Skip to content

Commit 24d92e0

Browse files
committed
added tests
1 parent 8dacf8f commit 24d92e0

File tree

2 files changed

+29
-5
lines changed

2 files changed

+29
-5
lines changed

src/lib/core/style/focus-classes.spec.ts

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
import {async, ComponentFixture, TestBed, inject} from '@angular/core/testing';
2-
import {Component, Renderer} from '@angular/core';
2+
import {Component, Renderer, ViewChild} from '@angular/core';
33
import {StyleModule} from './index';
44
import {By} from '@angular/platform-browser';
55
import {TAB} from '../keyboard/keycodes';
6-
import {FocusOriginMonitor} from './focus-classes';
6+
import {FocusOriginMonitor, FocusOrigin, CdkFocusClasses} from './focus-classes';
77

88
describe('FocusOriginMonitor', () => {
99
let fixture: ComponentFixture<PlainButton>;
1010
let buttonElement: HTMLElement;
1111
let buttonRenderer: Renderer;
1212
let focusOriginMonitor: FocusOriginMonitor;
13+
let changeHandler: (origin: FocusOrigin) => void;
1314

1415
beforeEach(async(() => {
1516
TestBed.configureTestingModule({
@@ -30,7 +31,9 @@ describe('FocusOriginMonitor', () => {
3031
buttonRenderer = fixture.componentInstance.renderer;
3132
focusOriginMonitor = fom;
3233

33-
focusOriginMonitor.registerElementForFocusClasses(buttonElement, buttonRenderer);
34+
changeHandler = jasmine.createSpy('focus origin change handler');
35+
focusOriginMonitor.registerElementForFocusClasses(buttonElement, buttonRenderer)
36+
.subscribe(changeHandler);
3437

3538
// Patch the element focus to properly emit focus events when the browser is blurred.
3639
patchElementFocus(buttonElement);
@@ -45,6 +48,7 @@ describe('FocusOriginMonitor', () => {
4548

4649
expect(buttonElement.classList.contains('cdk-focused'))
4750
.toBe(true, 'button should have cdk-focused class');
51+
expect(changeHandler).toHaveBeenCalledTimes(1);
4852
}, 0);
4953
}));
5054

@@ -63,6 +67,7 @@ describe('FocusOriginMonitor', () => {
6367
.toBe(true, 'button should have cdk-focused class');
6468
expect(buttonElement.classList.contains('cdk-keyboard-focused'))
6569
.toBe(true, 'button should have cdk-keyboard-focused class');
70+
expect(changeHandler).toHaveBeenCalledWith('keyboard');
6671
}, 0);
6772
}));
6873

@@ -81,6 +86,7 @@ describe('FocusOriginMonitor', () => {
8186
.toBe(true, 'button should have cdk-focused class');
8287
expect(buttonElement.classList.contains('cdk-mouse-focused'))
8388
.toBe(true, 'button should have cdk-mouse-focused class');
89+
expect(changeHandler).toHaveBeenCalledWith('mouse');
8490
}, 0);
8591
}));
8692

@@ -98,6 +104,7 @@ describe('FocusOriginMonitor', () => {
98104
.toBe(true, 'button should have cdk-focused class');
99105
expect(buttonElement.classList.contains('cdk-program-focused'))
100106
.toBe(true, 'button should have cdk-program-focused class');
107+
expect(changeHandler).toHaveBeenCalledWith('program');
101108
}, 0);
102109
}));
103110

@@ -114,6 +121,7 @@ describe('FocusOriginMonitor', () => {
114121
.toBe(true, 'button should have cdk-focused class');
115122
expect(buttonElement.classList.contains('cdk-keyboard-focused'))
116123
.toBe(true, 'button should have cdk-keyboard-focused class');
124+
expect(changeHandler).toHaveBeenCalledWith('keyboard');
117125
}, 0);
118126
}));
119127

@@ -130,6 +138,7 @@ describe('FocusOriginMonitor', () => {
130138
.toBe(true, 'button should have cdk-focused class');
131139
expect(buttonElement.classList.contains('cdk-mouse-focused'))
132140
.toBe(true, 'button should have cdk-mouse-focused class');
141+
expect(changeHandler).toHaveBeenCalledWith('mouse');
133142
}, 0);
134143
}));
135144

