@@ -604,51 +604,84 @@ int main (int, char**)
604604 t.is (Datetime (" 5/1/2011" , " m/d/Y" ).dayOfYear (), 121 , " dayOfYear (5/1/2011) -> 121" );
605605 t.is (Datetime (" 12/31/2011" , " m/d/Y" ).dayOfYear (), 365 , " dayOfYear (12/31/2011) -> 365" );
606606
607- // Relative dates.
608- Datetime r1 (" today" );
609- t.ok (r1.sameDay (now), " today = now" );
610-
611- Datetime r4 (" sunday" );
612- if (now.dayOfWeek () >= 0 )
613- t.ok (r4.sameDay (now + (0 - now.dayOfWeek () + 7 ) * 86400 ), " next sunday" );
614- else
615- t.ok (r4.sameDay (now + (0 - now.dayOfWeek ()) * 86400 ), " next sunday" );;
616-
617- Datetime r5 (" monday" );
618- if (now.dayOfWeek () >= 1 )
619- t.ok (r5.sameDay (now + (1 - now.dayOfWeek () + 7 ) * 86400 ), " next monday" );
620- else
621- t.ok (r5.sameDay (now + (1 - now.dayOfWeek ()) * 86400 ), " next monday" );;
622-
623- Datetime r6 (" tuesday" );
624- if (now.dayOfWeek () >= 2 )
625- t.ok (r6.sameDay (now + (2 - now.dayOfWeek () + 7 ) * 86400 ), " next tuesday" );
626- else
627- t.ok (r6.sameDay (now + (2 - now.dayOfWeek ()) * 86400 ), " next tuesday" );;
628-
629- Datetime r7 (" wednesday" );
630- if (now.dayOfWeek () >= 3 )
631- t.ok (r7.sameDay (now + (3 - now.dayOfWeek () + 7 ) * 86400 ), " next wednesday" );
632- else
633- t.ok (r7.sameDay (now + (3 - now.dayOfWeek ()) * 86400 ), " next wednesday" );;
634-
635- Datetime r8 (" thursday" );
636- if (now.dayOfWeek () >= 4 )
637- t.ok (r8.sameDay (now + (4 - now.dayOfWeek () + 7 ) * 86400 ), " next thursday" );
638- else
639- t.ok (r8.sameDay (now + (4 - now.dayOfWeek ()) * 86400 ), " next thursday" );;
640-
641- Datetime r9 (" friday" );
642- if (now.dayOfWeek () >= 5 )
643- t.ok (r9.sameDay (now + (5 - now.dayOfWeek () + 7 ) * 86400 ), " next friday" );
644- else
645- t.ok (r9.sameDay (now + (5 - now.dayOfWeek ()) * 86400 ), " next friday" );;
646-
647- Datetime r10 (" saturday" );
648- if (now.dayOfWeek () >= 6 )
649- t.ok (r10.sameDay (now + (6 - now.dayOfWeek () + 7 ) * 86400 ), " next saturday" );
650- else
651- t.ok (r10.sameDay (now + (6 - now.dayOfWeek ()) * 86400 ), " next saturday" );;
607+ // Relative dates - look ahead
608+ {
609+ Datetime::timeRelative = true ;
610+
611+ Datetime r1 (" today" );
612+ t.ok (r1.sameDay (now), " today = now" );
613+
614+ Datetime r4 (" sunday" );
615+ if (now.dayOfWeek () >= 0 )
616+ t.ok (r4.sameDay (now + (0 - now.dayOfWeek () + 7 ) * 86400 ), " next sunday" );
617+ else
618+ t.ok (r4.sameDay (now + (0 - now.dayOfWeek ()) * 86400 ), " next sunday" );;
619+
620+ Datetime r5 (" monday" );
621+ if (now.dayOfWeek () >= 1 )
622+ t.ok (r5.sameDay (now + (1 - now.dayOfWeek () + 7 ) * 86400 ), " next monday" );
623+ else
624+ t.ok (r5.sameDay (now + (1 - now.dayOfWeek ()) * 86400 ), " next monday" );;
625+
626+ Datetime r6 (" tuesday" );
627+ if (now.dayOfWeek () >= 2 )
628+ t.ok (r6.sameDay (now + (2 - now.dayOfWeek () + 7 ) * 86400 ), " next tuesday" );
629+ else
630+ t.ok (r6.sameDay (now + (2 - now.dayOfWeek ()) * 86400 ), " next tuesday" );;
631+
632+ Datetime r7 (" wednesday" );
633+ if (now.dayOfWeek () >= 3 )
634+ t.ok (r7.sameDay (now + (3 - now.dayOfWeek () + 7 ) * 86400 ), " next wednesday" );
635+ else
636+ t.ok (r7.sameDay (now + (3 - now.dayOfWeek ()) * 86400 ), " next wednesday" );;
637+
638+ Datetime r8 (" thursday" );
639+ if (now.dayOfWeek () >= 4 )
640+ t.ok (r8.sameDay (now + (4 - now.dayOfWeek () + 7 ) * 86400 ), " next thursday" );
641+ else
642+ t.ok (r8.sameDay (now + (4 - now.dayOfWeek ()) * 86400 ), " next thursday" );;
643+
644+ Datetime r9 (" friday" );
645+ if (now.dayOfWeek () >= 5 )
646+ t.ok (r9.sameDay (now + (5 - now.dayOfWeek () + 7 ) * 86400 ), " next friday" );
647+ else
648+ t.ok (r9.sameDay (now + (5 - now.dayOfWeek ()) * 86400 ), " next friday" );;
649+
650+ Datetime r10 (" saturday" );
651+ if (now.dayOfWeek () >= 6 )
652+ t.ok (r10.sameDay (now + (6 - now.dayOfWeek () + 7 ) * 86400 ), " next saturday" );
653+ else
654+ t.ok (r10.sameDay (now + (6 - now.dayOfWeek ()) * 86400 ), " next saturday" );;
655+ }
656+
657+ // Relative dates - look back
658+ {
659+ Datetime::timeRelative = false ;
660+
661+ Datetime r1 (" today" );
662+ t.ok (r1.sameDay (now), " today = now" );
663+
664+ Datetime r4 (" sunday" );
665+ t.ok (r4.sameDay (now + (0 - now.dayOfWeek ()) * 86400 ), " previous sunday" );
666+
667+ Datetime r5 (" monday" );
668+ t.ok (r5.sameDay (now + (1 - now.dayOfWeek ()) * 86400 ), " previous monday" );
669+
670+ Datetime r6 (" tuesday" );
671+ t.ok (r6.sameDay (now + (2 - now.dayOfWeek ()) * 86400 ), " previous tuesday" );
672+
673+ Datetime r7 (" wednesday" );
674+ t.ok (r7.sameDay (now + (3 - now.dayOfWeek ()) * 86400 ), " previous wednesday" );
675+
676+ Datetime r8 (" thursday" );
677+ t.ok (r8.sameDay (now + (4 - now.dayOfWeek ()) * 86400 ), " previous thursday" );
678+
679+ Datetime r9 (" friday" );
680+ t.ok (r9.sameDay (now + (5 - now.dayOfWeek ()) * 86400 ), " previous friday" );
681+
682+ Datetime r10 (" saturday" );
683+ t.ok (r10.sameDay (now + (6 - now.dayOfWeek ()) * 86400 ), " previous saturday" );
684+ }
652685
653686 Datetime r11 (" eow" );
654687 t.ok (r11 < now + (8 * 86400 ), " eow < 7 days away" );
@@ -686,9 +719,77 @@ int main (int, char**)
686719 Datetime r19d (" eoq" );
687720 t.ok (r19d > now, " eoq > now" );
688721
689- Datetime first (" 1st" );
690- t.notok (first.sameMonth (now), " 1st not in same month as now" );
691- t.is (first.day (), 1 , " 1st day is 1" );
722+ {
723+ Datetime::timeRelative = true ;
724+
725+ Datetime first (" 1st" );
726+ std::cout << " actual (first - relative:true): " << first.toISO () << " now: " << now.toISO () << std::endl;
727+ if (now.day () >= 1 )
728+ t.notok (first.sameMonth (now), " 1st not in same month as now" );
729+ else
730+ t.ok (first.sameMonth (now), " 1st in same month as now" );
731+ t.is (first.day (), 1 , " 1st day is 1" );
732+
733+ Datetime second (" 2nd" );
734+ std::cout << " actual (second - relative:true): " << second.toISO () << " now: " << now.toISO () << std::endl;
735+ if (now.day () >= 2 )
736+ t.notok (second.sameMonth (now), " 2nd not in same month as now" );
737+ else
738+ t.ok (second.sameMonth (now), " 2nd in same month as now" );
739+ t.is (second.day (), 2 , " 2nd day is 2" );
740+
741+ Datetime third (" 3rd" );
742+ std::cout << " actual (third - relative:true): " << third.toISO () << " now: " << now.toISO () << std::endl;
743+ if (now.day () >= 3 )
744+ t.notok (third.sameMonth (now), " 3rd not in same month as now" );
745+ else
746+ t.ok (third.sameMonth (now), " 3rd in same month as now" );
747+ t.is (third.day (), 3 , " 3rd day is 3" );
748+
749+ Datetime fourth (" 4th" );
750+ std::cout << " actual (fourth - relative:true): " << fourth.toISO () << " now: " << now.toISO () << std::endl;
751+ if (now.day () >= 4 )
752+ t.notok (fourth.sameMonth (now), " 4th not in same month as now" );
753+ else
754+ t.ok (fourth.sameMonth (now), " 4th not in same month as now" );
755+ t.is (fourth.day (), 4 , " 4th day is 4" );
756+ }
757+
758+ {
759+ Datetime::timeRelative = false ;
760+
761+ Datetime first (" 1st" );
762+ std::cout << " actual (first - relative:false): " << first.toISO () << " now: " << now.toISO () << std::endl;
763+ if (now.day () >= 1 )
764+ t.ok (first.month () == now.month (), " 1st in same month as now" );
765+ else
766+ t.ok ((first.month () - now.month () - 12 ) % 12 == -1 , " 1st in previous month" );
767+ t.is (first.day (), 1 , " 1st day is 1" );
768+
769+ Datetime second (" 2nd" );
770+ std::cout << " actual (second - relative:false): " << second.toISO () << " now: " << now.toISO () << std::endl;
771+ if (now.day () >= 2 )
772+ t.ok (second.month () == now.month (), " 2nd in same month as now" );
773+ else
774+ t.ok ((second.month () - now.month () - 12 ) % 12 == -1 , " 2nd in previous month" );
775+ t.is (second.day (), 2 , " 2nd day is 2" );
776+
777+ Datetime third (" 3rd" );
778+ std::cout << " actual (third - relative:false): " << third.toISO () << " now: " << now.toISO () << std::endl;
779+ if (now.day () >= 3 )
780+ t.ok (third.month () == now.month (), " 3rd in same month as now" );
781+ else
782+ t.ok ((third.month () - now.month () - 12 ) % 12 == -1 , " 3rd in previous month" );
783+ t.is (third.day (), 3 , " 3rd day is 3" );
784+
785+ Datetime fourth (" 4th" );
786+ std::cout << " actual (fourth - relative:false): " << fourth.toISO () << " now: " << now.toISO () << std::endl;
787+ if (now.day () >= 4 )
788+ t.ok (fourth.month () == now.month (), " 4th in same month as now" );
789+ else
790+ t.ok ((fourth.month () - now.month () - 12 ) % 12 == -1 , " 4th in previous month" );
791+ t.is (fourth.day (), 4 , " 4th day is 4" );
792+ }
692793
693794 Datetime later (" later" );
694795 t.is (later.month (), 1 , " later -> m = 1" );
0 commit comments