<?PHP
/**
 * This script contains tests for the home page.
 *
 * @author Joshua Ramon Enslin <joshua@museum-digital.de>
 */
declare(strict_types = 1);
use PHPUnit\Framework\TestCase;
require_once __DIR__ . "/../src/NodaTimeSplitter.php";
require_once __DIR__ . "/../../MD_STD/MD_STD.php";

/**
 * Tests for home page.
 */
final class NodaTimeSplitterTest extends TestCase {

    /**
     * Test to check whether the HTML page is correctly generated.
     *
     * @author Joshua Ramon Enslin <joshua@museum-digital.de>
     * @group  ValidOutput
     *
     * @return void
     */
    public function testSplitSimpleDatesGerman():void {

        $output = NodaTimeSplitter::attempt_splitting("02.1.25 v. Chr");
        self::assertEquals($output, [
            0 => "-25",
            1 => "-25",
            2 => "01",
            3 => "02",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.25 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 25);

        $output = NodaTimeSplitter::attempt_splitting("2.01.25 v. Chr");
        self::assertEquals($output, [
            0 => "-25",
            1 => "-25",
            2 => "01",
            3 => "02",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.25 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 25);

        $output = NodaTimeSplitter::attempt_splitting("02.01.25 v. Chr");
        self::assertEquals($output, [
            0 => "-25",
            1 => "-25",
            2 => "01",
            3 => "02",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.25 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 25);

        $output = NodaTimeSplitter::attempt_splitting("2.1.25 v. Chr");
        self::assertEquals($output, [
            0 => "-25",
            1 => "-25",
            2 => "01",
            3 => "02",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.25 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 25);

        $output = NodaTimeSplitter::attempt_splitting("2.1.2020");
        self::assertEquals($output, [
            0 => "2020",
            1 => "2020",
            2 => "01",
            3 => "02",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.2020");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("02.01.2020");
        self::assertEquals($output, [
            0 => "2020",
            1 => "2020",
            2 => "01",
            3 => "02",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.2020");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("2. Januar 2020");
        self::assertEquals($output, [
            0 => "2020",
            1 => "2020",
            2 => "01",
            3 => "02",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.2020");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("1920-1929");
        self::assertEquals($output, [
            0 => "1920",
            1 => "1929",
            2 => "00",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "1920-1929");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925);

        $output = NodaTimeSplitter::attempt_splitting("1920er Jahre");
        self::assertEquals($output, [
            0 => "1920",
            1 => "1929",
            2 => "00",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "1920-1929");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925);

        $output = NodaTimeSplitter::attempt_splitting("Januar 2020");
        self::assertEquals($output, [
            0 => "2020",
            1 => "2020",
            2 => "01",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "Januar 2020");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("Januar 2020 v. Chr.");
        self::assertEquals($output, [
            0 => "-2020",
            1 => "-2020",
            2 => "01",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "Januar 2020 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        // 5-Digit timespans BCE
        $output = NodaTimeSplitter::attempt_splitting("40000-25000 vor Christus");
        self::assertEquals($output, [
            0 => "-40000",
            1 => "-25000",
            2 => "00",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "40000-25000 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 32500);

        $output = NodaTimeSplitter::attempt_splitting("20. Jahrhundert v. Chr.");
        self::assertEquals($output, [
            0 => "-2000",
            1 => "-1901",
            2 => "00",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "2000-1901 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1950);

        $output = NodaTimeSplitter::attempt_splitting("20.-19. Jahrhundert v. Chr.");
        self::assertEquals($output, [
            0 => "-2000",
            1 => "-1801",
            2 => "00",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "2000-1801 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1900);

        $output = NodaTimeSplitter::attempt_splitting("Bis 20.-19. Jahrhundert v. Chr.");
        self::assertEquals($output, [
            0 => "?",
            1 => "-1801",
            2 => "00",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "Bis 1801 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1801);

    }

    /**
     * Test to check whether the HTML page is correctly generated.
     *
     * @author Joshua Ramon Enslin <joshua@museum-digital.de>
     * @group  ValidOutput
     *
     * @return void
     */
    public function testSplitSimpleDatesHungarian():void {

        $output = NodaTimeSplitter::attempt_splitting("2020.01.02.");
        self::assertEquals($output, [
            0 => "2020",
            1 => "2020",
            2 => "01",
            3 => "02",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.2020");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("2020. Januar 2.");
        self::assertEquals($output, [
            0 => "2020",
            1 => "2020",
            2 => "01",
            3 => "02",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "02.01.2020");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("1920-tól 1929-ig");
        self::assertEquals($output, [
            0 => "1920",
            1 => "1929",
            2 => "00",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "1920-1929");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925);

        $output = NodaTimeSplitter::attempt_splitting("1920-1929 között");
        self::assertEquals($output, [
            0 => "1920",
            1 => "1929",
            2 => "00",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "1920-1929");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925);

        $output = NodaTimeSplitter::attempt_splitting("1920-től 1929-ig");
        self::assertEquals($output, [
            0 => "1920",
            1 => "1929",
            2 => "00",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "1920-1929");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925);

        $output = NodaTimeSplitter::attempt_splitting("1920-es évek");
        self::assertEquals($output, [
            0 => "1920",
            1 => "1929",
            2 => "00",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "1920-1929");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1925);

        $output = NodaTimeSplitter::attempt_splitting("2020. Januar");
        self::assertEquals($output, [
            0 => "2020",
            1 => "2020",
            2 => "01",
            3 => "00",
            4 => "+",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "Januar 2020");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("Kr. e. 2020. Januar");
        self::assertEquals($output, [
            0 => "-2020",
            1 => "-2020",
            2 => "01",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "Januar 2020 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 2020);

        $output = NodaTimeSplitter::attempt_splitting("Kr. e. 20. század");
        self::assertEquals($output, [
            0 => "-2000",
            1 => "-1901",
            2 => "00",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "2000-1901 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1950);

        $output = NodaTimeSplitter::attempt_splitting("Kr. e. 20.-19. század");
        self::assertEquals($output, [
            0 => "-2000",
            1 => "-1801",
            2 => "00",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "2000-1801 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1900);

        $output = NodaTimeSplitter::attempt_splitting("Kr. e. 20.-19. század-ig");
        self::assertEquals($output, [
            0 => "?",
            1 => "-1801",
            2 => "00",
            3 => "00",
            4 => "-",
            5 => "",
        ]);
        self::assertEquals(NodaTimeSplitter::timePartsToTimeName($output), "Bis 1801 v. Chr.");
        self::assertEquals(NodaTimeSplitter::timePartsToCountingYear($output), 1801);

    }

    /**
     * Test to check whether the HTML page is correctly generated.
     *
     * @author Joshua Ramon Enslin <joshua@museum-digital.de>
     * @group  ValidOutput
     *
     * @return void
     */
    public function testSplitDoesNotWorkWhenItShouldNot():void {

        $output = NodaTimeSplitter::attempt_splitting("");
        self::assertEquals($output, []);

        $output = NodaTimeSplitter::attempt_splitting("1.2.2020-2.2.2020");
        self::assertEquals($output, []);

        $output = NodaTimeSplitter::attempt_splitting("2020 Januar 2-2020 Februar 2");
        self::assertEquals($output, []);

        $output = NodaTimeSplitter::attempt_splitting("2020 Januar-2020 Februar");
        self::assertEquals($output, []);

        $output = NodaTimeSplitter::attempt_splitting("Januar-Februar");
        self::assertEquals($output, []);

        $output = NodaTimeSplitter::attempt_splitting("Nach 1944");
        self::assertEquals($output, []);

    }

}