/**
* @test
*/
public function reduceTargetClassNamesFiltersAllClassesExceptTheClassItselfAndAllItsSubclasses()
{
$testClassName = uniqid('someTestInterface');
eval('class ' . $testClassName . ' {}');
$availableClassNames = [$testClassName, 'TestPackage\\Subpackage\\Class1', 'TestPackage\\Class2', 'TestPackage\\Subpackage\\SubSubPackage\\Class3', 'TestPackage\\Subpackage2\\Class4'];
sort($availableClassNames);
$availableClassNamesIndex = new Aop\Builder\ClassNameIndex();
$availableClassNamesIndex->setClassNames($availableClassNames);
$mockReflectionService = $this->getMockBuilder(ReflectionService::class)->disableOriginalConstructor()->getMock();
$mockReflectionService->expects($this->any())->method('getAllSubClassNamesForClass')->with($testClassName)->will($this->returnValue(['TestPackage\\Subpackage\\Class1', 'TestPackage\\Subpackage\\SubSubPackage\\Class3', 'SomeMoreClass']));
$classTypeFilter = new Aop\Pointcut\PointcutClassTypeFilter($testClassName);
$classTypeFilter->injectReflectionService($mockReflectionService);
$expectedClassNames = [$testClassName, 'TestPackage\\Subpackage\\Class1', 'TestPackage\\Subpackage\\SubSubPackage\\Class3'];
sort($expectedClassNames);
$expectedClassNamesIndex = new Aop\Builder\ClassNameIndex();
$expectedClassNamesIndex->setClassNames($expectedClassNames);
$result = $classTypeFilter->reduceTargetClassNames($availableClassNamesIndex);
$this->assertEquals($expectedClassNamesIndex, $result, 'The wrong class names have been filtered');
}