@@ -9,7 +9,7 @@ const reduceToDictionary = (parts: DatePartInfo[]) => parts.reduce((obj, x) => {
99describe ( `DateTimeUtil Unit tests` , ( ) => {
1010 describe ( 'Date Time Parsing' , ( ) => {
1111 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 ' ) ;
1313 const expected = [
1414 { start : 0 , end : 2 , type : DatePart . Date , format : 'dd' } ,
1515 { start : 2 , end : 3 , type : DatePart . Literal , format : '/' } ,
@@ -22,10 +22,16 @@ describe(`DateTimeUtil Unit tests`, () => {
2222 { start : 14 , end : 16 , type : DatePart . Minutes , format : 'mm' } ,
2323 { start : 16 , end : 17 , type : DatePart . Literal , format : ':' } ,
2424 { 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' }
2729 ] ;
2830 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 ) ) ;
2935 } ) ;
3036
3137 it ( 'should correctly parse date parts of with short formats' , ( ) => {
@@ -112,27 +118,37 @@ describe(`DateTimeUtil Unit tests`, () => {
112118 expect ( result ) . toEqual ( new Date ( 2020 , 9 , 31 ) ) ;
113119 } ) ;
114120
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' , ( ) => {
116122 const verifyTime = ( val : Date , hours = 0 , minutes = 0 , seconds = 0 , milliseconds = 0 ) => {
117123 expect ( val . getHours ( ) ) . toEqual ( hours ) ;
118124 expect ( val . getMinutes ( ) ) . toEqual ( minutes ) ;
119125 expect ( val . getSeconds ( ) ) . toEqual ( seconds ) ;
120126 expect ( val . getMilliseconds ( ) ) . toEqual ( milliseconds ) ;
121127 } ;
122128
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+ }
136152 } ) ;
137153 } ) ;
138154
@@ -159,7 +175,7 @@ describe(`DateTimeUtil Unit tests`, () => {
159175 { start : 5 , end : 6 , type : DatePart . Literal , format : ':' } ,
160176 { start : 6 , end : 8 , type : DatePart . Seconds , format : 'ss' } ,
161177 { 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 ' }
163179 ] ;
164180
165181 result = DateTimeUtil . parseValueFromMask ( input , dateParts ) ;
@@ -225,6 +241,7 @@ describe(`DateTimeUtil Unit tests`, () => {
225241 expect ( DateTimeUtil . isDateOrTimeChar ( 'h' ) ) . toBeTrue ( ) ;
226242 expect ( DateTimeUtil . isDateOrTimeChar ( 'm' ) ) . toBeTrue ( ) ;
227243 expect ( DateTimeUtil . isDateOrTimeChar ( 's' ) ) . toBeTrue ( ) ;
244+ expect ( DateTimeUtil . isDateOrTimeChar ( 'S' ) ) . toBeTrue ( ) ;
228245 expect ( DateTimeUtil . isDateOrTimeChar ( ':' ) ) . toBeFalse ( ) ;
229246 expect ( DateTimeUtil . isDateOrTimeChar ( '/' ) ) . toBeFalse ( ) ;
230247 expect ( DateTimeUtil . isDateOrTimeChar ( '.' ) ) . toBeFalse ( ) ;
@@ -404,7 +421,35 @@ describe(`DateTimeUtil Unit tests`, () => {
404421 expect ( date . getTime ( ) ) . toEqual ( new Date ( 2015 , 4 , 20 , 12 , 59 , 57 ) . getTime ( ) ) ;
405422 } ) ;
406423
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' , ( ) => {
408453 const currentDate = new Date ( 2015 , 4 , 31 , 4 , 59 , 59 ) ;
409454 const newDate = new Date ( 2015 , 4 , 31 , 4 , 59 , 59 ) ;
410455 // spin from AM to PM
@@ -414,6 +459,12 @@ describe(`DateTimeUtil Unit tests`, () => {
414459 // spin from PM to AM
415460 DateTimeUtil . spinAmPm ( currentDate , newDate , 'AM' ) ;
416461 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 ) ;
417468 } ) ;
418469
419470 it ( 'should compare dates correctly' , ( ) => {
0 commit comments