Browse Source

Add tests for toDate

Jamison Bryant 1 year ago
parent
commit
2bcc7ee346
2 changed files with 28 additions and 35 deletions
  1. 8 9
      src/Core/functions.php
  2. 20 26
      tests/TestCase/Core/FunctionsTest.php

+ 8 - 9
src/Core/functions.php

@@ -21,6 +21,7 @@ use Cake\I18n\DateTime;
 use Cake\I18n\FrozenDate;
 use DateTimeInterface;
 use Exception;
+use IntlDateFormatter;
 use JsonException;
 use Stringable;
 
@@ -530,10 +531,10 @@ function toDateTime(mixed $value): ?DateTime
 }
 
 /**
- * Converts a value to a DateInterface.
+ * Converts a value to a native Date object.
  *
  *  integer  - value is treated as a Unix timestamp
- *  string - value is treated as a ISO-8601 (Atom) formatted timestamp
+ *  string - value is treated as a I18N short formatted date
  *  Other values returns as null.
  *
  * @param mixed $value The value to convert to DateInterface.
@@ -544,9 +545,9 @@ function toDate(mixed $value): ?Date
 {
     if ($value instanceof Date) {
         return $value;
-    }
-
-    if (is_int($value)) {
+    } else if ($value instanceof DateTimeInterface) {
+        return Date::parse($value);
+    } else if (is_int($value)) {
         try {
             $ts = DateTime::createFromTimestamp($value);
             return Date::createFromArray([
@@ -557,11 +558,9 @@ function toDate(mixed $value): ?Date
         } catch (Exception) {
             return null;
         }
-    }
-
-    if (is_string($value)) {
+    } else if (is_string($value)) {
         try {
-            return Date::createFromFormat(DateTimeInterface::ATOM, $value);
+            return Date::parseDate($value, \IntlDateFormatter::SHORT);
         } catch (Exception) {
             return null;
         }

+ 20 - 26
tests/TestCase/Core/FunctionsTest.php

@@ -20,6 +20,7 @@ use Cake\Core\Configure;
 use Cake\Http\Response;
 use Cake\I18n\Date;
 use Cake\I18n\DateTime;
+use Cake\I18n\FrozenDate;
 use Cake\I18n\FrozenTime;
 use Cake\ORM\Entity;
 use Cake\TestSuite\TestCase;
@@ -613,16 +614,16 @@ class FunctionsTest extends TestCase
      */
     public static function toDateTimeProvider(): array
     {
-        $now = '2024-07-01T14:30:00Z';
-        // TODO: Not sure if necessary
-        DateTime::setTestNow(new DateTime($now));
+        $date = new DateTime('2024-07-01T14:30:00Z');
+        $now = $date->toAtomString();
+        DateTime::setTestNow($now);
 
         return [
             // datetime input types
-            '(datetime) datetime interface' => [new \DateTime($now), new DateTime($now)],
-            '(datetime) frozentime interface' => [new FrozenTime($now), new DateTime($now)],
+            '(datetime) datetime interface' => [new \DateTime($now), $date],
+            '(datetime) frozentime interface' => [new FrozenTime($now), $date],
             // string input types
-            '(string) datetime string' => [$now, new DateTime($now)],
+            '(string) datetime string' => [$now, $date],
             '(string) empty string' => ['', null],
             '(string) space' => [' ', null],
             '(string) some word' => ['abc', null],
@@ -632,7 +633,7 @@ class FunctionsTest extends TestCase
             '(string) double 1' => ['11', null],
             '(string) true-string' => ['true', null],
             // int input types
-            '(int) timestamp' => [1719844200, new DateTime($now)],
+            '(int) timestamp' => [1719844200, $date],
             '(int) negative number' => [-1000, DateTime::createFromTimestamp(-1000)],
             // float input types
             '(float) positive' => [5.5, null],
@@ -654,7 +655,7 @@ class FunctionsTest extends TestCase
      */
     public function testToDate(mixed $rawValue, ?Date $expected): void
     {
-        $this->assertSame($expected, toDate($rawValue));
+        $this->assertEquals($expected, toDate($rawValue));
     }
 
     /**
@@ -662,40 +663,33 @@ class FunctionsTest extends TestCase
      */
     public static function toDateProvider(): array
     {
+        $epoch = Date::createFromArray(['year' => 1970, 'month' => 01, 'day' => 01]);
+        $date = Date::createFromArray(['year' => 2024, 'month' => 07, 'day' => 01]);
+        $now = $date->toAtomString();
+        DateTime::setTestNow($now);
+
         return [
-            // ai-generated
-            'timestamp' => [1622548800, new Date('2021-06-01')],
-            'datetime_interface' => [new \DateTime('2021-06-01'), new Date('2021-06-01')],
-            'valid_date_string' => ['2021-06-01', new Date('2021-06-01')],
-            'invalid_date_string' => ['invalid-date', null],
-            'null_value' => [null, null],
+            // datetime input types
+            '(datetime) datetime interface' => [new \DateTime($now), $date],
+            '(datetime frozendate object' => [new FrozenDate($now), $date],
             // string input types
+            '(string) date string' => [$date->i18nFormat(\IntlDateFormatter::SHORT), $date],
             '(string) empty string' => ['', null],
             '(string) space' => [' ', null],
             '(string) some word' => ['abc', null],
             '(string) double 0' => ['00', null],
-            '(string) single 0' => ['0', false],
             '(string) false' => ['false', null],
             '(string) double 1' => ['11', null],
-            '(string) single 1' => ['1', true],
             '(string) true-string' => ['true', null],
             // int input types
-            '(int) 0' => [0, false],
-            '(int) 1' => [1, true],
-            '(int) -1' => [-1, null],
-            '(int) 55' => [55, null],
-            '(int) negative number' => [-5, null],
+            '(int) timestamp' => [1_719_844_200, $date],
+            '(int) negative number' => [-2_592_000, $epoch->subDays(30)],
             // float input types
             '(float) positive' => [5.5, null],
             '(float) round' => [5.0, null],
-            '(float) 0.0' => [0.0, false],
-            '(float) 1.0' => [1.0, true],
             '(float) NaN' => [acos(8), null],
             '(float) INF' => [INF, null],
             '(float) -INF' => [-INF, null],
-            // boolean input types
-            '(bool) true' => [true, true],
-            '(bool) false' => [false, false],
             // other input types
             '(other) null' => [null, null],
             '(other) empty-array' => [[], null],