import {
AsyncTestCompleter,
TestComponentBuilder,
beforeEach,
beforeEachBindings,
ddescribe,
describe,
el,
expect,
iit,
inject,
it,
xit,
} from 'angular2/test_lib';
import {DebugElement} from 'angular2/src/core/debug/debug_element';
import {Component, View, ViewMetadata, UrlResolver, bind} from 'angular2/core';
import {MdButton, MdAnchor} from 'angular2_material/src/components/button/button';
import {TestUrlResolver} from './test_url_resolver';
import {XHR} from 'angular2/src/core/render/xhr';
import {XHRImpl} from 'angular2/src/core/render/xhr_impl';
export function main() {
describe('MdButton', () => {
let builder: TestComponentBuilder;
beforeEachBindings(() => [
// Need a custom URL resolver for ng-material template files in order for them to work
// with both JS and Dart output.
bind(UrlResolver)
.toValue(new TestUrlResolver()),
// Need to use the real XHR implementation (instead of the mock) so we can actually request
// the template files, since Angular 2 doesn't have anything like $templateCache. This should
// eventually be replaced with a preprocessor that inlines templates.
bind(XHR).toClass(XHRImpl)
]);
beforeEach(inject([TestComponentBuilder], (tcb) => { builder = tcb; }));
describe('button[md-button]', () => {
it('should handle a click on the button', inject([AsyncTestCompleter], (async) => {
builder.createAsync(TestApp).then(rootTestComponent => {
let testComponent = rootTestComponent.debugElement.componentInstance;
let buttonDebugElement =
getChildDebugElement(rootTestComponent.debugElement, 'button');
buttonDebugElement.nativeElement.click();
expect(testComponent.clickCount).toBe(1);
async.done();
});
}));
it('should disable the button', inject([AsyncTestCompleter], (async) => {
builder.createAsync(TestApp).then(rootTestComponent => {
let testAppComponent = rootTestComponent.debugElement.componentInstance;
let buttonDebugElement =
getChildDebugElement(rootTestComponent.debugElement, 'button');
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;
rootTestComponent.detectChanges();
// 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();
});
}));
});
describe('a[md-button]', () => {
const anchorTemplate = `Go`;
beforeEach(() => {
builder = builder.overrideView(
TestApp, new ViewMetadata({template: anchorTemplate, directives: [MdAnchor]}));
});
it('should remove disabled anchors from tab order', inject([AsyncTestCompleter], (async) => {
builder.createAsync(TestApp).then(rootTestComponent => {
let testAppComponent = rootTestComponent.debugElement.componentInstance;
let anchorDebugElement = getChildDebugElement(rootTestComponent.debugElement, 'a');
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;
rootTestComponent.detectChanges();
// 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();
}));
}));
});
});
}
/** Gets a child DebugElement by tag name. */
function getChildDebugElement(parent: DebugElement, tagName: string): DebugElement {
return parent.query(debugEl => debugEl.nativeElement.tagName.toLowerCase() == tagName);
}
/** Test component that contains an MdButton. */
@Component({selector: 'test-app'})
@View({
directives: [MdButton],
template:
``
})
class TestApp {
clickCount: number = 0;
isDisabled: boolean = false;
increment() {
this.clickCount++;
}
}