/**
* @test
*/
public function reduceTargetClassNamesFiltersAllClassesNotMatchedAByClassNameFilter()
{
$availableClassNames = ['TestPackage\\Subpackage\\Class1', 'TestPackage\\Class2', 'TestPackage\\Subpackage\\SubSubPackage\\Class3', 'TestPackage\\Subpackage2\\Class4'];
sort($availableClassNames);
$availableClassNamesIndex = new Aop\Builder\ClassNameIndex();
$availableClassNamesIndex->setClassNames($availableClassNames);
$classNameFilter1 = new Pointcut\PointcutClassNameFilter('TestPackage\\Subpackage\\SubSubPackage\\Class3');
$classNameFilter2 = new Pointcut\PointcutClassNameFilter('TestPackage\\Subpackage\\Class1');
$methodNameFilter1 = new Pointcut\PointcutMethodNameFilter('method2');
$expectedClassNames = ['TestPackage\\Subpackage\\Class1', 'TestPackage\\Subpackage\\SubSubPackage\\Class3'];
sort($expectedClassNames);
$expectedClassNamesIndex = new Aop\Builder\ClassNameIndex();
$expectedClassNamesIndex->setClassNames($expectedClassNames);
$pointcutFilterComposite = new Pointcut\PointcutFilterComposite();
$pointcutFilterComposite->addFilter('&&', $classNameFilter1);
$pointcutFilterComposite->addFilter('||', $classNameFilter2);
$pointcutFilterComposite->addFilter('&&', $methodNameFilter1);
$result = $pointcutFilterComposite->reduceTargetClassNames($availableClassNamesIndex);
$this->assertEquals($expectedClassNamesIndex, $result, 'The wrong class names have been filtered');
}