2015-08-24 20:24:01 -04:00
|
|
|
import {
|
|
|
|
AsyncTestCompleter,
|
|
|
|
TestComponentBuilder,
|
|
|
|
beforeEach,
|
2015-11-17 18:24:36 -05:00
|
|
|
beforeEachProviders,
|
2015-08-24 20:24:01 -04:00
|
|
|
ddescribe,
|
|
|
|
describe,
|
|
|
|
el,
|
|
|
|
expect,
|
|
|
|
iit,
|
|
|
|
inject,
|
|
|
|
it,
|
|
|
|
xit,
|
2015-10-13 03:29:13 -04:00
|
|
|
} from 'angular2/testing_internal';
|
2015-08-24 20:24:01 -04:00
|
|
|
|
2016-01-14 00:35:21 -05:00
|
|
|
import {Component, View, ViewMetadata, bind, provide, DebugElement} from 'angular2/core';
|
2015-11-17 18:24:36 -05:00
|
|
|
import {UrlResolver} from 'angular2/compiler';
|
2015-08-24 20:24:01 -04:00
|
|
|
|
|
|
|
import {MdButton, MdAnchor} from 'angular2_material/src/components/button/button';
|
|
|
|
|
|
|
|
import {TestUrlResolver} from './test_url_resolver';
|
|
|
|
|
|
|
|
|
|
|
|
export function main() {
|
|
|
|
describe('MdButton', () => {
|
|
|
|
let builder: TestComponentBuilder;
|
|
|
|
|
2015-11-17 18:24:36 -05:00
|
|
|
beforeEachProviders(() => [
|
2015-08-24 20:24:01 -04:00
|
|
|
// Need a custom URL resolver for ng-material template files in order for them to work
|
|
|
|
// with both JS and Dart output.
|
2015-11-17 18:24:36 -05:00
|
|
|
provide(UrlResolver, {useValue: new TestUrlResolver()})
|
2015-08-24 20:24:01 -04:00
|
|
|
]);
|
|
|
|
|
|
|
|
beforeEach(inject([TestComponentBuilder], (tcb) => { builder = tcb; }));
|
|
|
|
|
2015-11-23 19:02:19 -05:00
|
|
|
describe('button[mdButton]', () => {
|
2015-08-24 20:24:01 -04:00
|
|
|
it('should handle a click on the button', inject([AsyncTestCompleter], (async) => {
|
2015-10-31 12:50:19 -04:00
|
|
|
builder.createAsync(TestApp).then(fixture => {
|
|
|
|
let testComponent = fixture.debugElement.componentInstance;
|
|
|
|
let buttonDebugElement = getChildDebugElement(fixture.debugElement, 'button');
|
2015-08-24 20:24:01 -04:00
|
|
|
|
|
|
|
buttonDebugElement.nativeElement.click();
|
|
|
|
expect(testComponent.clickCount).toBe(1);
|
|
|
|
|
|
|
|
async.done();
|
|
|
|
});
|
2015-11-20 10:59:21 -05:00
|
|
|
}), 10000);
|
2015-08-24 20:24:01 -04:00
|
|
|
|
|
|
|
it('should disable the button', inject([AsyncTestCompleter], (async) => {
|
2015-10-31 12:50:19 -04:00
|
|
|
builder.createAsync(TestApp).then(fixture => {
|
|
|
|
let testAppComponent = fixture.debugElement.componentInstance;
|
|
|
|
let buttonDebugElement = getChildDebugElement(fixture.debugElement, 'button');
|
2015-08-24 20:24:01 -04:00
|
|
|
let buttonElement = buttonDebugElement.nativeElement;
|
|
|
|
|
|
|
|
// The button should initially be enabled.
|
|
|
|
expect(buttonElement.disabled).toBe(false);
|
|
|
|
|
|
|
|
// After the disabled binding has been changed.
|
|
|
|
testAppComponent.isDisabled = true;
|
2015-10-31 12:50:19 -04:00
|
|
|
fixture.detectChanges();
|
2015-08-24 20:24:01 -04:00
|
|
|
|
|
|
|
// The button should should now be disabled.
|
|
|
|
expect(buttonElement.disabled).toBe(true);
|
|
|
|
|
|
|
|
// Clicking the button should not invoke the handler.
|
|
|
|
buttonElement.click();
|
|
|
|
expect(testAppComponent.clickCount).toBe(0);
|
|
|
|
async.done();
|
|
|
|
});
|
2015-11-20 10:59:21 -05:00
|
|
|
}), 10000);
|
2015-08-24 20:24:01 -04:00
|
|
|
});
|
|
|
|
|
2015-11-23 19:02:19 -05:00
|
|
|
describe('a[mdButton]', () => {
|
|
|
|
const anchorTemplate = `<a mdButton href="http://google.com" [disabled]="isDisabled">Go</a>`;
|
2015-08-24 20:24:01 -04:00
|
|
|
|
|
|
|
beforeEach(() => {
|
|
|
|
builder = builder.overrideView(
|
|
|
|
TestApp, new ViewMetadata({template: anchorTemplate, directives: [MdAnchor]}));
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should remove disabled anchors from tab order', inject([AsyncTestCompleter], (async) => {
|
2015-10-31 12:50:19 -04:00
|
|
|
builder.createAsync(TestApp).then(fixture => {
|
|
|
|
let testAppComponent = fixture.debugElement.componentInstance;
|
|
|
|
let anchorDebugElement = getChildDebugElement(fixture.debugElement, 'a');
|
2015-08-24 20:24:01 -04:00
|
|
|
let anchorElement = anchorDebugElement.nativeElement;
|
|
|
|
|
|
|
|
// The anchor should initially be in the tab order.
|
|
|
|
expect(anchorElement.tabIndex).toBe(0);
|
|
|
|
|
|
|
|
// After the disabled binding has been changed.
|
|
|
|
testAppComponent.isDisabled = true;
|
2015-10-31 12:50:19 -04:00
|
|
|
fixture.detectChanges();
|
2015-08-24 20:24:01 -04:00
|
|
|
|
|
|
|
// The anchor should now be out of the tab order.
|
|
|
|
expect(anchorElement.tabIndex).toBe(-1);
|
|
|
|
|
|
|
|
async.done();
|
|
|
|
});
|
|
|
|
|
|
|
|
it('should preventDefault for disabled anchor clicks',
|
|
|
|
inject([AsyncTestCompleter], (async) => {
|
|
|
|
// No clear way to test this; see https://github.com/angular/angular/issues/3782
|
|
|
|
async.done();
|
|
|
|
}));
|
2015-11-20 10:59:21 -05:00
|
|
|
}), 10000);
|
2015-08-24 20:24:01 -04:00
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
/** Gets a child DebugElement by tag name. */
|
|
|
|
function getChildDebugElement(parent: DebugElement, tagName: string): DebugElement {
|
2016-01-14 00:35:21 -05:00
|
|
|
var el = parent.query(debugEl => debugEl.nativeNode.tagName.toLowerCase() == tagName);
|
|
|
|
return <DebugElement>el;
|
2015-08-24 20:24:01 -04:00
|
|
|
}
|
|
|
|
|
|
|
|
/** Test component that contains an MdButton. */
|
|
|
|
@Component({selector: 'test-app'})
|
|
|
|
@View({
|
|
|
|
directives: [MdButton],
|
|
|
|
template:
|
2015-11-23 19:02:19 -05:00
|
|
|
`<button mdButton type="button" (click)="increment()" [disabled]="isDisabled">Go</button>`
|
2015-08-24 20:24:01 -04:00
|
|
|
})
|
|
|
|
class TestApp {
|
|
|
|
clickCount: number = 0;
|
|
|
|
isDisabled: boolean = false;
|
|
|
|
|
|
|
|
increment() {
|
|
|
|
this.clickCount++;
|
|
|
|
}
|
|
|
|
}
|