diff --git a/src/Pyz/Zed/LeapYear/Business/Checker/LeapYearChecker.php b/src/Pyz/Zed/LeapYear/Business/Checker/LeapYearChecker.php new file mode 100644 index 0000000000..23d9093367 --- /dev/null +++ b/src/Pyz/Zed/LeapYear/Business/Checker/LeapYearChecker.php @@ -0,0 +1,18 @@ +getFactory()->createLeapYearChecker()->checkLeapYear($year); + } +} diff --git a/src/Pyz/Zed/LeapYear/Business/LeapYearFacadeInterface.php b/src/Pyz/Zed/LeapYear/Business/LeapYearFacadeInterface.php new file mode 100644 index 0000000000..20cfba4c7b --- /dev/null +++ b/src/Pyz/Zed/LeapYear/Business/LeapYearFacadeInterface.php @@ -0,0 +1,15 @@ + 1, + 'V' => 5, + 'X' => 10, + 'L' => 50, + 'C' => 100, + 'D' => 500, + 'M' => 1000, + ]; + + /** + * @param string $romanNumbers + * @return int + * @throws NotARomanNumberException + */ + public function convert(string $romanNumbers): int + { + if (!$this->isValidRomanNumber($romanNumbers)) { + throw new NotARomanNumberException($romanNumbers); + } + + $romanNumbers = str_replace('IV', 'IIII', $romanNumbers); + $romanNumbers = str_replace('IX', 'VIIII', $romanNumbers); + $romanNumbers = str_replace('XL', 'XXXX', $romanNumbers); + $romanNumbers = str_replace('XC', 'LXXXX', $romanNumbers); + $romanNumbers = str_replace('CD', 'CCCC', $romanNumbers); + $romanNumbers = str_replace('CM', 'DCCCC', $romanNumbers); + $romanNumbers = str_replace('XD', 'CCCCLXXXX', $romanNumbers); + + $result = 0; + $result += substr_count($romanNumbers, 'I'); + $result += substr_count($romanNumbers, 'V') * 5; + $result += substr_count($romanNumbers, 'X') * 10; + $result += substr_count($romanNumbers, 'L') * 50; + $result += substr_count($romanNumbers, 'C') * 100; + $result += substr_count($romanNumbers, 'D') * 500; + $result += substr_count($romanNumbers, 'M') * 1000; + + return $result; + } + + /** + * @param string $romanNumbers + * @return bool + */ + private function isValidRomanNumber(string $romanNumbers): bool + { + if (empty($romanNumbers)) { + return false; + } + $split_romanNumbers = str_split($romanNumbers); + foreach ($split_romanNumbers as $romanNumber) { + $validcharacters = ["I", "V", "X", "L", "C", "D", "M"]; + if (!in_array($romanNumber, $validcharacters)) { + return false; + } + } + return true; + } +} + + diff --git a/src/Pyz/Zed/RomanNumbers/Business/Exception/NotARomanNumberException.php b/src/Pyz/Zed/RomanNumbers/Business/Exception/NotARomanNumberException.php new file mode 100644 index 0000000000..6f231d5499 --- /dev/null +++ b/src/Pyz/Zed/RomanNumbers/Business/Exception/NotARomanNumberException.php @@ -0,0 +1,16 @@ +getFactory()->createRomanNumbersConverter()->convert($romanNumber); + } +} diff --git a/src/Pyz/Zed/RomanNumbers/Business/RomanNumbersFacadeInterface.php b/src/Pyz/Zed/RomanNumbers/Business/RomanNumbersFacadeInterface.php new file mode 100644 index 0000000000..9b87557fd2 --- /dev/null +++ b/src/Pyz/Zed/RomanNumbers/Business/RomanNumbersFacadeInterface.php @@ -0,0 +1,15 @@ +tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertTrue($result); + } + + public function testTwothousendTwentyFourIsLeapYear(): void + { + // Arrange + $year = 2024; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertTrue($result); + } + + public function testTwothousandTwentyThreeIsLeapYear(): void + { + // Arrange + $year = 2023; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertFalse($result); + } + + public function testOnethousandNineHundredIsLeapYear(): void + { + // Arrange + $year = 1900; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertFalse($result); + } + + public function testFourHundredIsLeapYear(): void + { + // Arrange + $year = 400; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertTrue($result); + } + + public function testEightHundredIsLeapYear(): void + { + // Arrange + $year = 800; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertTrue($result); + } + + public function testZeroIsLeapYear(): void + { + // Arrange + $year = 0; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertFalse($result); + } + + public function testFourIsLeapYear(): void + { + // Arrange + $year = 4; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertTrue($result); + } + + public function testOneHundredIsLeapYear(): void + { + // Arrange + $year = 100; + + // Act + $result = $this->tester->getFacade()->checkLeapYear($year); + + // Assert + $this->assertFalse($result); + } +} +//todo Testcases hinzufügen diff --git a/tests/PyzTest/Zed/LeapYear/_support/LeapYearBusinessTester.php b/tests/PyzTest/Zed/LeapYear/_support/LeapYearBusinessTester.php new file mode 100644 index 0000000000..4cac21fd88 --- /dev/null +++ b/tests/PyzTest/Zed/LeapYear/_support/LeapYearBusinessTester.php @@ -0,0 +1,37 @@ +tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerTwo(): void + { + // Arrange + $romanNumber = 'II'; + $expectedInteger = 2; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerThree(): void + { + // Arrange + $romanNumber = 'III'; + $expectedInteger = 3; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerFive(): void + { + // Arrange + $romanNumber = 'V'; + $expectedInteger = 5; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerSix(): void + { + // Arrange + $romanNumber = 'VI'; + $expectedInteger = 6; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerFour(): void + { + // Arrange + $romanNumber = 'IV'; + $expectedInteger = 4; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerTen(): void + { + // Arrange + $romanNumber = 'X'; + $expectedInteger = 10; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerNine(): void + { + // Arrange + $romanNumber = 'IX'; + $expectedInteger = 9; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerFifty(): void + { + // Arrange + $romanNumber = 'L'; + $expectedInteger = 50; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerFourthy(): void + { + // Arrange + $romanNumber = 'XL'; + $expectedInteger = 40; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerHundred(): void + { + // Arrange + $romanNumber = 'C'; + $expectedInteger = 100; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerNinty(): void + { + // Arrange + $romanNumber = 'XC'; + $expectedInteger = 90; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerFivehundred(): void + { + // Arrange + $romanNumber = 'D'; + $expectedInteger = 500; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerFourhundredNinty(): void + { + // Arrange + $romanNumber = 'XD'; + $expectedInteger = 490; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerTausend(): void + { + // Arrange + $romanNumber = 'M'; + $expectedInteger = 1000; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerNinehundredNinty(): void + { + // Arrange + $romanNumber = 'CMXC'; + $expectedInteger = 990; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerThreetausendNintynine(): void + { + // Arrange + $romanNumber = 'MMMCMXCIX'; + $expectedInteger = 3999; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerTwotausendfourhundredfourthy(): void + { + // Arrange + $romanNumber = 'MMCDXL'; + $expectedInteger = 2440; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerFourhundred(): void + { + // Arrange + $romanNumber = 'CD'; + $expectedInteger = 400; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerNinehundred(): void + { + // Arrange + $romanNumber = 'CM'; + $expectedInteger = 900; + + // Act + $result = $this->tester->getFacade()->convertRomanToInteger($romanNumber); + + // Assert + $this->assertSame($expectedInteger, $result); + } + + public function testConversionOfRomanNumberToIntegerThrowsNotARomanNumberExceptioWithIllegalCharacters(): void + { + // Arrange + $illegalString = 'KR0815'; + $expectedException = NotARomanNumberException::class; + + // Act & Assert + $this->tester->expectThrowable($expectedException, function () use ($illegalString): void { + $this->tester->getFacade()->convertRomanToInteger($illegalString); + }); + } + + public function testConversionOfRomanNumberToIntegerThrowsNotARomanNumberExceptionWithEmptyString(): void + { + // Arrange + $emptyString = ''; + $expectedException = NotARomanNumberException::class; + + // Act & Assert + $this->tester->expectThrowable($expectedException, function () use ($emptyString): void { + $this->tester->getFacade()->convertRomanToInteger($emptyString); + }); + } +} diff --git a/tests/PyzTest/Zed/RomanNumbers/_support/RomanNumbersBusinessTester.php b/tests/PyzTest/Zed/RomanNumbers/_support/RomanNumbersBusinessTester.php new file mode 100644 index 0000000000..ab1661e4c0 --- /dev/null +++ b/tests/PyzTest/Zed/RomanNumbers/_support/RomanNumbersBusinessTester.php @@ -0,0 +1,37 @@ +