/**
* Construct a new facade driver.
*
* @param AssertionRecorder $assertionRecorder The assertion recorder to use.
*/
protected function __construct(AssertionRecorder $assertionRecorder)
{
$this->sequences = array();
$anyMatcher = new AnyMatcher();
$objectIdSequence = Sequencer::sequence('exporter-object-id');
$invocableInspector = new InvocableInspector();
$exporter = new InlineExporter(1, $objectIdSequence, $invocableInspector);
$featureDetector = new FeatureDetector();
$invoker = new Invoker();
$matcherVerifier = new MatcherVerifier();
if ($featureDetector->isSupported('runtime.hhvm')) {
// @codeCoverageIgnoreStart
$functionSignatureInspector = new HhvmFunctionSignatureInspector($invocableInspector, $featureDetector);
// @codeCoverageIgnoreEnd
} else {
$functionSignatureInspector = new PhpFunctionSignatureInspector($invocableInspector, $featureDetector);
}
$mockClassLabelSequence = Sequencer::sequence('mock-class-label');
$this->sequences[] = $mockClassLabelSequence;
$mockGenerator = new MockGenerator($mockClassLabelSequence, $functionSignatureInspector, $featureDetector);
$wildcardMatcher = new WildcardMatcher($anyMatcher, 0, null);
$matcherFactory = new MatcherFactory($anyMatcher, $wildcardMatcher, $exporter);
$matcherFactory->addMatcherDriver(new HamcrestMatcherDriver());
$matcherFactory->addMatcherDriver(new CounterpartMatcherDriver());
$matcherFactory->addMatcherDriver(new PhpunitMatcherDriver());
$matcherFactory->addMatcherDriver(new SimpletestMatcherDriver());
$matcherFactory->addMatcherDriver(new PhakeMatcherDriver($wildcardMatcher));
$matcherFactory->addMatcherDriver(new ProphecyMatcherDriver($wildcardMatcher));
$matcherFactory->addMatcherDriver(new MockeryMatcherDriver());
$emptyValueFactory = new EmptyValueFactory();
$generatorAnswerBuilderFactory = new GeneratorAnswerBuilderFactory($invocableInspector, $invoker, $featureDetector);
$stubLabelSequence = Sequencer::sequence('stub-label');
$this->sequences[] = $stubLabelSequence;
$stubFactory = new StubFactory($stubLabelSequence, $matcherFactory, $matcherVerifier, $invoker, $invocableInspector, $emptyValueFactory, $generatorAnswerBuilderFactory);
$clock = new SystemClock('microtime');
$eventSequence = Sequencer::sequence('event-sequence-number');
$this->sequences[] = $eventSequence;
$eventFactory = new CallEventFactory($eventSequence, $clock);
$callFactory = new CallFactory($eventFactory, $invoker);
$generatorSpyFactory = new GeneratorSpyFactory($eventFactory, $featureDetector);
$iterableSpyFactory = new IterableSpyFactory($eventFactory);
$spyLabelSequence = Sequencer::sequence('spy-label');
$this->sequences[] = $spyLabelSequence;
$spyFactory = new SpyFactory($spyLabelSequence, $callFactory, $invoker, $generatorSpyFactory, $iterableSpyFactory);
$differenceEngine = new DifferenceEngine($featureDetector);
$assertionRenderer = new AssertionRenderer($matcherVerifier, $exporter, $differenceEngine, $featureDetector);
$generatorVerifierFactory = new GeneratorVerifierFactory($matcherFactory, $assertionRecorder, $assertionRenderer);
$iterableVerifierFactory = new IterableVerifierFactory($matcherFactory, $assertionRecorder, $assertionRenderer);
$callVerifierFactory = new CallVerifierFactory($matcherFactory, $matcherVerifier, $generatorVerifierFactory, $iterableVerifierFactory, $assertionRecorder, $assertionRenderer);
$assertionRecorder->setCallVerifierFactory($callVerifierFactory);
$functionHookGenerator = new FunctionHookGenerator();
$functionHookManager = new FunctionHookManager($functionSignatureInspector, $functionHookGenerator);
$stubVerifierFactory = new StubVerifierFactory($stubFactory, $spyFactory, $matcherFactory, $matcherVerifier, $generatorVerifierFactory, $iterableVerifierFactory, $callVerifierFactory, $assertionRecorder, $assertionRenderer, $generatorAnswerBuilderFactory, $functionHookManager);
$handleFactory = new HandleFactory($stubFactory, $stubVerifierFactory, $assertionRenderer, $assertionRecorder, $invoker);
$mockLabelSequence = Sequencer::sequence('mock-label');
$this->sequences[] = $mockLabelSequence;
$mockFactory = new MockFactory($mockLabelSequence, $mockGenerator, $handleFactory, $featureDetector);
$mockBuilderFactory = new MockBuilderFactory($mockFactory, $handleFactory, $invocableInspector, $featureDetector);
$spyVerifierFactory = new SpyVerifierFactory($spyFactory, $matcherFactory, $matcherVerifier, $generatorVerifierFactory, $iterableVerifierFactory, $callVerifierFactory, $assertionRecorder, $assertionRenderer, $functionHookManager);
$eventOrderVerifier = new EventOrderVerifier($assertionRecorder, $assertionRenderer);
$emptyValueFactory->setStubVerifierFactory($stubVerifierFactory);
$emptyValueFactory->setMockBuilderFactory($mockBuilderFactory);
$generatorVerifierFactory->setCallVerifierFactory($callVerifierFactory);
$iterableVerifierFactory->setCallVerifierFactory($callVerifierFactory);
$this->mockBuilderFactory = $mockBuilderFactory;
$this->handleFactory = $handleFactory;
$this->spyVerifierFactory = $spyVerifierFactory;
$this->stubVerifierFactory = $stubVerifierFactory;
$this->functionHookManager = $functionHookManager;
$this->eventOrderVerifier = $eventOrderVerifier;
$this->matcherFactory = $matcherFactory;
$this->exporter = $exporter;
$this->assertionRenderer = $assertionRenderer;
$this->differenceEngine = $differenceEngine;
}