@@ -9,7 +9,7 @@ const reduceToDictionary = (parts: DatePartInfo[]) => parts.reduce((obj, x) => {
9
9
describe ( `DateTimeUtil Unit tests` , ( ) => {
10
10
describe ( 'Date Time Parsing' , ( ) => {
11
11
it ( 'should correctly parse all date time parts (base)' , ( ) => {
12
- const result = DateTimeUtil . parseDateTimeFormat ( 'dd/MM/yyyy HH:mm:ss tt ' ) ;
12
+ let result = DateTimeUtil . parseDateTimeFormat ( 'dd/MM/yyyy HH:mm:ss:SS a ' ) ;
13
13
const expected = [
14
14
{ start : 0 , end : 2 , type : DatePart . Date , format : 'dd' } ,
15
15
{ start : 2 , end : 3 , type : DatePart . Literal , format : '/' } ,
@@ -22,10 +22,16 @@ describe(`DateTimeUtil Unit tests`, () => {
22
22
{ start : 14 , end : 16 , type : DatePart . Minutes , format : 'mm' } ,
23
23
{ start : 16 , end : 17 , type : DatePart . Literal , format : ':' } ,
24
24
{ start : 17 , end : 19 , type : DatePart . Seconds , format : 'ss' } ,
25
- { start : 19 , end : 20 , type : DatePart . Literal , format : ' ' } ,
26
- { start : 20 , end : 22 , type : DatePart . AmPm , format : 'tt' }
25
+ { start : 19 , end : 20 , type : DatePart . Literal , format : ':' } ,
26
+ { start : 20 , end : 23 , type : DatePart . FractionalSeconds , format : 'SSS' } ,
27
+ { start : 23 , end : 24 , type : DatePart . Literal , format : ' ' } ,
28
+ { start : 24 , end : 26 , type : DatePart . AmPm , format : 'aa' }
27
29
] ;
28
30
expect ( JSON . stringify ( result ) ) . toEqual ( JSON . stringify ( expected ) ) ;
31
+
32
+ result = DateTimeUtil . parseDateTimeFormat ( 'dd/MM/yyyy HH:mm:ss:SS tt' ) ;
33
+ expected [ expected . length - 1 ] = { start : 24 , end : 26 , type : DatePart . AmPm , format : 'tt' }
34
+ expect ( JSON . stringify ( result ) ) . toEqual ( JSON . stringify ( expected ) ) ;
29
35
} ) ;
30
36
31
37
it ( 'should correctly parse date parts of with short formats' , ( ) => {
@@ -112,27 +118,37 @@ describe(`DateTimeUtil Unit tests`, () => {
112
118
expect ( result ) . toEqual ( new Date ( 2020 , 9 , 31 ) ) ;
113
119
} ) ;
114
120
115
- it ( 'should correctly parse values in h:m:s tt format' , ( ) => {
121
+ it ( 'should correctly parse values in h:m:s a, aa,.. or h:m:s tt format' , ( ) => {
116
122
const verifyTime = ( val : Date , hours = 0 , minutes = 0 , seconds = 0 , milliseconds = 0 ) => {
117
123
expect ( val . getHours ( ) ) . toEqual ( hours ) ;
118
124
expect ( val . getMinutes ( ) ) . toEqual ( minutes ) ;
119
125
expect ( val . getSeconds ( ) ) . toEqual ( seconds ) ;
120
126
expect ( val . getMilliseconds ( ) ) . toEqual ( milliseconds ) ;
121
127
} ;
122
128
123
- const parts = DateTimeUtil . parseDateTimeFormat ( 'h:m:s tt' ) ;
124
- let result = DateTimeUtil . parseValueFromMask ( '11:34:12 AM' , parts ) ;
125
- verifyTime ( result , 11 , 34 , 12 ) ;
126
- result = DateTimeUtil . parseValueFromMask ( '04:12:15 PM' , parts ) ;
127
- verifyTime ( result , 16 , 12 , 15 ) ;
128
- result = DateTimeUtil . parseValueFromMask ( '11:00:00 AM' , parts ) ;
129
- verifyTime ( result , 11 , 0 , 0 ) ;
130
- result = DateTimeUtil . parseValueFromMask ( '10:00:00 PM' , parts ) ;
131
- verifyTime ( result , 22 , 0 , 0 ) ;
132
- result = DateTimeUtil . parseValueFromMask ( '12:00:00 PM' , parts ) ;
133
- verifyTime ( result , 12 , 0 , 0 ) ;
134
- result = DateTimeUtil . parseValueFromMask ( '12:00:00 AM' , parts ) ;
135
- verifyTime ( result , 0 , 0 , 0 ) ;
129
+ const runTestsForParts = ( parts : DatePartInfo [ ] ) => {
130
+ let result = DateTimeUtil . parseValueFromMask ( '11:34:12 AM' , parts ) ;
131
+ verifyTime ( result , 11 , 34 , 12 ) ;
132
+ result = DateTimeUtil . parseValueFromMask ( '04:12:15 PM' , parts ) ;
133
+ verifyTime ( result , 16 , 12 , 15 ) ;
134
+ result = DateTimeUtil . parseValueFromMask ( '11:00:00 AM' , parts ) ;
135
+ verifyTime ( result , 11 , 0 , 0 ) ;
136
+ result = DateTimeUtil . parseValueFromMask ( '10:00:00 PM' , parts ) ;
137
+ verifyTime ( result , 22 , 0 , 0 ) ;
138
+ result = DateTimeUtil . parseValueFromMask ( '12:00:00 PM' , parts ) ;
139
+ verifyTime ( result , 12 , 0 , 0 ) ;
140
+ result = DateTimeUtil . parseValueFromMask ( '12:00:00 AM' , parts ) ;
141
+ verifyTime ( result , 0 , 0 , 0 ) ;
142
+ }
143
+
144
+ const inputFormat = 'h:m:s' ;
145
+ let parts = DateTimeUtil . parseDateTimeFormat ( `${ inputFormat } tt` ) ;
146
+ runTestsForParts ( parts ) ;
147
+
148
+ for ( let i = 0 ; i < 5 ; i ++ ) {
149
+ parts = DateTimeUtil . parseDateTimeFormat ( `${ inputFormat } ${ 'a' . repeat ( i + 1 ) } ` ) ;
150
+ runTestsForParts ( parts ) ;
151
+ }
136
152
} ) ;
137
153
} ) ;
138
154
@@ -159,7 +175,7 @@ describe(`DateTimeUtil Unit tests`, () => {
159
175
{ start : 5 , end : 6 , type : DatePart . Literal , format : ':' } ,
160
176
{ start : 6 , end : 8 , type : DatePart . Seconds , format : 'ss' } ,
161
177
{ start : 8 , end : 9 , type : DatePart . Literal , format : ' ' } ,
162
- { start : 9 , end : 11 , type : DatePart . AmPm , format : 'tt ' }
178
+ { start : 9 , end : 11 , type : DatePart . AmPm , format : 'a ' }
163
179
] ;
164
180
165
181
result = DateTimeUtil . parseValueFromMask ( input , dateParts ) ;
@@ -225,6 +241,7 @@ describe(`DateTimeUtil Unit tests`, () => {
225
241
expect ( DateTimeUtil . isDateOrTimeChar ( 'h' ) ) . toBeTrue ( ) ;
226
242
expect ( DateTimeUtil . isDateOrTimeChar ( 'm' ) ) . toBeTrue ( ) ;
227
243
expect ( DateTimeUtil . isDateOrTimeChar ( 's' ) ) . toBeTrue ( ) ;
244
+ expect ( DateTimeUtil . isDateOrTimeChar ( 'S' ) ) . toBeTrue ( ) ;
228
245
expect ( DateTimeUtil . isDateOrTimeChar ( ':' ) ) . toBeFalse ( ) ;
229
246
expect ( DateTimeUtil . isDateOrTimeChar ( '/' ) ) . toBeFalse ( ) ;
230
247
expect ( DateTimeUtil . isDateOrTimeChar ( '.' ) ) . toBeFalse ( ) ;
@@ -404,7 +421,35 @@ describe(`DateTimeUtil Unit tests`, () => {
404
421
expect ( date . getTime ( ) ) . toEqual ( new Date ( 2015 , 4 , 20 , 12 , 59 , 57 ) . getTime ( ) ) ;
405
422
} ) ;
406
423
407
- it ( 'should spin AM/PM portion correctly' , ( ) => {
424
+ it ( 'should spin fractional seconds portion correctly' , ( ) => {
425
+ // base
426
+ let date = new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 555 ) ;
427
+ DateTimeUtil . spinFractionalSeconds ( 1 , date , false ) ;
428
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 556 ) . getTime ( ) ) ;
429
+ DateTimeUtil . spinFractionalSeconds ( - 1 , date , false ) ;
430
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 555 ) . getTime ( ) ) ;
431
+
432
+ // delta !== 1
433
+ DateTimeUtil . spinFractionalSeconds ( 5 , date , false ) ;
434
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 560 ) . getTime ( ) ) ;
435
+ DateTimeUtil . spinFractionalSeconds ( - 6 , date , false ) ;
436
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 554 ) . getTime ( ) ) ;
437
+
438
+ // without looping over
439
+ date = new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 999 ) ;
440
+ DateTimeUtil . spinFractionalSeconds ( 1 , date , false ) ;
441
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 999 ) . getTime ( ) ) ;
442
+ DateTimeUtil . spinFractionalSeconds ( - 1000 , date , false ) ;
443
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 0 ) . getTime ( ) ) ;
444
+
445
+ // with looping over (seconds are not affected)
446
+ DateTimeUtil . spinFractionalSeconds ( 1001 , date , true ) ;
447
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 1 ) . getTime ( ) ) ;
448
+ DateTimeUtil . spinFractionalSeconds ( - 5 , date , true ) ;
449
+ expect ( date . getTime ( ) ) . toEqual ( new Date ( 2024 , 3 , 10 , 6 , 10 , 5 , 996 ) . getTime ( ) ) ;
450
+ } ) ;
451
+
452
+ it ( 'should spin AM/PM and a/p portion correctly' , ( ) => {
408
453
const currentDate = new Date ( 2015 , 4 , 31 , 4 , 59 , 59 ) ;
409
454
const newDate = new Date ( 2015 , 4 , 31 , 4 , 59 , 59 ) ;
410
455
// spin from AM to PM
@@ -414,6 +459,12 @@ describe(`DateTimeUtil Unit tests`, () => {
414
459
// spin from PM to AM
415
460
DateTimeUtil . spinAmPm ( currentDate , newDate , 'AM' ) ;
416
461
expect ( currentDate . getHours ( ) ) . toEqual ( 4 ) ;
462
+
463
+ DateTimeUtil . spinAmPm ( currentDate , newDate , 'p' ) ;
464
+ expect ( currentDate . getHours ( ) ) . toEqual ( 16 ) ;
465
+
466
+ DateTimeUtil . spinAmPm ( currentDate , newDate , 'a' ) ;
467
+ expect ( currentDate . getHours ( ) ) . toEqual ( 4 ) ;
417
468
} ) ;
418
469
419
470
it ( 'should compare dates correctly' , ( ) => {
0 commit comments