Skip to content

Commit 3378c27

Browse files
committed
added tests
1 parent 165e5ac commit 3378c27

File tree

3 files changed

+133
-19
lines changed

3 files changed

+133
-19
lines changed

Diff for: src/lib/core/keyboard/keycodes.ts

+6
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ export const DOWN_ARROW = 40;
99
export const RIGHT_ARROW = 39;
1010
export const LEFT_ARROW = 37;
1111

12+
export const PAGE_UP = 33;
13+
export const PAGE_DOWN = 34;
14+
15+
export const HOME = 36;
16+
export const END = 35;
17+
1218
export const ENTER = 13;
1319
export const SPACE = 32;
1420
export const TAB = 9;

Diff for: src/lib/slider/slider.spec.ts

+100-2
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,18 @@
11
import {async, ComponentFixture, TestBed} from '@angular/core/testing';
22
import {ReactiveFormsModule, FormControl} from '@angular/forms';
33
import {Component, DebugElement} from '@angular/core';
4-
import {By} from '@angular/platform-browser';
4+
import {By, HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
55
import {MdSlider, MdSliderModule} from './slider';
6-
import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
76
import {TestGestureConfig} from './test-gesture-config';
7+
import {
8+
UP_ARROW,
9+
RIGHT_ARROW,
10+
DOWN_ARROW,
11+
PAGE_DOWN,
12+
PAGE_UP,
13+
END,
14+
HOME, LEFT_ARROW
15+
} from '../core/keyboard/keycodes';
816

917

1018
describe('MdSlider', () => {
@@ -746,6 +754,90 @@ describe('MdSlider', () => {
746754
expect(testComponent.onChange).toHaveBeenCalledTimes(1);
747755
});
748756
});
757+
758+
describe('keyboard support', () => {
759+
let fixture: ComponentFixture<StandardSlider>;
760+
let sliderDebugElement: DebugElement;
761+
let sliderNativeElement: HTMLElement;
762+
let sliderTrackElement: HTMLElement;
763+
let testComponent: StandardSlider;
764+
let sliderInstance: MdSlider;
765+
766+
beforeEach(() => {
767+
fixture = TestBed.createComponent(StandardSlider);
768+
fixture.detectChanges();
769+
770+
testComponent = fixture.debugElement.componentInstance;
771+
sliderDebugElement = fixture.debugElement.query(By.directive(MdSlider));
772+
sliderNativeElement = sliderDebugElement.nativeElement;
773+
sliderTrackElement = <HTMLElement>sliderNativeElement.querySelector('.md-slider-track');
774+
sliderInstance = sliderDebugElement.injector.get(MdSlider);
775+
});
776+
777+
it('should increment slider by 1 on up arrow pressed', () => {
778+
dispatchKeydownEvent(sliderNativeElement, UP_ARROW);
779+
fixture.detectChanges();
780+
781+
expect(sliderInstance.value).toBe(1);
782+
});
783+
784+
it('should increment slider by 1 on right arrow pressed', () => {
785+
dispatchKeydownEvent(sliderNativeElement, RIGHT_ARROW);
786+
fixture.detectChanges();
787+
788+
expect(sliderInstance.value).toBe(1);
789+
});
790+
791+
it('should decrement slider by 1 on down arrow pressed', () => {
792+
sliderInstance.value = 100;
793+
794+
dispatchKeydownEvent(sliderNativeElement, DOWN_ARROW);
795+
fixture.detectChanges();
796+
797+
expect(sliderInstance.value).toBe(99);
798+
});
799+
800+
it('should decrement slider by 1 on left arrow pressed', () => {
801+
sliderInstance.value = 100;
802+
803+
dispatchKeydownEvent(sliderNativeElement, LEFT_ARROW);
804+
fixture.detectChanges();
805+
806+
expect(sliderInstance.value).toBe(99);
807+
});
808+
809+
it('should increment slider by 10 on page up pressed', () => {
810+
dispatchKeydownEvent(sliderNativeElement, PAGE_UP);
811+
fixture.detectChanges();
812+
813+
expect(sliderInstance.value).toBe(10);
814+
});
815+
816+
it('should decrement slider by 10 on page down pressed', () => {
817+
sliderInstance.value = 100;
818+
819+
dispatchKeydownEvent(sliderNativeElement, PAGE_DOWN);
820+
fixture.detectChanges();
821+
822+
expect(sliderInstance.value).toBe(90);
823+
});
824+
825+
it('should set slider to max on end pressed', () => {
826+
dispatchKeydownEvent(sliderNativeElement, END);
827+
fixture.detectChanges();
828+
829+
expect(sliderInstance.value).toBe(100);
830+
});
831+
832+
it('should set slider to min on home pressed', () => {
833+
sliderInstance.value = 100;
834+
835+
dispatchKeydownEvent(sliderNativeElement, HOME);
836+
fixture.detectChanges();
837+
838+
expect(sliderInstance.value).toBe(0);
839+
});
840+
});
749841
});
750842

