Skip to content

Commit aae4b65

Browse files
committed
added tests
1 parent b52097f commit aae4b65

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,9 +1,9 @@
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
import {PlatformModule} from '../platform/index';
88
import {Platform} from '../platform/platform';
99

@@ -20,6 +20,7 @@ describe('FocusOriginMonitor', () => {
2020
let buttonRenderer: Renderer;
2121
let focusOriginMonitor: FocusOriginMonitor;
2222
let platform: Platform;
23+
let changeHandler: (origin: FocusOrigin) => void;
2324

2425
beforeEach(async(() => {
2526
TestBed.configureTestingModule({
@@ -41,7 +42,9 @@ describe('FocusOriginMonitor', () => {
4142
focusOriginMonitor = fom;
4243
platform = pfm;
4344

44-
focusOriginMonitor.registerElementForFocusClasses(buttonElement, buttonRenderer);
45+
changeHandler = jasmine.createSpy('focus origin change handler');
46+
focusOriginMonitor.registerElementForFocusClasses(buttonElement, buttonRenderer)
47+
.subscribe(changeHandler);
4548
}));
4649

4750
it('manually registered element should receive focus classes', async(() => {
@@ -55,6 +58,7 @@ describe('FocusOriginMonitor', () => {
5558

5659
expect(buttonElement.classList.contains('cdk-focused'))
5760
.toBe(true, 'button should have cdk-focused class');
61+
expect(changeHandler).toHaveBeenCalledTimes(1);
5862
}, 0);
5963
}));
6064

@@ -75,6 +79,7 @@ describe('FocusOriginMonitor', () => {
7579
.toBe(true, 'button should have cdk-focused class');
7680
expect(buttonElement.classList.contains('cdk-keyboard-focused'))
7781
.toBe(true, 'button should have cdk-keyboard-focused class');
82+
expect(changeHandler).toHaveBeenCalledWith('keyboard');
7883
}, 0);
7984
}));
8085

@@ -95,6 +100,7 @@ describe('FocusOriginMonitor', () => {
95100
.toBe(true, 'button should have cdk-focused class');
96101
expect(buttonElement.classList.contains('cdk-mouse-focused'))
97102
.toBe(true, 'button should have cdk-mouse-focused class');
103+
expect(changeHandler).toHaveBeenCalledWith('mouse');
98104
}, 0);
99105
}));
100106

@@ -114,6 +120,7 @@ describe('FocusOriginMonitor', () => {
114120
.toBe(true, 'button should have cdk-focused class');
115121
expect(buttonElement.classList.contains('cdk-program-focused'))
116122
.toBe(true, 'button should have cdk-program-focused class');
123+
expect(changeHandler).toHaveBeenCalledWith('program');
117124
}, 0);
118125
}));
119126

@@ -132,6 +139,7 @@ describe('FocusOriginMonitor', () => {
132139
.toBe(true, 'button should have cdk-focused class');
133140
expect(buttonElement.classList.contains('cdk-keyboard-focused'))
134141
.toBe(true, 'button should have cdk-keyboard-focused class');
142+
expect(changeHandler).toHaveBeenCalledWith('keyboard');
135143
}, 0);
136144
}));
137145

@@ -150,6 +158,7 @@ describe('FocusOriginMonitor', () => {
150158
.toBe(true, 'button should have cdk-focused class');
151159
expect(buttonElement.classList.contains('cdk-mouse-focused'))
152160
.toBe(true, 'button should have cdk-mouse-focused class');
161+
expect(changeHandler).toHaveBeenCalledWith('mouse');
153162
}, 0);
154163
}));
155164

@@ -168,6 +177,7 @@ describe('FocusOriginMonitor', () => {
168177
.toBe(true, 'button should have cdk-focused class');
169178
expect(buttonElement.classList.contains('cdk-program-focused'))
170179
.toBe(true, 'button should have cdk-program-focused class');
180+
expect(changeHandler).toHaveBeenCalledWith('program');
171181
}, 0);
172182
}));
173183
});
@@ -177,6 +187,7 @@ describe('cdkFocusClasses', () => {
177187
let fixture: ComponentFixture<ButtonWithFocusClasses>;
178188
let buttonElement: HTMLElement;
179189
let platform: Platform;
190+
let changeHandler: (origin: FocusOrigin) => void;
180191

181192
beforeEach(async(() => {
182193
TestBed.configureTestingModule({
@@ -193,6 +204,8 @@ describe('cdkFocusClasses', () => {
193204
fixture = TestBed.createComponent(ButtonWithFocusClasses);
194205
fixture.detectChanges();
195206

207+
changeHandler = jasmine.createSpy('focus origin change handler');
208+
fixture.componentInstance.cdkFocusClasses.changes.subscribe(changeHandler);
196209
buttonElement = fixture.debugElement.query(By.css('button')).nativeElement;
197210
platform = pfm;
198211
}));
@@ -218,6 +231,7 @@ describe('cdkFocusClasses', () => {
218231
.toBe(true, 'button should have cdk-focused class');
219232
expect(buttonElement.classList.contains('cdk-keyboard-focused'))
220233
.toBe(true, 'button should have cdk-keyboard-focused class');
234+
expect(changeHandler).toHaveBeenCalledWith('keyboard');
221235
}, 0);
222236
}));
223237

@@ -238,6 +252,7 @@ describe('cdkFocusClasses', () => {
238252
.toBe(true, 'button should have cdk-focused class');
239253
expect(buttonElement.classList.contains('cdk-mouse-focused'))
240254
.toBe(true, 'button should have cdk-mouse-focused class');
255+
expect(changeHandler).toHaveBeenCalledWith('mouse');
241256
}, 0);
242257
}));
243258

@@ -257,6 +272,7 @@ describe('cdkFocusClasses', () => {
257272
.toBe(true, 'button should have cdk-focused class');
258273
expect(buttonElement.classList.contains('cdk-program-focused'))
259274
.toBe(true, 'button should have cdk-program-focused class');
275+
expect(changeHandler).toHaveBeenCalledWith('program');
260276
}, 0);
261277
}));
262278
});
@@ -269,7 +285,9 @@ class PlainButton {
269285

270286

271287
@Component({template: `<button cdkFocusClasses>focus me!</button>`})
272-
class ButtonWithFocusClasses {}
288+
class ButtonWithFocusClasses {
289+
@ViewChild(CdkFocusClasses) cdkFocusClasses: CdkFocusClasses;
290+
}
273291

274292

275293
/** Dispatches a mousedown event on the specified element. */

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)