diff --git a/src/NodaTimeSplitter.php b/src/NodaTimeSplitter.php index 15ae72e..f93ef2d 100644 --- a/src/NodaTimeSplitter.php +++ b/src/NodaTimeSplitter.php @@ -752,8 +752,15 @@ final class NodaTimeSplitter { return new NodaSplitTime($year, $year); } - if (\preg_match("/^[0-9]{4}$/", \strtr($inpDateWoSpaces, ['-0' => '', '0-' => '', 'o' => '0']))) { // German Y-m - $year = \strtr($inpDateWoSpaces, ['-0' => '', '0-' => '', 'o' => '0']); + if (str_starts_with($inpDateWoSpaces, '0-') || str_ends_with($inpDateWoSpaces, '-0') && \preg_match("/^[0-9]{4}$/", \strtr($inpDateWoSpaces, ['-0' => '', '0-' => '']))) { + $year = \strtr($inpDateWoSpaces, ['-0' => '', '0-' => '']); + if (strlen($year) === 4) { + return new NodaSplitTime($year, $year); + } + } + + if (\preg_match("/^[0-9]{4}$/", \strtr($inpDateWoSpaces, ['o' => '0']))) { // German Y-m + $year = \strtr($inpDateWoSpaces, ['o' => '0']); return new NodaSplitTime($year, $year); } @@ -870,7 +877,7 @@ final class NodaTimeSplitter { $output->counting_time_indicator, NodaTimeBeforeAfterIndicator::until, '?', $output->end_date); } } - if (str_ends_with($datum, '-as évekig') || str_ends_with($datum, '-es évekig')) { + if (str_ends_with($datum, ' as évekig') || str_ends_with($datum, ' es évekig') || str_ends_with($datum, '-as évekig') || str_ends_with($datum, '-es évekig')) { if ($output = self::attempt_splitting(\substr($datum, 0, -2))) { return new NodaSplitTime('?', $output->end_year, $output->counting_time_month, $output->counting_time_day, $output->counting_time_indicator, NodaTimeBeforeAfterIndicator::until, '?', $output->end_date); diff --git a/tests/NodaTimeSplitterTest.php b/tests/NodaTimeSplitterTest.php index 1379d32..14c094d 100644 --- a/tests/NodaTimeSplitterTest.php +++ b/tests/NodaTimeSplitterTest.php @@ -17,6 +17,522 @@ use PHPUnit\Framework\Attributes\DataProvider; #[small] #[CoversClass(\NodaTimeSplitter::class)] final class NodaTimeSplitterTest extends TestCase { + /** + * Data provider for German time names. + * + * @return array + */ + public static function splittableGermanTimeNamesProvider():array { + + return [ + "1920er Jahre" => [ + "1920er Jahre", + new NodaSplitTime('1920', '1929', + start_date: '1920-01-01', + end_date: '1929-12-31'), + "1920-1929", + ], + "20er" => [ + "20er", + new NodaSplitTime('1920', '1929', + start_date: '1920-01-01', + end_date: '1929-12-31'), + "1920-1929", + ], + "2. Januar 2020" => [ + "2. Januar 2020", + new NodaSplitTime('2020', '2020', + counting_time_month: '01', + counting_time_day: '02', + start_date: '2020-01-02', + end_date: '2020-01-02'), + "02.01.2020", + ], + "02.01.2020" => [ + "02.01.2020", + new NodaSplitTime('2020', '2020', + counting_time_month: '01', + counting_time_day: '02', + start_date: '2020-01-02', + end_date: '2020-01-02'), + "02.01.2020", + ], + "2.1.2020" => [ + "2.1.2020", + new NodaSplitTime('2020', '2020', + counting_time_month: '01', + counting_time_day: '02', + start_date: '2020-01-02', + end_date: '2020-01-02'), + "02.01.2020", + ], + "?.1.2020" => [ + "?.1.2020", + new NodaSplitTime('2020', '2020', + counting_time_month: '01', + start_date: '2020-01-01', + end_date: '2020-01-31'), + "Januar 2020", + ], + "? 2020" => [ + "? 2020", + new NodaSplitTime('2020', '2020', + start_date: '2020-01-01', + end_date: '2020-12-31'), + "2020", + ], + "?.?.2020" => [ + "?.?.2020", + new NodaSplitTime('2020', '2020', + start_date: '2020-01-01', + end_date: '2020-12-31'), + "2020", + ], + "?.10.2020" => [ + "?.10.2020", + new NodaSplitTime('2020', '2020', + counting_time_month: '10', + start_date: '2020-10-01', + end_date: '2020-10-31'), + "Oktober 2020", + ], + "20. Jh." => [ + "20. Jh.", + new NodaSplitTime('1901', '2000', + start_date: '1901-01-01', + end_date: '2000-12-31'), + "1901-2000", + ], + "20. Jhd." => [ + "20. Jhd.", + new NodaSplitTime('1901', '2000', + start_date: '1901-01-01', + end_date: '2000-12-31'), + "1901-2000", + ], + "20. Jhdt." => [ + "20. Jhdt.", + new NodaSplitTime('1901', '2000', + start_date: '1901-01-01', + end_date: '2000-12-31'), + "1901-2000", + ], + "20. Jahrhundert" => [ + "20. Jahrhundert", + new NodaSplitTime('1901', '2000', + start_date: '1901-01-01', + end_date: '2000-12-31'), + "1901-2000", + ], + "1945-48" => [ + "1945-48", + new NodaSplitTime('1945', '1948', + start_date: '1945-01-01', + end_date: '1948-12-31'), + "1945-1948", + ], + "1945 und 1946" => [ + "1945 und 1946", + new NodaSplitTime('1945', '1946', + start_date: '1945-01-01', + end_date: '1946-12-31'), + "1945-1946", + ], + "1945 oder 1946" => [ + "1945 oder 1946", + new NodaSplitTime('1945', '1946', + start_date: '1945-01-01', + end_date: '1946-12-31'), + "1945-1946", + ], + ]; + + } + + /** + * Data provider for English time names. + * + * @return array + */ + public static function splittableEnglishTimeNamesProvider():array { + + return [ + "1925 BCE" => [ + "1925 BCE", + new NodaSplitTime('-1925', '-1925', + counting_time_indicator: NodaCountingTimeIndicator::bce, + start_date: '-1925-12-31', + end_date: '-1925-01-01'), + "1925 v. Chr.", + ], + "1925 CE" => [ + "1925", + new NodaSplitTime('1925', '1925'), + "1925", + ], + ]; + + } + + /** + * Data provider for Hungarian time names. + * + * @return array + */ + public static function splittableHungarianTimeNamesProvider():array { + + return [ + '1920-es evek: 1920s' => [ + "1920-es évek", + new NodaSplitTime('1920', '1929', + start_date: '1920-01-01', + end_date: '1929-12-31'), + "1920-1929", + ], + '1920 es evekig: Until the 1920s' => [ + "1920 es évekig", + new NodaSplitTime('?', '1929', + before_after_indicator: NodaTimeBeforeAfterIndicator::until, + end_date: '1929-12-31'), + "Bis 1929", + ], + '1920-es evekig: Until the 1920s' => [ + "1920-es évekig", + new NodaSplitTime('?', '1929', + before_after_indicator: NodaTimeBeforeAfterIndicator::until, + end_date: '1929-12-31'), + "Bis 1929", + ], + 'year + month' => [ + "2020. Januar", + new NodaSplitTime('2020', '2020', + counting_time_month: '01', + start_date: '2020-01-01', + end_date: '2020-01-31'), + "Januar 2020", + ], + 'Kr. e. (BC) + year + month' => [ + "Kr. e. 2020. Januar", + new NodaSplitTime('-2020', '-2020', + counting_time_month: '01', + counting_time_indicator: NodaCountingTimeIndicator::bce, + start_date: '-2020-01-31', + end_date: '-2020-01-01'), + "Januar 2020 v. Chr.", + ], + '[0-9]{2}. sz' => [ + "20. sz", + new NodaSplitTime('1901', '2000', + start_date: '1901-01-01', + end_date: '2000-12-31'), + "1901-2000", + ], + '[0-9]{2}. század' => [ + "20. század", + new NodaSplitTime('1901', '2000', + start_date: '1901-01-01', + end_date: '2000-12-31'), + "1901-2000", + ], + '[0-9]{2}.század' => [ + "20.század", + new NodaSplitTime('1901', '2000', + start_date: '1901-01-01', + end_date: '2000-12-31'), + "1901-2000", + ], + 'Kr. e. (BC) + század' => [ + "Kr. e. 20. század", + new NodaSplitTime('-2000', '-1901', + counting_time_indicator: NodaCountingTimeIndicator::bce, + start_date: '-2000-12-31', + end_date: '-1901-01-01'), + "2000-1901 v. Chr.", + ], + 'Kr. e. (BC) + 20-19' => [ + "Kr. e. 20.-19. század", + new NodaSplitTime('-2000', '-1801', + counting_time_indicator: NodaCountingTimeIndicator::bce, + start_date: '-1801-12-31', + end_date: '-2000-01-01'), + "2000-1801 v. Chr.", + ], + 'Kr. e. (BC) + 20-19 + ig (until)' => [ + "Kr. e. 20.-19. század-ig", + new NodaSplitTime('?', '-1801', + counting_time_indicator: NodaCountingTimeIndicator::bce, + before_after_indicator: NodaTimeBeforeAfterIndicator::until, + start_date: '-9999-12-31', + end_date: '-2000-01-01'), + "Bis 1801 v. Chr.", + ], + 'year + suffix: -ig (until)' => [ + '1900ig', + new NodaSplitTime('?', '1900', + before_after_indicator: NodaTimeBeforeAfterIndicator::until, + start_date: '-9999-12-31', + end_date: '1900-12-31'), + "Bis 1900", + ], + 'year + suffix: ig (until)' => [ + '1900ig', + new NodaSplitTime('?', '1900', + before_after_indicator: NodaTimeBeforeAfterIndicator::until, + start_date: '-9999-12-31', + end_date: '1900-12-31'), + "Bis 1900", + ], + 'year előtt (before)' => [ + '2020. előtt', + new NodaSplitTime('?', '2019', + before_after_indicator: NodaTimeBeforeAfterIndicator::before, + start_date: '-9999-12-31', + end_date: '2020-01-01'), + 'Vor 2020', + ], + 'year, month + előtt (before)' => [ + '2020. december előtt', + new NodaSplitTime('?', '2020', + counting_time_month: '12', + before_after_indicator: NodaTimeBeforeAfterIndicator::before, + start_date: '-9999-12-31', + end_date: '2020-12-01'), + 'Vor Dezember 2020', + ], + ]; + + } + + /** + * Data provider for Ukrainian time names. + * + * @return array + */ + public static function splittableUkrainianTimeNamesProvider():array { + + return [ + 'Year + p' => [ + '2020 p', + new NodaSplitTime('2020', '2020', + start_date: '2020-01-01', + end_date: '2020-12-31'), + ], + ]; + + } + + /** + * Data provider for time names that the time splitter should not + * be able to split. + * + * @return array + */ + public static function timeNamesToSplitFromTillProvider():array { + + $output = []; + + foreach ([ + "2004.01.-2004.02." => [ + 'start_name' => "Januar 2004", + 'end_name' => "Februar 2004", + "start_year" => '2004', + "end_year" => '2004', + 'start_date' => '2004-01-01', + 'end_date' => '2004-02-31', + "counting_time_year" => "2004", + "counting_time_month" => "02", + "counting_time_day" => "01", + "counting_time_bcce" => "+", + ], + "2004.01.-02." => [ + 'start_name' => "Januar 2004", + 'end_name' => "Februar 2004", + "start_year" => '2004', + "end_year" => '2004', + 'start_date' => '2004-01-01', + 'end_date' => '2004-02-31', + "counting_time_year" => "2004", + "counting_time_month" => "02", + "counting_time_day" => "01", + "counting_time_bcce" => "+", + ], + "2003.04-05." => [ + 'start_name' => "April 2003", + 'end_name' => "Mai 2003", + "start_year" => '2003', + "end_year" => '2003', + 'start_date' => '2003-04-01', + 'end_date' => '2003-05-31', + "counting_time_year" => "2003", + "counting_time_month" => "05", + "counting_time_day" => "01", + "counting_time_bcce" => "+", + ], + "1981. július-augusztus" => [ + 'start_name' => "Juli 1981", + 'end_name' => "August 1981", + "start_year" => '1981', + "end_year" => '1981', + 'start_date' => '1981-07-01', + 'end_date' => '1981-08-31', + "counting_time_year" => "1981", + "counting_time_month" => "08", + "counting_time_day" => "01", + "counting_time_bcce" => "+", + ], + "2019.03.14.,04.15." => [ + 'start_name' => "14.03.2019", + 'end_name' => "15.04.2019", + "start_year" => '2019', + "end_year" => '2019', + 'start_date' => '2019-03-14', + 'end_date' => '2019-04-15', + "counting_time_year" => "2019", + "counting_time_month" => "03", + "counting_time_day" => "30", + "counting_time_bcce" => "+", + ], + "14.-15.03.2019" => [ + 'start_name' => "14.03.2019", + 'end_name' => "15.03.2019", + "start_year" => '2019', + "end_year" => '2019', + 'start_date' => '2019-03-14', + 'end_date' => '2019-03-15', + "counting_time_year" => "2019", + "counting_time_month" => "03", + "counting_time_day" => "15", + "counting_time_bcce" => "+", + ], + "3.-7.9.1819" => [ + 'start_name' => "03.09.1819", + 'end_name' => "07.09.1819", + "start_year" => '1819', + "end_year" => '1819', + 'start_date' => '1819-09-03', + 'end_date' => '1819-09-07', + "counting_time_year" => "1819", + "counting_time_month" => "09", + "counting_time_day" => "05", + "counting_time_bcce" => "+", + ], + "3.-15.9.1819" => [ + 'start_name' => "03.09.1819", + 'end_name' => "15.09.1819", + "start_year" => '1819', + "end_year" => '1819', + 'start_date' => '1819-09-03', + 'end_date' => '1819-09-15', + "counting_time_year" => "1819", + "counting_time_month" => "09", + "counting_time_day" => "09", + "counting_time_bcce" => "+", + ], + "14.-15.9.1819" => [ + 'start_name' => "14.09.1819", + 'end_name' => "15.09.1819", + "start_year" => '1819', + "end_year" => '1819', + 'start_date' => '1819-09-14', + 'end_date' => '1819-09-15', + "counting_time_year" => "1819", + "counting_time_month" => "09", + "counting_time_day" => "15", + "counting_time_bcce" => "+", + ], + "14.-15.11.1819" => [ + 'start_name' => "14.11.1819", + 'end_name' => "15.11.1819", + "start_year" => '1819', + "end_year" => '1819', + 'start_date' => '1819-11-14', + 'end_date' => '1819-11-15', + "counting_time_year" => "1819", + "counting_time_month" => "11", + "counting_time_day" => "15", + "counting_time_bcce" => "+", + ], + "2019.03.14-15" => [ + 'start_name' => "14.03.2019", + 'end_name' => "15.03.2019", + "start_year" => '2019', + "end_year" => '2019', + 'start_date' => '2019-03-14', + 'end_date' => '2019-03-15', + "counting_time_year" => "2019", + "counting_time_month" => "03", + "counting_time_day" => "15", + "counting_time_bcce" => "+", + ], + "17-19.század" => [ + 'start_name' => "1601", + 'end_name' => "1900", + "start_year" => '1601', + "end_year" => '1900', + 'start_date' => '1601-01-01', + 'end_date' => '1900-12-31', + "counting_time_year" => "1751", + "counting_time_month" => "01", + "counting_time_day" => "01", + "counting_time_bcce" => "+", + ], + "1950-60-as évek" => [ + 'start_name' => "1950", + 'end_name' => "1969", + "start_year" => '1950', + "end_year" => '1969', + 'start_date' => '1950-01-01', + 'end_date' => '1969-12-31', + "counting_time_year" => "1960", + "counting_time_month" => "01", + "counting_time_day" => "01", + "counting_time_bcce" => "+", + ], + ] as $in => $out) { + $output[$in] = [$in, $out]; + } + + return $output; + + } + + /** + * Data provider for time names that the time splitter should not + * be able to split. + * + * @return array + */ + public static function nonSplittableNamesProvider():array { + + $output = [ + 'empty string' => [''], + ]; + + foreach ([ + "1.2.2020-2.2.2020", + "2020 Januar 2-2020 Februar 2", + "2020 Januar-2020 Februar", + "Januar-Februar", + "13.13.2022", + "2022-13-13", + "40.10.2022", + "2022-10-40", + "6;November 1978", + "65497028c51eb", + "6552cf08b0196 test tag", + "1978. július7", + "1978. július 7 elött", + "Anfang September 1903", + "120-63 v. Chr.", + "0-25 n. Chr.", // Should not be splittable because 25 CE is too close to 0. 0 might actually be correct, not an artefact. + ] as $entry) { + $output[$entry] = [$entry]; + } + + return $output; + + } + /** * Test to check whether the HTML page is correctly generated. * @@ -26,20 +542,7 @@ final class NodaTimeSplitterTest extends TestCase { * * @return void */ - public function testSplitSimpleDatesGerman():void { - - $output = NodaTimeSplitter::attempt_splitting("2. Januar 2020"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "2020", - 1 => "2020", - 2 => "01", - 3 => "02", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "02.01.2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); + public function testSplitSimpleDatesGermanOld():void { $output = NodaTimeSplitter::attempt_splitting("02.1.25 v. Chr"); self::assertNotEmpty($output); @@ -93,19 +596,6 @@ final class NodaTimeSplitterTest extends TestCase { self::assertEquals($output->toTimeName(), "02.01.25 v. Chr."); self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 25); - $output = NodaTimeSplitter::attempt_splitting("2.1.2020"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "2020", - 1 => "2020", - 2 => "01", - 3 => "02", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "02.01.2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - $output = NodaTimeSplitter::attempt_splitting("02.01.2020"); self::assertNotEmpty($output); self::assertEquals($output->toOldFormat(), [ @@ -119,32 +609,6 @@ final class NodaTimeSplitterTest extends TestCase { self::assertEquals($output->toTimeName(), "02.01.2020"); self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - $output = NodaTimeSplitter::attempt_splitting("?.1.2020"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "2020", - 1 => "2020", - 2 => "01", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "Januar 2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - - $output = NodaTimeSplitter::attempt_splitting("?.11.2020"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "2020", - 1 => "2020", - 2 => "11", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "November 2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - $output = NodaTimeSplitter::attempt_splitting(".2020"); self::assertNotEmpty($output); self::assertEquals($output->toOldFormat(), [ @@ -184,32 +648,6 @@ final class NodaTimeSplitterTest extends TestCase { self::assertEquals($output->toTimeName(), "2020"); self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - $output = NodaTimeSplitter::attempt_splitting("? 2020"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "2020", - 1 => "2020", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - - $output = NodaTimeSplitter::attempt_splitting("?.?.2020"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "2020", - 1 => "2020", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - $output = NodaTimeSplitter::attempt_splitting("1920-1929"); self::assertNotEmpty($output); self::assertEquals($output->toOldFormat(), [ @@ -223,45 +661,6 @@ final class NodaTimeSplitterTest extends TestCase { self::assertEquals($output->toTimeName(), "1920-1929"); self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925); - $output = NodaTimeSplitter::attempt_splitting("20er"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1920", - 1 => "1929", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1920-1929"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925); - - $output = NodaTimeSplitter::attempt_splitting("1920-1929"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1920", - 1 => "1929", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1920-1929"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925); - - $output = NodaTimeSplitter::attempt_splitting("1920er Jahre"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1920", - 1 => "1929", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1920-1929"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925); - $output = NodaTimeSplitter::attempt_splitting("Vor Dezember 2020"); self::assertNotEmpty($output); self::assertEquals($output->toOldFormat(), [ @@ -490,97 +889,6 @@ final class NodaTimeSplitterTest extends TestCase { self::assertEquals($output->toTimeName(), "2000-1901 v. Chr."); self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1950); - $output = NodaTimeSplitter::attempt_splitting("20. Jh."); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1901", - 1 => "2000", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1901-2000"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - - $output = NodaTimeSplitter::attempt_splitting("20. Jhd."); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1901", - 1 => "2000", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1901-2000"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - - $output = NodaTimeSplitter::attempt_splitting("20. Jhdt."); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1901", - 1 => "2000", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1901-2000"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - - $output = NodaTimeSplitter::attempt_splitting("20. Jahrhundert"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1901", - 1 => "2000", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1901-2000"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - - $output = NodaTimeSplitter::attempt_splitting("1945-48"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1945", - 1 => "1948", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1945-1948"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1947); - - $output = NodaTimeSplitter::attempt_splitting("1945 und 1946"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1945", - 1 => "1946", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1945-1946"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1946); - - $output = NodaTimeSplitter::attempt_splitting("1945 oder 1946"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1945", - 1 => "1946", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1945-1946"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1946); - $output = NodaTimeSplitter::attempt_splitting("20.-19. Jahrhundert v. Chr."); self::assertNotEmpty($output); self::assertEquals($output->toOldFormat(), [ @@ -636,46 +944,51 @@ final class NodaTimeSplitterTest extends TestCase { } /** - * Test to check whether the HTML page is correctly generated. + * Test that German dates are correctly parsed. * * @author Joshua Ramon Enslin * @group ValidOutput * @small * + * @param string $time_name Input time name. + * @param NodaSplitTime $expected Expected output. + * @param string $expected_name Expected name. + * * @return void */ - public function testSplitSimpleDatesEnglish():void { + #[DataProvider('splittableGermanTimeNamesProvider')] + public function testSplitSimpleDatesGerman(string $time_name, NodaSplitTime $expected, string $expected_name):void { - $output = NodaTimeSplitter::attempt_splitting("1925 BCE"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "-1925", - 1 => "-1925", - 2 => "00", - 3 => "00", - 4 => "-", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1925 v. Chr."); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925); - - $output = NodaTimeSplitter::attempt_splitting("1925 CE"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1925", - 1 => "1925", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1925"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925); + $output = NodaTimeSplitter::attempt_splitting($time_name); + self::assertEquals($expected, $output); + self::assertEquals($expected_name, $output->toTimeName()); } /** - * Test to check whether the HTML page is correctly generated. + * Test that English dates are correctly parsed. + * + * @author Joshua Ramon Enslin + * @group ValidOutput + * @small + * + * @param string $time_name Input time name. + * @param NodaSplitTime $expected Expected output. + * @param string $expected_name Expected name. + * + * @return void + */ + #[DataProvider('splittableEnglishTimeNamesProvider')] + public function testSplitSimpleDatesEnglish(string $time_name, NodaSplitTime $expected, string $expected_name):void { + + $output = NodaTimeSplitter::attempt_splitting($time_name); + self::assertEquals($expected, $output); + self::assertEquals($expected_name, $output->toTimeName()); + + } + + /** + * Test that Hungarian dates are correctly parsed. * * @author Joshua Ramon Enslin * @group ValidOutput @@ -829,71 +1142,6 @@ final class NodaTimeSplitterTest extends TestCase { self::assertEquals($output->toTimeName(), "Seit 1920"); self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1920); - $output = NodaTimeSplitter::attempt_splitting("1920-es évek"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1920", - 1 => "1929", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1920-1929"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925); - - $output = NodaTimeSplitter::attempt_splitting("1920-es évekig"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "?", - 1 => "1929", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "Bis", - ]); - self::assertEquals($output->toTimeName(), "Bis 1929"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1929); - - $output = NodaTimeSplitter::attempt_splitting("2020. Januar"); - self::assertNotEmpty($output); - self::assertEquals([ - 0 => "2020", - 1 => "2020", - 2 => "01", - 3 => "00", - 4 => "+", - 5 => "", - ], $output->toOldFormat()); - self::assertEquals($output->toTimeName(), "Januar 2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - - $output = NodaTimeSplitter::attempt_splitting("Kr. e. 2020. Januar"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "-2020", - 1 => "-2020", - 2 => "01", - 3 => "00", - 4 => "-", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "Januar 2020 v. Chr."); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - - $output = NodaTimeSplitter::attempt_splitting("20. sz"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1901", - 1 => "2000", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1901-2000"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - $output = NodaTimeSplitter::attempt_splitting("III. század"); self::assertNotEmpty($output); self::assertEquals($output->toOldFormat(), [ @@ -920,331 +1168,53 @@ final class NodaTimeSplitterTest extends TestCase { self::assertEquals($output->toTimeName(), "1901-2000"); self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - $output = NodaTimeSplitter::attempt_splitting("20. század"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1901", - 1 => "2000", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1901-2000"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - - $output = NodaTimeSplitter::attempt_splitting("20.század"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "1901", - 1 => "2000", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "1901-2000"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1951); - - $output = NodaTimeSplitter::attempt_splitting("Kr. e. 20. század"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "-2000", - 1 => "-1901", - 2 => "00", - 3 => "00", - 4 => "-", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "2000-1901 v. Chr."); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1950); - - $output = NodaTimeSplitter::attempt_splitting("Kr. e. 20.-19. század"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "-2000", - 1 => "-1801", - 2 => "00", - 3 => "00", - 4 => "-", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "2000-1801 v. Chr."); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1900); - - $output = NodaTimeSplitter::attempt_splitting("Kr. e. 20.-19. század-ig"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "?", - 1 => "-1801", - 2 => "00", - 3 => "00", - 4 => "-", - 5 => "Bis", - ]); - self::assertEquals($output->toTimeName(), "Bis 1801 v. Chr."); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1801); - - /* - * TODO - $output = NodaTimeSplitter::attempt_splitting("1900 előtt"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "?", - 1 => "1899", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "Vor 1900"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1899); - */ - - $output = NodaTimeSplitter::attempt_splitting("1900-ig"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "?", - 1 => "1900", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "Bis", - ]); - self::assertEquals($output->toTimeName(), "Bis 1900"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1900); - - $output = NodaTimeSplitter::attempt_splitting("1900ig"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "?", - 1 => "1900", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "Bis", - ]); - self::assertEquals($output->toTimeName(), "Bis 1900"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1900); - - $output = NodaTimeSplitter::attempt_splitting("2020. december előtt"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "?", - 1 => "2020", - 2 => "12", - 3 => "00", - 4 => "+", - 5 => "Vor", - ]); - self::assertEquals($output->toTimeName(), "Vor Dezember 2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); - } /** - * Test to check whether the HTML page is correctly generated. + * Test that Hungarian dates are correctly parsed. * * @author Joshua Ramon Enslin * @group ValidOutput * @small * + * @param string $time_name Input time name. + * @param NodaSplitTime $expected Expected output. + * @param string $expected_name Expected name. + * * @return void */ - public function testSplitSimpleDatesUkrainian():void { + #[DataProvider('splittableHungarianTimeNamesProvider')] + public function testSplitSimpleDatesHungarianNew(string $time_name, NodaSplitTime $expected, string $expected_name):void { - $output = NodaTimeSplitter::attempt_splitting("2020 p"); - self::assertNotEmpty($output); - self::assertEquals($output->toOldFormat(), [ - 0 => "2020", - 1 => "2020", - 2 => "00", - 3 => "00", - 4 => "+", - 5 => "", - ]); - self::assertEquals($output->toTimeName(), "2020"); - self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020); + $output = NodaTimeSplitter::attempt_splitting($time_name); + self::assertEquals($expected, $output); + self::assertEquals($expected_name, $output->toTimeName()); } /** - * Data provider for time names that the time splitter should not - * be able to split. + * Test that Ukrainian dates are correctly parsed. * - * @return array + * @author Joshua Ramon Enslin + * @group ValidOutput + * @small + * + * @param string $time_name Input time name. + * @param NodaSplitTime $expected Expected output. + * + * @return void */ - public static function timeNamesToSplitFromTillProvider():array { + #[DataProvider('splittableUkrainianTimeNamesProvider')] + public function testSplitSimpleDatesUkrainian(string $time_name, NodaSplitTime $expected):void { - $output = []; - - foreach ([ - "2004.01.-2004.02." => [ - 'start_name' => "Januar 2004", - 'end_name' => "Februar 2004", - "start_year" => '2004', - "end_year" => '2004', - 'start_date' => '2004-01-01', - 'end_date' => '2004-02-31', - "counting_time_year" => "2004", - "counting_time_month" => "02", - "counting_time_day" => "01", - "counting_time_bcce" => "+", - ], - "2004.01.-02." => [ - 'start_name' => "Januar 2004", - 'end_name' => "Februar 2004", - "start_year" => '2004', - "end_year" => '2004', - 'start_date' => '2004-01-01', - 'end_date' => '2004-02-31', - "counting_time_year" => "2004", - "counting_time_month" => "02", - "counting_time_day" => "01", - "counting_time_bcce" => "+", - ], - "2003.04-05." => [ - 'start_name' => "April 2003", - 'end_name' => "Mai 2003", - "start_year" => '2003', - "end_year" => '2003', - 'start_date' => '2003-04-01', - 'end_date' => '2003-05-31', - "counting_time_year" => "2003", - "counting_time_month" => "05", - "counting_time_day" => "01", - "counting_time_bcce" => "+", - ], - "1981. július-augusztus" => [ - 'start_name' => "Juli 1981", - 'end_name' => "August 1981", - "start_year" => '1981', - "end_year" => '1981', - 'start_date' => '1981-07-01', - 'end_date' => '1981-08-31', - "counting_time_year" => "1981", - "counting_time_month" => "08", - "counting_time_day" => "01", - "counting_time_bcce" => "+", - ], - "2019.03.14.,04.15." => [ - 'start_name' => "14.03.2019", - 'end_name' => "15.04.2019", - "start_year" => '2019', - "end_year" => '2019', - 'start_date' => '2019-03-14', - 'end_date' => '2019-04-15', - "counting_time_year" => "2019", - "counting_time_month" => "03", - "counting_time_day" => "30", - "counting_time_bcce" => "+", - ], - "14.-15.03.2019" => [ - 'start_name' => "14.03.2019", - 'end_name' => "15.03.2019", - "start_year" => '2019', - "end_year" => '2019', - 'start_date' => '2019-03-14', - 'end_date' => '2019-03-15', - "counting_time_year" => "2019", - "counting_time_month" => "03", - "counting_time_day" => "15", - "counting_time_bcce" => "+", - ], - "3.-7.9.1819" => [ - 'start_name' => "03.09.1819", - 'end_name' => "07.09.1819", - "start_year" => '1819', - "end_year" => '1819', - 'start_date' => '1819-09-03', - 'end_date' => '1819-09-07', - "counting_time_year" => "1819", - "counting_time_month" => "09", - "counting_time_day" => "05", - "counting_time_bcce" => "+", - ], - "3.-15.9.1819" => [ - 'start_name' => "03.09.1819", - 'end_name' => "15.09.1819", - "start_year" => '1819', - "end_year" => '1819', - 'start_date' => '1819-09-03', - 'end_date' => '1819-09-15', - "counting_time_year" => "1819", - "counting_time_month" => "09", - "counting_time_day" => "09", - "counting_time_bcce" => "+", - ], - "14.-15.9.1819" => [ - 'start_name' => "14.09.1819", - 'end_name' => "15.09.1819", - "start_year" => '1819', - "end_year" => '1819', - 'start_date' => '1819-09-14', - 'end_date' => '1819-09-15', - "counting_time_year" => "1819", - "counting_time_month" => "09", - "counting_time_day" => "15", - "counting_time_bcce" => "+", - ], - "14.-15.11.1819" => [ - 'start_name' => "14.11.1819", - 'end_name' => "15.11.1819", - "start_year" => '1819', - "end_year" => '1819', - 'start_date' => '1819-11-14', - 'end_date' => '1819-11-15', - "counting_time_year" => "1819", - "counting_time_month" => "11", - "counting_time_day" => "15", - "counting_time_bcce" => "+", - ], - "2019.03.14-15" => [ - 'start_name' => "14.03.2019", - 'end_name' => "15.03.2019", - "start_year" => '2019', - "end_year" => '2019', - 'start_date' => '2019-03-14', - 'end_date' => '2019-03-15', - "counting_time_year" => "2019", - "counting_time_month" => "03", - "counting_time_day" => "15", - "counting_time_bcce" => "+", - ], - "17-19.század" => [ - 'start_name' => "1601", - 'end_name' => "1900", - "start_year" => '1601', - "end_year" => '1900', - 'start_date' => '1601-01-01', - 'end_date' => '1900-12-31', - "counting_time_year" => "1751", - "counting_time_month" => "01", - "counting_time_day" => "01", - "counting_time_bcce" => "+", - ], - "1950-60-as évek" => [ - 'start_name' => "1950", - 'end_name' => "1969", - "start_year" => '1950', - "end_year" => '1969', - 'start_date' => '1950-01-01', - 'end_date' => '1969-12-31', - "counting_time_year" => "1960", - "counting_time_month" => "01", - "counting_time_day" => "01", - "counting_time_bcce" => "+", - ], - ] as $in => $out) { - $output[$in] = [$in, $out]; - } - - return $output; + $output = NodaTimeSplitter::attempt_splitting($time_name); + self::assertNotEmpty($output); + self::assertEquals($expected, $output); } /** - * Test to check special cases can be parsed. + * Test to check that time spans can be parsed as expected. * * @author Joshua Ramon Enslin * @group ValidOutput @@ -1261,12 +1231,12 @@ final class NodaTimeSplitterTest extends TestCase { // Regular $output = NodaTimeSplitter::attempt_splitting_from_till($time_name); self::assertNotEmpty($output); - self::assertEquals($output, $expected); + self::assertEquals($expected, $output); } /** - * Special cases for timespans. + * Test to check special cases of timespans can be parsed. * * @return void */ @@ -1288,41 +1258,6 @@ final class NodaTimeSplitterTest extends TestCase { } - /** - * Data provider for time names that the time splitter should not - * be able to split. - * - * @return array - */ - public static function nonSplittableNamesProvider():array { - - $output = [ - 'empty string' => [''], - ]; - - foreach ([ - "1.2.2020-2.2.2020", - "2020 Januar 2-2020 Februar 2", - "2020 Januar-2020 Februar", - "Januar-Februar", - "13.13.2022", - "2022-13-13", - "40.10.2022", - "2022-10-40", - "6;November 1978", - "65497028c51eb", - "6552cf08b0196 test tag", - "1978. július7", - "1978. július 7 elött", - "Anfang September 1903", - ] as $entry) { - $output[$entry] = [$entry]; - } - - return $output; - - } - /** * Test to check whether the HTML page is correctly generated. *