diff --git a/src/Definition/ClassDefinition.php b/src/Definition/ClassDefinition.php index 58262eb5..a3a5f007 100644 --- a/src/Definition/ClassDefinition.php +++ b/src/Definition/ClassDefinition.php @@ -136,6 +136,9 @@ public function hasClass($class) */ public function getClassSupertypes($class) { + if ($this->class !== $class) { + return array(); + } return $this->supertypes; } @@ -144,6 +147,9 @@ public function getClassSupertypes($class) */ public function getInstantiator($class) { + if ($this->class !== $class) { + return null; + } return $this->instantiator; } @@ -160,6 +166,9 @@ public function hasMethods($class) */ public function getMethods($class) { + if ($this->class !== $class) { + return array(); + } return $this->methods; } @@ -168,6 +177,10 @@ public function getMethods($class) */ public function hasMethod($class, $method) { + if ($this->class !== $class) { + return null; + } + if (is_array($this->methods)) { return array_key_exists($method, $this->methods); } else { @@ -180,6 +193,9 @@ public function hasMethod($class, $method) */ public function hasMethodParameters($class, $method) { + if ($this->class !== $class) { + return false; + } return (array_key_exists($method, $this->methodParameters)); } @@ -188,6 +204,10 @@ public function hasMethodParameters($class, $method) */ public function getMethodParameters($class, $method) { + if ($this->class !== $class) { + return null; + } + if (array_key_exists($method, $this->methodParameters)) { return $this->methodParameters[$method]; } diff --git a/src/DefinitionList.php b/src/DefinitionList.php index 345bbc94..0ab0c411 100644 --- a/src/DefinitionList.php +++ b/src/DefinitionList.php @@ -144,9 +144,13 @@ public function getClassSupertypes($class) $supertypes = array(); /** @var $definition Definition\DefinitionInterface */ foreach ($this as $definition) { - $supertypes = array_merge($supertypes, $definition->getClassSupertypes($class)); + if ($definition->hasClass($class)) { + $supertypes = array_merge($supertypes, $definition->getClassSupertypes($class)); + if (!$definition instanceof Definition\PartialMarker) { + return $supertypes; + } + } } - // @todo remove duplicates? return $supertypes; } diff --git a/test/Definition/ClassDefinitionTest.php b/test/Definition/ClassDefinitionTest.php index 39625a7c..8dc2ac39 100644 --- a/test/Definition/ClassDefinitionTest.php +++ b/test/Definition/ClassDefinitionTest.php @@ -27,4 +27,52 @@ public function testClassDefinitionHasMethods() $definition->addMethod('doBar'); $this->assertTrue($definition->hasMethods('Foo')); } + + public function testGetClassSupertypes() + { + $definition = new ClassDefinition('Foo'); + $definition->setSupertypes(array('superFoo')); + $this->assertEquals(array(), $definition->getClassSupertypes('Bar')); + $this->assertEquals(array('superFoo'), $definition->getClassSupertypes('Foo')); + } + + public function testGetInstantiator() + { + $definition = new ClassDefinition('Foo'); + $definition->setInstantiator('__construct'); + $this->assertNull($definition->getInstantiator('Bar')); + $this->assertEquals('__construct', $definition->getInstantiator('Foo')); + } + + public function testGetMethods() + { + $definition = new ClassDefinition('Foo'); + $definition->addMethod("setVar", true); + $this->assertEquals(array(), $definition->getMethods('Bar')); + $this->assertEquals(array('setVar' => true), $definition->getMethods('Foo')); + } + + public function testHasMethod() + { + $definition = new ClassDefinition('Foo'); + $definition->addMethod("setVar", true); + $this->assertNull($definition->hasMethod('Bar', "setVar")); + $this->assertTrue($definition->hasMethod('Foo', "setVar")); + } + + public function testHasMethodParameters() + { + $definition = new ClassDefinition('Foo'); + $definition->addMethodParameter("setVar", "var", array(null, true)); + $this->assertFalse($definition->hasMethodParameters("Bar", "setVar")); + $this->assertTrue($definition->hasMethodParameters("Foo", "setVar")); + } + + public function testGetMethodParameters() + { + $definition = new ClassDefinition('Foo'); + $definition->addMethodParameter("setVar", "var", array('type' => null, 'required' => true)); + $this->assertNull($definition->getMethodParameters("Bar", "setVar")); + $this->assertEquals(array('Foo::setVar:var' => array("var", null, true)), $definition->getMethodParameters("Foo", "setVar")); + } } diff --git a/test/DefinitionListTest.php b/test/DefinitionListTest.php new file mode 100644 index 00000000..16b83f79 --- /dev/null +++ b/test/DefinitionListTest.php @@ -0,0 +1,35 @@ +setSupertypes($superTypesA); + + $definitionClassB = new ClassDefinition("B"); + $definitionClassB->setSupertypes(array("superB")); + + $definitionList = new DefinitionList(array($definitionClassA, $definitionClassB)); + + $this->assertEquals($superTypesA, $definitionList->getClassSupertypes("A")); + + } +}