public function testGetDependenciesAndInheritDependencies() { $dependencyResult = new DependencyResult(); $dependencyResult->addDependency($dep1 = new DependencyResult\Dependency('A', 12, 'B')); $dependencyResult->addInheritDependency($dep2 = new DependencyResult\Dependency('A', 12, 'B')); $this->assertEquals([$dep1, $dep2], $dependencyResult->getDependenciesAndInheritDependencies()); }
public function applyDependencies(AstParserInterface $astParser, AstMap $astMap, DependencyResult $dependencyResult) { foreach ($astMap->getAstClassReferences() as $classReference) { foreach ($astMap->getClassInherits($classReference->getClassName()) as $inherit) { if ($inherit instanceof FlattenAstInherit) { continue; } $dependencyResult->addDependency(new Dependency($classReference->getClassName(), $inherit->getLine(), $inherit->getClassName())); } } }
/** * @param array $dependenciesAsArray * @param array $classesInLayers * @param array $rulesetConfiguration * @param $expectedCount * @dataProvider dependencyProvider */ public function testGetViolationsButNoViolations(array $dependenciesAsArray, array $classesInLayers, array $rulesetConfiguration, $expectedCount) { $dependencyResult = new DependencyResult(); foreach ($this->createDependencies($dependenciesAsArray) as $dep) { $dependencyResult->addDependency($dep); } $classNameLayerResolver = $this->prophesize(ClassNameLayerResolverInterface::class); foreach ($classesInLayers as $classInLayer => $layers) { $classNameLayerResolver->getLayersByClassName($classInLayer)->willReturn($layers); } $this->assertCount($expectedCount, (new RulesetEngine())->getViolations($dependencyResult, $classNameLayerResolver->reveal(), ConfigurationRuleset::fromArray($rulesetConfiguration))); }
public function flattenDependencies(AstMap $astMap, DependencyResult $dependencyResult) { foreach ($astMap->getAstClassReferences() as $classReference) { foreach ($astMap->getClassInherits($classReference->getClassName()) as $inherit) { if (!$inherit instanceof FlattenAstInherit) { continue; } foreach ($dependencyResult->getDependenciesByClass($inherit->getClassName()) as $dep) { $dependencyResult->addInheritDependency(new InheritDependency($classReference->getClassName(), $dep->getClassB(), $dep, $inherit)); } } } }
/** * @param DependencyResult $dependencyResult * @param ClassNameLayerResolverInterface $classNameLayerResolver * @param ConfigurationRuleset $configurationRuleset * * @return RulesetViolation[] */ public function getViolations(DependencyResult $dependencyResult, ClassNameLayerResolverInterface $classNameLayerResolver, ConfigurationRuleset $configurationRuleset) { $violations = []; foreach ($dependencyResult->getDependenciesAndInheritDependencies() as $dependency) { $layerNames = $classNameLayerResolver->getLayersByClassName($dependency->getClassA()); foreach ($layerNames as $layerName) { foreach ($classNameLayerResolver->getLayersByClassName($dependency->getClassB()) as $layerNameOfDependency) { if ($layerName == $layerNameOfDependency) { continue; } if (in_array($layerNameOfDependency, $configurationRuleset->getAllowedDependendencies($layerName))) { continue; } $violations[] = new RulesetViolation($dependency, $layerName, $layerNameOfDependency, ''); } } } return $violations; }
public function testFlattenDependencies() { $astMap = $this->prophesize(AstMap::class); $astMap->getAstClassReferences()->willReturn([$this->getAstReference('classA'), $this->getAstReference('classB'), $this->getAstReference('classBaum'), $this->getAstReference('classWeihnachtsbaum'), $this->getAstReference('classGeschmückterWeihnachtsbaum')]); $dependencyResult = new DependencyResult(); $dependencyResult->addDependency($classADep = $this->getDependency('classA')); $dependencyResult->addDependency($classBDep = $this->getDependency('classB')); $dependencyResult->addDependency($classBaumDep = $this->getDependency('classBaum')); $dependencyResult->addDependency($classWeihnachtsbaumsDep = $this->getDependency('classWeihnachtsbaumsA')); $astMap->getClassInherits('classA')->willReturn([]); $astMap->getClassInherits('classB')->willReturn([]); $astMap->getClassInherits('classBaum')->willReturn([]); $astMap->getClassInherits('classWeihnachtsbaum')->willReturn([AstInherit::newUses('classBaum', 3)]); $astMap->getClassInherits('classGeschmückterWeihnachtsbaum')->willReturn([new FlattenAstInherit(AstMap\AstInherit::newExtends('classBaum', 3), [AstInherit::newUses('classWeihnachtsbaum', 3)])]); (new DependencyInheritanceFlatter())->flattenDependencies($astMap->reveal(), $dependencyResult); $inheritDeps = array_filter($dependencyResult->getDependenciesAndInheritDependencies(), function ($v) { return $v instanceof InheritDependency; }); $this->assertCount(1, $inheritDeps); }
/** * @param AstMap $astMap * @param DependencyResult $dependencyResult * @param ClassNameLayerResolverInterface $classNameLayerResolver * * @return array */ private function calculateLayerDependencies(AstMap $astMap, DependencyResult $dependencyResult, ClassNameLayerResolverInterface $classNameLayerResolver) { $layersDependOnLayers = []; // all classes foreach ($astMap->getAstClassReferences() as $classReferences) { foreach ($classNameLayerResolver->getLayersByClassName($classReferences->getClassName()) as $classReferenceLayer) { $layersDependOnLayers[$classReferenceLayer] = []; } } // dependencies foreach ($dependencyResult->getDependenciesAndInheritDependencies() as $dependency) { $layersA = $classNameLayerResolver->getLayersByClassName($dependency->getClassA()); $layersB = $classNameLayerResolver->getLayersByClassName($dependency->getClassB()); if (empty($layersB)) { continue; } foreach ($layersA as $layerA) { if (!isset($layersDependOnLayers[$layerA])) { $layersDependOnLayers[$layerA] = []; } foreach ($layersB as $layerB) { if ($layerA == $layerB) { continue; } if (!isset($layersDependOnLayers[$layerA][$layerB])) { $layersDependOnLayers[$layerA][$layerB] = 1; continue; } $layersDependOnLayers[$layerA][$layerB] = $layersDependOnLayers[$layerA][$layerB] + 1; } } } return $layersDependOnLayers; }
public function applyDependencies(AstParserInterface $astParser, AstMap $astMap, DependencyResult $dependencyResult) { /* @var $astParser NikicPhpParser */ assert($astParser instanceof NikicPhpParser === true); foreach ($astMap->getAstFileReferences() as $fileReference) { $uses = $this->getUseStatements($astParser, $fileReference); foreach ($fileReference->getAstClassReferences() as $astClassReference) { /** @var $uses EmittedDependency[] */ $uses = array_merge($uses, $this->getInstanceOfStatements($astParser, $astClassReference), $this->getParamStatements($astParser, $astClassReference), $this->getNewStatements($astParser, $astClassReference), $this->getStaticPropertiesAccess($astParser, $astClassReference), $this->getStaticMethodCalls($astParser, $astClassReference)); foreach ($uses as $emittedDependency) { $dependencyResult->addDependency(new Dependency($astClassReference->getClassName(), $emittedDependency->getLine(), $emittedDependency->getClass())); } } } }