hasProperty($propertyName)) { throw new ReflectionException("Unknown property {$propertyName}"); } $property = $reflection->getProperty($propertyName); $property->setAccessible(true); return $property->getValue($object); } /** * Surcharge la méthode assertClassHasAttribute qui disparaitra dans PHPUnit 10 */ public static function assertClassHasAttribute(string $attributeName, string $className, string $message = ''): void { $reflection = new \ReflectionClass($className); self::assertTrue($reflection->hasProperty($attributeName), 'Failed asserting that class "' . $className . '" has attribute "' . $attributeName . '".'); } /** * Teste que la classe possède les propriétés attendues. */ public function testExpectedProperties() { $webPage = new WebPage(); foreach ($this->expectedProperties as $expectedProperty) { $this->assertClassHasAttribute($expectedProperty, get_class($webPage)); } } /** * Teste que la classe ne possède que les propriétés attendues. */ public function testUnexpectedProperties() { $webPage = new WebPage(); // Other properties ? $reflection = new \ReflectionClass(get_class($webPage)); foreach ($reflection->getProperties() as $property) { $this->assertTrue( in_array($property->getName(), $this->expectedProperties), "The property '{$property->getName()}' should not exist" ); } } /** * Teste la visibilité des propriétés de la classe. */ public function testPropertiesVisibility() { $webPage = new WebPage(); $reflection = new \ReflectionClass(get_class($webPage)); // Properties visibility foreach ($reflection->getProperties() as $property) { $this->assertTrue($property->isPrivate(), "The property '{$property->getName()}' should be private"); } } /** * Teste le constructeur sans paramètre. */ public function testEmptyConstructor() { $webPage = new WebPage(); foreach ($this->expectedProperties as $propertyName) { $this->assertEmpty(self::getPropertyValue($webPage, $propertyName), "The property '{$propertyName}' should contain an empty string"); } } /** * Teste le constructeur avec un paramètre. */ public function testConstructorWithParameter() { $fakeTitle = 'fakeTitle'; $webPage = new WebPage($fakeTitle); // Test title $propertyName = 'title'; $this->assertEquals($fakeTitle, self::getPropertyValue($webPage, $propertyName), "The property '{$propertyName}' should contain the value of the parameter of the constructor"); // Test other properties $expectedProperties = $this->expectedProperties; unset($expectedProperties[array_search('title', $expectedProperties)]); foreach ($expectedProperties as $propertyName) { $this->assertEmpty(self::getPropertyValue($webPage, $propertyName), "The property '{$propertyName}' should contain an empty string"); } } /** * Teste la méthode setTitle(). */ public function testSetTitle() { $fakeTitle = 'fakeTitle'; $webPage = new WebPage(); $webPage->setTitle($fakeTitle); // Test title $propertyName = 'title'; $this->assertEquals($fakeTitle, self::getPropertyValue($webPage, $propertyName), "The property '{$propertyName}' should contain the value of the parameter of the 'setTitle()' method"); } /** * Teste la méthode appendContent() appelée une fois. */ public function testAppendContentOnce() { $fakeBody = 'fakeBody'; $webPage = new WebPage(); $webPage->appendContent($fakeBody); $propertyName = 'body'; $this->assertEquals($fakeBody, self::getPropertyValue($webPage, $propertyName), "The property '{$propertyName}' should contain the value of the parameter of the 'appendContent' method"); } /** * Teste la méthode appendContent() appelée deux fois. */ public function testAppendContentTwice() { $fakeBody1 = 'fakeBody first line'; $fakeBody2 = 'fakeBody second line'; $webPage = new WebPage(); $webPage->appendContent($fakeBody1); $webPage->appendContent($fakeBody2); $propertyName = 'body'; $this->assertEquals($fakeBody1 . $fakeBody2, self::getPropertyValue($webPage, $propertyName), "The property '{$propertyName}' should contain the value of the parameter of the 'appendContent' method"); } /** * Teste la méthode escapeString(). */ public function testEscapeString() { $webPage = new WebPage(); $string = "<>éàôïaz&erty ' \""; $escapedString = '<>éàôïaz&erty ' "'; $this->assertEquals($escapedString, $webPage->escapeString($string), "the 'escapeString' method should use htmlspecialchars() properly"); } /** * Teste la méthode getHead(). */ public function testGetHead() { $fakeHead1 = 'fakeHead first line'; $fakeHead2 = 'fakeHead second line'; $webPage = new WebPage(); $webPage->appendToHead($fakeHead1); $webPage->appendToHead($fakeHead2); $this->assertEquals($fakeHead1 . $fakeHead2, $webPage->getHead(), "the 'getHead()' method should return the content of the 'head' property"); } /** * Teste la méthode getBody(). */ public function testGetBody() { $fakeBody1 = 'fakeBody first line'; $fakeBody2 = 'fakeBody second line'; $webPage = new WebPage(); $webPage->appendContent($fakeBody1); $webPage->appendContent($fakeBody2); $this->assertEquals($fakeBody1 . $fakeBody2, $webPage->getBody(), "The 'getBody()' method should return the content of the 'body' property"); } }