public function matchesReturnsTrueForNegatedSubfiltersWithRuntimeEvaluations()
{
$mockPointcutFilter1 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter1->expects($this->any())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue(['eval']));
$mockPointcutFilter1->expects($this->once())->method('matches')->will($this->returnValue(true));
$mockPointcutFilter2 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter2->expects($this->any())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue(['eval']));
$mockPointcutFilter2->expects($this->once())->method('matches')->will($this->returnValue(true));
$mockPointcutFilter3 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter3->expects($this->any())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue(['eval']));
$mockPointcutFilter3->expects($this->any())->method('matches')->will($this->returnValue(true));
$mockPointcutFilter4 = $this->getMockBuilder(Pointcut\PointcutFilterInterface::class)->disableOriginalConstructor()->getMock();
$mockPointcutFilter4->expects($this->any())->method('getRuntimeEvaluationsDefinition')->will($this->returnValue(['eval']));
$mockPointcutFilter4->expects($this->once())->method('matches')->will($this->returnValue(true));
$pointcutFilterComposite = new Pointcut\PointcutFilterComposite();
$pointcutFilterComposite->addFilter('&&', $mockPointcutFilter1);
$pointcutFilterComposite->addFilter('&&!', $mockPointcutFilter2);
$pointcutFilterComposite->addFilter('||', $mockPointcutFilter3);
$pointcutFilterComposite->addFilter('||!', $mockPointcutFilter4);
$this->assertTrue($pointcutFilterComposite->matches('someClass', 'someMethod', 'someDeclaringClass', 1));
}