public function getRuntimeEvaluationsDefintionReturnsTheEvaluationsFromAllContainedFiltersThatMatchedThePointcutWithTheCorrectOperators()
{
$runtimeEvaluations1 = ['methodArgumentConstraint' => ['arg1' => 'eval1']];
$runtimeEvaluations2 = ['methodArgumentConstraint' => ['arg2' => 'eval2']];
$runtimeEvaluations3 = ['methodArgumentConstraint' => ['arg3' => 'eval3']];
$runtimeEvaluations4 = ['methodArgumentConstraint' => ['arg4' => 'eval4']];
$runtimeEvaluations5 = ['methodArgumentConstraint' => ['arg5' => 'eval5', 'arg6' => 'eval6']];
$mockPointcutFilter1 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter1->expects($this->once())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue($runtimeEvaluations1));
$mockPointcutFilter1->expects($this->any())->method('matches')->will($this->returnValue(true));
$mockPointcutFilter1->expects($this->any())->method('hasRuntimeEvaluationsDefinition')->will($this->returnValue(true));
$mockPointcutFilter2 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter2->expects($this->once())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue($runtimeEvaluations2));
$mockPointcutFilter2->expects($this->any())->method('matches')->will($this->returnValue(false));
$mockPointcutFilter2->expects($this->any())->method('hasRuntimeEvaluationsDefinition')->will($this->returnValue(true));
$mockPointcutFilter3 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter3->expects($this->once())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue($runtimeEvaluations3));
$mockPointcutFilter3->expects($this->any())->method('matches')->will($this->returnValue(true));
$mockPointcutFilter3->expects($this->any())->method('hasRuntimeEvaluationsDefinition')->will($this->returnValue(true));
$mockPointcutFilter4 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter4->expects($this->once())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue($runtimeEvaluations4));
$mockPointcutFilter4->expects($this->any())->method('matches')->will($this->returnValue(true));
$mockPointcutFilter4->expects($this->any())->method('hasRuntimeEvaluationsDefinition')->will($this->returnValue(true));
$mockPointcutFilter5 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter5->expects($this->once())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue($runtimeEvaluations5));
$mockPointcutFilter5->expects($this->any())->method('matches')->will($this->returnValue(true));
$mockPointcutFilter5->expects($this->any())->method('hasRuntimeEvaluationsDefinition')->will($this->returnValue(true));
$pointcutFilterComposite = new Pointcut\PointcutFilterComposite();
$pointcutFilterComposite->addFilter('&&', $mockPointcutFilter1);
$pointcutFilterComposite->addFilter('&&!', $mockPointcutFilter2);
$pointcutFilterComposite->addFilter('||', $mockPointcutFilter3);
$pointcutFilterComposite->addFilter('||!', $mockPointcutFilter4);
$pointcutFilterComposite->addFilter('||!', $mockPointcutFilter5);
$expectedRuntimeEvaluations = ['&&' => ['methodArgumentConstraint' => ['arg1' => 'eval1']], '||' => ['methodArgumentConstraint' => ['arg3' => 'eval3']], '||!' => ['methodArgumentConstraint' => ['arg4' => 'eval4', 'arg5' => 'eval5', 'arg6' => 'eval6']]];
$pointcutFilterComposite->matches('className', 'methodName', 'methodDeclaringClassName', 1);
$this->assertEquals($expectedRuntimeEvaluations, $pointcutFilterComposite->getRuntimeEvaluationsDefinition());
}