@@ -146,6 +155,7 @@ describe('FocusOriginMonitor', () => {
146155
.toBe(true, 'button should have cdk-focused class');
147156
expect(buttonElement.classList.contains('cdk-program-focused'))
148157
.toBe(true, 'button should have cdk-program-focused class');
158+
expect(changeHandler).toHaveBeenCalledWith('program');
149159
}, 0);
150160
}));
151161
});
@@ -154,6 +164,7 @@ describe('FocusOriginMonitor', () => {
154164
describe('cdkFocusClasses', () => {
155165
let fixture: ComponentFixture<ButtonWithFocusClasses>;
156166
let buttonElement: HTMLElement;
167+
let changeHandler: (origin: FocusOrigin) => void;
157168

158169
beforeEach(async(() => {
159170
TestBed.configureTestingModule({
@@ -170,6 +181,8 @@ describe('cdkFocusClasses', () => {
170181
fixture = TestBed.createComponent(ButtonWithFocusClasses);
171182
fixture.detectChanges();
172183

184+
changeHandler = jasmine.createSpy('focus origin change handler');
185+
fixture.componentInstance.cdkFocusClasses.changes.subscribe(changeHandler);
173186
buttonElement = fixture.debugElement.query(By.css('button')).nativeElement;
174187

175188
// Patch the element focus to properly emit focus events when the browser is blurred.
@@ -195,6 +208,7 @@ describe('cdkFocusClasses', () => {
195208
.toBe(true, 'button should have cdk-focused class');
196209
expect(buttonElement.classList.contains('cdk-keyboard-focused'))
197210
.toBe(true, 'button should have cdk-keyboard-focused class');
211+
expect(changeHandler).toHaveBeenCalledWith('keyboard');
198212
}, 0);
199213
}));
200214

@@ -213,6 +227,7 @@ describe('cdkFocusClasses', () => {
213227
.toBe(true, 'button should have cdk-focused class');
214228
expect(buttonElement.classList.contains('cdk-mouse-focused'))
215229
.toBe(true, 'button should have cdk-mouse-focused class');
230+
expect(changeHandler).toHaveBeenCalledWith('mouse');
216231
}, 0);
217232
}));
218233

@@ -230,6 +245,7 @@ describe('cdkFocusClasses', () => {
230245
.toBe(true, 'button should have cdk-focused class');
231246
expect(buttonElement.classList.contains('cdk-program-focused'))
232247
.toBe(true, 'button should have cdk-program-focused class');
248+
expect(changeHandler).toHaveBeenCalledWith('program');
233249
}, 0);
234250
}));
235251
});
@@ -242,7 +258,9 @@ class PlainButton {
242258

243259

244260
@Component({template: `<button cdkFocusClasses>focus me!</button>`})
245-
class ButtonWithFocusClasses {}
261+
class ButtonWithFocusClasses {
262+
@ViewChild(CdkFocusClasses) cdkFocusClasses: CdkFocusClasses;
263+
}
246264

247265
// TODO(devversion): move helper functions into a global utility file. See #2902
248266

src/lib/core/style/focus-classes.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,10 @@ export class FocusOriginMonitor {
4444

4545
/** Handles focus events on a registered element. */
4646
private _onFocus(element: Element, renderer: Renderer, subject: Subject<FocusOrigin>) {
47+
// If we couldn't detect a cause for the focus event, assume it was due to programmatically
48+
// setting the focus.
4749
this._origin = this._origin || 'program';
50+
4851
renderer.setElementClass(element, 'cdk-focused', true);
4952
renderer.setElementClass(element, 'cdk-keyboard-focused', this._origin == 'keyboard');
5053
renderer.setElementClass(element, 'cdk-mouse-focused', this._origin == 'mouse');
@@ -72,8 +75,11 @@ export class FocusOriginMonitor {
7275
selector: '[cdkFocusClasses]',
7376
})
7477
export class CdkFocusClasses {
78+
changes: Observable<FocusOrigin>;
79+
7580
constructor(elementRef: ElementRef, focusOriginMonitor: FocusOriginMonitor, renderer: Renderer) {
76-
focusOriginMonitor.registerElementForFocusClasses(elementRef.nativeElement, renderer);
81+
this.changes =
82+
focusOriginMonitor.registerElementForFocusClasses(elementRef.nativeElement, renderer);
7783
}
7884
}
7985

0 commit comments

Comments
 (0)