66 * found in the LICENSE file at https://angular.io/license
77 */
88
9+ import * as keyCodes from '@angular/cdk/keycodes' ;
910import {
10- dispatchFakeEvent ,
11- dispatchKeyboardEvent ,
11+ clearElement ,
1212 dispatchMouseEvent ,
13+ isTextInput ,
14+ ModifierKeys ,
1315 triggerBlur ,
14- triggerFocus
16+ triggerFocus ,
17+ typeInElement
1518} from '@angular/cdk/testing' ;
16- import { TestElement } from '../test-element' ;
19+ import { TestElement , TestKey } from '../test-element' ;
1720
18- function isTextInput ( element : Element ) : element is HTMLInputElement | HTMLTextAreaElement {
19- return element . nodeName . toLowerCase ( ) === 'input' ||
20- element . nodeName . toLowerCase ( ) === 'textarea' ;
21- }
21+ /** Maps `TestKey` constants to the `keyCode` and `key` values used by native browser events. */
22+ const keyMap = {
23+ [ TestKey . BACKSPACE ] : { keyCode : keyCodes . BACKSPACE , key : 'Backspace' } ,
24+ [ TestKey . TAB ] : { keyCode : keyCodes . TAB , key : 'Tab' } ,
25+ [ TestKey . ENTER ] : { keyCode : keyCodes . ENTER , key : 'Enter' } ,
26+ [ TestKey . SHIFT ] : { keyCode : keyCodes . SHIFT , key : 'Shift' } ,
27+ [ TestKey . CONTROL ] : { keyCode : keyCodes . CONTROL , key : 'Control' } ,
28+ [ TestKey . ALT ] : { keyCode : keyCodes . ALT , key : 'Alt' } ,
29+ [ TestKey . ESCAPE ] : { keyCode : keyCodes . ESCAPE , key : 'Escape' } ,
30+ [ TestKey . PAGE_UP ] : { keyCode : keyCodes . PAGE_UP , key : 'PageUp' } ,
31+ [ TestKey . PAGE_DOWN ] : { keyCode : keyCodes . PAGE_DOWN , key : 'PageDown' } ,
32+ [ TestKey . END ] : { keyCode : keyCodes . END , key : 'End' } ,
33+ [ TestKey . HOME ] : { keyCode : keyCodes . HOME , key : 'Home' } ,
34+ [ TestKey . LEFT_ARROW ] : { keyCode : keyCodes . LEFT_ARROW , key : 'ArrowLeft' } ,
35+ [ TestKey . UP_ARROW ] : { keyCode : keyCodes . UP_ARROW , key : 'ArrowUp' } ,
36+ [ TestKey . RIGHT_ARROW ] : { keyCode : keyCodes . RIGHT_ARROW , key : 'ArrowRight' } ,
37+ [ TestKey . DOWN_ARROW ] : { keyCode : keyCodes . DOWN_ARROW , key : 'ArrowDown' } ,
38+ [ TestKey . INSERT ] : { keyCode : keyCodes . INSERT , key : 'Insert' } ,
39+ [ TestKey . DELETE ] : { keyCode : keyCodes . DELETE , key : 'Delete' } ,
40+ [ TestKey . F1 ] : { keyCode : keyCodes . F1 , key : 'F1' } ,
41+ [ TestKey . F2 ] : { keyCode : keyCodes . F2 , key : 'F2' } ,
42+ [ TestKey . F3 ] : { keyCode : keyCodes . F3 , key : 'F3' } ,
43+ [ TestKey . F4 ] : { keyCode : keyCodes . F4 , key : 'F4' } ,
44+ [ TestKey . F5 ] : { keyCode : keyCodes . F5 , key : 'F5' } ,
45+ [ TestKey . F6 ] : { keyCode : keyCodes . F6 , key : 'F6' } ,
46+ [ TestKey . F7 ] : { keyCode : keyCodes . F7 , key : 'F7' } ,
47+ [ TestKey . F8 ] : { keyCode : keyCodes . F8 , key : 'F8' } ,
48+ [ TestKey . F9 ] : { keyCode : keyCodes . F9 , key : 'F9' } ,
49+ [ TestKey . F10 ] : { keyCode : keyCodes . F10 , key : 'F10' } ,
50+ [ TestKey . F11 ] : { keyCode : keyCodes . F11 , key : 'F11' } ,
51+ [ TestKey . F12 ] : { keyCode : keyCodes . F12 , key : 'F12' } ,
52+ [ TestKey . META ] : { keyCode : keyCodes . META , key : 'Meta' }
53+ } ;
2254
2355/** A `TestElement` implementation for unit tests. */
2456export class UnitTestElement implements TestElement {
@@ -35,9 +67,7 @@ export class UnitTestElement implements TestElement {
3567 if ( ! isTextInput ( this . element ) ) {
3668 throw Error ( 'Attempting to clear an invalid element' ) ;
3769 }
38- triggerFocus ( this . element as HTMLElement ) ;
39- this . element . value = '' ;
40- dispatchFakeEvent ( this . element , 'input' ) ;
70+ clearElement ( this . element ) ;
4171 await this . _stabilize ( ) ;
4272 }
4373
@@ -66,21 +96,12 @@ export class UnitTestElement implements TestElement {
6696 await this . _stabilize ( ) ;
6797 }
6898
69- async sendKeys ( keys : string ) : Promise < void > {
99+ async sendKeys ( ...keys : ( string | TestKey ) [ ] ) : Promise < void > ;
100+ async sendKeys ( modifiers : ModifierKeys , ...keys : ( string | TestKey ) [ ] ) : Promise < void > ;
101+ async sendKeys ( ...modifiersAndKeys : any [ ] ) : Promise < void > {
70102 await this . _stabilize ( ) ;
71- triggerFocus ( this . element as HTMLElement ) ;
72- for ( const key of keys ) {
73- const keyCode = key . charCodeAt ( 0 ) ;
74- dispatchKeyboardEvent ( this . element , 'keydown' , keyCode ) ;
75- dispatchKeyboardEvent ( this . element , 'keypress' , keyCode ) ;
76- if ( isTextInput ( this . element ) ) {
77- this . element . value += key ;
78- }
79- dispatchKeyboardEvent ( this . element , 'keyup' , keyCode ) ;
80- if ( isTextInput ( this . element ) ) {
81- dispatchFakeEvent ( this . element , 'input' ) ;
82- }
83- }
103+ const args = modifiersAndKeys . map ( k => typeof k === 'number' ? keyMap [ k as TestKey ] : k ) ;
104+ typeInElement ( this . element as HTMLElement , ...args ) ;
84105 await this . _stabilize ( ) ;
85106 }
86107
0 commit comments