751843
// Disable animations and make the slider an even 100px (+ 8px padding on either side)
@@ -953,3 +1045,9 @@ function dispatchMouseenterEvent(element: HTMLElement): void {
9531045
'mouseenter', true, true, window, 0, x, y, x, y, false, false, false, false, 0, null);
9541046
element.dispatchEvent(event);
9551047
}
1048+
1049+
function dispatchKeydownEvent(element: HTMLElement, keyCode: number): void {
1050+
let event = new Event('keydown');
1051+
(<any>event).keyCode = keyCode;
1052+
element.dispatchEvent(event);
1053+
}

Diff for: src/lib/slider/slider.ts

+27-17
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,28 @@
11
import {
2-
NgModule,
3-
ModuleWithProviders,
4-
Component,
5-
ElementRef,
6-
Input,
7-
Output,
8-
ViewEncapsulation,
9-
forwardRef,
10-
EventEmitter,
2+
NgModule,
3+
ModuleWithProviders,
4+
Component,
5+
ElementRef,
6+
Input,
7+
Output,
8+
ViewEncapsulation,
9+
forwardRef,
10+
EventEmitter
1111
} from '@angular/core';
1212
import {NG_VALUE_ACCESSOR, ControlValueAccessor, FormsModule} from '@angular/forms';
1313
import {HAMMER_GESTURE_CONFIG} from '@angular/platform-browser';
1414
import {MdGestureConfig, coerceBooleanProperty, coerceNumberProperty} from '../core';
1515
import {Input as HammerInput} from 'hammerjs';
16+
import {
17+
PAGE_UP,
18+
PAGE_DOWN,
19+
END,
20+
HOME,
21+
LEFT_ARROW,
22+
UP_ARROW,
23+
RIGHT_ARROW,
24+
DOWN_ARROW
25+
} from '../core/keyboard/keycodes';
1626

1727
/**
1828
* Visually, a 30px separation between tick marks looks best. This is very subjective but it is
@@ -260,28 +270,28 @@ export class MdSlider implements ControlValueAccessor {
260270
if (this.disabled) { return; }
261271

262272
switch (event.keyCode) {
263-
case 33: /* page up */
273+
case PAGE_UP:
264274
this._increment(10);
265275
break;
266-
case 34: /* page down */
276+
case PAGE_DOWN:
267277
this._increment(-10);
268278
break;
269-
case 35: /* end */
279+
case END:
270280
this.value = this.max;
271281
break;
272-
case 36: /* home */
282+
case HOME:
273283
this.value = this.min;
274284
break;
275-
case 37: /* left arrow */
285+
case LEFT_ARROW:
276286
this._increment(-1);
277287
break;
278-
case 38: /* up arrow */
288+
case UP_ARROW:
279289
this._increment(1);
280290
break;
281-
case 39: /* right arrow */
291+
case RIGHT_ARROW:
282292
this._increment(1);
283293
break;
284-
case 40: /* down arrow */
294+
case DOWN_ARROW:
285295
this._increment(-1);
286296
break;
287297
default:

0 commit comments

Comments
 (0)