11// Load the implementations that should be tested
2- import { ChangeDetectorRef , Component , CUSTOM_ELEMENTS_SCHEMA } from '@angular/core' ;
3- import { ComponentFixture , inject , TestBed , waitForAsync , } from '@angular/core/testing' ;
42import { UntypedFormControl , UntypedFormGroup } from '@angular/forms' ;
3+ import { ChangeDetectorRef , Component , CUSTOM_ELEMENTS_SCHEMA , Renderer2 } from '@angular/core' ;
4+ import { ComponentFixture , fakeAsync , inject , TestBed , tick , waitForAsync , } from '@angular/core/testing' ;
55
66import { NgbModule } from '@ng-bootstrap/ng-bootstrap' ;
77import { DynamicFormLayoutService , DynamicFormValidationService } from '@ng-dynamic-forms/core' ;
@@ -13,6 +13,7 @@ import {
1313 mockDynamicFormLayoutService ,
1414 mockDynamicFormValidationService
1515} from '../../../../../testing/dynamic-form-mock-services' ;
16+ import { By } from '@angular/platform-browser' ;
1617
1718
1819export const DATE_TEST_GROUP = new UntypedFormGroup ( {
@@ -39,6 +40,11 @@ describe('DsDatePickerComponent test suite', () => {
3940 let dateFixture : ComponentFixture < DsDatePickerComponent > ;
4041 let html ;
4142
43+ const renderer2 : Renderer2 = {
44+ selectRootElement : jasmine . createSpy ( 'selectRootElement' ) ,
45+ querySelector : jasmine . createSpy ( 'querySelector' ) ,
46+ } as unknown as Renderer2 ;
47+
4248 // waitForAsync beforeEach
4349 beforeEach ( waitForAsync ( ( ) => {
4450
@@ -54,7 +60,8 @@ describe('DsDatePickerComponent test suite', () => {
5460 ChangeDetectorRef ,
5561 DsDatePickerComponent ,
5662 { provide : DynamicFormLayoutService , useValue : mockDynamicFormLayoutService } ,
57- { provide : DynamicFormValidationService , useValue : mockDynamicFormValidationService }
63+ { provide : DynamicFormValidationService , useValue : mockDynamicFormValidationService } ,
64+ { provide : Renderer2 , useValue : renderer2 } ,
5865 ] ,
5966 schemas : [ CUSTOM_ELEMENTS_SCHEMA ]
6067 } ) ;
@@ -233,6 +240,102 @@ describe('DsDatePickerComponent test suite', () => {
233240 expect ( dateComp . disabledMonth ) . toBeFalsy ( ) ;
234241 expect ( dateComp . disabledDay ) . toBeFalsy ( ) ;
235242 } ) ;
243+
244+ it ( 'should move focus on month field when on year field and tab pressed' , fakeAsync ( ( ) => {
245+ const event = {
246+ field : 'day' ,
247+ value : null
248+ } ;
249+ const event1 = {
250+ field : 'month' ,
251+ value : null
252+ } ;
253+ dateComp . onChange ( event ) ;
254+ dateComp . onChange ( event1 ) ;
255+
256+ const yearElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _year` ) ) ;
257+ const monthElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _month` ) ) ;
258+
259+ yearElement . nativeElement . focus ( ) ;
260+ dateFixture . detectChanges ( ) ;
261+
262+ expect ( document . activeElement ) . toBe ( yearElement . nativeElement ) ;
263+
264+ dateFixture . nativeElement . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'tab' } ) ) ;
265+ dateFixture . detectChanges ( ) ;
266+
267+ tick ( 200 ) ;
268+ dateFixture . detectChanges ( ) ;
269+
270+ expect ( document . activeElement ) . toBe ( monthElement . nativeElement ) ;
271+ } ) ) ;
272+
273+ it ( 'should move focus on day field when on month field and tab pressed' , fakeAsync ( ( ) => {
274+ const event = {
275+ field : 'day' ,
276+ value : null
277+ } ;
278+ dateComp . onChange ( event ) ;
279+
280+ const monthElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _month` ) ) ;
281+ const dayElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _day` ) ) ;
282+
283+ monthElement . nativeElement . focus ( ) ;
284+ dateFixture . detectChanges ( ) ;
285+
286+ expect ( document . activeElement ) . toBe ( monthElement . nativeElement ) ;
287+
288+ dateFixture . nativeElement . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'tab' } ) ) ;
289+ dateFixture . detectChanges ( ) ;
290+
291+ tick ( 200 ) ;
292+ dateFixture . detectChanges ( ) ;
293+
294+ expect ( document . activeElement ) . toBe ( dayElement . nativeElement ) ;
295+ } ) ) ;
296+
297+ it ( 'should move focus on month field when on day field and shift tab pressed' , fakeAsync ( ( ) => {
298+ const event = {
299+ field : 'day' ,
300+ value : null
301+ } ;
302+ dateComp . onChange ( event ) ;
303+
304+ const monthElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _month` ) ) ;
305+ const dayElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _day` ) ) ;
306+
307+ dayElement . nativeElement . focus ( ) ;
308+ dateFixture . detectChanges ( ) ;
309+
310+ expect ( document . activeElement ) . toBe ( dayElement . nativeElement ) ;
311+
312+ dateFixture . nativeElement . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'shift.tab' } ) ) ;
313+ dateFixture . detectChanges ( ) ;
314+
315+ tick ( 200 ) ;
316+ dateFixture . detectChanges ( ) ;
317+
318+ expect ( document . activeElement ) . toBe ( monthElement . nativeElement ) ;
319+ } ) ) ;
320+
321+ it ( 'should move focus on year field when on month field and shift tab pressed' , fakeAsync ( ( ) => {
322+ const yearElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _year` ) ) ;
323+ const monthElement = dateFixture . debugElement . query ( By . css ( `#${ dateComp . model . id } _month` ) ) ;
324+
325+ monthElement . nativeElement . focus ( ) ;
326+ dateFixture . detectChanges ( ) ;
327+
328+ expect ( document . activeElement ) . toBe ( monthElement . nativeElement ) ;
329+
330+ dateFixture . nativeElement . dispatchEvent ( new KeyboardEvent ( 'keydown' , { key : 'shift.tab' } ) ) ;
331+ dateFixture . detectChanges ( ) ;
332+
333+ tick ( 200 ) ;
334+ dateFixture . detectChanges ( ) ;
335+
336+ expect ( document . activeElement ) . toBe ( yearElement . nativeElement ) ;
337+ } ) ) ;
338+
236339 } ) ;
237340 } ) ;
238341
0 commit comments