From f8033d08000909011ce3111875261295de9a5c65 Mon Sep 17 00:00:00 2001 From: tux-rampage Date: Tue, 5 Apr 2016 11:50:04 +0200 Subject: [PATCH] Unit Tests --- src/Config.php | 8 +- src/Definition/BuilderDefinition.php | 6 +- test/Resolver/DependencyResolver.php | 78 -------- test/Resolver/DependencyResolverTest.php | 230 +++++++++++++++++++++++ 4 files changed, 238 insertions(+), 84 deletions(-) delete mode 100644 test/Resolver/DependencyResolver.php create mode 100644 test/Resolver/DependencyResolverTest.php diff --git a/src/Config.php b/src/Config.php index 31abdaf9..203db891 100644 --- a/src/Config.php +++ b/src/Config.php @@ -89,9 +89,13 @@ class Config implements ConfigInterface protected $data = []; /** - * Constructor + * Construct from option array * - * @param array|Traversable $options + * Utilizes the given options array or traversable. + * + * @param array|Traversable $options The options array. Traversables + * will be converted to an array + * internally * @throws Exception\InvalidArgumentException */ public function __construct($options) diff --git a/src/Definition/BuilderDefinition.php b/src/Definition/BuilderDefinition.php index 38a1e77c..4ffd8457 100644 --- a/src/Definition/BuilderDefinition.php +++ b/src/Definition/BuilderDefinition.php @@ -49,14 +49,14 @@ class BuilderDefinition implements DefinitionInterface public function addClass(Builder\PhpClass $phpClass) { $this->classes[] = $phpClass; - return $this; } /** * Create a class builder object using default class builder class * - * This method is a factory that can be used in place of addClass(). + * This method is a factory that can be used to provide the parameter + * for addClass(). * * @param null|string $name Optional name of class to assign * @return Builder\PhpClass @@ -71,8 +71,6 @@ public function createClass($name = null) $class->setName($name); } - $this->addClass($class); - return $class; } diff --git a/test/Resolver/DependencyResolver.php b/test/Resolver/DependencyResolver.php deleted file mode 100644 index 0409b0bd..00000000 --- a/test/Resolver/DependencyResolver.php +++ /dev/null @@ -1,78 +0,0 @@ - [ - 'Some\SpecificClass' - ], - 'definition' => [ - 'Some\SpecificClass' => [ - 'SomeInterface' - ] - ], - 'Some\SpecificClass' - ] - ]; - } - - /** - * Tests the resolve preference code for specific configurations and definitions - * - * @dataProvider globalTypePreferenceTestDataProvider - * @covers ::resolvePreference - * - * @param string $type - * @param string $asAliasOfClass - * @param array $preferences - * @param array $definition - * @param string $expectedClass - */ - public function testResolveConfiguredGlobalPreference($type, $asAliasOfClass, $preferences, $definition, $expectedClass) - { - $configMock = $this->getMockForAbstractClass(ConfigInterface::class); - $configMock->method('getTypePreferences')->willReturn($preferences); - $configMock->method('isAlias')->willReturn($asAliasOfClass !== null); - $configMock->method('getClassForAlias')->willReturn($asAliasOfClass); - - $definitionMock = $this->getMockForAbstractClass(DefinitionInterface::class); - $definitionMock->method('hasClass')->willReturnCallback(function($class) use ($definition) { - return isset($definition[$class]); - }); - - $definitionMock->method('getClassSupertypes')->willReturnCallback(function($class) use ($definition) { - return $definition[$class]; - }); - - - $resolver = new DependencyResolver($definitionMock, $configMock); - $this->assertEquals($expectedClass, $resolver->resolvePreference($type)); - } -} \ No newline at end of file diff --git a/test/Resolver/DependencyResolverTest.php b/test/Resolver/DependencyResolverTest.php new file mode 100644 index 00000000..3b00316c --- /dev/null +++ b/test/Resolver/DependencyResolverTest.php @@ -0,0 +1,230 @@ +addClass( + $definition->createClass('Some\SpecificClass') + ->addSuperType('SomeInterface') + ) + ->addClass($definition->createClass('NotSomeInterface')) + ->addClass( + $definition->createClass('Some\OtherSpecificClass') + ->addSuperType('SomeInterface') + ); + + return [ + [ + 'SomeInterface', + 'Some\SpecificClass', + $definition, + new Config([ + 'preferences' => [ + 'SomeInterface' => [ 'Some\SpecificClass' ] + ], + ]) + ], + [ + 'SomeInterface', + 'Some\SpecificClass', + $definition, + new Config([ + 'preferences' => [ + 'SomeInterface' => [ 'NotSomeInterface', 'Some\SpecificClass' ] + ], + ]) + ], + [ + 'SomeInterface', + 'my.alias', + $definition, + new Config([ + 'preferences' => [ + 'SomeInterface' => [ 'my.alias' ] + ], + 'instances' => [ + 'my.alias' => [ + 'aliasOf' => 'SomeInterface', + ] + ] + ]), + ], + ]; + } + + /** + * @return array + */ + public function contextTypePreferenceTestDataProvider() + { + $definition = new BuilderDefinition(); + + $definition + ->addClass( + $definition->createClass('Some\SpecificClass') + ->addSuperType('SomeInterface') + ) + ->addClass($definition->createClass('NotSomeInterface')) + ->addClass( + $definition->createClass('Some\OtherSpecificClass') + ->addSuperType('SomeInterface') + ); + + return [ + [ + 'SomeInterface', + 'ContextClass', + 'Some\SpecificClass', + $definition, + new Config([ + 'instances' => [ + 'ContextClass' =>[ + 'preferences' => [ + 'SomeInterface' => [ 'Some\SpecificClass' ] + ], + ] + ] + ]) + ], + [ + 'SomeInterface', + 'ContextClassB', + 'Some\SpecificClass', + $definition, + new Config([ + 'instances' => [ + 'ContextClassB' =>[ + 'preferences' => [ + 'SomeInterface' => [ 'NotSomeInterface', 'Some\SpecificClass' ] + ], + ] + ] + ]) + ], + [ + 'SomeInterface', + 'ContextClassC', + 'my.alias', + $definition, + new Config([ + 'instances' => [ + 'my.alias' => [ + 'aliasOf' => 'SomeInterface', + ], + 'ContextClassC' => [ + 'preferences' => [ + 'SomeInterface' => [ 'my.alias' ] + ], + ] + ] + ]), + ], + [ + 'SomeInterface', + 'ContextClassE', + 'Some\OtherSpecificClass', + $definition, + new Config([ + 'preferences' => [ + 'SomeInterface' => [ 'Some\SpecificClass' ] + ], + 'instances' => [ + 'ContextClassE' => [ + 'preferences' => [ + 'SomeInterface' => [ 'Some\OtherSpecificClass' ] + ], + ] + ] + ]), + ], + [ + 'SomeInterface', + 'ContextClassE', + 'Some\SpecificClass', + $definition, + new Config([ + 'preferences' => [ + 'SomeInterface' => [ 'Some\SpecificClass' ] + ], + 'instances' => [ + 'ContextClassE' => [ + 'preferences' => [ + 'SomeInterface' => [ 'NotSomeInterface' ] + ], + ] + ] + ]), + + ], + ]; + } + + /** + * Tests the resolve global type preference code + * + * @dataProvider globalTypePreferenceTestDataProvider + * @covers ::resolvePreference + * @uses Zend\Di\Defintion\BuilderDefinition + * @uses Zend\Di\Config + * + * @param string $type The type to resolve for + * @param string $expected The expected preference + * @param DefinitionInterface $definition The definition to utilize + * @param ConfigInterface $config The config to utilize + */ + public function testResolveConfiguredGlobalPreference($type, $expected, DefinitionInterface $definition, ConfigInterface $config) + { + $resolver = new DependencyResolver($definition, $config); + $this->assertEquals($expected, $resolver->resolvePreference($type)); + } + + /** + * Tests the resolve context based type preference code + * + * @dataProvider contextTypePreferenceTestDataProvider + * @covers ::resolvePreference + * @uses Zend\Di\Defintion\BuilderDefinition + * @uses Zend\Di\Config + * + * @param string $type The type to resolve for + * @param string $contextType The context type name + * @param string $expected The expected preference + * @param DefinitionInterface $definition The definition to utilize + * @param ConfigInterface $config The config to utilize + */ + public function testResolveConfiguredPreferenceForContextType($type, $contextType, $expected, DefinitionInterface $definition, ConfigInterface $config) + { + $resolver = new DependencyResolver($definition, $config); + $this->assertEquals($expected, $resolver->resolvePreference($type, $contextType)); + } +} \ No newline at end of file