@@ -883,3 +883,169 @@ describe("formatAsHeader", () => {
883883 } ) ;
884884 }
885885} ) ;
886+
887+ describe ( "formatTimeOnly" , ( ) => {
888+ type Testcase = {
889+ description : string ;
890+ dueDate : DueDate ;
891+ expected : string ;
892+ } ;
893+
894+ const testcases : Testcase [ ] = [
895+ {
896+ description : "no time component" ,
897+ dueDate : {
898+ start : {
899+ raw : makeDate ( 2024 , 0 , 1 ) ,
900+ hasTime : false ,
901+ isOverdue : false ,
902+ isCurrentYear : true ,
903+ flag : "today" ,
904+ } ,
905+ end : undefined ,
906+ } ,
907+ expected : "" ,
908+ } ,
909+ {
910+ description : "single time" ,
911+ dueDate : {
912+ start : {
913+ raw : makeDate ( 2024 , 0 , 1 , 14 , 30 ) ,
914+ hasTime : true ,
915+ isOverdue : false ,
916+ isCurrentYear : true ,
917+ flag : "today" ,
918+ } ,
919+ end : undefined ,
920+ } ,
921+ expected : "2:30 PM" ,
922+ } ,
923+ {
924+ description : "same-day duration" ,
925+ dueDate : {
926+ start : {
927+ raw : makeDate ( 2024 , 0 , 1 , 14 , 30 ) ,
928+ hasTime : true ,
929+ isOverdue : false ,
930+ isCurrentYear : true ,
931+ flag : "today" ,
932+ } ,
933+ end : {
934+ raw : makeDate ( 2024 , 0 , 1 , 15 , 30 ) ,
935+ hasTime : true ,
936+ isOverdue : false ,
937+ isCurrentYear : true ,
938+ flag : "today" ,
939+ } ,
940+ } ,
941+ expected : "2:30 PM - 3:30 PM" ,
942+ } ,
943+ {
944+ description : "same-day duration (different times)" ,
945+ dueDate : {
946+ start : {
947+ raw : makeDate ( 2024 , 1 , 15 , 9 , 0 ) ,
948+ hasTime : true ,
949+ isOverdue : false ,
950+ isCurrentYear : true ,
951+ flag : undefined ,
952+ } ,
953+ end : {
954+ raw : makeDate ( 2024 , 1 , 15 , 17 , 0 ) ,
955+ hasTime : true ,
956+ isOverdue : false ,
957+ isCurrentYear : true ,
958+ flag : undefined ,
959+ } ,
960+ } ,
961+ expected : "9:00 AM - 5:00 PM" ,
962+ } ,
963+ {
964+ description : "multi-day duration (today to tomorrow)" ,
965+ dueDate : {
966+ start : {
967+ raw : makeDate ( 2024 , 0 , 1 , 14 , 0 ) ,
968+ hasTime : true ,
969+ isOverdue : false ,
970+ isCurrentYear : true ,
971+ flag : "today" ,
972+ } ,
973+ end : {
974+ raw : makeDate ( 2024 , 0 , 2 , 10 , 0 ) ,
975+ hasTime : true ,
976+ isOverdue : false ,
977+ isCurrentYear : true ,
978+ flag : "tomorrow" ,
979+ } ,
980+ } ,
981+ expected : "2:00 PM - Tomorrow at 10:00 AM" ,
982+ } ,
983+ {
984+ description : "multi-day duration (tomorrow to next week)" ,
985+ dueDate : {
986+ start : {
987+ raw : makeDate ( 2024 , 0 , 2 , 9 , 0 ) ,
988+ hasTime : true ,
989+ isOverdue : false ,
990+ isCurrentYear : true ,
991+ flag : "tomorrow" ,
992+ } ,
993+ end : {
994+ raw : makeDate ( 2024 , 0 , 5 , 17 , 0 ) ,
995+ hasTime : true ,
996+ isOverdue : false ,
997+ isCurrentYear : true ,
998+ flag : "nextWeek" ,
999+ } ,
1000+ } ,
1001+ expected : "9:00 AM - Friday at 5:00 PM" ,
1002+ } ,
1003+ {
1004+ description : "multi-day duration (specific dates)" ,
1005+ dueDate : {
1006+ start : {
1007+ raw : makeDate ( 2024 , 0 , 3 , 12 , 0 ) ,
1008+ hasTime : true ,
1009+ isOverdue : false ,
1010+ isCurrentYear : true ,
1011+ flag : undefined ,
1012+ } ,
1013+ end : {
1014+ raw : makeDate ( 2024 , 0 , 8 , 12 , 0 ) ,
1015+ hasTime : true ,
1016+ isOverdue : false ,
1017+ isCurrentYear : true ,
1018+ flag : undefined ,
1019+ } ,
1020+ } ,
1021+ expected : "12:00 PM - Jan 8 at 12:00 PM" ,
1022+ } ,
1023+ {
1024+ description : "multi-day duration (different years)" ,
1025+ dueDate : {
1026+ start : {
1027+ raw : makeDate ( 2024 , 11 , 30 , 9 , 0 ) ,
1028+ hasTime : true ,
1029+ isOverdue : false ,
1030+ isCurrentYear : true ,
1031+ flag : undefined ,
1032+ } ,
1033+ end : {
1034+ raw : makeDate ( 2025 , 0 , 2 , 17 , 0 ) ,
1035+ hasTime : true ,
1036+ isOverdue : false ,
1037+ isCurrentYear : false ,
1038+ flag : undefined ,
1039+ } ,
1040+ } ,
1041+ expected : "9:00 AM - Jan 2, 2025 at 5:00 PM" ,
1042+ } ,
1043+ ] ;
1044+
1045+ for ( const tc of testcases ) {
1046+ it ( tc . description , ( ) => {
1047+ const actual = DueDate . formatTimeOnly ( tc . dueDate ) ;
1048+ expect ( actual ) . toBe ( tc . expected ) ;
1049+ } ) ;
1050+ }
1051+ } ) ;
0 commit comments