@@ -29,102 +29,47 @@ public function testCreateFromFormatReturnsInstance()
2929 $ this ->assertTrue ($ d instanceof Chronos);
3030 }
3131
32- public function testCreateFromFormatWithTestNowMissingYear ()
32+ public function testCreateFromFormatMissingTimeIsZero ()
3333 {
34- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
35- $ d = Chronos::createFromFormat ('m-d H:i:s ' , '10-05 09:15:30 ' );
36- $ this ->assertDateTime ($ d , 2020 , 10 , 5 , 9 , 15 , 30 );
37- }
38-
39- public function testCreateFromFormatWithTestNowMissingDate ()
40- {
41- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
42- $ d = Chronos::createFromFormat ('H:i:s ' , '09:15:30 ' );
43- $ this ->assertDateTime ($ d , 2020 , 12 , 1 , 9 , 15 , 30 );
44- }
45-
46- public function testCreateFromFormatWithTestNowMissingTime ()
47- {
48- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
49- $ d = Chronos::createFromFormat ('Y-m-d ' , '2021-06-15 ' );
50- $ this ->assertDateTime ($ d , 2021 , 6 , 15 , 14 , 30 , 45 );
51- }
52-
53- public function testCreateFromFormatWithTestNowPartialDate ()
54- {
55- Chronos::setTestNow (new Chronos ('2020-12-01 00:00:00 ' ));
56- $ d = Chronos::createFromFormat ('m-d ' , '10-05 ' );
57- $ this ->assertDateTime ($ d , 2020 , 10 , 5 , 0 , 0 , 0 );
58- }
59-
60- public function testCreateFromFormatWithTestNowDayOnly ()
61- {
62- Chronos::setTestNow (new Chronos ('2020-12-01 00:00:00 ' ));
63- $ d = Chronos::createFromFormat ('d ' , '05 ' );
64- $ this ->assertDateTime ($ d , 2020 , 12 , 5 , 0 , 0 , 0 );
65- }
66-
67- public function testCreateFromFormatWithTestNowComplete ()
68- {
69- // When format is complete, testNow should not affect the result
70- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
71- $ d = Chronos::createFromFormat ('Y-m-d H:i:s ' , '1975-05-21 22:32:11 ' );
72- $ this ->assertDateTime ($ d , 1975 , 5 , 21 , 22 , 32 , 11 );
73- }
74-
75- public function testCreateFromFormatWithTestNowResetModifier ()
76- {
77- // The '!' modifier resets to Unix epoch, should not use testNow
78- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
79- $ d = Chronos::createFromFormat ('!Y-m-d ' , '2021-06-15 ' );
80- $ this ->assertDateTime ($ d , 2021 , 6 , 15 , 0 , 0 , 0 );
81- }
82-
83- public function testCreateFromFormatWithTestNowPipeModifier ()
84- {
85- // The '|' modifier resets unspecified components to zero, should not use testNow
86- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
87- $ d = Chronos::createFromFormat ('Y-m-d| ' , '2021-06-15 ' );
88- $ this ->assertDateTime ($ d , 2021 , 6 , 15 , 0 , 0 , 0 );
34+ // Missing time components should be zero, not current time
35+ $ d = Chronos::createFromFormat ('Y-m-d ' , '2024-03-14 ' );
36+ $ this ->assertDateTime ($ d , 2024 , 3 , 14 , 0 , 0 , 0 );
37+ $ this ->assertSame (0 , $ d ->micro );
8938 }
9039
91- public function testCreateFromFormatWithoutTestNow ()
40+ public function testCreateFromFormatMissingSecondsIsZero ()
9241 {
93- // Without testNow set, behavior should use real current time for missing components
94- Chronos::setTestNow (null );
95- $ d = Chronos::createFromFormat ('Y-m-d H:i:s ' , '1975-05-21 22:32:11 ' );
96- $ this ->assertDateTime ($ d , 1975 , 5 , 21 , 22 , 32 , 11 );
42+ // Missing seconds should be zero
43+ $ d = Chronos::createFromFormat ('Y-m-d H:i ' , '2024-03-14 12:30 ' );
44+ $ this ->assertDateTime ($ d , 2024 , 3 , 14 , 12 , 30 , 0 );
9745 }
9846
99- public function testCreateFromFormatWithTestNowEscapedCharacters ()
47+ public function testCreateFromFormatMissingDateIsEpoch ()
10048 {
101- // Escaped format characters should not be treated as format specifiers
102- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
103- $ d = Chronos::createFromFormat ('\Y\-m-d ' , 'Y-10-05 ' );
104- $ this ->assertDateTime ($ d , 2020 , 10 , 5 , 14 , 30 , 45 );
49+ // Missing date components should be Unix epoch (1970-01-01)
50+ $ d = Chronos::createFromFormat ('H:i:s ' , '12:30:45 ' );
51+ $ this ->assertDateTime ($ d , 1970 , 1 , 1 , 12 , 30 , 45 );
10552 }
10653
107- public function testCreateFromFormatWithTestNowMicroseconds ()
54+ public function testCreateFromFormatMissingMicrosecondsIsZero ()
10855 {
109- Chronos:: setTestNow ( new Chronos ( ' 2020-12-01 14:30:45.123456 ' ));
110- $ d = Chronos::createFromFormat ('Y-m-d H:i:s ' , '2021-06-15 09:15:30 ' );
111- $ this ->assertSame (123456 , $ d ->micro );
56+ // Missing microseconds should be zero
57+ $ d = Chronos::createFromFormat ('Y-m-d H:i:s ' , '2024-03-14 12:30:45 ' );
58+ $ this ->assertSame (0 , $ d ->micro );
11259 }
11360
114- public function testCreateFromFormatWithTestNowUnixTimestamp ()
61+ public function testCreateFromFormatWithExplicitPipeModifier ()
11562 {
116- // Unix timestamp ('U' format) sets all components, should not use testNow
117- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
118- $ d = Chronos::createFromFormat ('U ' , '0 ' );
119- $ this ->assertDateTime ($ d , 1970 , 1 , 1 , 0 , 0 , 0 );
63+ // Explicit | should still work
64+ $ d = Chronos::createFromFormat ('Y-m-d| ' , '2024-03-14 ' );
65+ $ this ->assertDateTime ($ d , 2024 , 3 , 14 , 0 , 0 , 0 );
12066 }
12167
122- public function testCreateFromFormatWithTestNowNegativeUnixTimestamp ()
68+ public function testCreateFromFormatWithExplicitBangModifier ()
12369 {
124- // Negative Unix timestamp should also not use testNow
125- Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
126- $ d = Chronos::createFromFormat ('U ' , '-1000 ' );
127- $ this ->assertDateTime ($ d , 1969 , 12 , 31 , 23 , 43 , 20 );
70+ // Explicit ! should still work
71+ $ d = Chronos::createFromFormat ('!Y-m-d ' , '2024-03-14 ' );
72+ $ this ->assertDateTime ($ d , 2024 , 3 , 14 , 0 , 0 , 0 );
12873 }
12974
13075 public function testCreateFromFormatWithTimezoneString ()
@@ -147,6 +92,18 @@ public function testCreateFromFormatWithMillis()
14792 $ this ->assertSame (254687 , $ d ->micro );
14893 }
14994
95+ public function testCreateFromFormatWithUnixTimestamp ()
96+ {
97+ $ d = Chronos::createFromFormat ('U ' , '0 ' );
98+ $ this ->assertDateTime ($ d , 1970 , 1 , 1 , 0 , 0 , 0 );
99+ }
100+
101+ public function testCreateFromFormatWithNegativeUnixTimestamp ()
102+ {
103+ $ d = Chronos::createFromFormat ('U ' , '-1000 ' );
104+ $ this ->assertDateTime ($ d , 1969 , 12 , 31 , 23 , 43 , 20 );
105+ }
106+
150107 public function testCreateFromFormatInvalidFormat ()
151108 {
152109 $ parseException = null ;
@@ -160,4 +117,12 @@ public function testCreateFromFormatInvalidFormat()
160117 $ this ->assertIsArray (Chronos::getLastErrors ());
161118 $ this ->assertNotEmpty (Chronos::getLastErrors ()['errors ' ]);
162119 }
120+
121+ public function testCreateFromFormatDoesNotUseTestNow ()
122+ {
123+ // testNow should not affect createFromFormat - missing components are zero
124+ Chronos::setTestNow (new Chronos ('2020-12-01 14:30:45 ' ));
125+ $ d = Chronos::createFromFormat ('Y-m-d ' , '2024-03-14 ' );
126+ $ this ->assertDateTime ($ d , 2024 , 3 , 14 , 0 , 0 , 0 );
127+ }
163128}
0 commit comments