<?php
namespace nur\sery\php\time;

use DateTimeZone;
use nulib\tests\TestCase;

class DateTimeTest extends TestCase {
  protected static function dt(string $datetime): DateTime {
    return new DateTime($datetime, new DateTimeZone("Indian/Reunion"));
  }

  function testDateTime() {
    $date = self::dt("2024-04-05 09:15:23");

    self::assertEquals("05/04/2024 09:15:23", $date->format());
    self::assertEquals("05/04/2024 09:15:23", strval($date));
    self::assertSame(2024, $date->year);
    self::assertSame(4, $date->month);
    self::assertSame(5, $date->day);
    self::assertSame(9, $date->hour);
    self::assertSame(15, $date->minute);
    self::assertSame(23, $date->second);
    self::assertSame(5, $date->wday);
    self::assertSame(14, $date->wnum);
    self::assertEquals("+04:00", $date->timezone);
    self::assertSame("05/04/2024 09:15:23", $date->datetime);
    self::assertSame("05/04/2024", $date->date);
    self::assertSame("20240405", $date->Ymd);
    self::assertSame("20240405T091523", $date->YmdHMS);
    self::assertSame("20240405T091523+04:00", $date->YmdHMSZ);
  }

  function testDateTimeZ() {
    $date = new DateTime("20240405T091523Z");
    self::assertSame("20240405T091523", $date->YmdHMS);
    self::assertSame("20240405T091523Z", $date->YmdHMSZ);
  }

  function testClone() {
    $date = self::dt("now");
    $clone = DateTime::clone($date);
    self::assertInstanceOf(DateTime::class, $clone);
  }

  function testConstruct() {
    $y = date("Y");
    self::assertSame("05/04/$y 00:00:00", strval(new DateTime("5/4")));
    self::assertSame("05/04/2024 00:00:00", strval(new DateTime("5/4/24")));
    self::assertSame("05/04/2024 00:00:00", strval(new DateTime("5/4/2024")));
    self::assertSame("05/04/2024 00:00:00", strval(new DateTime("05/04/2024")));
    self::assertSame("05/04/2024 00:00:00", strval(new DateTime("20240405")));
    self::assertSame("05/04/2024 00:00:00", strval(new DateTime("240405")));
    self::assertSame("05/04/2024 09:15:23", strval(new DateTime("20240405T091523")));
    self::assertSame("05/04/2024 09:15:23", strval(new DateTime("20240405T091523Z")));
    self::assertSame("05/04/2024 09:15:23", strval(new DateTime("5/4/2024 9:15:23")));
    self::assertSame("05/04/2024 09:15:23", strval(new DateTime("5/4/2024 9.15.23")));
    self::assertSame("05/04/2024 09:15:00", strval(new DateTime("5/4/2024 9:15")));
    self::assertSame("05/04/2024 09:15:00", strval(new DateTime("5/4/2024 9.15")));
    self::assertSame("05/04/2024 09:15:00", strval(new DateTime("5/4/2024 9h15")));
    self::assertSame("05/04/2024 09:15:23", strval(new DateTime("5/4/2024 09:15:23")));
    self::assertSame("05/04/2024 09:15:00", strval(new DateTime("5/4/2024 09:15")));
    self::assertSame("05/04/2024 09:15:00", strval(new DateTime("5/4/2024 09h15")));
  }
}