11import  { Component ,  DebugElement ,  ViewChild }  from  '@angular/core' ; 
2- import  { async ,  ComponentFixture ,  fakeAsync ,  flush ,  TestBed }  from  '@angular/core/testing' ; 
2+ import  { async ,  ComponentFixture ,  fakeAsync ,  flush ,  TestBed , tick }  from  '@angular/core/testing' ; 
33import  { FormsModule ,  NgForm }  from  '@angular/forms' ; 
44import  { By }  from  '@angular/platform-browser' ; 
55import  *  as  _moment  from  'moment' ; 
@@ -24,7 +24,7 @@ if ('default' in _moment) {
2424 </form>` 
2525} ) 
2626class  DateModelComponent  { 
27-  dateValue : any ; 
27+  dateValue : number ; 
2828 @ViewChild ( DlDateTimeInputDirective ,  { static : false } )  input : DlDateTimeInputDirective < number > ; 
2929 dateTimeFilter : ( value : ( number  |  null ) )  =>  boolean  =  ( )  =>  true ; 
3030} 
@@ -71,7 +71,7 @@ describe('DlDateTimeInputDirective', () => {
7171 it ( 'should be displayed using default format' ,  fakeAsync ( ( )  =>  { 
7272 const  octoberFirst  =  moment ( '2018年10月01日' ) ; 
7373 const  expectedValue  =  octoberFirst . format ( DL_DATE_TIME_DISPLAY_FORMAT_DEFAULT ) ; 
74-  component . dateValue  =  octoberFirst . toDate ( ) ; 
74+  component . dateValue  =  octoberFirst . valueOf ( ) ; 
7575 fixture . detectChanges ( ) ; 
7676 flush ( ) ; 
7777 const  inputElement  =  debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ; 
@@ -107,7 +107,7 @@ describe('DlDateTimeInputDirective', () => {
107107 expect ( inputElement . classList ) . toContain ( 'ng-touched' ) ; 
108108 } ) ; 
109109
110-  it ( 'should reformat the input value on blur' ,  ( )  =>  { 
110+  it ( 'should reformat the input value on blur' ,  fakeAsync ( ( )  =>  { 
111111 const  inputElement  =  debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ; 
112112
113113 inputElement . value  =  '1/1/2001' ; 
@@ -120,19 +120,21 @@ describe('DlDateTimeInputDirective', () => {
120120 fixture . detectChanges ( ) ; 
121121
122122 expect ( inputElement . value ) . toBe ( moment ( '2001年01月01日' ) . format ( DL_DATE_TIME_DISPLAY_FORMAT_DEFAULT ) ) ; 
123-  } ) ; 
123+  } ) ) ; 
124124
125125 it ( 'should not reformat invalid dates on blur' ,  ( )  =>  { 
126126 const  inputElement  =  debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ; 
127127
128-  inputElement . value  =  'very-valid -date' ; 
128+  inputElement . value  =  'very-invalid -date' ; 
129129 inputElement . dispatchEvent ( new  Event ( 'input' ) ) ; 
130130 fixture . detectChanges ( ) ; 
131131
132+  expect ( inputElement . value ) . toBe ( 'very-invalid-date' ) ; 
133+ 132134 inputElement . dispatchEvent ( new  Event ( 'blur' ) ) ; 
133135 fixture . detectChanges ( ) ; 
134136
135-  expect ( inputElement . value ) . toBe ( 'very-valid -date' ) ; 
137+  expect ( inputElement . value ) . toBe ( 'very-invalid -date' ) ; 
136138 } ) ; 
137139
138140 it ( 'should consider empty input to be valid (for non-required inputs)' ,  ( )  =>  { 
@@ -143,7 +145,7 @@ describe('DlDateTimeInputDirective', () => {
143145
144146 it ( 'should add ng-invalid on invalid input' ,  fakeAsync ( ( )  =>  { 
145147 const  novemberFirst  =  moment ( '2018年11月01日' ) ; 
146-  component . dateValue  =  novemberFirst . toDate ( ) ; 
148+  component . dateValue  =  novemberFirst . valueOf ( ) ; 
147149 fixture . detectChanges ( ) ; 
148150 flush ( ) ; 
149151
@@ -186,10 +188,13 @@ describe('DlDateTimeInputDirective', () => {
186188 expect ( inputElement . classList ) . toContain ( 'ng-valid' ) ; 
187189 } ) ; 
188190
189-  it ( 'should add ng-invalid for valid input of filtered date' ,  ( )  =>  { 
190-  const  filteredValue  =  moment ( '2018年10月29日T17:00' ) . valueOf ( ) ; 
191+  it ( 'should add ng-invalid for input of filtered out date' ,  ( )  =>  { 
192+  const  expectedErrorValue  =  moment ( '2018年10月29日T17:00' ) . valueOf ( ) ; 
193+ 194+  const  allowedValue  =  moment ( '2019年10月29日T17:00' ) . valueOf ( ) ; 
195+ 191196 spyOn ( component ,  'dateTimeFilter' ) . and . callFake ( ( date : number )  =>  { 
192-  return  date  !== filteredValue ; 
197+  return  date  === allowedValue ; 
193198 } ) ; 
194199
195200 const  inputElement  =  debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ; 
@@ -201,9 +206,33 @@ describe('DlDateTimeInputDirective', () => {
201206
202207 const  control  =  debugElement . children [ 0 ] . injector . get ( NgForm ) . control . get ( 'dateValue' ) ; 
203208 expect ( control . hasError ( 'dlDateTimeInputFilter' ) ) . toBe ( true ) ; 
204-  expect ( control . errors . dlDateTimeInputFilter . value ) . toBe ( filteredValue . valueOf ( ) ) ; 
209+  const  value  =  control . errors . dlDateTimeInputFilter . value ; 
210+  expect ( value ) . toBe ( expectedErrorValue ) ; 
205211 } ) ; 
206212
213+  it ( 'should remove ng-invalid when model is updated with valid date' ,  fakeAsync ( ( )  =>  { 
214+  const  allowedValue  =  moment ( '2019年10月29日T17:00' ) . valueOf ( ) ; 
215+  spyOn ( component ,  'dateTimeFilter' ) . and . callFake ( ( date : number )  =>  { 
216+  return  date  ===  allowedValue ; 
217+  } ) ; 
218+ 219+  const  inputElement  =  debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ; 
220+  inputElement . value  =  '10/29/2018 05:00 PM' ; 
221+  inputElement . dispatchEvent ( new  Event ( 'blur' ) ) ; 
222+ 223+  fixture . detectChanges ( ) ; 
224+ 225+  expect ( inputElement . classList ) . toContain ( 'ng-invalid' ) ; 
226+ 227+  component . dateValue  =  allowedValue ; 
228+ 229+  fixture . detectChanges ( ) ; 
230+  tick ( ) ; 
231+  fixture . detectChanges ( ) ; 
232+ 233+  expect ( inputElement . classList ) . toContain ( 'ng-valid' ) ; 
234+  } ) ) ; 
235+ 207236 it ( 'should disable input when setDisabled is called' ,  ( )  =>  { 
208237 const  inputElement  =  debugElement . query ( By . directive ( DlDateTimeInputDirective ) ) . nativeElement ; 
209238 expect ( inputElement . disabled ) . toBe ( false ) ; 
0 commit comments