diff --git a/src/Factory/ResultRendererFactory.php b/src/Factory/ResultRendererFactory.php index 4ff99896..22ec4798 100644 --- a/src/Factory/ResultRendererFactory.php +++ b/src/Factory/ResultRendererFactory.php @@ -37,11 +37,11 @@ class ResultRendererFactory */ public function registerRenderer($resultClass, $rendererClass) { - if (!class_implements($resultClass, ResultInterface::class)) { + if (!$this->isImplementationNameOfClass($resultClass, ResultInterface::class)) { throw new InvalidArgumentException; } - if (!class_implements($rendererClass, ResultRendererInterface::class)) { + if (!$this->isImplementationNameOfClass($rendererClass, ResultRendererInterface::class)) { throw new InvalidArgumentException; } @@ -61,4 +61,9 @@ public function create(ResultInterface $result) return new $this->mappings[$class]($result); } + + protected function isImplementationNameOfClass($implementationName, $className) + { + return is_string($implementationName) && is_subclass_of($implementationName, $className); + } } diff --git a/test/Asset/PatchableExercise.php b/test/Asset/PatchableExercise.php index ba0b9913..e638cb7e 100644 --- a/test/Asset/PatchableExercise.php +++ b/test/Asset/PatchableExercise.php @@ -54,7 +54,7 @@ public function getProblem() */ public function tearDown() { - + // TODO: Implement tearDown() method. } /** diff --git a/test/Check/ComposerCheckTest.php b/test/Check/ComposerCheckTest.php index 4dcabdd3..f62642a7 100644 --- a/test/Check/ComposerCheckTest.php +++ b/test/Check/ComposerCheckTest.php @@ -40,7 +40,6 @@ public function setUp() $this->assertTrue($this->check->canRun(ExerciseType::CGI())); $this->assertTrue($this->check->canRun(ExerciseType::CLI())); - } public function testExceptionIsThrownIfNotValidExercise() diff --git a/test/Factory/ResultRendererFactoryTest.php b/test/Factory/ResultRendererFactoryTest.php new file mode 100644 index 00000000..51cb9c47 --- /dev/null +++ b/test/Factory/ResultRendererFactoryTest.php @@ -0,0 +1,90 @@ + + */ +class ResultsRendererFactoryTest extends PHPUnit_Framework_TestCase +{ + /** + * @expectedException InvalidArgumentException + */ + public function testRegisterRendererRequiresResultInterface() + { + $resultClass = get_class($this->createMock(PHPUnit_Framework_TestCase::class)); + $rendererClass = get_class($this->createMock(ResultRendererInterface::class)); + $factory = new ResultRendererFactory(); + + $factory->registerRenderer($resultClass, $rendererClass); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testRegisterRendererRequiresResultRendererInterface() + { + $resultClass = get_class($this->createMock(ResultInterface::class)); + $rendererClass = get_class($this->createMock(PHPUnit_Framework_TestCase::class)); + $factory = new ResultRendererFactory(); + + $factory->registerRenderer($resultClass, $rendererClass); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testRegisterRendererRequiresResultClassToBeString() + { + $resultClass = $this->createMock(ResultInterface::class); + $rendererClass = get_class($this->createMock(ResultRendererInterface::class)); + $factory = new ResultRendererFactory(); + + $factory->registerRenderer($resultClass, $rendererClass); + } + + /** + * @expectedException InvalidArgumentException + */ + public function testRegisterRendererRequiresRendererClassToBeString() + { + $resultClass = get_class($this->createMock(ResultInterface::class)); + $rendererClass = $this->createMock(ResultRendererInterface::class); + $factory = new ResultRendererFactory(); + + $factory->registerRenderer($resultClass, $rendererClass); + } + + /** + * @expectedException RuntimeException + */ + public function testCreateRequiresMappingToClassName() + { + $resultClass = $this->createMock(ResultInterface::class); + $factory = new ResultRendererFactory(); + + $factory->create($resultClass); + } + + public function testCreateReturnsMappedRendererInterface() + { + $resultClass = $this->createMock(ResultInterface::class); + $resultClassName = get_class($resultClass); + $rendererClassName = get_class($this->createMock(ResultRendererInterface::class)); + $factory = new ResultRendererFactory(); + $factory->registerRenderer($resultClassName, $rendererClassName); + + $returnedRenderer = $factory->create($resultClass); + + $this->assertInstanceOf($rendererClassName, $returnedRenderer); + } +}