assertEquals('2023-01-01', DateHelper::excelDateToISODate(44927)); // Excel date 45292 = 2024-01-01 $this->assertEquals('2024-01-01', DateHelper::excelDateToISODate(45292)); // Excel date 25569 = 1970-01-01 (Unix epoch) $this->assertEquals('1970-01-01', DateHelper::excelDateToISODate(25569)); } public function test_iso_date_to_excel_date_converts_correctly(): void { $this->assertEquals(44927, DateHelper::ISODateToExcelDate('2023-01-01')); $this->assertEquals(45292, DateHelper::ISODateToExcelDate('2024-01-01')); $this->assertEquals(25569, DateHelper::ISODateToExcelDate('1970-01-01')); } public function test_excel_date_conversion_is_reversible(): void { $excelDate = 45000; $isoDate = DateHelper::excelDateToISODate($excelDate); $backToExcel = DateHelper::ISODateToExcelDate($isoDate); $this->assertEquals($excelDate, $backToExcel); } public function test_get_human_date_returns_text_format_by_default(): void { $result = DateHelper::getHumanDate('2024-03-15'); // Should contain month name in Russian $this->assertStringContainsString('марта', $result); $this->assertStringContainsString('15', $result); $this->assertStringContainsString('2024', $result); } public function test_get_human_date_returns_numeric_format_when_requested(): void { $result = DateHelper::getHumanDate('2024-03-15', true); $this->assertEquals('15.03.2024', $result); } public function test_is_date_validates_correct_dates(): void { $this->assertTrue(DateHelper::isDate('2024-01-01')); $this->assertTrue(DateHelper::isDate('2023-12-31')); $this->assertTrue(DateHelper::isDate('1990-06-15')); } public function test_is_date_rejects_invalid_dates(): void { $this->assertFalse(DateHelper::isDate('2024-13-01')); // Invalid month $this->assertFalse(DateHelper::isDate('2024-00-01')); // Invalid month $this->assertFalse(DateHelper::isDate('2024-01-32')); // Invalid day $this->assertFalse(DateHelper::isDate('24-01-01')); // Short year $this->assertFalse(DateHelper::isDate('01-01-2024')); // Wrong format $this->assertFalse(DateHelper::isDate('not-a-date')); } public function test_get_date_for_db_formats_correctly(): void { $this->assertEquals('2024-03-15', DateHelper::getDateForDB('March 15, 2024')); $this->assertEquals('2024-03-15', DateHelper::getDateForDB('15.03.2024')); } public function test_add_months_works_correctly(): void { $this->assertEquals('2024-04-01', DateHelper::addMonths('2024-01-01', 3)); $this->assertEquals('2025-01-01', DateHelper::addMonths('2024-01-01', 12)); $this->assertEquals('2023-10-01', DateHelper::addMonths('2024-01-01', -3)); } public function test_get_date_of_week_returns_correct_date(): void { // Week 1 of 2024, Monday $result = DateHelper::getDateOfWeek(2024, 1, 1); $this->assertEquals('2024-01-01', $result); // Week 1 of 2024, Sunday $result = DateHelper::getDateOfWeek(2024, 1, 7); $this->assertEquals('2024-01-07', $result); } public function test_get_random_date_returns_valid_date(): void { $result = DateHelper::getRandomDate(1); $this->assertTrue(DateHelper::isDate($result)); } public function test_get_random_date_throws_exception_for_invalid_years(): void { $this->expectException(InvalidDateException::class); DateHelper::getRandomDate(-1); } public function test_get_human_day_of_week_returns_russian_day_name(): void { // 2024-01-01 is Monday $result = DateHelper::getHumanDayOfWeek('2024-01-01'); $this->assertEquals('Понедельник', $result); // 2024-01-07 is Sunday $result = DateHelper::getHumanDayOfWeek('2024-01-07'); $this->assertEquals('Воскресенье', $result); } }