t |
t |
Projeto criado com o objetivo de mostrar a simplicidade de como é possível programar e fazer uma cópia de acordo com o que se vê. Neste caso, utilizamos o Instagram como base para um teste de seleção na Mkt Virtual.
+ +A aplicação não utilizará os dados fornecidos pelos possíveis usuários e o mesmo será desativado após ser visualizado pela empresa MktVirtual.
+ + \ No newline at end of file diff --git a/vendor/autoload.php b/vendor/autoload.php index 828cabe..0260f0c 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -1,7 +1,6 @@ prefixes; + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', $this->prefixesPsr0); + } + + return array(); + } + + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; } public function getFallbackDirs() { - return $this->fallbackDirs; + return $this->fallbackDirsPsr0; + } + + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; } public function getClassMap() @@ -75,61 +96,135 @@ public function addClassMap(array $classMap) } /** - * Registers a set of classes, merging with any others previously set. + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The classes prefix - * @param array|string $paths The location(s) of the classes - * @param bool $prepend Prepend the location(s) + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories */ public function add($prefix, $paths, $prepend = false) { if (!$prefix) { if ($prepend) { - $this->fallbackDirs = array_merge( + $this->fallbackDirsPsr0 = array_merge( (array) $paths, - $this->fallbackDirs + $this->fallbackDirsPsr0 ); } else { - $this->fallbackDirs = array_merge( - $this->fallbackDirs, + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, (array) $paths ); } return; } - if (!isset($this->prefixes[$prefix])) { - $this->prefixes[$prefix] = (array) $paths; + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = (array) $paths; return; } if ($prepend) { - $this->prefixes[$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix] = array_merge( (array) $paths, - $this->prefixes[$prefix] + $this->prefixesPsr0[$first][$prefix] ); } else { - $this->prefixes[$prefix] = array_merge( - $this->prefixes[$prefix], + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], (array) $paths ); } } /** - * Registers a set of classes, replacing any others previously set. + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-0 base directories + * @param bool $prepend Whether to prepend the directories * - * @param string $prefix The classes prefix - * @param array|string $paths The location(s) of the classes + * @throws \InvalidArgumentException + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + (array) $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + (array) $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + (array) $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + (array) $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param array|string $paths The PSR-0 base directories */ public function set($prefix, $paths) { if (!$prefix) { - $this->fallbackDirs = (array) $paths; + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } - return; + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param array|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; } - $this->prefixes[$prefix] = (array) $paths; } /** @@ -180,7 +275,7 @@ public function unregister() public function loadClass($class) { if ($file = $this->findFile($class)) { - include $file; + includeFile($file); return true; } @@ -195,46 +290,98 @@ public function loadClass($class) */ public function findFile($class) { + // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731 if ('\\' == $class[0]) { $class = substr($class, 1); } + // class map lookup if (isset($this->classMap[$class])) { return $this->classMap[$class]; } + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if ($file === null && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if ($file === null) { + // Remember that this class does not exist. + return $this->classMap[$class] = false; + } + + return $file; + } + + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) { + if (0 === strpos($class, $prefix)) { + foreach ($this->prefixDirsPsr4[$prefix] as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup if (false !== $pos = strrpos($class, '\\')) { // namespaced class name - $classPath = str_replace('\\', DIRECTORY_SEPARATOR, substr($class, 0, $pos)) . DIRECTORY_SEPARATOR; - $className = substr($class, $pos + 1); + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); } else { // PEAR-like class name - $classPath = null; - $className = $class; + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; } - $classPath .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php'; - - foreach ($this->prefixes as $prefix => $dirs) { - if (0 === strpos($class, $prefix)) { - foreach ($dirs as $dir) { - if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) { - return $dir . DIRECTORY_SEPARATOR . $classPath; + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } } } } } - foreach ($this->fallbackDirs as $dir) { - if (file_exists($dir . DIRECTORY_SEPARATOR . $classPath)) { - return $dir . DIRECTORY_SEPARATOR . $classPath; + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; } } - if ($this->useIncludePath && $file = stream_resolve_include_path($classPath)) { + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { return $file; } - - return $this->classMap[$class] = false; } } + +/** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + */ +function includeFile($file) +{ + include $file; +} diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 69cecaa..630d5f2 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -1,13 +1,413 @@ $vendorDir . '/facebook/php-sdk/src/base_facebook.php', - 'Facebook' => $vendorDir . '/facebook/php-sdk/src/facebook.php', - 'FacebookApiException' => $vendorDir . '/facebook/php-sdk/src/base_facebook.php', - 'Mkt' => $baseDir . '/app/samples/Mkt.php', + 'File_Iterator' => $vendorDir . '/phpunit/php-file-iterator/File/Iterator.php', + 'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/File/Iterator/Facade.php', + 'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/File/Iterator/Factory.php', + 'PHPUnit_Exception' => $vendorDir . '/phpunit/phpunit/src/Exception.php', + 'PHPUnit_Extensions_GroupTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php', + 'PHPUnit_Extensions_PhptTestCase' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestCase.php', + 'PHPUnit_Extensions_PhptTestSuite' => $vendorDir . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php', + 'PHPUnit_Extensions_RepeatedTest' => $vendorDir . '/phpunit/phpunit/src/Extensions/RepeatedTest.php', + 'PHPUnit_Extensions_TestDecorator' => $vendorDir . '/phpunit/phpunit/src/Extensions/TestDecorator.php', + 'PHPUnit_Extensions_TicketListener' => $vendorDir . '/phpunit/phpunit/src/Extensions/TicketListener.php', + 'PHPUnit_Framework_Assert' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert.php', + 'PHPUnit_Framework_AssertionFailedError' => $vendorDir . '/phpunit/phpunit/src/Framework/AssertionFailedError.php', + 'PHPUnit_Framework_BaseTestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/BaseTestListener.php', + 'PHPUnit_Framework_CodeCoverageException' => $vendorDir . '/phpunit/phpunit/src/Framework/CodeCoverageException.php', + 'PHPUnit_Framework_Constraint' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint.php', + 'PHPUnit_Framework_Constraint_And' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/And.php', + 'PHPUnit_Framework_Constraint_ArrayHasKey' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php', + 'PHPUnit_Framework_Constraint_ArraySubset' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php', + 'PHPUnit_Framework_Constraint_Attribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php', + 'PHPUnit_Framework_Constraint_Callback' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Callback.php', + 'PHPUnit_Framework_Constraint_ClassHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php', + 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php', + 'PHPUnit_Framework_Constraint_Composite' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Composite.php', + 'PHPUnit_Framework_Constraint_Count' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Count.php', + 'PHPUnit_Framework_Constraint_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Exception.php', + 'PHPUnit_Framework_Constraint_ExceptionCode' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php', + 'PHPUnit_Framework_Constraint_ExceptionMessage' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php', + 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php', + 'PHPUnit_Framework_Constraint_FileExists' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php', + 'PHPUnit_Framework_Constraint_GreaterThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php', + 'PHPUnit_Framework_Constraint_IsAnything' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php', + 'PHPUnit_Framework_Constraint_IsEmpty' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php', + 'PHPUnit_Framework_Constraint_IsEqual' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php', + 'PHPUnit_Framework_Constraint_IsFalse' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php', + 'PHPUnit_Framework_Constraint_IsIdentical' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php', + 'PHPUnit_Framework_Constraint_IsInstanceOf' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php', + 'PHPUnit_Framework_Constraint_IsJson' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php', + 'PHPUnit_Framework_Constraint_IsNull' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php', + 'PHPUnit_Framework_Constraint_IsTrue' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php', + 'PHPUnit_Framework_Constraint_IsType' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/IsType.php', + 'PHPUnit_Framework_Constraint_JsonMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php', + 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php', + 'PHPUnit_Framework_Constraint_LessThan' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php', + 'PHPUnit_Framework_Constraint_Not' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Not.php', + 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php', + 'PHPUnit_Framework_Constraint_Or' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Or.php', + 'PHPUnit_Framework_Constraint_PCREMatch' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php', + 'PHPUnit_Framework_Constraint_SameSize' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php', + 'PHPUnit_Framework_Constraint_StringContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php', + 'PHPUnit_Framework_Constraint_StringEndsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php', + 'PHPUnit_Framework_Constraint_StringMatches' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php', + 'PHPUnit_Framework_Constraint_StringStartsWith' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php', + 'PHPUnit_Framework_Constraint_TraversableContains' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php', + 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php', + 'PHPUnit_Framework_Constraint_Xor' => $vendorDir . '/phpunit/phpunit/src/Framework/Constraint/Xor.php', + 'PHPUnit_Framework_Error' => $vendorDir . '/phpunit/phpunit/src/Framework/Error.php', + 'PHPUnit_Framework_Error_Deprecated' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Deprecated.php', + 'PHPUnit_Framework_Error_Notice' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Notice.php', + 'PHPUnit_Framework_Error_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Error/Warning.php', + 'PHPUnit_Framework_Exception' => $vendorDir . '/phpunit/phpunit/src/Framework/Exception.php', + 'PHPUnit_Framework_ExceptionWrapper' => $vendorDir . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php', + 'PHPUnit_Framework_ExpectationFailedException' => $vendorDir . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php', + 'PHPUnit_Framework_IncompleteTest' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTest.php', + 'PHPUnit_Framework_IncompleteTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php', + 'PHPUnit_Framework_IncompleteTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/IncompleteTestError.php', + 'PHPUnit_Framework_InvalidCoversTargetError' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetError.php', + 'PHPUnit_Framework_InvalidCoversTargetException' => $vendorDir . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php', + 'PHPUnit_Framework_MockObject_BadMethodCallException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php', + 'PHPUnit_Framework_MockObject_Builder_Identity' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php', + 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php', + 'PHPUnit_Framework_MockObject_Builder_Match' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php', + 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php', + 'PHPUnit_Framework_MockObject_Builder_Namespace' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php', + 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php', + 'PHPUnit_Framework_MockObject_Builder_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php', + 'PHPUnit_Framework_MockObject_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php', + 'PHPUnit_Framework_MockObject_Generator' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php', + 'PHPUnit_Framework_MockObject_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php', + 'PHPUnit_Framework_MockObject_InvocationMocker' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php', + 'PHPUnit_Framework_MockObject_Invocation_Object' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php', + 'PHPUnit_Framework_MockObject_Invocation_Static' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php', + 'PHPUnit_Framework_MockObject_Invokable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php', + 'PHPUnit_Framework_MockObject_Matcher' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php', + 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php', + 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php', + 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php', + 'PHPUnit_Framework_MockObject_Matcher_Invocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php', + 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php', + 'PHPUnit_Framework_MockObject_Matcher_MethodName' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php', + 'PHPUnit_Framework_MockObject_Matcher_Parameters' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php', + 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php', + 'PHPUnit_Framework_MockObject_MockBuilder' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php', + 'PHPUnit_Framework_MockObject_MockObject' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php', + 'PHPUnit_Framework_MockObject_RuntimeException' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php', + 'PHPUnit_Framework_MockObject_Stub' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php', + 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php', + 'PHPUnit_Framework_MockObject_Stub_Exception' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php', + 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php', + 'PHPUnit_Framework_MockObject_Stub_Return' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php', + 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php', + 'PHPUnit_Framework_MockObject_Verifiable' => $vendorDir . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php', + 'PHPUnit_Framework_OutputError' => $vendorDir . '/phpunit/phpunit/src/Framework/OutputError.php', + 'PHPUnit_Framework_RiskyTest' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTest.php', + 'PHPUnit_Framework_RiskyTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/RiskyTestError.php', + 'PHPUnit_Framework_SelfDescribing' => $vendorDir . '/phpunit/phpunit/src/Framework/SelfDescribing.php', + 'PHPUnit_Framework_SkippedTest' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTest.php', + 'PHPUnit_Framework_SkippedTestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestCase.php', + 'PHPUnit_Framework_SkippedTestError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestError.php', + 'PHPUnit_Framework_SkippedTestSuiteError' => $vendorDir . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php', + 'PHPUnit_Framework_SyntheticError' => $vendorDir . '/phpunit/phpunit/src/Framework/SyntheticError.php', + 'PHPUnit_Framework_Test' => $vendorDir . '/phpunit/phpunit/src/Framework/Test.php', + 'PHPUnit_Framework_TestCase' => $vendorDir . '/phpunit/phpunit/src/Framework/TestCase.php', + 'PHPUnit_Framework_TestFailure' => $vendorDir . '/phpunit/phpunit/src/Framework/TestFailure.php', + 'PHPUnit_Framework_TestListener' => $vendorDir . '/phpunit/phpunit/src/Framework/TestListener.php', + 'PHPUnit_Framework_TestResult' => $vendorDir . '/phpunit/phpunit/src/Framework/TestResult.php', + 'PHPUnit_Framework_TestSuite' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite.php', + 'PHPUnit_Framework_TestSuite_DataProvider' => $vendorDir . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php', + 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => $vendorDir . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php', + 'PHPUnit_Framework_Warning' => $vendorDir . '/phpunit/phpunit/src/Framework/Warning.php', + 'PHPUnit_Runner_BaseTestRunner' => $vendorDir . '/phpunit/phpunit/src/Runner/BaseTestRunner.php', + 'PHPUnit_Runner_Exception' => $vendorDir . '/phpunit/phpunit/src/Runner/Exception.php', + 'PHPUnit_Runner_Filter_Factory' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Factory.php', + 'PHPUnit_Runner_Filter_GroupFilterIterator' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group.php', + 'PHPUnit_Runner_Filter_Group_Exclude' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php', + 'PHPUnit_Runner_Filter_Group_Include' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php', + 'PHPUnit_Runner_Filter_Test' => $vendorDir . '/phpunit/phpunit/src/Runner/Filter/Test.php', + 'PHPUnit_Runner_StandardTestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php', + 'PHPUnit_Runner_TestSuiteLoader' => $vendorDir . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php', + 'PHPUnit_Runner_Version' => $vendorDir . '/phpunit/phpunit/src/Runner/Version.php', + 'PHPUnit_TextUI_Command' => $vendorDir . '/phpunit/phpunit/src/TextUI/Command.php', + 'PHPUnit_TextUI_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/TextUI/ResultPrinter.php', + 'PHPUnit_TextUI_TestRunner' => $vendorDir . '/phpunit/phpunit/src/TextUI/TestRunner.php', + 'PHPUnit_Util_Blacklist' => $vendorDir . '/phpunit/phpunit/src/Util/Blacklist.php', + 'PHPUnit_Util_Configuration' => $vendorDir . '/phpunit/phpunit/src/Util/Configuration.php', + 'PHPUnit_Util_ErrorHandler' => $vendorDir . '/phpunit/phpunit/src/Util/ErrorHandler.php', + 'PHPUnit_Util_Fileloader' => $vendorDir . '/phpunit/phpunit/src/Util/Fileloader.php', + 'PHPUnit_Util_Filesystem' => $vendorDir . '/phpunit/phpunit/src/Util/Filesystem.php', + 'PHPUnit_Util_Filter' => $vendorDir . '/phpunit/phpunit/src/Util/Filter.php', + 'PHPUnit_Util_Getopt' => $vendorDir . '/phpunit/phpunit/src/Util/Getopt.php', + 'PHPUnit_Util_GlobalState' => $vendorDir . '/phpunit/phpunit/src/Util/GlobalState.php', + 'PHPUnit_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php', + 'PHPUnit_Util_Log_JSON' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JSON.php', + 'PHPUnit_Util_Log_JUnit' => $vendorDir . '/phpunit/phpunit/src/Util/Log/JUnit.php', + 'PHPUnit_Util_Log_TAP' => $vendorDir . '/phpunit/phpunit/src/Util/Log/TAP.php', + 'PHPUnit_Util_PHP' => $vendorDir . '/phpunit/phpunit/src/Util/PHP.php', + 'PHPUnit_Util_PHP_Default' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Default.php', + 'PHPUnit_Util_PHP_Windows' => $vendorDir . '/phpunit/phpunit/src/Util/PHP/Windows.php', + 'PHPUnit_Util_Printer' => $vendorDir . '/phpunit/phpunit/src/Util/Printer.php', + 'PHPUnit_Util_Regex' => $vendorDir . '/phpunit/phpunit/src/Util/Regex.php', + 'PHPUnit_Util_String' => $vendorDir . '/phpunit/phpunit/src/Util/String.php', + 'PHPUnit_Util_Test' => $vendorDir . '/phpunit/phpunit/src/Util/Test.php', + 'PHPUnit_Util_TestDox_NamePrettifier' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php', + 'PHPUnit_Util_TestDox_ResultPrinter' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php', + 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php', + 'PHPUnit_Util_TestDox_ResultPrinter_Text' => $vendorDir . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php', + 'PHPUnit_Util_TestSuiteIterator' => $vendorDir . '/phpunit/phpunit/src/Util/TestSuiteIterator.php', + 'PHPUnit_Util_Type' => $vendorDir . '/phpunit/phpunit/src/Util/Type.php', + 'PHPUnit_Util_XML' => $vendorDir . '/phpunit/phpunit/src/Util/XML.php', + 'PHP_CodeCoverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage.php', + 'PHP_CodeCoverage_Driver' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver.php', + 'PHP_CodeCoverage_Driver_HHVM' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php', + 'PHP_CodeCoverage_Driver_Xdebug' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php', + 'PHP_CodeCoverage_Exception' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Exception.php', + 'PHP_CodeCoverage_Exception_UnintentionallyCoveredCode' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php', + 'PHP_CodeCoverage_Filter' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Filter.php', + 'PHP_CodeCoverage_Report_Clover' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php', + 'PHP_CodeCoverage_Report_Crap4j' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php', + 'PHP_CodeCoverage_Report_Factory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php', + 'PHP_CodeCoverage_Report_HTML' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php', + 'PHP_CodeCoverage_Report_HTML_Renderer' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_Dashboard' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php', + 'PHP_CodeCoverage_Report_HTML_Renderer_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php', + 'PHP_CodeCoverage_Report_Node' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node.php', + 'PHP_CodeCoverage_Report_Node_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Directory.php', + 'PHP_CodeCoverage_Report_Node_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/File.php', + 'PHP_CodeCoverage_Report_Node_Iterator' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Iterator.php', + 'PHP_CodeCoverage_Report_PHP' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/PHP.php', + 'PHP_CodeCoverage_Report_Text' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Text.php', + 'PHP_CodeCoverage_Report_XML' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML.php', + 'PHP_CodeCoverage_Report_XML_Directory' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Directory.php', + 'PHP_CodeCoverage_Report_XML_File' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File.php', + 'PHP_CodeCoverage_Report_XML_File_Coverage' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Coverage.php', + 'PHP_CodeCoverage_Report_XML_File_Method' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Method.php', + 'PHP_CodeCoverage_Report_XML_File_Report' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Report.php', + 'PHP_CodeCoverage_Report_XML_File_Unit' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Unit.php', + 'PHP_CodeCoverage_Report_XML_Node' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Node.php', + 'PHP_CodeCoverage_Report_XML_Project' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Project.php', + 'PHP_CodeCoverage_Report_XML_Tests' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Tests.php', + 'PHP_CodeCoverage_Report_XML_Totals' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Totals.php', + 'PHP_CodeCoverage_Util' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Util.php', + 'PHP_CodeCoverage_Util_InvalidArgumentHelper' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Util/InvalidArgumentHelper.php', + 'PHP_Timer' => $vendorDir . '/phpunit/php-timer/PHP/Timer.php', + 'PHP_Token' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScope' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_TokenWithScopeAndVisibility' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ABSTRACT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AMPERSAND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AND_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ARRAY_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BACKTICK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BAD_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOLEAN_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BOOL_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_BREAK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CALLABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CARET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CASE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CATCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CHARACTER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLASS_NAME_CONSTANT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLONE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CLOSE_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMA' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONCAT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONSTANT_ENCAPSED_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CONTINUE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_CURLY_OPEN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DEFAULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DIV_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOC_COMMENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_COLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_DOUBLE_QUOTES' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELLIPSIS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ELSEIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EMPTY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENCAPSED_AND_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDDECLARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDFOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDIF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDSWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ENDWHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_END_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EVAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXCLAMATION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_EXTENDS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FINALLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FOREACH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNCTION' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_FUNC_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GLOBAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GOTO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_HALT_COMPILER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IMPLEMENTS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INCLUDE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INLINE_HTML' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTANCEOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INSTEADOF' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INTERFACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_INT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_ISSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_GREATER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_NOT_IDENTICAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_IS_SMALLER_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Includes' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LINE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LIST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LNUMBER' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_AND' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_OR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LOGICAL_XOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_METHOD_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MINUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MOD_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MULT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_MUL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NAMESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NEW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NS_SEPARATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_NUM_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OBJECT_OPERATOR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_BRACKET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_CURLY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_SQUARE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OPEN_TAG_WITH_ECHO' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_OR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PERCENT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PIPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PLUS_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_POW_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRINT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PRIVATE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PROTECTED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_PUBLIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_QUESTION_MARK' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_REQUIRE_ONCE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_RETURN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SEMICOLON' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SL_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_START_HEREDOC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STATIC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_STRING_VARNAME' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_SWITCH' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_Stream' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream.php', + 'PHP_Token_Stream_CachingFactory' => $vendorDir . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php', + 'PHP_Token_THROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TILDE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRAIT_C' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_TRY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_UNSET_CAST' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_USE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VAR' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_VARIABLE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHILE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_WHITESPACE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_XOR_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'PHP_Token_YIELD' => $vendorDir . '/phpunit/php-token-stream/src/Token.php', + 'SebastianBergmann\\Comparator\\ArrayComparator' => $vendorDir . '/sebastian/comparator/src/ArrayComparator.php', + 'SebastianBergmann\\Comparator\\Comparator' => $vendorDir . '/sebastian/comparator/src/Comparator.php', + 'SebastianBergmann\\Comparator\\ComparisonFailure' => $vendorDir . '/sebastian/comparator/src/ComparisonFailure.php', + 'SebastianBergmann\\Comparator\\DOMNodeComparator' => $vendorDir . '/sebastian/comparator/src/DOMNodeComparator.php', + 'SebastianBergmann\\Comparator\\DateTimeComparator' => $vendorDir . '/sebastian/comparator/src/DateTimeComparator.php', + 'SebastianBergmann\\Comparator\\DoubleComparator' => $vendorDir . '/sebastian/comparator/src/DoubleComparator.php', + 'SebastianBergmann\\Comparator\\ExceptionComparator' => $vendorDir . '/sebastian/comparator/src/ExceptionComparator.php', + 'SebastianBergmann\\Comparator\\Factory' => $vendorDir . '/sebastian/comparator/src/Factory.php', + 'SebastianBergmann\\Comparator\\MockObjectComparator' => $vendorDir . '/sebastian/comparator/src/MockObjectComparator.php', + 'SebastianBergmann\\Comparator\\NumericComparator' => $vendorDir . '/sebastian/comparator/src/NumericComparator.php', + 'SebastianBergmann\\Comparator\\ObjectComparator' => $vendorDir . '/sebastian/comparator/src/ObjectComparator.php', + 'SebastianBergmann\\Comparator\\ResourceComparator' => $vendorDir . '/sebastian/comparator/src/ResourceComparator.php', + 'SebastianBergmann\\Comparator\\ScalarComparator' => $vendorDir . '/sebastian/comparator/src/ScalarComparator.php', + 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => $vendorDir . '/sebastian/comparator/src/SplObjectStorageComparator.php', + 'SebastianBergmann\\Comparator\\TypeComparator' => $vendorDir . '/sebastian/comparator/src/TypeComparator.php', + 'SebastianBergmann\\Diff\\Chunk' => $vendorDir . '/sebastian/diff/src/Chunk.php', + 'SebastianBergmann\\Diff\\Diff' => $vendorDir . '/sebastian/diff/src/Diff.php', + 'SebastianBergmann\\Diff\\Differ' => $vendorDir . '/sebastian/diff/src/Differ.php', + 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => $vendorDir . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php', + 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php', + 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => $vendorDir . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php', + 'SebastianBergmann\\Diff\\Line' => $vendorDir . '/sebastian/diff/src/Line.php', + 'SebastianBergmann\\Diff\\Parser' => $vendorDir . '/sebastian/diff/src/Parser.php', + 'SebastianBergmann\\Environment\\Console' => $vendorDir . '/sebastian/environment/src/Console.php', + 'SebastianBergmann\\Environment\\Runtime' => $vendorDir . '/sebastian/environment/src/Runtime.php', + 'SebastianBergmann\\Exporter\\Context' => $vendorDir . '/sebastian/exporter/src/Context.php', + 'SebastianBergmann\\Exporter\\Exception' => $vendorDir . '/sebastian/exporter/src/Exception.php', + 'SebastianBergmann\\Exporter\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php', + 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php', + 'SebastianBergmann\\GlobalState\\Exception' => $vendorDir . '/sebastian/global-state/src/Exception.php', + 'SebastianBergmann\\GlobalState\\Restorer' => $vendorDir . '/sebastian/global-state/src/Restorer.php', + 'SebastianBergmann\\GlobalState\\RuntimeException' => $vendorDir . '/sebastian/global-state/src/RuntimeException.php', + 'SebastianBergmann\\GlobalState\\Snapshot' => $vendorDir . '/sebastian/global-state/src/Snapshot.php', + 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php', + 'Text_Template' => $vendorDir . '/phpunit/php-text-template/Text/Template.php', ); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php index 2732fb3..7af0c88 100644 --- a/vendor/composer/autoload_namespaces.php +++ b/vendor/composer/autoload_namespaces.php @@ -1,10 +1,13 @@ $vendorDir . '/symfony/finder', + 'phpDocumentor' => array($vendorDir . '/phpdocumentor/reflection-docblock/src'), + 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'), + 'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src'), + 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src'), ); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..92309c9 --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,10 @@ + array($vendorDir . '/facebook/php-sdk-v4/src/Facebook'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index a2f31c6..34eacc5 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -1,8 +1,8 @@ $path) { - $loader->add($namespace, $path); + $loader->set($namespace, $path); + } + + $map = require __DIR__ . '/autoload_psr4.php'; + foreach ($map as $namespace => $path) { + $loader->setPsr4($namespace, $path); } $classMap = require __DIR__ . '/autoload_classmap.php'; @@ -41,3 +47,8 @@ public static function getLoader() return $loader; } } + +function composerRequireb6ac48f2fffa1eec602d390336d8b2ed($file) +{ + require $file; +} diff --git a/vendor/composer/include_paths.php b/vendor/composer/include_paths.php new file mode 100644 index 0000000..f3de164 --- /dev/null +++ b/vendor/composer/include_paths.php @@ -0,0 +1,13 @@ +=5.2.0" + "php": ">=5.3.3" }, - "time": "2013-01-15 21:37:15", + "time": "2014-01-30 17:20:04", "type": "library", "installation-source": "dist", "autoload": { "classmap": [ - "src" + "Text/" ] }, "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], "license": [ - "Apache2" + "BSD-3-Clause" ], "authors": [ { - "name": "Facebook", - "homepage": "https://github.com/facebook/facebook-php-sdk/contributors" + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" } ], - "description": "Facebook PHP SDK", - "homepage": "https://github.com/facebook/facebook-php-sdk", + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", "keywords": [ - "facebook", - "sdk" + "template" + ] + }, + { + "name": "phpunit/php-file-iterator", + "version": "1.3.4", + "version_normalized": "1.3.4.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/acd690379117b042d1c8af1fafd61bde001bf6bb", + "reference": "acd690379117b042d1c8af1fafd61bde001bf6bb", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2013-10-10 15:34:57", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "File/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ] + }, + { + "name": "sebastian/environment", + "version": "1.2.1", + "version_normalized": "1.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/6e6c71d918088c251b181ba8b3088af4ac336dd7", + "reference": "6e6c71d918088c251b181ba8b3088af4ac336dd7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.3" + }, + "time": "2014-10-25 08:00:45", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ] + }, + { + "name": "phpunit/php-token-stream", + "version": "1.3.0", + "version_normalized": "1.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-token-stream.git", + "reference": "f8d5d08c56de5cfd592b3340424a81733259a876" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/f8d5d08c56de5cfd592b3340424a81733259a876", + "reference": "f8d5d08c56de5cfd592b3340424a81733259a876", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "time": "2014-08-31 06:12:13", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.3-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Wrapper around PHP's tokenizer extension.", + "homepage": "https://github.com/sebastianbergmann/php-token-stream/", + "keywords": [ + "tokenizer" + ] + }, + { + "name": "phpunit/php-code-coverage", + "version": "2.0.14", + "version_normalized": "2.0.14.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "ca158276c1200cc27f5409a5e338486bc0b4fc94" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca158276c1200cc27f5409a5e338486bc0b4fc94", + "reference": "ca158276c1200cc27f5409a5e338486bc0b4fc94", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-token-stream": "~1.3", + "sebastian/environment": "~1.0", + "sebastian/version": "~1.0" + }, + "require-dev": { + "ext-xdebug": ">=2.1.4", + "phpunit/phpunit": "~4.1" + }, + "suggest": { + "ext-dom": "*", + "ext-xdebug": ">=2.2.1", + "ext-xmlwriter": "*" + }, + "time": "2014-12-26 13:28:33", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ] + }, + { + "name": "sebastian/diff", + "version": "1.2.0", + "version_normalized": "1.2.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "5843509fed39dee4b356a306401e9dd1a931fec7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/5843509fed39dee4b356a306401e9dd1a931fec7", + "reference": "5843509fed39dee4b356a306401e9dd1a931fec7", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "time": "2014-08-15 10:29:00", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Diff implementation", + "homepage": "http://www.github.com/sebastianbergmann/diff", + "keywords": [ + "diff" ] }, { - "name": "symfony/finder", - "version": "v2.2.1", - "version_normalized": "2.2.1.0", - "target-dir": "Symfony/Component/Finder", + "name": "symfony/yaml", + "version": "v2.6.3", + "version_normalized": "2.6.3.0", + "target-dir": "Symfony/Component/Yaml", "source": { "type": "git", - "url": "https://github.com/symfony/Finder.git", - "reference": "v2.2.1" + "url": "https://github.com/symfony/Yaml.git", + "reference": "82462a90848a52c2533aa6b598b107d68076b018" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/Finder/zipball/v2.2.1", - "reference": "v2.2.1", + "url": "https://api.github.com/repos/symfony/Yaml/zipball/82462a90848a52c2533aa6b598b107d68076b018", + "reference": "82462a90848a52c2533aa6b598b107d68076b018", "shasum": "" }, "require": { "php": ">=5.3.3" }, - "time": "2013-04-01 07:51:50", + "time": "2015-01-03 15:33:07", "type": "library", "extra": { "branch-alias": { - "dev-master": "2.2-dev" + "dev-master": "2.6-dev" } }, "installation-source": "dist", "autoload": { "psr-0": { - "Symfony\\Component\\Finder\\": "" + "Symfony\\Component\\Yaml\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -81,50 +390,598 @@ "MIT" ], "authors": [ + { + "name": "Symfony Community", + "homepage": "http://symfony.com/contributors" + }, { "name": "Fabien Potencier", "email": "fabien@symfony.com" + } + ], + "description": "Symfony Yaml Component", + "homepage": "http://symfony.com" + }, + { + "name": "phpunit/php-timer", + "version": "1.0.5", + "version_normalized": "1.0.5.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "reference": "19689d4354b295ee3d8c54b4f42c3efb69cbc17c", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "time": "2013-08-02 07:42:54", + "type": "library", + "installation-source": "dist", + "autoload": { + "classmap": [ + "PHP/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "include-path": [ + "" + ], + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ] + }, + { + "name": "sebastian/global-state", + "version": "1.0.0", + "version_normalized": "1.0.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "reference": "c7428acdb62ece0a45e6306f1ae85e1c05b09c01", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.2" + }, + "suggest": { + "ext-uopz": "*" + }, + "time": "2014-10-06 09:23:50", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ] + }, + { + "name": "sebastian/exporter", + "version": "1.0.2", + "version_normalized": "1.0.2.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", + "reference": "c7d59948d6e82818e1bdff7cadb6c34710eb7dc0", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "~4.0" + }, + "time": "2014-09-10 00:51:36", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" }, { - "name": "Symfony Community", - "homepage": "http://symfony.com/contributors" + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" } ], - "description": "Symfony Finder Component", - "homepage": "http://symfony.com" + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "http://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ] + }, + { + "name": "sebastian/comparator", + "version": "1.1.0", + "version_normalized": "1.1.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "c484a80f97573ab934e37826dba0135a3301b26a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/c484a80f97573ab934e37826dba0135a3301b26a", + "reference": "c484a80f97573ab934e37826dba0135a3301b26a", + "shasum": "" + }, + "require": { + "php": ">=5.3.3", + "sebastian/diff": "~1.1", + "sebastian/exporter": "~1.0" + }, + "require-dev": { + "phpunit/phpunit": "~4.1" + }, + "time": "2014-11-16 21:32:38", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "http://www.github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ] + }, + { + "name": "doctrine/instantiator", + "version": "1.0.4", + "version_normalized": "1.0.4.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/f976e5de371104877ebc89bd8fecb0019ed9c119", + "reference": "f976e5de371104877ebc89bd8fecb0019ed9c119", + "shasum": "" + }, + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "athletic/athletic": "~0.1.8", + "ext-pdo": "*", + "ext-phar": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA" + }, + "time": "2014-10-13 12:58:55", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Doctrine\\Instantiator\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "constructor", + "instantiate" + ] + }, + { + "name": "phpunit/phpunit-mock-objects", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", + "reference": "c63d2367247365f688544f0d500af90a11a44c65" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/c63d2367247365f688544f0d500af90a11a44c65", + "reference": "c63d2367247365f688544f0d500af90a11a44c65", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "~1.0,>=1.0.1", + "php": ">=5.3.3", + "phpunit/php-text-template": "~1.2" + }, + "require-dev": { + "phpunit/phpunit": "~4.3" + }, + "suggest": { + "ext-soap": "*" + }, + "time": "2014-10-03 05:12:11", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sb@sebastian-bergmann.de", + "role": "lead" + } + ], + "description": "Mock Object library for PHPUnit", + "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", + "keywords": [ + "mock", + "xunit" + ] + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "2.0.3", + "version_normalized": "2.0.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "38743b677965c48a637097b2746a281264ae2347" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/38743b677965c48a637097b2746a281264ae2347", + "reference": "38743b677965c48a637097b2746a281264ae2347", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "phpunit/phpunit": "3.7.*@stable" + }, + "suggest": { + "dflydev/markdown": "1.0.*", + "erusev/parsedown": "~0.7" + }, + "time": "2014-08-09 10:27:07", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "phpDocumentor": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "mike.vanriel@naenius.com" + } + ] }, { - "name": "eher/phpunit", - "version": "1.6", - "version_normalized": "1.6.0.0", + "name": "phpspec/prophecy", + "version": "v1.3.1", + "version_normalized": "1.3.1.0", "source": { "type": "git", - "url": "https://github.com/EHER/phpunit-all-in-one", - "reference": "1.6" + "url": "https://github.com/phpspec/prophecy.git", + "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9" }, "dist": { "type": "zip", - "url": "https://github.com/EHER/phpunit-all-in-one/zipball/1.6", - "reference": "1.6", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/9ca52329bcdd1500de24427542577ebf3fc2f1c9", + "reference": "9ca52329bcdd1500de24427542577ebf3fc2f1c9", "shasum": "" }, "require": { - "php": ">=5.3.0", - "symfony/finder": "*" + "doctrine/instantiator": "~1.0,>=1.0.2", + "phpdocumentor/reflection-docblock": "~2.0" + }, + "require-dev": { + "phpspec/phpspec": "~2.0" + }, + "time": "2014-11-17 16:23:49", + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-0": { + "Prophecy\\": "src/" + } }, - "time": "2012-05-23 18:46:24", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "http://phpspec.org", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ] + }, + { + "name": "phpunit/phpunit", + "version": "dev-master", + "version_normalized": "9999999-dev", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "9ca4a3c679c3bfede8e0bc3e139d37a0c6637b86" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9ca4a3c679c3bfede8e0bc3e139d37a0c6637b86", + "reference": "9ca4a3c679c3bfede8e0bc3e139d37a0c6637b86", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-json": "*", + "ext-pcre": "*", + "ext-reflection": "*", + "ext-spl": "*", + "php": ">=5.3.3", + "phpspec/prophecy": "~1.3.1", + "phpunit/php-code-coverage": "~2.0", + "phpunit/php-file-iterator": "~1.3", + "phpunit/php-text-template": "~1.2", + "phpunit/php-timer": "~1.0", + "phpunit/phpunit-mock-objects": "~2.3", + "sebastian/comparator": "~1.1", + "sebastian/diff": "~1.2", + "sebastian/environment": "~1.2", + "sebastian/exporter": "~1.0", + "sebastian/global-state": "~1.0", + "sebastian/version": "~1.0", + "symfony/yaml": "~2.1|~3.0" + }, + "suggest": { + "phpunit/php-invoker": "~1.1" + }, + "time": "2015-01-15 06:15:56", "bin": [ - "bin/dbunit", - "bin/phpcov", - "bin/phpcpd", - "bin/phpdcd", - "bin/phploc", - "bin/phpunit", - "bin/phpunit-skelgen" + "phpunit" ], "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.6.x-dev" + } + }, + "installation-source": "source", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ] + }, + { + "name": "facebook/php-sdk-v4", + "version": "4.0.15", + "version_normalized": "4.0.15.0", + "source": { + "type": "git", + "url": "https://github.com/facebook/facebook-php-sdk-v4.git", + "reference": "ebc82667ef953b98e2eca5dfb6784d6466a185cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/facebook/facebook-php-sdk-v4/zipball/ebc82667ef953b98e2eca5dfb6784d6466a185cd", + "reference": "ebc82667ef953b98e2eca5dfb6784d6466a185cd", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "~4.0", + "mockery/mockery": "dev-master", + "phpunit/phpunit": "3.7.*" + }, + "suggest": { + "guzzlehttp/guzzle": "Allows for implementation of the Guzzle HTTP client" + }, + "time": "2015-01-06 21:29:27", + "type": "library", "installation-source": "dist", + "autoload": { + "psr-4": { + "Facebook\\": "src/Facebook/" + } + }, "notification-url": "https://packagist.org/downloads/", - "description": "Unofficial version of PHPUnit to be handled with Composer." + "license": [ + "Facebook Platform" + ], + "authors": [ + { + "name": "Facebook", + "homepage": "https://github.com/facebook/facebook-php-sdk-v4/contributors" + } + ], + "description": "Facebook SDK for PHP", + "homepage": "https://github.com/facebook/facebook-php-sdk-v4", + "keywords": [ + "facebook", + "sdk" + ] } ] diff --git a/vendor/doctrine/instantiator/.gitignore b/vendor/doctrine/instantiator/.gitignore new file mode 100644 index 0000000..9a63932 --- /dev/null +++ b/vendor/doctrine/instantiator/.gitignore @@ -0,0 +1,5 @@ +phpunit.xml +composer.lock +build +vendor +coverage.clover \ No newline at end of file diff --git a/vendor/doctrine/instantiator/.scrutinizer.yml b/vendor/doctrine/instantiator/.scrutinizer.yml new file mode 100644 index 0000000..aad5e40 --- /dev/null +++ b/vendor/doctrine/instantiator/.scrutinizer.yml @@ -0,0 +1,46 @@ +before_commands: + - "composer install --prefer-source" + +tools: + external_code_coverage: + timeout: 600 + php_code_coverage: + enabled: true + test_command: ./vendor/bin/phpunit + php_code_sniffer: + enabled: true + config: + standard: PSR2 + filter: + paths: ["src/*", "tests/*"] + php_cpd: + enabled: true + excluded_dirs: ["build/*", "tests", "vendor"] + php_cs_fixer: + enabled: true + config: + level: all + filter: + paths: ["src/*", "tests/*"] + php_loc: + enabled: true + excluded_dirs: ["build", "tests", "vendor"] + php_mess_detector: + enabled: true + config: + ruleset: phpmd.xml.dist + design_rules: { eval_expression: false } + filter: + paths: ["src/*"] + php_pdepend: + enabled: true + excluded_dirs: ["build", "tests", "vendor"] + php_analyzer: + enabled: true + filter: + paths: ["src/*", "tests/*"] + php_hhvm: + enabled: true + filter: + paths: ["src/*", "tests/*"] + sensiolabs_security_checker: true diff --git a/vendor/doctrine/instantiator/.travis.install.sh b/vendor/doctrine/instantiator/.travis.install.sh new file mode 100644 index 0000000..e4f1cb2 --- /dev/null +++ b/vendor/doctrine/instantiator/.travis.install.sh @@ -0,0 +1,13 @@ +set -x +if [ "$TRAVIS_PHP_VERSION" = 'hhvm' ] || [ "$TRAVIS_PHP_VERSION" = 'hhvm-nightly' ] ; then + curl -sS https://getcomposer.org/installer > composer-installer.php + hhvm composer-installer.php + hhvm -v ResourceLimit.SocketDefaultTimeout=30 -v Http.SlowQueryThreshold=30000 composer.phar update --prefer-source +elif [ "$TRAVIS_PHP_VERSION" = '5.3.3' ] ; then + composer self-update + composer update --prefer-source --no-dev + composer dump-autoload +else + composer self-update + composer update --prefer-source +fi diff --git a/vendor/doctrine/instantiator/.travis.yml b/vendor/doctrine/instantiator/.travis.yml new file mode 100644 index 0000000..0f686a9 --- /dev/null +++ b/vendor/doctrine/instantiator/.travis.yml @@ -0,0 +1,26 @@ +language: php + +php: + - 5.3.3 + - 5.3 + - 5.4 + - 5.5 + - 5.6 + - hhvm + - hhvm-nightly + +before_script: + - ./.travis.install.sh + +script: + - sh -c "if [ '$TRAVIS_PHP_VERSION' = '5.3.3' ]; then phpunit; fi" + - sh -c "if [ '$TRAVIS_PHP_VERSION' != '5.3.3' ]; then ./vendor/bin/phpunit; fi" + - sh -c "if [ '$TRAVIS_PHP_VERSION' != '5.3.3' ]; then ./vendor/bin/phpcs --standard=PSR2 ./src/ ./tests/; fi" + - sh -c "if [[ '$TRAVIS_PHP_VERSION' != '5.3.3' && '$TRAVIS_PHP_VERSION' != '5.4.29' && '$TRAVIS_PHP_VERSION' != '5.5.13' ]]; then php -n ./vendor/bin/athletic -p ./tests/DoctrineTest/InstantiatorPerformance/ -f GroupedFormatter; fi" + +after_script: + - sh -c "if [ '$TRAVIS_PHP_VERSION' != '5.3.3' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi" + +matrix: + allow_failures: + - php: hhvm-nightly diff --git a/vendor/doctrine/instantiator/CONTRIBUTING.md b/vendor/doctrine/instantiator/CONTRIBUTING.md new file mode 100644 index 0000000..75b84b2 --- /dev/null +++ b/vendor/doctrine/instantiator/CONTRIBUTING.md @@ -0,0 +1,35 @@ +# Contributing + + * Coding standard for the project is [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md) + * The project will follow strict [object calisthenics](http://www.slideshare.net/guilhermeblanco/object-calisthenics-applied-to-php) + * Any contribution must provide tests for additional introduced conditions + * Any un-confirmed issue needs a failing test case before being accepted + * Pull requests must be sent from a new hotfix/feature branch, not from `master`. + +## Installation + +To install the project and run the tests, you need to clone it first: + +```sh +$ git clone git://github.com/doctrine/instantiator.git +``` + +You will then need to run a composer installation: + +```sh +$ cd Instantiator +$ curl -s https://getcomposer.org/installer | php +$ php composer.phar update +``` + +## Testing + +The PHPUnit version to be used is the one installed as a dev- dependency via composer: + +```sh +$ ./vendor/bin/phpunit +``` + +Accepted coverage for new contributions is 80%. Any contribution not satisfying this requirement +won't be merged. + diff --git a/vendor/doctrine/instantiator/LICENSE b/vendor/doctrine/instantiator/LICENSE new file mode 100644 index 0000000..4d983d1 --- /dev/null +++ b/vendor/doctrine/instantiator/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2014 Doctrine Project + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/doctrine/instantiator/README.md b/vendor/doctrine/instantiator/README.md new file mode 100644 index 0000000..393ec7c --- /dev/null +++ b/vendor/doctrine/instantiator/README.md @@ -0,0 +1,40 @@ +# Instantiator + +This library provides a way of avoiding usage of constructors when instantiating PHP classes. + +[![Build Status](https://travis-ci.org/doctrine/instantiator.svg?branch=master)](https://travis-ci.org/doctrine/instantiator) +[![Code Coverage](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/coverage.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) +[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/doctrine/instantiator/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/doctrine/instantiator/?branch=master) +[![Dependency Status](https://www.versioneye.com/package/php--doctrine--instantiator/badge.svg)](https://www.versioneye.com/package/php--doctrine--instantiator) +[![HHVM Status](http://hhvm.h4cc.de/badge/doctrine/instantiator.png)](http://hhvm.h4cc.de/package/doctrine/instantiator) + +[![Latest Stable Version](https://poser.pugx.org/doctrine/instantiator/v/stable.png)](https://packagist.org/packages/doctrine/instantiator) +[![Latest Unstable Version](https://poser.pugx.org/doctrine/instantiator/v/unstable.png)](https://packagist.org/packages/doctrine/instantiator) + +## Installation + +The suggested installation method is via [composer](https://getcomposer.org/): + +```sh +php composer.phar require "doctrine/instantiator:~1.0.3" +``` + +## Usage + +The instantiator is able to create new instances of any class without using the constructor or any API of the class +itself: + +```php +$instantiator = new \Doctrine\Instantiator\Instantiator(); + +$instance = $instantiator->instantiate('My\\ClassName\\Here'); +``` + +## Contributing + +Please read the [CONTRIBUTING.md](CONTRIBUTING.md) contents if you wish to help out! + +## Credits + +This library was migrated from [ocramius/instantiator](https://github.com/Ocramius/Instantiator), which +has been donated to the doctrine organization, and which is now deprecated in favour of this package. diff --git a/vendor/doctrine/instantiator/composer.json b/vendor/doctrine/instantiator/composer.json new file mode 100644 index 0000000..89d59f6 --- /dev/null +++ b/vendor/doctrine/instantiator/composer.json @@ -0,0 +1,45 @@ +{ + "name": "doctrine/instantiator", + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "type": "library", + "license": "MIT", + "homepage": "https://github.com/doctrine/instantiator", + "keywords": [ + "instantiate", + "constructor" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "http://ocramius.github.com/" + } + ], + "require": { + "php": ">=5.3,<8.0-DEV" + }, + "require-dev": { + "ext-phar": "*", + "ext-pdo": "*", + "phpunit/phpunit": "~4.0", + "squizlabs/php_codesniffer": "2.0.*@ALPHA", + "athletic/athletic": "~0.1.8" + }, + "autoload": { + "psr-0": { + "Doctrine\\Instantiator\\": "src" + } + }, + "autoload-dev": { + "psr-0": { + "DoctrineTest\\InstantiatorPerformance\\": "tests", + "DoctrineTest\\InstantiatorTest\\": "tests", + "DoctrineTest\\InstantiatorTestAsset\\": "tests" + } + }, + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + } +} diff --git a/vendor/doctrine/instantiator/phpmd.xml.dist b/vendor/doctrine/instantiator/phpmd.xml.dist new file mode 100644 index 0000000..8254105 --- /dev/null +++ b/vendor/doctrine/instantiator/phpmd.xml.dist @@ -0,0 +1,27 @@ + + element, surround
+ // it with a pre element. Please note that we explicitly used str_replace
+ // and not preg_replace to gain performance
+ if (strpos($result, '') !== false) {
+ $result = str_replace(
+ array('', "\r\n", "\n", "\r", '
'),
+ array('', '', '', '', '
'),
+ $result
+ );
+ }
+
+ if (class_exists('Parsedown')) {
+ $markdown = \Parsedown::instance();
+ $result = $markdown->parse($result);
+ } elseif (class_exists('dflydev\markdown\MarkdownExtraParser')) {
+ $markdown = new \dflydev\markdown\MarkdownExtraParser();
+ $result = $markdown->transformMarkdown($result);
+ }
+
+ return trim($result);
+ }
+
+ /**
+ * Gets the docblock this tag belongs to.
+ *
+ * @return DocBlock The docblock this description belongs to.
+ */
+ public function getDocBlock()
+ {
+ return $this->docblock;
+ }
+
+ /**
+ * Sets the docblock this tag belongs to.
+ *
+ * @param DocBlock $docblock The new docblock this description belongs to.
+ * Setting NULL removes any association.
+ *
+ * @return $this
+ */
+ public function setDocBlock(DocBlock $docblock = null)
+ {
+ $this->docblock = $docblock;
+
+ return $this;
+ }
+
+ /**
+ * Builds a string representation of this object.
+ *
+ * @todo determine the exact format as used by PHP Reflection
+ * and implement it.
+ *
+ * @return void
+ * @codeCoverageIgnore Not yet implemented
+ */
+ public static function export()
+ {
+ throw new \Exception('Not yet implemented');
+ }
+
+ /**
+ * Returns the long description as a string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->getContents();
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php
new file mode 100644
index 0000000..966ed44
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Location.php
@@ -0,0 +1,76 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+/**
+ * The location a DocBlock occurs within a file.
+ *
+ * @author Vasil Rangelov
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class Location
+{
+ /** @var int Line where the DocBlock text starts. */
+ protected $lineNumber = 0;
+
+ /** @var int Column where the DocBlock text starts. */
+ protected $columnNumber = 0;
+
+ public function __construct(
+ $lineNumber = 0,
+ $columnNumber = 0
+ ) {
+ $this->setLineNumber($lineNumber)->setColumnNumber($columnNumber);
+ }
+
+ /**
+ * @return int Line where the DocBlock text starts.
+ */
+ public function getLineNumber()
+ {
+ return $this->lineNumber;
+ }
+
+ /**
+ *
+ * @param type $lineNumber
+ * @return $this
+ */
+ public function setLineNumber($lineNumber)
+ {
+ $this->lineNumber = (int)$lineNumber;
+
+ return $this;
+ }
+
+ /**
+ * @return int Column where the DocBlock text starts.
+ */
+ public function getColumnNumber()
+ {
+ return $this->columnNumber;
+ }
+
+ /**
+ *
+ * @param int $columnNumber
+ * @return $this
+ */
+ public function setColumnNumber($columnNumber)
+ {
+ $this->columnNumber = (int)$columnNumber;
+
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php
new file mode 100644
index 0000000..c161785
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Serializer.php
@@ -0,0 +1,198 @@
+
+ * @copyright 2013 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock;
+
+/**
+ * Serializes a DocBlock instance.
+ *
+ * @author Barry vd. Heuvel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class Serializer
+{
+
+ /** @var string The string to indent the comment with. */
+ protected $indentString = ' ';
+
+ /** @var int The number of times the indent string is repeated. */
+ protected $indent = 0;
+
+ /** @var bool Whether to indent the first line. */
+ protected $isFirstLineIndented = true;
+
+ /** @var int|null The max length of a line. */
+ protected $lineLength = null;
+
+ /**
+ * Create a Serializer instance.
+ *
+ * @param int $indent The number of times the indent string is
+ * repeated.
+ * @param string $indentString The string to indent the comment with.
+ * @param bool $indentFirstLine Whether to indent the first line.
+ * @param int|null $lineLength The max length of a line or NULL to
+ * disable line wrapping.
+ */
+ public function __construct(
+ $indent = 0,
+ $indentString = ' ',
+ $indentFirstLine = true,
+ $lineLength = null
+ ) {
+ $this->setIndentationString($indentString);
+ $this->setIndent($indent);
+ $this->setIsFirstLineIndented($indentFirstLine);
+ $this->setLineLength($lineLength);
+ }
+
+ /**
+ * Sets the string to indent comments with.
+ *
+ * @param string $indentationString The string to indent comments with.
+ *
+ * @return $this This serializer object.
+ */
+ public function setIndentationString($indentString)
+ {
+ $this->indentString = (string)$indentString;
+ return $this;
+ }
+
+ /**
+ * Gets the string to indent comments with.
+ *
+ * @return string The indent string.
+ */
+ public function getIndentationString()
+ {
+ return $this->indentString;
+ }
+
+ /**
+ * Sets the number of indents.
+ *
+ * @param int $indent The number of times the indent string is repeated.
+ *
+ * @return $this This serializer object.
+ */
+ public function setIndent($indent)
+ {
+ $this->indent = (int)$indent;
+ return $this;
+ }
+
+ /**
+ * Gets the number of indents.
+ *
+ * @return int The number of times the indent string is repeated.
+ */
+ public function getIndent()
+ {
+ return $this->indent;
+ }
+
+ /**
+ * Sets whether or not the first line should be indented.
+ *
+ * Sets whether or not the first line (the one with the "/**") should be
+ * indented.
+ *
+ * @param bool $indentFirstLine The new value for this setting.
+ *
+ * @return $this This serializer object.
+ */
+ public function setIsFirstLineIndented($indentFirstLine)
+ {
+ $this->isFirstLineIndented = (bool)$indentFirstLine;
+ return $this;
+ }
+
+ /**
+ * Gets whether or not the first line should be indented.
+ *
+ * @return bool Whether or not the first line should be indented.
+ */
+ public function isFirstLineIndented()
+ {
+ return $this->isFirstLineIndented;
+ }
+
+ /**
+ * Sets the line length.
+ *
+ * Sets the length of each line in the serialization. Content will be
+ * wrapped within this limit.
+ *
+ * @param int|null $lineLength The length of each line. NULL to disable line
+ * wrapping altogether.
+ *
+ * @return $this This serializer object.
+ */
+ public function setLineLength($lineLength)
+ {
+ $this->lineLength = null === $lineLength ? null : (int)$lineLength;
+ return $this;
+ }
+
+ /**
+ * Gets the line length.
+ *
+ * @return int|null The length of each line or NULL if line wrapping is
+ * disabled.
+ */
+ public function getLineLength()
+ {
+ return $this->lineLength;
+ }
+
+ /**
+ * Generate a DocBlock comment.
+ *
+ * @param DocBlock The DocBlock to serialize.
+ *
+ * @return string The serialized doc block.
+ */
+ public function getDocComment(DocBlock $docblock)
+ {
+ $indent = str_repeat($this->indentString, $this->indent);
+ $firstIndent = $this->isFirstLineIndented ? $indent : '';
+
+ $text = $docblock->getText();
+ if ($this->lineLength) {
+ //3 === strlen(' * ')
+ $wrapLength = $this->lineLength - strlen($indent) - 3;
+ $text = wordwrap($text, $wrapLength);
+ }
+ $text = str_replace("\n", "\n{$indent} * ", $text);
+
+ $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n";
+
+ /** @var Tag $tag */
+ foreach ($docblock->getTags() as $tag) {
+ $tagText = (string) $tag;
+ if ($this->lineLength) {
+ $tagText = wordwrap($tagText, $wrapLength);
+ }
+ $tagText = str_replace("\n", "\n{$indent} * ", $tagText);
+
+ $comment .= "{$indent} * {$tagText}\n";
+ }
+
+ $comment .= $indent . ' */';
+
+ return $comment;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php
new file mode 100644
index 0000000..a96db09
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag.php
@@ -0,0 +1,377 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock;
+
+/**
+ * Parses a tag definition for a DocBlock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class Tag implements \Reflector
+{
+ /**
+ * PCRE regular expression matching a tag name.
+ */
+ const REGEX_TAGNAME = '[\w\-\_\\\\]+';
+
+ /** @var string Name of the tag */
+ protected $tag = '';
+
+ /**
+ * @var string|null Content of the tag.
+ * When set to NULL, it means it needs to be regenerated.
+ */
+ protected $content = '';
+
+ /** @var string Description of the content of this tag */
+ protected $description = '';
+
+ /**
+ * @var array|null The description, as an array of strings and Tag objects.
+ * When set to NULL, it means it needs to be regenerated.
+ */
+ protected $parsedDescription = null;
+
+ /** @var Location Location of the tag. */
+ protected $location = null;
+
+ /** @var DocBlock The DocBlock which this tag belongs to. */
+ protected $docblock = null;
+
+ /**
+ * @var array An array with a tag as a key, and an FQCN to a class that
+ * handles it as an array value. The class is expected to inherit this
+ * class.
+ */
+ private static $tagHandlerMappings = array(
+ 'author'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\AuthorTag',
+ 'covers'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\CoversTag',
+ 'deprecated'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag',
+ 'example'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\ExampleTag',
+ 'link'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\LinkTag',
+ 'method'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\MethodTag',
+ 'param'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\ParamTag',
+ 'property-read'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyReadTag',
+ 'property'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyTag',
+ 'property-write'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\PropertyWriteTag',
+ 'return'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\ReturnTag',
+ 'see'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\SeeTag',
+ 'since'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\SinceTag',
+ 'source'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\SourceTag',
+ 'throw'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
+ 'throws'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag',
+ 'uses'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\UsesTag',
+ 'var'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\VarTag',
+ 'version'
+ => '\phpDocumentor\Reflection\DocBlock\Tag\VersionTag'
+ );
+
+ /**
+ * Factory method responsible for instantiating the correct sub type.
+ *
+ * @param string $tag_line The text for this tag, including description.
+ * @param DocBlock $docblock The DocBlock which this tag belongs to.
+ * @param Location $location Location of the tag.
+ *
+ * @throws \InvalidArgumentException if an invalid tag line was presented.
+ *
+ * @return static A new tag object.
+ */
+ final public static function createInstance(
+ $tag_line,
+ DocBlock $docblock = null,
+ Location $location = null
+ ) {
+ if (!preg_match(
+ '/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us',
+ $tag_line,
+ $matches
+ )) {
+ throw new \InvalidArgumentException(
+ 'Invalid tag_line detected: ' . $tag_line
+ );
+ }
+
+ $handler = __CLASS__;
+ if (isset(self::$tagHandlerMappings[$matches[1]])) {
+ $handler = self::$tagHandlerMappings[$matches[1]];
+ } elseif (isset($docblock)) {
+ $tagName = (string)new Type\Collection(
+ array($matches[1]),
+ $docblock->getContext()
+ );
+
+ if (isset(self::$tagHandlerMappings[$tagName])) {
+ $handler = self::$tagHandlerMappings[$tagName];
+ }
+ }
+
+ return new $handler(
+ $matches[1],
+ isset($matches[2]) ? $matches[2] : '',
+ $docblock,
+ $location
+ );
+ }
+
+ /**
+ * Registers a handler for tags.
+ *
+ * Registers a handler for tags. The class specified is autoloaded if it's
+ * not available. It must inherit from this class.
+ *
+ * @param string $tag Name of tag to regiser a handler for. When
+ * registering a namespaced tag, the full name, along with a prefixing
+ * slash MUST be provided.
+ * @param string|null $handler FQCN of handler. Specifing NULL removes the
+ * handler for the specified tag, if any.
+ *
+ * @return bool TRUE on success, FALSE on failure.
+ */
+ final public static function registerTagHandler($tag, $handler)
+ {
+ $tag = trim((string)$tag);
+
+ if (null === $handler) {
+ unset(self::$tagHandlerMappings[$tag]);
+ return true;
+ }
+
+ if ('' !== $tag
+ && class_exists($handler, true)
+ && is_subclass_of($handler, __CLASS__)
+ && !strpos($tag, '\\') //Accept no slash, and 1st slash at offset 0.
+ ) {
+ self::$tagHandlerMappings[$tag] = $handler;
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Parses a tag and populates the member variables.
+ *
+ * @param string $name Name of the tag.
+ * @param string $content The contents of the given tag.
+ * @param DocBlock $docblock The DocBlock which this tag belongs to.
+ * @param Location $location Location of the tag.
+ */
+ public function __construct(
+ $name,
+ $content,
+ DocBlock $docblock = null,
+ Location $location = null
+ ) {
+ $this
+ ->setName($name)
+ ->setContent($content)
+ ->setDocBlock($docblock)
+ ->setLocation($location);
+ }
+
+ /**
+ * Gets the name of this tag.
+ *
+ * @return string The name of this tag.
+ */
+ public function getName()
+ {
+ return $this->tag;
+ }
+
+ /**
+ * Sets the name of this tag.
+ *
+ * @param string $name The new name of this tag.
+ *
+ * @return $this
+ * @throws \InvalidArgumentException When an invalid tag name is provided.
+ */
+ public function setName($name)
+ {
+ if (!preg_match('/^' . self::REGEX_TAGNAME . '$/u', $name)) {
+ throw new \InvalidArgumentException(
+ 'Invalid tag name supplied: ' . $name
+ );
+ }
+
+ $this->tag = $name;
+
+ return $this;
+ }
+
+ /**
+ * Gets the content of this tag.
+ *
+ * @return string
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content = $this->description;
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * Sets the content of this tag.
+ *
+ * @param string $content The new content of this tag.
+ *
+ * @return $this
+ */
+ public function setContent($content)
+ {
+ $this->setDescription($content);
+ $this->content = $content;
+
+ return $this;
+ }
+
+ /**
+ * Gets the description component of this tag.
+ *
+ * @return string
+ */
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ /**
+ * Sets the description component of this tag.
+ *
+ * @param string $description The new description component of this tag.
+ *
+ * @return $this
+ */
+ public function setDescription($description)
+ {
+ $this->content = null;
+ $this->parsedDescription = null;
+ $this->description = trim($description);
+
+ return $this;
+ }
+
+ /**
+ * Gets the parsed text of this description.
+ *
+ * @return array An array of strings and tag objects, in the order they
+ * occur within the description.
+ */
+ public function getParsedDescription()
+ {
+ if (null === $this->parsedDescription) {
+ $description = new Description($this->description, $this->docblock);
+ $this->parsedDescription = $description->getParsedContents();
+ }
+ return $this->parsedDescription;
+ }
+
+ /**
+ * Gets the docblock this tag belongs to.
+ *
+ * @return DocBlock The docblock this tag belongs to.
+ */
+ public function getDocBlock()
+ {
+ return $this->docblock;
+ }
+
+ /**
+ * Sets the docblock this tag belongs to.
+ *
+ * @param DocBlock $docblock The new docblock this tag belongs to. Setting
+ * NULL removes any association.
+ *
+ * @return $this
+ */
+ public function setDocBlock(DocBlock $docblock = null)
+ {
+ $this->docblock = $docblock;
+
+ return $this;
+ }
+
+ /**
+ * Gets the location of the tag.
+ *
+ * @return Location The tag's location.
+ */
+ public function getLocation()
+ {
+ return $this->location;
+ }
+
+ /**
+ * Sets the location of the tag.
+ *
+ * @param Location $location The new location of the tag.
+ *
+ * @return $this
+ */
+ public function setLocation(Location $location = null)
+ {
+ $this->location = $location;
+
+ return $this;
+ }
+
+ /**
+ * Builds a string representation of this object.
+ *
+ * @todo determine the exact format as used by PHP Reflection and implement it.
+ *
+ * @return void
+ * @codeCoverageIgnore Not yet implemented
+ */
+ public static function export()
+ {
+ throw new \Exception('Not yet implemented');
+ }
+
+ /**
+ * Returns the tag as a serialized string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return "@{$this->getName()} {$this->getContent()}";
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php
new file mode 100644
index 0000000..bacf52e
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/AuthorTag.php
@@ -0,0 +1,131 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for an @author tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class AuthorTag extends Tag
+{
+ /**
+ * PCRE regular expression matching any valid value for the name component.
+ */
+ const REGEX_AUTHOR_NAME = '[^\<]*';
+
+ /**
+ * PCRE regular expression matching any valid value for the email component.
+ */
+ const REGEX_AUTHOR_EMAIL = '[^\>]*';
+
+ /** @var string The name of the author */
+ protected $authorName = '';
+
+ /** @var string The email of the author */
+ protected $authorEmail = '';
+
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content = $this->authorName;
+ if ('' != $this->authorEmail) {
+ $this->content .= "<{$this->authorEmail}>";
+ }
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ parent::setContent($content);
+ if (preg_match(
+ '/^(' . self::REGEX_AUTHOR_NAME .
+ ')(\<(' . self::REGEX_AUTHOR_EMAIL .
+ ')\>)?$/u',
+ $this->description,
+ $matches
+ )) {
+ $this->authorName = trim($matches[1]);
+ if (isset($matches[3])) {
+ $this->authorEmail = trim($matches[3]);
+ }
+ }
+
+ return $this;
+ }
+
+ /**
+ * Gets the author's name.
+ *
+ * @return string The author's name.
+ */
+ public function getAuthorName()
+ {
+ return $this->authorName;
+ }
+
+ /**
+ * Sets the author's name.
+ *
+ * @param string $authorName The new author name.
+ * An invalid value will set an empty string.
+ *
+ * @return $this
+ */
+ public function setAuthorName($authorName)
+ {
+ $this->content = null;
+ $this->authorName
+ = preg_match('/^' . self::REGEX_AUTHOR_NAME . '$/u', $authorName)
+ ? $authorName : '';
+
+ return $this;
+ }
+
+ /**
+ * Gets the author's email.
+ *
+ * @return string The author's email.
+ */
+ public function getAuthorEmail()
+ {
+ return $this->authorEmail;
+ }
+
+ /**
+ * Sets the author's email.
+ *
+ * @param string $authorEmail The new author email.
+ * An invalid value will set an empty string.
+ *
+ * @return $this
+ */
+ public function setAuthorEmail($authorEmail)
+ {
+ $this->authorEmail
+ = preg_match('/^' . self::REGEX_AUTHOR_EMAIL . '$/u', $authorEmail)
+ ? $authorEmail : '';
+
+ $this->content = null;
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php
new file mode 100644
index 0000000..bd31b56
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/CoversTag.php
@@ -0,0 +1,24 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @covers tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class CoversTag extends SeeTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php
new file mode 100644
index 0000000..7226316
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTag.php
@@ -0,0 +1,26 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag\VersionTag;
+
+/**
+ * Reflection class for a @deprecated tag in a Docblock.
+ *
+ * @author Vasil Rangelov
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class DeprecatedTag extends VersionTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php
new file mode 100644
index 0000000..0e163ea
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ExampleTag.php
@@ -0,0 +1,156 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @example tag in a Docblock.
+ *
+ * @author Vasil Rangelov
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ExampleTag extends SourceTag
+{
+ /**
+ * @var string Path to a file to use as an example.
+ * May also be an absolute URI.
+ */
+ protected $filePath = '';
+
+ /**
+ * @var bool Whether the file path component represents an URI.
+ * This determines how the file portion appears at {@link getContent()}.
+ */
+ protected $isURI = false;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $filePath = '';
+ if ($this->isURI) {
+ if (false === strpos($this->filePath, ':')) {
+ $filePath = str_replace(
+ '%2F',
+ '/',
+ rawurlencode($this->filePath)
+ );
+ } else {
+ $filePath = $this->filePath;
+ }
+ } else {
+ $filePath = '"' . $this->filePath . '"';
+ }
+
+ $this->content = $filePath . ' ' . parent::getContent();
+ }
+
+ return $this->content;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ Tag::setContent($content);
+ if (preg_match(
+ '/^
+ # File component
+ (?:
+ # File path in quotes
+ \"([^\"]+)\"
+ |
+ # File URI
+ (\S+)
+ )
+ # Remaining content (parsed by SourceTag)
+ (?:\s+(.*))?
+ $/sux',
+ $this->description,
+ $matches
+ )) {
+ if ('' !== $matches[1]) {
+ $this->setFilePath($matches[1]);
+ } else {
+ $this->setFileURI($matches[2]);
+ }
+
+ if (isset($matches[3])) {
+ parent::setContent($matches[3]);
+ } else {
+ $this->setDescription('');
+ }
+ $this->content = $content;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Returns the file path.
+ *
+ * @return string Path to a file to use as an example.
+ * May also be an absolute URI.
+ */
+ public function getFilePath()
+ {
+ return $this->filePath;
+ }
+
+ /**
+ * Sets the file path.
+ *
+ * @param string $filePath The new file path to use for the example.
+ *
+ * @return $this
+ */
+ public function setFilePath($filePath)
+ {
+ $this->isURI = false;
+ $this->filePath = trim($filePath);
+
+ $this->content = null;
+ return $this;
+ }
+
+ /**
+ * Sets the file path as an URI.
+ *
+ * This function is equivalent to {@link setFilePath()}, except that it
+ * convers an URI to a file path before that.
+ *
+ * There is no getFileURI(), as {@link getFilePath()} is compatible.
+ *
+ * @param type $uri The new file URI to use as an example.
+ */
+ public function setFileURI($uri)
+ {
+ $this->isURI = true;
+ if (false === strpos($uri, ':')) {
+ //Relative URL
+ $this->filePath = rawurldecode(
+ str_replace(array('/', '\\'), '%2F', $uri)
+ );
+ } else {
+ //Absolute URL or URI.
+ $this->filePath = $uri;
+ }
+
+ $this->content = null;
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php
new file mode 100644
index 0000000..f79f25d
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/LinkTag.php
@@ -0,0 +1,81 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @link tag in a Docblock.
+ *
+ * @author Ben Selby
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class LinkTag extends Tag
+{
+ /** @var string */
+ protected $link = '';
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content = "{$this->link} {$this->description}";
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ parent::setContent($content);
+ $parts = preg_split('/\s+/Su', $this->description, 2);
+
+ $this->link = $parts[0];
+
+ $this->setDescription(isset($parts[1]) ? $parts[1] : $parts[0]);
+
+ $this->content = $content;
+ return $this;
+ }
+
+ /**
+ * Gets the link
+ *
+ * @return string
+ */
+ public function getLink()
+ {
+ return $this->link;
+ }
+
+ /**
+ * Sets the link
+ *
+ * @param string $link The link
+ *
+ * @return $this
+ */
+ public function setLink($link)
+ {
+ $this->link = $link;
+
+ $this->content = null;
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php
new file mode 100644
index 0000000..7a5ce79
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/MethodTag.php
@@ -0,0 +1,209 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @method in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class MethodTag extends ReturnTag
+{
+
+ /** @var string */
+ protected $method_name = '';
+
+ /** @var string */
+ protected $arguments = '';
+
+ /** @var bool */
+ protected $isStatic = false;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content = '';
+ if ($this->isStatic) {
+ $this->content .= 'static ';
+ }
+ $this->content .= $this->type .
+ " {$this->method_name}({$this->arguments}) " .
+ $this->description;
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ Tag::setContent($content);
+ // 1. none or more whitespace
+ // 2. optionally the keyword "static" followed by whitespace
+ // 3. optionally a word with underscores followed by whitespace : as
+ // type for the return value
+ // 4. then optionally a word with underscores followed by () and
+ // whitespace : as method name as used by phpDocumentor
+ // 5. then a word with underscores, followed by ( and any character
+ // until a ) and whitespace : as method name with signature
+ // 6. any remaining text : as description
+ if (preg_match(
+ '/^
+ # Static keyword
+ # Declates a static method ONLY if type is also present
+ (?:
+ (static)
+ \s+
+ )?
+ # Return type
+ (?:
+ ([\w\|_\\\\]+)
+ \s+
+ )?
+ # Legacy method name (not captured)
+ (?:
+ [\w_]+\(\)\s+
+ )?
+ # Method name
+ ([\w\|_\\\\]+)
+ # Arguments
+ \(([^\)]*)\)
+ \s*
+ # Description
+ (.*)
+ $/sux',
+ $this->description,
+ $matches
+ )) {
+ list(
+ ,
+ $static,
+ $this->type,
+ $this->method_name,
+ $this->arguments,
+ $this->description
+ ) = $matches;
+ if ($static) {
+ if (!$this->type) {
+ $this->type = 'static';
+ } else {
+ $this->isStatic = true;
+ }
+ } else {
+ if (!$this->type) {
+ $this->type = 'void';
+ }
+ }
+ $this->parsedDescription = null;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Sets the name of this method.
+ *
+ * @param string $method_name The name of the method.
+ *
+ * @return $this
+ */
+ public function setMethodName($method_name)
+ {
+ $this->method_name = $method_name;
+
+ $this->content = null;
+ return $this;
+ }
+
+ /**
+ * Retrieves the method name.
+ *
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->method_name;
+ }
+
+ /**
+ * Sets the arguments for this method.
+ *
+ * @param string $arguments A comma-separated arguments line.
+ *
+ * @return void
+ */
+ public function setArguments($arguments)
+ {
+ $this->arguments = $arguments;
+
+ $this->content = null;
+ return $this;
+ }
+
+ /**
+ * Returns an array containing each argument as array of type and name.
+ *
+ * Please note that the argument sub-array may only contain 1 element if no
+ * type was specified.
+ *
+ * @return string[]
+ */
+ public function getArguments()
+ {
+ if (empty($this->arguments)) {
+ return array();
+ }
+
+ $arguments = explode(',', $this->arguments);
+ foreach ($arguments as $key => $value) {
+ $arguments[$key] = explode(' ', trim($value));
+ }
+
+ return $arguments;
+ }
+
+ /**
+ * Checks whether the method tag describes a static method or not.
+ *
+ * @return bool TRUE if the method declaration is for a static method, FALSE
+ * otherwise.
+ */
+ public function isStatic()
+ {
+ return $this->isStatic;
+ }
+
+ /**
+ * Sets a new value for whether the method is static or not.
+ *
+ * @param bool $isStatic The new value to set.
+ *
+ * @return $this
+ */
+ public function setIsStatic($isStatic)
+ {
+ $this->isStatic = $isStatic;
+
+ $this->content = null;
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php
new file mode 100644
index 0000000..9bc0270
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ParamTag.php
@@ -0,0 +1,119 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @param tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ParamTag extends ReturnTag
+{
+ /** @var string */
+ protected $variableName = '';
+
+ /** @var bool determines whether this is a variadic argument */
+ protected $isVariadic = false;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content
+ = "{$this->type} {$this->variableName} {$this->description}";
+ }
+ return $this->content;
+ }
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ Tag::setContent($content);
+ $parts = preg_split(
+ '/(\s+)/Su',
+ $this->description,
+ 3,
+ PREG_SPLIT_DELIM_CAPTURE
+ );
+
+ // if the first item that is encountered is not a variable; it is a type
+ if (isset($parts[0])
+ && (strlen($parts[0]) > 0)
+ && ($parts[0][0] !== '$')
+ ) {
+ $this->type = array_shift($parts);
+ array_shift($parts);
+ }
+
+ // if the next item starts with a $ or ...$ it must be the variable name
+ if (isset($parts[0])
+ && (strlen($parts[0]) > 0)
+ && ($parts[0][0] == '$' || substr($parts[0], 0, 4) === '...$')
+ ) {
+ $this->variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($this->variableName, 0, 3) === '...') {
+ $this->isVariadic = true;
+ $this->variableName = substr($this->variableName, 3);
+ }
+ }
+
+ $this->setDescription(implode('', $parts));
+
+ $this->content = $content;
+ return $this;
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Sets the variable's name.
+ *
+ * @param string $name The new name for this variable.
+ *
+ * @return $this
+ */
+ public function setVariableName($name)
+ {
+ $this->variableName = $name;
+
+ $this->content = null;
+ return $this;
+ }
+
+ /**
+ * Returns whether this tag is variadic.
+ *
+ * @return boolean
+ */
+ public function isVariadic()
+ {
+ return $this->isVariadic;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php
new file mode 100644
index 0000000..3340602
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyReadTag.php
@@ -0,0 +1,24 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @property-read tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class PropertyReadTag extends PropertyTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php
new file mode 100644
index 0000000..288ecff
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyTag.php
@@ -0,0 +1,24 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @property tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class PropertyTag extends ParamTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php
new file mode 100644
index 0000000..ec4e866
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/PropertyWriteTag.php
@@ -0,0 +1,24 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @property-write tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class PropertyWriteTag extends PropertyTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php
new file mode 100644
index 0000000..9293db9
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ReturnTag.php
@@ -0,0 +1,99 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Type\Collection;
+
+/**
+ * Reflection class for a @return tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ReturnTag extends Tag
+{
+ /** @var string The raw type component. */
+ protected $type = '';
+
+ /** @var Collection The parsed type component. */
+ protected $types = null;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content = "{$this->type} {$this->description}";
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ parent::setContent($content);
+
+ $parts = preg_split('/\s+/Su', $this->description, 2);
+
+ // any output is considered a type
+ $this->type = $parts[0];
+ $this->types = null;
+
+ $this->setDescription(isset($parts[1]) ? $parts[1] : '');
+
+ $this->content = $content;
+ return $this;
+ }
+
+ /**
+ * Returns the unique types of the variable.
+ *
+ * @return string[]
+ */
+ public function getTypes()
+ {
+ return $this->getTypesCollection()->getArrayCopy();
+ }
+
+ /**
+ * Returns the type section of the variable.
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return (string) $this->getTypesCollection();
+ }
+
+ /**
+ * Returns the type collection.
+ *
+ * @return void
+ */
+ protected function getTypesCollection()
+ {
+ if (null === $this->types) {
+ $this->types = new Collection(
+ array($this->type),
+ $this->docblock ? $this->docblock->getContext() : null
+ );
+ }
+ return $this->types;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php
new file mode 100644
index 0000000..4f5f22c
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SeeTag.php
@@ -0,0 +1,81 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @see tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class SeeTag extends Tag
+{
+ /** @var string */
+ protected $refers = null;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content = "{$this->refers} {$this->description}";
+ }
+ return $this->content;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ parent::setContent($content);
+ $parts = preg_split('/\s+/Su', $this->description, 2);
+
+ // any output is considered a type
+ $this->refers = $parts[0];
+
+ $this->setDescription(isset($parts[1]) ? $parts[1] : '');
+
+ $this->content = $content;
+ return $this;
+ }
+
+ /**
+ * Gets the structural element this tag refers to.
+ *
+ * @return string
+ */
+ public function getReference()
+ {
+ return $this->refers;
+ }
+
+ /**
+ * Sets the structural element this tag refers to.
+ *
+ * @param string $refers The new type this tag refers to.
+ *
+ * @return $this
+ */
+ public function setReference($refers)
+ {
+ $this->refers = $refers;
+
+ $this->content = null;
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php
new file mode 100644
index 0000000..ba009c4
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SinceTag.php
@@ -0,0 +1,26 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag\VersionTag;
+
+/**
+ * Reflection class for a @since tag in a Docblock.
+ *
+ * @author Vasil Rangelov
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class SinceTag extends VersionTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php
new file mode 100644
index 0000000..3400220
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/SourceTag.php
@@ -0,0 +1,137 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @source tag in a Docblock.
+ *
+ * @author Vasil Rangelov
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class SourceTag extends Tag
+{
+ /**
+ * @var int The starting line, relative to the structural element's
+ * location.
+ */
+ protected $startingLine = 1;
+
+ /**
+ * @var int|null The number of lines, relative to the starting line. NULL
+ * means "to the end".
+ */
+ protected $lineCount = null;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content
+ = "{$this->startingLine} {$this->lineCount} {$this->description}";
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ parent::setContent($content);
+ if (preg_match(
+ '/^
+ # Starting line
+ ([1-9]\d*)
+ \s*
+ # Number of lines
+ (?:
+ ((?1))
+ \s+
+ )?
+ # Description
+ (.*)
+ $/sux',
+ $this->description,
+ $matches
+ )) {
+ $this->startingLine = (int)$matches[1];
+ if (isset($matches[2]) && '' !== $matches[2]) {
+ $this->lineCount = (int)$matches[2];
+ }
+ $this->setDescription($matches[3]);
+ $this->content = $content;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Gets the starting line.
+ *
+ * @return int The starting line, relative to the structural element's
+ * location.
+ */
+ public function getStartingLine()
+ {
+ return $this->startingLine;
+ }
+
+ /**
+ * Sets the starting line.
+ *
+ * @param int $startingLine The new starting line, relative to the
+ * structural element's location.
+ *
+ * @return $this
+ */
+ public function setStartingLine($startingLine)
+ {
+ $this->startingLine = $startingLine;
+
+ $this->content = null;
+ return $this;
+ }
+
+ /**
+ * Returns the number of lines.
+ *
+ * @return int|null The number of lines, relative to the starting line. NULL
+ * means "to the end".
+ */
+ public function getLineCount()
+ {
+ return $this->lineCount;
+ }
+
+ /**
+ * Sets the number of lines.
+ *
+ * @param int|null $lineCount The new number of lines, relative to the
+ * starting line. NULL means "to the end".
+ *
+ * @return $this
+ */
+ public function setLineCount($lineCount)
+ {
+ $this->lineCount = $lineCount;
+
+ $this->content = null;
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php
new file mode 100644
index 0000000..58ee44a
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTag.php
@@ -0,0 +1,24 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @throws tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ThrowsTag extends ReturnTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php
new file mode 100644
index 0000000..da0d663
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/UsesTag.php
@@ -0,0 +1,24 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @uses tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class UsesTag extends SeeTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php
new file mode 100644
index 0000000..236b2c8
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VarTag.php
@@ -0,0 +1,24 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @var tag in a Docblock.
+ *
+ * @author Mike van Riel
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class VarTag extends ParamTag
+{
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php
new file mode 100644
index 0000000..260f698
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Tag/VersionTag.php
@@ -0,0 +1,108 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a @version tag in a Docblock.
+ *
+ * @author Vasil Rangelov
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class VersionTag extends Tag
+{
+ /**
+ * PCRE regular expression matching a version vector.
+ * Assumes the "x" modifier.
+ */
+ const REGEX_VECTOR = '(?:
+ # Normal release vectors.
+ \d\S*
+ |
+ # VCS version vectors. Per PHPCS, they are expected to
+ # follow the form of the VCS name, followed by ":", followed
+ # by the version vector itself.
+ # By convention, popular VCSes like CVS, SVN and GIT use "$"
+ # around the actual version vector.
+ [^\s\:]+\:\s*\$[^\$]+\$
+ )';
+
+ /** @var string The version vector. */
+ protected $version = '';
+
+ public function getContent()
+ {
+ if (null === $this->content) {
+ $this->content = "{$this->version} {$this->description}";
+ }
+
+ return $this->content;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function setContent($content)
+ {
+ parent::setContent($content);
+
+ if (preg_match(
+ '/^
+ # The version vector
+ (' . self::REGEX_VECTOR . ')
+ \s*
+ # The description
+ (.+)?
+ $/sux',
+ $this->description,
+ $matches
+ )) {
+ $this->version = $matches[1];
+ $this->setDescription(isset($matches[2]) ? $matches[2] : '');
+ $this->content = $content;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Gets the version section of the tag.
+ *
+ * @return string The version section of the tag.
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Sets the version section of the tag.
+ *
+ * @param string $version The new version section of the tag.
+ * An invalid value will set an empty string.
+ *
+ * @return $this
+ */
+ public function setVersion($version)
+ {
+ $this->version
+ = preg_match('/^' . self::REGEX_VECTOR . '$/ux', $version)
+ ? $version
+ : '';
+
+ $this->content = null;
+ return $this;
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php
new file mode 100644
index 0000000..90ead3f
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/src/phpDocumentor/Reflection/DocBlock/Type/Collection.php
@@ -0,0 +1,221 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Type;
+
+use phpDocumentor\Reflection\DocBlock\Context;
+
+/**
+ * Collection
+ *
+ * @author Mike van Riel
+ * @copyright 2010-2011 Mike van Riel / Naenius (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class Collection extends \ArrayObject
+{
+ /** @var string Definition of the OR operator for types */
+ const OPERATOR_OR = '|';
+
+ /** @var string Definition of the ARRAY operator for types */
+ const OPERATOR_ARRAY = '[]';
+
+ /** @var string Definition of the NAMESPACE operator in PHP */
+ const OPERATOR_NAMESPACE = '\\';
+
+ /** @var string[] List of recognized keywords */
+ protected static $keywords = array(
+ 'string', 'int', 'integer', 'bool', 'boolean', 'float', 'double',
+ 'object', 'mixed', 'array', 'resource', 'void', 'null', 'scalar',
+ 'callback', 'callable', 'false', 'true', 'self', '$this', 'static'
+ );
+
+ /**
+ * Current invoking location.
+ *
+ * This is used to prepend to type with a relative location.
+ * May also be 'default' or 'global', in which case they are ignored.
+ *
+ * @var Context
+ */
+ protected $context = null;
+
+ /**
+ * Registers the namespace and aliases; uses that to add and expand the
+ * given types.
+ *
+ * @param string[] $types Array containing a list of types to add to this
+ * container.
+ * @param Context $location The current invoking location.
+ */
+ public function __construct(
+ array $types = array(),
+ Context $context = null
+ ) {
+ $this->context = null === $context ? new Context() : $context;
+
+ foreach ($types as $type) {
+ $this->add($type);
+ }
+ }
+
+ /**
+ * Returns the current invoking location.
+ *
+ * @return Context
+ */
+ public function getContext()
+ {
+ return $this->context;
+ }
+
+ /**
+ * Adds a new type to the collection and expands it if it contains a
+ * relative namespace.
+ *
+ * If a class in the type contains a relative namespace than this collection
+ * will try to expand that into a FQCN.
+ *
+ * @param string $type A 'Type' as defined in the phpDocumentor
+ * documentation.
+ *
+ * @throws \InvalidArgumentException if a non-string argument is passed.
+ *
+ * @see http://phpdoc.org/docs/latest/for-users/types.html for the
+ * definition of a type.
+ *
+ * @return void
+ */
+ public function add($type)
+ {
+ if (!is_string($type)) {
+ throw new \InvalidArgumentException(
+ 'A type should be represented by a string, received: '
+ .var_export($type, true)
+ );
+ }
+
+ // separate the type by the OR operator
+ $type_parts = explode(self::OPERATOR_OR, $type);
+ foreach ($type_parts as $part) {
+ $expanded_type = $this->expand($part);
+ if ($expanded_type) {
+ $this[] = $expanded_type;
+ }
+ }
+ }
+
+ /**
+ * Returns a string representation of the collection.
+ *
+ * @return string The resolved types across the collection, separated with
+ * {@link self::OPERATOR_OR}.
+ */
+ public function __toString()
+ {
+ return implode(self::OPERATOR_OR, $this->getArrayCopy());
+ }
+
+ /**
+ * Analyzes the given type and returns the FQCN variant.
+ *
+ * When a type is provided this method checks whether it is not a keyword or
+ * Fully Qualified Class Name. If so it will use the given namespace and
+ * aliases to expand the type to a FQCN representation.
+ *
+ * This method only works as expected if the namespace and aliases are set;
+ * no dynamic reflection is being performed here.
+ *
+ * @param string $type The relative or absolute type.
+ *
+ * @uses getNamespace to determine with what to prefix the type name.
+ * @uses getNamespaceAliases to check whether the first part of the relative
+ * type name should not be replaced with another namespace.
+ *
+ * @return string
+ */
+ protected function expand($type)
+ {
+ $type = trim($type);
+ if (!$type) {
+ return '';
+ }
+
+ if ($this->isTypeAnArray($type)) {
+ return $this->expand(substr($type, 0, -2)) . self::OPERATOR_ARRAY;
+ }
+
+ if ($this->isRelativeType($type) && !$this->isTypeAKeyword($type)) {
+ $type_parts = explode(self::OPERATOR_NAMESPACE, $type, 2);
+
+ $namespace_aliases = $this->context->getNamespaceAliases();
+ // if the first segment is not an alias; prepend namespace name and
+ // return
+ if (!isset($namespace_aliases[$type_parts[0]])) {
+ $namespace = $this->context->getNamespace();
+ if ('' !== $namespace) {
+ $namespace .= self::OPERATOR_NAMESPACE;
+ }
+ return self::OPERATOR_NAMESPACE . $namespace . $type;
+ }
+
+ $type_parts[0] = $namespace_aliases[$type_parts[0]];
+ $type = implode(self::OPERATOR_NAMESPACE, $type_parts);
+ }
+
+ return $type;
+ }
+
+ /**
+ * Detects whether the given type represents an array.
+ *
+ * @param string $type A relative or absolute type as defined in the
+ * phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ protected function isTypeAnArray($type)
+ {
+ return substr($type, -2) === self::OPERATOR_ARRAY;
+ }
+
+ /**
+ * Detects whether the given type represents a PHPDoc keyword.
+ *
+ * @param string $type A relative or absolute type as defined in the
+ * phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ protected function isTypeAKeyword($type)
+ {
+ return in_array(strtolower($type), static::$keywords, true);
+ }
+
+ /**
+ * Detects whether the given type represents a relative or absolute path.
+ *
+ * This method will detect keywords as being absolute; even though they are
+ * not preceeded by a namespace separator.
+ *
+ * @param string $type A relative or absolute type as defined in the
+ * phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ protected function isRelativeType($type)
+ {
+ return ($type[0] !== self::OPERATOR_NAMESPACE)
+ || $this->isTypeAKeyword($type);
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php
new file mode 100644
index 0000000..a6ca7b3
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/DescriptionTest.php
@@ -0,0 +1,245 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Description
+ *
+ * @author Vasil Rangelov
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class DescriptionTest extends \PHPUnit_Framework_TestCase
+{
+ public function testConstruct()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(1, $parsedContents);
+ $this->assertSame($fixture, $parsedContents[0]);
+ }
+
+ public function testInlineTagParsing()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(3, $parsedContents);
+ $this->assertSame('This is text for a ', $parsedContents[0]);
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag\LinkTag',
+ $parsedContents[1]
+ );
+ $this->assertSame(
+ ' that uses inline
+tags.',
+ $parsedContents[2]
+ );
+ }
+
+ public function testInlineTagAtStartParsing()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(3, $parsedContents);
+
+ $this->assertSame('', $parsedContents[0]);
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag\LinkTag',
+ $parsedContents[1]
+ );
+ $this->assertSame(
+ ' is text for a description that uses inline
+tags.',
+ $parsedContents[2]
+ );
+ }
+
+ public function testNestedInlineTagParsing()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(3, $parsedContents);
+
+ $this->assertSame(
+ 'This is text for a description with ',
+ $parsedContents[0]
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $parsedContents[1]
+ );
+ $this->assertSame('.', $parsedContents[2]);
+
+ $parsedDescription = $parsedContents[1]->getParsedDescription();
+ $this->assertCount(3, $parsedDescription);
+ $this->assertSame("inline tag with\n", $parsedDescription[0]);
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag\LinkTag',
+ $parsedDescription[1]
+ );
+ $this->assertSame(' in it', $parsedDescription[2]);
+ }
+
+ public function testLiteralOpeningDelimiter()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(1, $parsedContents);
+ $this->assertSame($fixture, $parsedContents[0]);
+ }
+
+ public function testNestedLiteralOpeningDelimiter()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(3, $parsedContents);
+ $this->assertSame(
+ 'This is text for a description containing ',
+ $parsedContents[0]
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $parsedContents[1]
+ );
+ $this->assertSame('.', $parsedContents[2]);
+
+ $this->assertSame(
+ array('inline tag that has { that
+is literal'),
+ $parsedContents[1]->getParsedDescription()
+ );
+ }
+
+ public function testLiteralClosingDelimiter()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(1, $parsedContents);
+ $this->assertSame(
+ 'This is text for a description with } that is not a tag.',
+ $parsedContents[0]
+ );
+ }
+
+ public function testNestedLiteralClosingDelimiter()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(3, $parsedContents);
+ $this->assertSame(
+ 'This is text for a description with ',
+ $parsedContents[0]
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $parsedContents[1]
+ );
+ $this->assertSame('.', $parsedContents[2]);
+
+ $this->assertSame(
+ array('inline tag with } that is not an
+inline tag'),
+ $parsedContents[1]->getParsedDescription()
+ );
+ }
+
+ public function testInlineTagEscapingSequence()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(1, $parsedContents);
+ $this->assertSame(
+ 'This is text for a description with literal {@link}.',
+ $parsedContents[0]
+ );
+ }
+
+ public function testNestedInlineTagEscapingSequence()
+ {
+ $fixture = <<assertSame($fixture, $object->getContents());
+
+ $parsedContents = $object->getParsedContents();
+ $this->assertCount(3, $parsedContents);
+ $this->assertSame(
+ 'This is text for a description with an ',
+ $parsedContents[0]
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $parsedContents[1]
+ );
+ $this->assertSame('.', $parsedContents[2]);
+
+ $this->assertSame(
+ array('inline tag with literal
+{@link} in it'),
+ $parsedContents[1]->getParsedDescription()
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php
new file mode 100644
index 0000000..ff257aa
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/CoversTagTest.php
@@ -0,0 +1,86 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\CoversTag
+ *
+ * @author Daniel O'Connor
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class CoversTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\CoversTag can create
+ * a link for the covers doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exReference
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\CoversTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exReference
+ ) {
+ $tag = new CoversTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exReference, $tag->getReference());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exReference
+ return array(
+ array(
+ 'covers',
+ 'Foo::bar()',
+ 'Foo::bar()',
+ '',
+ 'Foo::bar()'
+ ),
+ array(
+ 'covers',
+ 'Foo::bar() Testing',
+ 'Foo::bar() Testing',
+ 'Testing',
+ 'Foo::bar()',
+ ),
+ array(
+ 'covers',
+ 'Foo::bar() Testing comments',
+ 'Foo::bar() Testing comments',
+ 'Testing comments',
+ 'Foo::bar()',
+ ),
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php
new file mode 100644
index 0000000..7a75e79
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/DeprecatedTagTest.php
@@ -0,0 +1,115 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag
+ *
+ * @author Vasil Rangelov
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class DeprecatedTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
+ * a link for the @deprecated doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exDescription
+ * @param string $exVersion
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\DeprecatedTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exVersion
+ ) {
+ $tag = new DeprecatedTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exVersion, $tag->getVersion());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exVersion
+ return array(
+ array(
+ 'deprecated',
+ '1.0 First release.',
+ '1.0 First release.',
+ 'First release.',
+ '1.0'
+ ),
+ array(
+ 'deprecated',
+ "1.0\nFirst release.",
+ "1.0\nFirst release.",
+ 'First release.',
+ '1.0'
+ ),
+ array(
+ 'deprecated',
+ "1.0\nFirst\nrelease.",
+ "1.0\nFirst\nrelease.",
+ "First\nrelease.",
+ '1.0'
+ ),
+ array(
+ 'deprecated',
+ 'Unfinished release',
+ 'Unfinished release',
+ 'Unfinished release',
+ ''
+ ),
+ array(
+ 'deprecated',
+ '1.0',
+ '1.0',
+ '',
+ '1.0'
+ ),
+ array(
+ 'deprecated',
+ 'GIT: $Id$',
+ 'GIT: $Id$',
+ '',
+ 'GIT: $Id$'
+ ),
+ array(
+ 'deprecated',
+ 'GIT: $Id$ Dev build',
+ 'GIT: $Id$ Dev build',
+ 'Dev build',
+ 'GIT: $Id$'
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php
new file mode 100644
index 0000000..519a61b
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ExampleTagTest.php
@@ -0,0 +1,203 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag
+ *
+ * @author Vasil Rangelov
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ExampleTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can
+ * understand the @source DocBlock.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exStartingLine
+ * @param string $exLineCount
+ * @param string $exFilepath
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\ExampleTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exStartingLine,
+ $exLineCount,
+ $exFilePath
+ ) {
+ $tag = new ExampleTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exStartingLine, $tag->getStartingLine());
+ $this->assertEquals($exLineCount, $tag->getLineCount());
+ $this->assertEquals($exFilePath, $tag->getFilePath());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type,
+ // $content,
+ // $exContent,
+ // $exDescription,
+ // $exStartingLine,
+ // $exLineCount,
+ // $exFilePath
+ return array(
+ array(
+ 'example',
+ 'file.php',
+ 'file.php',
+ '',
+ 1,
+ null,
+ 'file.php'
+ ),
+ array(
+ 'example',
+ 'Testing comments',
+ 'Testing comments',
+ 'comments',
+ 1,
+ null,
+ 'Testing'
+ ),
+ array(
+ 'example',
+ 'file.php 2 Testing',
+ 'file.php 2 Testing',
+ 'Testing',
+ 2,
+ null,
+ 'file.php'
+ ),
+ array(
+ 'example',
+ 'file.php 2 3 Testing comments',
+ 'file.php 2 3 Testing comments',
+ 'Testing comments',
+ 2,
+ 3,
+ 'file.php'
+ ),
+ array(
+ 'example',
+ 'file.php 2 -1 Testing comments',
+ 'file.php 2 -1 Testing comments',
+ '-1 Testing comments',
+ 2,
+ null,
+ 'file.php'
+ ),
+ array(
+ 'example',
+ 'file.php -1 1 Testing comments',
+ 'file.php -1 1 Testing comments',
+ '-1 1 Testing comments',
+ 1,
+ null,
+ 'file.php'
+ ),
+ array(
+ 'example',
+ '"file with spaces.php" Testing comments',
+ '"file with spaces.php" Testing comments',
+ 'Testing comments',
+ 1,
+ null,
+ 'file with spaces.php'
+ ),
+ array(
+ 'example',
+ '"file with spaces.php" 2 Testing comments',
+ '"file with spaces.php" 2 Testing comments',
+ 'Testing comments',
+ 2,
+ null,
+ 'file with spaces.php'
+ ),
+ array(
+ 'example',
+ '"file with spaces.php" 2 3 Testing comments',
+ '"file with spaces.php" 2 3 Testing comments',
+ 'Testing comments',
+ 2,
+ 3,
+ 'file with spaces.php'
+ ),
+ array(
+ 'example',
+ '"file with spaces.php" 2 -3 Testing comments',
+ '"file with spaces.php" 2 -3 Testing comments',
+ '-3 Testing comments',
+ 2,
+ null,
+ 'file with spaces.php'
+ ),
+ array(
+ 'example',
+ '"file with spaces.php" -2 3 Testing comments',
+ '"file with spaces.php" -2 3 Testing comments',
+ '-2 3 Testing comments',
+ 1,
+ null,
+ 'file with spaces.php'
+ ),
+ array(
+ 'example',
+ 'file%20with%20spaces.php Testing comments',
+ 'file%20with%20spaces.php Testing comments',
+ 'Testing comments',
+ 1,
+ null,
+ 'file with spaces.php'
+ ),
+ array(
+ 'example',
+ 'folder/file%20with%20spaces.php Testing comments',
+ 'folder/file%20with%20spaces.php Testing comments',
+ 'Testing comments',
+ 1,
+ null,
+ 'folder/file with spaces.php'
+ ),
+ array(
+ 'example',
+ 'http://example.com/file%20with%20spaces.php Testing comments',
+ 'http://example.com/file%20with%20spaces.php Testing comments',
+ 'Testing comments',
+ 1,
+ null,
+ 'http://example.com/file%20with%20spaces.php'
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php
new file mode 100644
index 0000000..0c64ed0
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/LinkTagTest.php
@@ -0,0 +1,87 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\LinkTag
+ *
+ * @author Ben Selby
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class LinkTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
+ * a link for the @link doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exDescription
+ * @param string $exLink
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\LinkTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exLink
+ ) {
+ $tag = new LinkTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exLink, $tag->getLink());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exLink
+ return array(
+ array(
+ 'link',
+ 'http://www.phpdoc.org/',
+ 'http://www.phpdoc.org/',
+ 'http://www.phpdoc.org/',
+ 'http://www.phpdoc.org/'
+ ),
+ array(
+ 'link',
+ 'http://www.phpdoc.org/ Testing',
+ 'http://www.phpdoc.org/ Testing',
+ 'Testing',
+ 'http://www.phpdoc.org/'
+ ),
+ array(
+ 'link',
+ 'http://www.phpdoc.org/ Testing comments',
+ 'http://www.phpdoc.org/ Testing comments',
+ 'Testing comments',
+ 'http://www.phpdoc.org/'
+ ),
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php
new file mode 100644
index 0000000..0eacac6
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/MethodTagTest.php
@@ -0,0 +1,145 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\MethodTag
+ *
+ * @author Mike van Riel
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class MethodTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @param string $signature The signature to test.
+ * @param bool $valid Whether the given signature is expected to
+ * be valid.
+ * @param string $expected_name The method name that is expected from this
+ * signature.
+ * @param string $expected_return The return type that is expected from this
+ * signature.
+ * @param bool $paramCount Number of parameters in the signature.
+ * @param string $description The short description mentioned in the
+ * signature.
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\MethodTag
+ * @dataProvider getTestSignatures
+ *
+ * @return void
+ */
+ public function testConstruct(
+ $signature,
+ $valid,
+ $expected_name,
+ $expected_return,
+ $expected_isStatic,
+ $paramCount,
+ $description
+ ) {
+ ob_start();
+ $tag = new MethodTag('method', $signature);
+ $stdout = ob_get_clean();
+
+ $this->assertSame(
+ $valid,
+ empty($stdout),
+ 'No error should have been output if the signature is valid'
+ );
+
+ if (!$valid) {
+ return;
+ }
+
+ $this->assertEquals($expected_name, $tag->getMethodName());
+ $this->assertEquals($expected_return, $tag->getType());
+ $this->assertEquals($description, $tag->getDescription());
+ $this->assertEquals($expected_isStatic, $tag->isStatic());
+ $this->assertCount($paramCount, $tag->getArguments());
+ }
+
+ public function getTestSignatures()
+ {
+ return array(
+ array(
+ 'foo',
+ false, 'foo', '', false, 0, ''
+ ),
+ array(
+ 'foo()',
+ true, 'foo', 'void', false, 0, ''
+ ),
+ array(
+ 'foo() description',
+ true, 'foo', 'void', false, 0, 'description'
+ ),
+ array(
+ 'int foo()',
+ true, 'foo', 'int', false, 0, ''
+ ),
+ array(
+ 'int foo() description',
+ true, 'foo', 'int', false, 0, 'description'
+ ),
+ array(
+ 'int foo($a, $b)',
+ true, 'foo', 'int', false, 2, ''
+ ),
+ array(
+ 'int foo() foo(int $a, int $b)',
+ true, 'foo', 'int', false, 2, ''
+ ),
+ array(
+ 'int foo(int $a, int $b)',
+ true, 'foo', 'int', false, 2, ''
+ ),
+ array(
+ 'null|int foo(int $a, int $b)',
+ true, 'foo', 'null|int', false, 2, ''
+ ),
+ array(
+ 'int foo(null|int $a, int $b)',
+ true, 'foo', 'int', false, 2, ''
+ ),
+ array(
+ '\Exception foo() foo(Exception $a, Exception $b)',
+ true, 'foo', '\Exception', false, 2, ''
+ ),
+ array(
+ 'int foo() foo(Exception $a, Exception $b) description',
+ true, 'foo', 'int', false, 2, 'description'
+ ),
+ array(
+ 'int foo() foo(\Exception $a, \Exception $b) description',
+ true, 'foo', 'int', false, 2, 'description'
+ ),
+ array(
+ 'void()',
+ true, 'void', 'void', false, 0, ''
+ ),
+ array(
+ 'static foo()',
+ true, 'foo', 'static', false, 0, ''
+ ),
+ array(
+ 'static void foo()',
+ true, 'foo', 'void', true, 0, ''
+ ),
+ array(
+ 'static static foo()',
+ true, 'foo', 'static', true, 0, ''
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php
new file mode 100644
index 0000000..0e05382
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ParamTagTest.php
@@ -0,0 +1,118 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\ParamTag
+ *
+ * @author Mike van Riel
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ParamTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ParamTag can
+ * understand the @param DocBlock.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $extractedType
+ * @param string $extractedTypes
+ * @param string $extractedVarName
+ * @param string $extractedDescription
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\ParamTag
+ * @dataProvider provideDataForConstructor
+ *
+ * @return void
+ */
+ public function testConstructorParsesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $extractedType,
+ $extractedTypes,
+ $extractedVarName,
+ $extractedDescription
+ ) {
+ $tag = new ParamTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($extractedType, $tag->getType());
+ $this->assertEquals($extractedTypes, $tag->getTypes());
+ $this->assertEquals($extractedVarName, $tag->getVariableName());
+ $this->assertEquals($extractedDescription, $tag->getDescription());
+ }
+
+ /**
+ * Data provider for testConstructorParsesInputsIntoCorrectFields()
+ *
+ * @return array
+ */
+ public function provideDataForConstructor()
+ {
+ return array(
+ array('param', 'int', 'int', array('int'), '', ''),
+ array('param', '$bob', '', array(), '$bob', ''),
+ array(
+ 'param',
+ 'int Number of bobs',
+ 'int',
+ array('int'),
+ '',
+ 'Number of bobs'
+ ),
+ array(
+ 'param',
+ 'int $bob',
+ 'int',
+ array('int'),
+ '$bob',
+ ''
+ ),
+ array(
+ 'param',
+ 'int $bob Number of bobs',
+ 'int',
+ array('int'),
+ '$bob',
+ 'Number of bobs'
+ ),
+ array(
+ 'param',
+ "int Description \n on multiple lines",
+ 'int',
+ array('int'),
+ '',
+ "Description \n on multiple lines"
+ ),
+ array(
+ 'param',
+ "int \n\$bob Variable name on a new line",
+ 'int',
+ array('int'),
+ '$bob',
+ "Variable name on a new line"
+ ),
+ array(
+ 'param',
+ "\nint \$bob Type on a new line",
+ 'int',
+ array('int'),
+ '$bob',
+ "Type on a new line"
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php
new file mode 100644
index 0000000..9e2aec0
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ReturnTagTest.php
@@ -0,0 +1,102 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\ReturnTag
+ *
+ * @author Mike van Riel
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ReturnTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag can
+ * understand the @return DocBlock.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $extractedType
+ * @param string $extractedTypes
+ * @param string $extractedDescription
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\ReturnTag
+ * @dataProvider provideDataForConstructor
+ *
+ * @return void
+ */
+ public function testConstructorParsesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $extractedType,
+ $extractedTypes,
+ $extractedDescription
+ ) {
+ $tag = new ReturnTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($extractedType, $tag->getType());
+ $this->assertEquals($extractedTypes, $tag->getTypes());
+ $this->assertEquals($extractedDescription, $tag->getDescription());
+ }
+
+ /**
+ * Data provider for testConstructorParsesInputsIntoCorrectFields()
+ *
+ * @return array
+ */
+ public function provideDataForConstructor()
+ {
+ return array(
+ array('return', '', '', array(), ''),
+ array('return', 'int', 'int', array('int'), ''),
+ array(
+ 'return',
+ 'int Number of Bobs',
+ 'int',
+ array('int'),
+ 'Number of Bobs'
+ ),
+ array(
+ 'return',
+ 'int|double Number of Bobs',
+ 'int|double',
+ array('int', 'double'),
+ 'Number of Bobs'
+ ),
+ array(
+ 'return',
+ "int Number of \n Bobs",
+ 'int',
+ array('int'),
+ "Number of \n Bobs"
+ ),
+ array(
+ 'return',
+ " int Number of Bobs",
+ 'int',
+ array('int'),
+ "Number of Bobs"
+ ),
+ array(
+ 'return',
+ "int\nNumber of Bobs",
+ 'int',
+ array('int'),
+ "Number of Bobs"
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php
new file mode 100644
index 0000000..6829b04
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SeeTagTest.php
@@ -0,0 +1,86 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SeeTag
+ *
+ * @author Daniel O'Connor
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class SeeTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the phpDocumentor_Reflection_DocBlock_Tag_See can create a link
+ * for the @see doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exReference
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\SeeTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exReference
+ ) {
+ $tag = new SeeTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exReference, $tag->getReference());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exReference
+ return array(
+ array(
+ 'see',
+ 'Foo::bar()',
+ 'Foo::bar()',
+ '',
+ 'Foo::bar()'
+ ),
+ array(
+ 'see',
+ 'Foo::bar() Testing',
+ 'Foo::bar() Testing',
+ 'Testing',
+ 'Foo::bar()',
+ ),
+ array(
+ 'see',
+ 'Foo::bar() Testing comments',
+ 'Foo::bar() Testing comments',
+ 'Testing comments',
+ 'Foo::bar()',
+ ),
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php
new file mode 100644
index 0000000..8caf25d
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SinceTagTest.php
@@ -0,0 +1,115 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SinceTag
+ *
+ * @author Vasil Rangelov
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class SinceTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
+ * a link for the @since doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exDescription
+ * @param string $exVersion
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\SinceTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exVersion
+ ) {
+ $tag = new SinceTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exVersion, $tag->getVersion());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exVersion
+ return array(
+ array(
+ 'since',
+ '1.0 First release.',
+ '1.0 First release.',
+ 'First release.',
+ '1.0'
+ ),
+ array(
+ 'since',
+ "1.0\nFirst release.",
+ "1.0\nFirst release.",
+ 'First release.',
+ '1.0'
+ ),
+ array(
+ 'since',
+ "1.0\nFirst\nrelease.",
+ "1.0\nFirst\nrelease.",
+ "First\nrelease.",
+ '1.0'
+ ),
+ array(
+ 'since',
+ 'Unfinished release',
+ 'Unfinished release',
+ 'Unfinished release',
+ ''
+ ),
+ array(
+ 'since',
+ '1.0',
+ '1.0',
+ '',
+ '1.0'
+ ),
+ array(
+ 'since',
+ 'GIT: $Id$',
+ 'GIT: $Id$',
+ '',
+ 'GIT: $Id$'
+ ),
+ array(
+ 'since',
+ 'GIT: $Id$ Dev build',
+ 'GIT: $Id$ Dev build',
+ 'Dev build',
+ 'GIT: $Id$'
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php
new file mode 100644
index 0000000..2a40e0a
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/SourceTagTest.php
@@ -0,0 +1,116 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\SourceTag
+ *
+ * @author Vasil Rangelov
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class SourceTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\SourceTag can
+ * understand the @source DocBlock.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exStartingLine
+ * @param string $exLineCount
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\SourceTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exStartingLine,
+ $exLineCount
+ ) {
+ $tag = new SourceTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exStartingLine, $tag->getStartingLine());
+ $this->assertEquals($exLineCount, $tag->getLineCount());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exStartingLine, $exLineCount
+ return array(
+ array(
+ 'source',
+ '2',
+ '2',
+ '',
+ 2,
+ null
+ ),
+ array(
+ 'source',
+ 'Testing',
+ 'Testing',
+ 'Testing',
+ 1,
+ null
+ ),
+ array(
+ 'source',
+ '2 Testing',
+ '2 Testing',
+ 'Testing',
+ 2,
+ null
+ ),
+ array(
+ 'source',
+ '2 3 Testing comments',
+ '2 3 Testing comments',
+ 'Testing comments',
+ 2,
+ 3
+ ),
+ array(
+ 'source',
+ '2 -1 Testing comments',
+ '2 -1 Testing comments',
+ '-1 Testing comments',
+ 2,
+ null
+ ),
+ array(
+ 'source',
+ '-1 1 Testing comments',
+ '-1 1 Testing comments',
+ '-1 1 Testing comments',
+ 1,
+ null
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php
new file mode 100644
index 0000000..3c669d5
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/ThrowsTagTest.php
@@ -0,0 +1,102 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\ThrowsTag
+ *
+ * @author Mike van Riel
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class ThrowsTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag can
+ * understand the @throws DocBlock.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $extractedType
+ * @param string $extractedTypes
+ * @param string $extractedDescription
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\ThrowsTag
+ * @dataProvider provideDataForConstructor
+ *
+ * @return void
+ */
+ public function testConstructorParsesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $extractedType,
+ $extractedTypes,
+ $extractedDescription
+ ) {
+ $tag = new ThrowsTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($extractedType, $tag->getType());
+ $this->assertEquals($extractedTypes, $tag->getTypes());
+ $this->assertEquals($extractedDescription, $tag->getDescription());
+ }
+
+ /**
+ * Data provider for testConstructorParsesInputsIntoCorrectFields()
+ *
+ * @return array
+ */
+ public function provideDataForConstructor()
+ {
+ return array(
+ array('throws', '', '', array(), ''),
+ array('throws', 'int', 'int', array('int'), ''),
+ array(
+ 'throws',
+ 'int Number of Bobs',
+ 'int',
+ array('int'),
+ 'Number of Bobs'
+ ),
+ array(
+ 'throws',
+ 'int|double Number of Bobs',
+ 'int|double',
+ array('int', 'double'),
+ 'Number of Bobs'
+ ),
+ array(
+ 'throws',
+ "int Number of \n Bobs",
+ 'int',
+ array('int'),
+ "Number of \n Bobs"
+ ),
+ array(
+ 'throws',
+ " int Number of Bobs",
+ 'int',
+ array('int'),
+ "Number of Bobs"
+ ),
+ array(
+ 'throws',
+ "int\nNumber of Bobs",
+ 'int',
+ array('int'),
+ "Number of Bobs"
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php
new file mode 100644
index 0000000..45868d7
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/UsesTagTest.php
@@ -0,0 +1,86 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\UsesTag
+ *
+ * @author Daniel O'Connor
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class UsesTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\UsesTag can create
+ * a link for the @uses doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exReference
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\UsesTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exReference
+ ) {
+ $tag = new UsesTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exReference, $tag->getReference());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exReference
+ return array(
+ array(
+ 'uses',
+ 'Foo::bar()',
+ 'Foo::bar()',
+ '',
+ 'Foo::bar()'
+ ),
+ array(
+ 'uses',
+ 'Foo::bar() Testing',
+ 'Foo::bar() Testing',
+ 'Testing',
+ 'Foo::bar()',
+ ),
+ array(
+ 'uses',
+ 'Foo::bar() Testing comments',
+ 'Foo::bar() Testing comments',
+ 'Testing comments',
+ 'Foo::bar()',
+ ),
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php
new file mode 100644
index 0000000..9ae2aa5
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VarTagTest.php
@@ -0,0 +1,94 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag
+ *
+ * @author Daniel O'Connor
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class VarTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can
+ * understand the @var doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exType
+ * @param string $exVariable
+ * @param string $exDescription
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\VarTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exType,
+ $exVariable,
+ $exDescription
+ ) {
+ $tag = new VarTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exType, $tag->getType());
+ $this->assertEquals($exVariable, $tag->getVariableName());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exType, $exVariable, $exDescription
+ return array(
+ array(
+ 'var',
+ 'int',
+ 'int',
+ '',
+ ''
+ ),
+ array(
+ 'var',
+ 'int $bob',
+ 'int',
+ '$bob',
+ ''
+ ),
+ array(
+ 'var',
+ 'int $bob Number of bobs',
+ 'int',
+ '$bob',
+ 'Number of bobs'
+ ),
+ array(
+ 'var',
+ '',
+ '',
+ '',
+ ''
+ ),
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php
new file mode 100644
index 0000000..e145386
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Tag/VersionTagTest.php
@@ -0,0 +1,115 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VersionTag
+ *
+ * @author Vasil Rangelov
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class VersionTagTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\LinkTag can create
+ * a link for the @version doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exContent
+ * @param string $exDescription
+ * @param string $exVersion
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag\VersionTag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exContent,
+ $exDescription,
+ $exVersion
+ ) {
+ $tag = new VersionTag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($exContent, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ $this->assertEquals($exVersion, $tag->getVersion());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exContent, $exDescription, $exVersion
+ return array(
+ array(
+ 'version',
+ '1.0 First release.',
+ '1.0 First release.',
+ 'First release.',
+ '1.0'
+ ),
+ array(
+ 'version',
+ "1.0\nFirst release.",
+ "1.0\nFirst release.",
+ 'First release.',
+ '1.0'
+ ),
+ array(
+ 'version',
+ "1.0\nFirst\nrelease.",
+ "1.0\nFirst\nrelease.",
+ "First\nrelease.",
+ '1.0'
+ ),
+ array(
+ 'version',
+ 'Unfinished release',
+ 'Unfinished release',
+ 'Unfinished release',
+ ''
+ ),
+ array(
+ 'version',
+ '1.0',
+ '1.0',
+ '',
+ '1.0'
+ ),
+ array(
+ 'version',
+ 'GIT: $Id$',
+ 'GIT: $Id$',
+ '',
+ 'GIT: $Id$'
+ ),
+ array(
+ 'version',
+ 'GIT: $Id$ Dev build',
+ 'GIT: $Id$ Dev build',
+ 'Dev build',
+ 'GIT: $Id$'
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php
new file mode 100644
index 0000000..9e873ec
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/TagTest.php
@@ -0,0 +1,313 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock;
+use phpDocumentor\Reflection\DocBlock\Context;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Tag\VarTag
+ *
+ * @author Daniel O'Connor
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class TagTest extends \PHPUnit_Framework_TestCase
+{
+
+ /**
+ * @expectedException \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function testInvalidTagLine()
+ {
+ Tag::createInstance('Invalid tag line');
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
+ *
+ * @return void
+ */
+ public function testTagHandlerUnregistration()
+ {
+ $currentHandler = __NAMESPACE__ . '\Tag\VarTag';
+ $tagPreUnreg = Tag::createInstance('@var mixed');
+ $this->assertInstanceOf(
+ $currentHandler,
+ $tagPreUnreg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPreUnreg
+ );
+
+ Tag::registerTagHandler('var', null);
+
+ $tagPostUnreg = Tag::createInstance('@var mixed');
+ $this->assertNotInstanceOf(
+ $currentHandler,
+ $tagPostUnreg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPostUnreg
+ );
+
+ Tag::registerTagHandler('var', $currentHandler);
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
+ *
+ * @return void
+ */
+ public function testTagHandlerCorrectRegistration()
+ {
+ if (0 == ini_get('allow_url_include')) {
+ $this->markTestSkipped('"data" URIs for includes are required.');
+ }
+ $currentHandler = __NAMESPACE__ . '\Tag\VarTag';
+ $tagPreReg = Tag::createInstance('@var mixed');
+ $this->assertInstanceOf(
+ $currentHandler,
+ $tagPreReg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPreReg
+ );
+
+ include 'data:text/plain;base64,'. base64_encode(
+<<assertTrue(Tag::registerTagHandler('var', '\MyTagHandler'));
+
+ $tagPostReg = Tag::createInstance('@var mixed');
+ $this->assertNotInstanceOf(
+ $currentHandler,
+ $tagPostReg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPostReg
+ );
+ $this->assertInstanceOf(
+ '\MyTagHandler',
+ $tagPostReg
+ );
+
+ $this->assertTrue(Tag::registerTagHandler('var', $currentHandler));
+ }
+
+ /**
+ * @depends testTagHandlerCorrectRegistration
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance
+ *
+ * @return void
+ */
+ public function testNamespacedTagHandlerCorrectRegistration()
+ {
+ $tagPreReg = Tag::createInstance('@T something');
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPreReg
+ );
+ $this->assertNotInstanceOf(
+ '\MyTagHandler',
+ $tagPreReg
+ );
+
+ $this->assertTrue(
+ Tag::registerTagHandler('\MyNamespace\MyTag', '\MyTagHandler')
+ );
+
+ $tagPostReg = Tag::createInstance(
+ '@T something',
+ new DocBlock(
+ '',
+ new Context('', array('T' => '\MyNamespace\MyTag'))
+ )
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPostReg
+ );
+ $this->assertInstanceOf(
+ '\MyTagHandler',
+ $tagPostReg
+ );
+
+ $this->assertTrue(
+ Tag::registerTagHandler('\MyNamespace\MyTag', null)
+ );
+ }
+
+ /**
+ * @depends testTagHandlerCorrectRegistration
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::createInstance
+ *
+ * @return void
+ */
+ public function testNamespacedTagHandlerIncorrectRegistration()
+ {
+ $tagPreReg = Tag::createInstance('@T something');
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPreReg
+ );
+ $this->assertNotInstanceOf(
+ '\MyTagHandler',
+ $tagPreReg
+ );
+
+ $this->assertFalse(
+ Tag::registerTagHandler('MyNamespace\MyTag', '\MyTagHandler')
+ );
+
+ $tagPostReg = Tag::createInstance(
+ '@T something',
+ new DocBlock(
+ '',
+ new Context('', array('T' => '\MyNamespace\MyTag'))
+ )
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPostReg
+ );
+ $this->assertNotInstanceOf(
+ '\MyTagHandler',
+ $tagPostReg
+ );
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
+ *
+ * @return void
+ */
+ public function testNonExistentTagHandlerRegistration()
+ {
+ $currentHandler = __NAMESPACE__ . '\Tag\VarTag';
+ $tagPreReg = Tag::createInstance('@var mixed');
+ $this->assertInstanceOf(
+ $currentHandler,
+ $tagPreReg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPreReg
+ );
+
+ $this->assertFalse(Tag::registerTagHandler('var', 'Non existent'));
+
+ $tagPostReg = Tag::createInstance('@var mixed');
+ $this->assertInstanceOf(
+ $currentHandler,
+ $tagPostReg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPostReg
+ );
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag::registerTagHandler
+ *
+ * @return void
+ */
+ public function testIncompatibleTagHandlerRegistration()
+ {
+ $currentHandler = __NAMESPACE__ . '\Tag\VarTag';
+ $tagPreReg = Tag::createInstance('@var mixed');
+ $this->assertInstanceOf(
+ $currentHandler,
+ $tagPreReg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPreReg
+ );
+
+ $this->assertFalse(
+ Tag::registerTagHandler('var', __NAMESPACE__ . '\TagTest')
+ );
+
+ $tagPostReg = Tag::createInstance('@var mixed');
+ $this->assertInstanceOf(
+ $currentHandler,
+ $tagPostReg
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\Tag',
+ $tagPostReg
+ );
+ }
+
+ /**
+ * Test that the \phpDocumentor\Reflection\DocBlock\Tag\VarTag can
+ * understand the @var doc block.
+ *
+ * @param string $type
+ * @param string $content
+ * @param string $exDescription
+ *
+ * @covers \phpDocumentor\Reflection\DocBlock\Tag
+ * @dataProvider provideDataForConstuctor
+ *
+ * @return void
+ */
+ public function testConstructorParesInputsIntoCorrectFields(
+ $type,
+ $content,
+ $exDescription
+ ) {
+ $tag = new Tag($type, $content);
+
+ $this->assertEquals($type, $tag->getName());
+ $this->assertEquals($content, $tag->getContent());
+ $this->assertEquals($exDescription, $tag->getDescription());
+ }
+
+ /**
+ * Data provider for testConstructorParesInputsIntoCorrectFields
+ *
+ * @return array
+ */
+ public function provideDataForConstuctor()
+ {
+ // $type, $content, $exDescription
+ return array(
+ array(
+ 'unknown',
+ 'some content',
+ 'some content',
+ ),
+ array(
+ 'unknown',
+ '',
+ '',
+ )
+ );
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php
new file mode 100644
index 0000000..78c7306
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlock/Type/CollectionTest.php
@@ -0,0 +1,195 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Type;
+
+use phpDocumentor\Reflection\DocBlock\Context;
+
+/**
+ * Test class for \phpDocumentor\Reflection\DocBlock\Type\Collection
+ *
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection
+ *
+ * @author Mike van Riel
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class CollectionTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::getContext
+ *
+ * @return void
+ */
+ public function testConstruct()
+ {
+ $collection = new Collection();
+ $this->assertCount(0, $collection);
+ $this->assertEquals('', $collection->getContext()->getNamespace());
+ $this->assertCount(0, $collection->getContext()->getNamespaceAliases());
+ }
+
+ /**
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
+ *
+ * @return void
+ */
+ public function testConstructWithTypes()
+ {
+ $collection = new Collection(array('integer', 'string'));
+ $this->assertCount(2, $collection);
+ }
+
+ /**
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
+ *
+ * @return void
+ */
+ public function testConstructWithNamespace()
+ {
+ $collection = new Collection(array(), new Context('\My\Space'));
+ $this->assertEquals('My\Space', $collection->getContext()->getNamespace());
+
+ $collection = new Collection(array(), new Context('My\Space'));
+ $this->assertEquals('My\Space', $collection->getContext()->getNamespace());
+
+ $collection = new Collection(array(), null);
+ $this->assertEquals('', $collection->getContext()->getNamespace());
+ }
+
+ /**
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::__construct
+ *
+ * @return void
+ */
+ public function testConstructWithNamespaceAliases()
+ {
+ $fixture = array('a' => 'b');
+ $collection = new Collection(array(), new Context(null, $fixture));
+ $this->assertEquals(
+ array('a' => '\b'),
+ $collection->getContext()->getNamespaceAliases()
+ );
+ }
+
+ /**
+ * @param string $fixture
+ * @param array $expected
+ *
+ * @dataProvider provideTypesToExpand
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add
+ *
+ * @return void
+ */
+ public function testAdd($fixture, $expected)
+ {
+ $collection = new Collection(
+ array(),
+ new Context('\My\Space', array('Alias' => '\My\Space\Aliasing'))
+ );
+ $collection->add($fixture);
+
+ $this->assertSame($expected, $collection->getArrayCopy());
+ }
+
+ /**
+ * @param string $fixture
+ * @param array $expected
+ *
+ * @dataProvider provideTypesToExpandWithoutNamespace
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add
+ *
+ * @return void
+ */
+ public function testAddWithoutNamespace($fixture, $expected)
+ {
+ $collection = new Collection(
+ array(),
+ new Context(null, array('Alias' => '\My\Space\Aliasing'))
+ );
+ $collection->add($fixture);
+
+ $this->assertSame($expected, $collection->getArrayCopy());
+ }
+
+ /**
+ * @covers phpDocumentor\Reflection\DocBlock\Type\Collection::add
+ * @expectedException InvalidArgumentException
+ *
+ * @return void
+ */
+ public function testAddWithInvalidArgument()
+ {
+ $collection = new Collection();
+ $collection->add(array());
+ }
+
+ /**
+ * Returns the types and their expected values to test the retrieval of
+ * types.
+ *
+ * @param string $method Name of the method consuming this data provider.
+ * @param string $namespace Name of the namespace to user as basis.
+ *
+ * @return string[]
+ */
+ public function provideTypesToExpand($method, $namespace = '\My\Space\\')
+ {
+ return array(
+ array('', array()),
+ array(' ', array()),
+ array('int', array('int')),
+ array('int ', array('int')),
+ array('string', array('string')),
+ array('DocBlock', array($namespace.'DocBlock')),
+ array('DocBlock[]', array($namespace.'DocBlock[]')),
+ array(' DocBlock ', array($namespace.'DocBlock')),
+ array('\My\Space\DocBlock', array('\My\Space\DocBlock')),
+ array('Alias\DocBlock', array('\My\Space\Aliasing\DocBlock')),
+ array(
+ 'DocBlock|Tag',
+ array($namespace .'DocBlock', $namespace .'Tag')
+ ),
+ array(
+ 'DocBlock|null',
+ array($namespace.'DocBlock', 'null')
+ ),
+ array(
+ '\My\Space\DocBlock|Tag',
+ array('\My\Space\DocBlock', $namespace.'Tag')
+ ),
+ array(
+ 'DocBlock[]|null',
+ array($namespace.'DocBlock[]', 'null')
+ ),
+ array(
+ 'DocBlock[]|int[]',
+ array($namespace.'DocBlock[]', 'int[]')
+ ),
+ );
+ }
+
+ /**
+ * Returns the types and their expected values to test the retrieval of
+ * types when no namespace is available.
+ *
+ * @param string $method Name of the method consuming this data provider.
+ *
+ * @return string[]
+ */
+ public function provideTypesToExpandWithoutNamespace($method)
+ {
+ return $this->provideTypesToExpand($method, '\\');
+ }
+}
diff --git a/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php
new file mode 100644
index 0000000..488db3e
--- /dev/null
+++ b/vendor/phpdocumentor/reflection-docblock/tests/phpDocumentor/Reflection/DocBlockTest.php
@@ -0,0 +1,302 @@
+
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Context;
+use phpDocumentor\Reflection\DocBlock\Location;
+use phpDocumentor\Reflection\DocBlock\Tag\ReturnTag;
+
+/**
+ * Test class for phpDocumentor\Reflection\DocBlock
+ *
+ * @author Mike van Riel
+ * @copyright 2010-2011 Mike van Riel / Naenius. (http://www.naenius.com)
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+class DocBlockTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock
+ *
+ * @return void
+ */
+ public function testConstruct()
+ {
+ $fixture = << '\phpDocumentor')),
+ new Location(2)
+ );
+ $this->assertEquals(
+ 'This is a short description',
+ $object->getShortDescription()
+ );
+ $this->assertEquals(
+ 'This is a long description',
+ $object->getLongDescription()->getContents()
+ );
+ $this->assertCount(2, $object->getTags());
+ $this->assertTrue($object->hasTag('see'));
+ $this->assertTrue($object->hasTag('return'));
+ $this->assertFalse($object->hasTag('category'));
+
+ $this->assertSame('MyNamespace', $object->getContext()->getNamespace());
+ $this->assertSame(
+ array('PHPDoc' => '\phpDocumentor'),
+ $object->getContext()->getNamespaceAliases()
+ );
+ $this->assertSame(2, $object->getLocation()->getLineNumber());
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock::splitDocBlock
+ *
+ * @return void
+ */
+ public function testConstructWithTagsOnly()
+ {
+ $fixture = <<assertEquals('', $object->getShortDescription());
+ $this->assertEquals('', $object->getLongDescription()->getContents());
+ $this->assertCount(2, $object->getTags());
+ $this->assertTrue($object->hasTag('see'));
+ $this->assertTrue($object->hasTag('return'));
+ $this->assertFalse($object->hasTag('category'));
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock::cleanInput
+ *
+ * @return void
+ */
+ public function testConstructOneLiner()
+ {
+ $fixture = '/** Short description and nothing more. */';
+ $object = new DocBlock($fixture);
+ $this->assertEquals(
+ 'Short description and nothing more.',
+ $object->getShortDescription()
+ );
+ $this->assertEquals('', $object->getLongDescription()->getContents());
+ $this->assertCount(0, $object->getTags());
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock::__construct
+ *
+ * @return void
+ */
+ public function testConstructFromReflector()
+ {
+ $object = new DocBlock(new \ReflectionClass($this));
+ $this->assertEquals(
+ 'Test class for phpDocumentor\Reflection\DocBlock',
+ $object->getShortDescription()
+ );
+ $this->assertEquals('', $object->getLongDescription()->getContents());
+ $this->assertCount(4, $object->getTags());
+ $this->assertTrue($object->hasTag('author'));
+ $this->assertTrue($object->hasTag('copyright'));
+ $this->assertTrue($object->hasTag('license'));
+ $this->assertTrue($object->hasTag('link'));
+ $this->assertFalse($object->hasTag('category'));
+ }
+
+ /**
+ * @expectedException \InvalidArgumentException
+ *
+ * @return void
+ */
+ public function testExceptionOnInvalidObject()
+ {
+ new DocBlock($this);
+ }
+
+ public function testDotSeperation()
+ {
+ $fixture = <<assertEquals(
+ 'This is a short description.',
+ $object->getShortDescription()
+ );
+ $this->assertEquals(
+ "This is a long description.\nThis is a continuation of the long "
+ ."description.",
+ $object->getLongDescription()->getContents()
+ );
+ }
+
+ /**
+ * @covers \phpDocumentor\Reflection\DocBlock::parseTags
+ * @expectedException \LogicException
+ *
+ * @return void
+ */
+ public function testInvalidTagBlock()
+ {
+ if (0 == ini_get('allow_url_include')) {
+ $this->markTestSkipped('"data" URIs for includes are required.');
+ }
+
+ include 'data:text/plain;base64,'. base64_encode(
+ <<assertEquals(
+ 'This is a short description.',
+ $object->getShortDescription()
+ );
+ $this->assertEquals(
+ 'This is a long description.',
+ $object->getLongDescription()->getContents()
+ );
+ $tags = $object->getTags();
+ $this->assertCount(2, $tags);
+ $this->assertTrue($object->hasTag('method'));
+ $this->assertTrue($object->hasTag('Method'));
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\DocBlock\Tag\MethodTag',
+ $tags[0]
+ );
+ $this->assertInstanceOf(
+ __NAMESPACE__ . '\DocBlock\Tag',
+ $tags[1]
+ );
+ $this->assertNotInstanceOf(
+ __NAMESPACE__ . '\DocBlock\Tag\MethodTag',
+ $tags[1]
+ );
+ }
+
+ /**
+ * @depends testConstructFromReflector
+ * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName
+ *
+ * @return void
+ */
+ public function testGetTagsByNameZeroAndOneMatch()
+ {
+ $object = new DocBlock(new \ReflectionClass($this));
+ $this->assertEmpty($object->getTagsByName('category'));
+ $this->assertCount(1, $object->getTagsByName('author'));
+ }
+
+ /**
+ * @depends testConstructWithTagsOnly
+ * @covers \phpDocumentor\Reflection\DocBlock::parseTags
+ *
+ * @return void
+ */
+ public function testParseMultilineTag()
+ {
+ $fixture = <<assertCount(1, $object->getTags());
+ }
+
+ /**
+ * @depends testConstructWithTagsOnly
+ * @covers \phpDocumentor\Reflection\DocBlock::parseTags
+ *
+ * @return void
+ */
+ public function testParseMultilineTagWithLineBreaks()
+ {
+ $fixture = <<assertCount(1, $tags = $object->getTags());
+ /** @var ReturnTag $tag */
+ $tag = reset($tags);
+ $this->assertEquals("Content on\n multiple lines.\n\n One more, after the break.", $tag->getDescription());
+ }
+
+ /**
+ * @depends testConstructWithTagsOnly
+ * @covers \phpDocumentor\Reflection\DocBlock::getTagsByName
+ *
+ * @return void
+ */
+ public function testGetTagsByNameMultipleMatch()
+ {
+ $fixture = <<assertEmpty($object->getTagsByName('category'));
+ $this->assertCount(1, $object->getTagsByName('return'));
+ $this->assertCount(2, $object->getTagsByName('param'));
+ }
+}
diff --git a/vendor/phpspec/prophecy/.gitignore b/vendor/phpspec/prophecy/.gitignore
new file mode 100644
index 0000000..0c39a17
--- /dev/null
+++ b/vendor/phpspec/prophecy/.gitignore
@@ -0,0 +1,5 @@
+*.tgz
+*.phar
+bin
+vendor
+composer.lock
diff --git a/vendor/phpspec/prophecy/.travis.yml b/vendor/phpspec/prophecy/.travis.yml
new file mode 100644
index 0000000..85f5870
--- /dev/null
+++ b/vendor/phpspec/prophecy/.travis.yml
@@ -0,0 +1,14 @@
+language: php
+
+php: [5.3, 5.4, 5.5, hhvm, hhvm-nightly]
+
+matrix:
+ allow_failures:
+ - php: hhvm
+ - php: hhvm-nightly
+
+before_script:
+ - composer self-update
+ - composer install --dev --prefer-source
+
+script: vendor/bin/phpspec run -fpretty -v
diff --git a/vendor/phpspec/prophecy/CHANGES.md b/vendor/phpspec/prophecy/CHANGES.md
new file mode 100644
index 0000000..e3e13c9
--- /dev/null
+++ b/vendor/phpspec/prophecy/CHANGES.md
@@ -0,0 +1,95 @@
+1.3.1 / 2014-11-17
+==================
+
+ * Fix the edge case when failed predictions weren't recorded for `getCheckedPredictions()`
+
+1.3.0 / 2014-11-14
+==================
+
+ * Add a way to get checked predictions with `MethodProphecy::getCheckedPredictions()`
+ * Fix HHVM compatibility
+ * Remove dead code (thanks @stof)
+ * Add support for DirectoryIterators (thanks @shanethehat)
+
+1.2.0 / 2014-07-18
+==================
+
+ * Added support for doubling magic methods documented in the class phpdoc (thanks @armetiz)
+ * Fixed a segfault appearing in some cases (thanks @dmoreaulf)
+ * Fixed the doubling of methods with typehints on non-existent classes (thanks @gquemener)
+ * Added support for internal classes using keywords as method names (thanks @milan)
+ * Added IdenticalValueToken and Argument::is (thanks @florianv)
+ * Removed the usage of scalar typehints in HHVM as HHVM 3 does not support them anymore in PHP code (thanks @whatthejeff)
+
+1.1.2 / 2014-01-24
+==================
+
+ * Spy automatically promotes spied method call to an expected one
+
+1.1.1 / 2014-01-15
+==================
+
+ * Added support for HHVM
+
+1.1.0 / 2014-01-01
+==================
+
+ * Changed the generated class names to use a static counter instead of a random number
+ * Added a clss patch for ReflectionClass::newInstance to make its argument optional consistently (thanks @docteurklein)
+ * Fixed mirroring of classes with typehints on non-existent classes (thanks @docteurklein)
+ * Fixed the support of array callables in CallbackPromise and CallbackPrediction (thanks @ciaranmcnulty)
+ * Added support for properties in ObjectStateToken (thanks @adrienbrault)
+ * Added support for mocking classes with a final constructor (thanks @ciaranmcnulty)
+ * Added ArrayEveryEntryToken and Argument::withEveryEntry() (thanks @adrienbrault)
+ * Added an exception when trying to prophesize on a final method instead of ignoring silently (thanks @docteurklein)
+ * Added StringContainToken and Argument::containingString() (thanks @peterjmit)
+ * Added ``shouldNotHaveBeenCalled`` on the MethodProphecy (thanks @ciaranmcnulty)
+ * Fixed the comparison of objects in ExactValuetoken (thanks @sstok)
+ * Deprecated ``shouldNotBeenCalled`` in favor of ``shouldNotHaveBeenCalled``
+
+1.0.4 / 2013-08-10
+==================
+
+ * Better randomness for generated class names (thanks @sstok)
+ * Add support for interfaces into TypeToken and Argument::type() (thanks @sstok)
+ * Add support for old-style (method name === class name) constructors (thanks @l310 for report)
+
+1.0.3 / 2013-07-04
+==================
+
+ * Support callable typehints (thanks @stof)
+ * Do not attempt to autoload arrays when generating code (thanks @MarcoDeBortoli)
+ * New ArrayEntryToken (thanks @kagux)
+
+1.0.2 / 2013-05-19
+==================
+
+ * Logical `AND` token added (thanks @kagux)
+ * Logical `NOT` token added (thanks @kagux)
+ * Add support for setting custom constructor arguments
+ * Properly stringify hashes
+ * Record calls that throw exceptions
+ * Migrate spec suite to PhpSpec 2.0
+
+1.0.1 / 2013-04-30
+==================
+
+ * Fix broken UnexpectedCallException message
+ * Trim AggregateException message
+
+1.0.0 / 2013-04-29
+==================
+
+ * Improve exception messages
+
+1.0.0-BETA2 / 2013-04-03
+========================
+
+ * Add more debug information to CallTimes and Call prediction exception messages
+ * Fix MethodNotFoundException wrong namespace (thanks @gunnarlium)
+ * Fix some typos in the exception messages (thanks @pborreli)
+
+1.0.0-BETA1 / 2013-03-25
+========================
+
+ * Initial release
diff --git a/vendor/phpspec/prophecy/CONTRIBUTING.md b/vendor/phpspec/prophecy/CONTRIBUTING.md
new file mode 100644
index 0000000..6ea0589
--- /dev/null
+++ b/vendor/phpspec/prophecy/CONTRIBUTING.md
@@ -0,0 +1,21 @@
+Contributing
+------------
+
+Prophecy is an open source, community-driven project. If you'd like to contribute,
+feel free to do this, but remember to follow this few simple rules:
+
+- Make your feature addition or bug fix,
+- Add either specs or examples for any changes you're making (bugfixes or additions)
+ (please look into `spec/` folder for some examples). This is important so we don't break
+ it in a future version unintentionally,
+- Commit your code, but do not mess with `CHANGES.md`,
+
+Running tests
+-------------
+
+Make sure that you don't break anything with your changes by running:
+
+```bash
+$> composer install --dev --prefer-dist
+$> vendor/bin/phpspec
+```
diff --git a/vendor/phpspec/prophecy/LICENSE b/vendor/phpspec/prophecy/LICENSE
new file mode 100644
index 0000000..c8b3647
--- /dev/null
+++ b/vendor/phpspec/prophecy/LICENSE
@@ -0,0 +1,23 @@
+Copyright (c) 2013 Konstantin Kudryashov
+ Marcello Duarte
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
diff --git a/vendor/phpspec/prophecy/README.md b/vendor/phpspec/prophecy/README.md
new file mode 100644
index 0000000..f1c612d
--- /dev/null
+++ b/vendor/phpspec/prophecy/README.md
@@ -0,0 +1,388 @@
+# Prophecy
+
+[![Build Status](https://travis-ci.org/phpspec/prophecy.png?branch=master)](https://travis-ci.org/phpspec/prophecy)
+
+Prophecy is a highly opinionated yet very powerful and flexible PHP object mocking
+framework. Though initially it was created to fulfil phpspec2 needs, it is flexible
+enough to be used inside any testing framework out there with minimal effort.
+
+## A simple example
+
+```php
+prophet->prophesize('App\Security\Hasher');
+ $user = new App\Entity\User($hasher->reveal());
+
+ $hasher->generateHash($user, 'qwerty')->willReturn('hashed_pass');
+
+ $user->setPassword('qwerty');
+
+ $this->assertEquals('hashed_pass', $user->getPassword());
+ }
+
+ protected function setup()
+ {
+ $this->prophet = new \Prophecy\Prophet;
+ }
+
+ protected function tearDown()
+ {
+ $this->prophet->checkPredictions();
+ }
+}
+```
+
+## Installation
+
+### Prerequisites
+
+Prophecy requires PHP 5.3.3 or greater.
+
+### Setup through composer
+
+First, add Prophecy to the list of dependencies inside your `composer.json`:
+
+```json
+{
+ "require-dev": {
+ "phpspec/prophecy": "~1.0"
+ }
+}
+```
+
+Then simply install it with composer:
+
+```bash
+$> composer install --prefer-dist
+```
+
+You can read more about Composer on its [official webpage](http://getcomposer.org).
+
+## How to use it
+
+First of all, in Prophecy every word has a logical meaning, even the name of the library
+itself (Prophecy). When you start feeling that, you'll become very fluid with this
+tool.
+
+For example, Prophecy has been named that way because it concentrates on describing the future
+behavior of objects with very limited knowledge about them. But as with any other prophecy,
+those object prophecies can't create themselves - there should be a Prophet:
+
+```php
+$prophet = new Prophecy\Prophet;
+```
+
+The Prophet creates prophecies by *prophesizing* them:
+
+```php
+$prophecy = $prophet->prophesize();
+```
+
+The result of the `prophesize()` method call is a new object of class `ObjectProphecy`. Yes,
+that's your specific object prophecy, which describes how your object would behave
+in the near future. But first, you need to specify which object you're talking about,
+right?
+
+```php
+$prophecy->willExtend('stdClass');
+$prophecy->willImplement('SessionHandlerInterface');
+```
+
+There are 2 interesting calls - `willExtend` and `willImplement`. The first one tells
+object prophecy that our object should extend specific class, the second one says that
+it should implement some interface. Obviously, objects in PHP can implement multiple
+interfaces, but extend only one parent class.
+
+### Dummies
+
+Ok, now we have our object prophecy. What can we do with it? First of all, we can get
+our object *dummy* by revealing its prophecy:
+
+```php
+$dummy = $prophecy->reveal();
+```
+
+The `$dummy` variable now holds a special dummy object. Dummy objects are objects that extend
+and/or implement preset classes/interfaces by overriding all their public methods. The key
+point about dummies is that they do not hold any logic - they just do nothing. Any method
+of the dummy will always return `null` and the dummy will never throw any exceptions.
+Dummy is your friend if you don't care about the actual behavior of this double and just need
+a token object to satisfy a method typehint.
+
+You need to understand one thing - a dummy is not a prophecy. Your object prophecy is still
+assigned to `$prophecy` variable and in order to manipulate with your expectations, you
+should work with it. `$dummy` is a dummy - a simple php object that tries to fulfil your
+prophecy.
+
+### Stubs
+
+Ok, now we know how to create basic prophecies and reveal dummies from them. That's
+awesome if we don't care about our _doubles_ (objects that reflect originals)
+interactions. If we do, we need to use *stubs* or *mocks*.
+
+A stub is an object double, which doesn't have any expectations about the object behavior,
+but when put in specific environment, behaves in specific way. Ok, I know, it's cryptic,
+but bear with me for a minute. Simply put, a stub is a dummy, which depending on the called
+method signature does different things (has logic). To create stubs in Prophecy:
+
+```php
+$prophecy->read('123')->willReturn('value');
+```
+
+Oh wow. We've just made an arbitrary call on the object prophecy? Yes, we did. And this
+call returned us a new object instance of class `MethodProphecy`. Yep, that's a specific
+method with arguments prophecy. Method prophecies give you the ability to create method
+promises or predictions. We'll talk about method predictions later in the _Mocks_ section.
+
+#### Promises
+
+Promises are logical blocks, that represent your fictional methods in prophecy terms
+and they are handled by the `MethodProphecy::will(PromiseInterface $promise)` method.
+As a matter of fact, the call that we made earlier (`willReturn('value')`) is a simple
+shortcut to:
+
+```php
+$prophecy->read('123')->will(new Prophecy\Promise\ReturnPromise(array('value')));
+```
+
+This promise will cause any call to our double's `read()` method with exactly one
+argument - `'123'` to always return `'value'`. But that's only for this
+promise, there's plenty others you can use:
+
+- `ReturnPromise` or `->willReturn(1)` - returns a value from a method call
+- `ReturnArgumentPromise` or `->willReturnArgument()` - returns the first method argument from call
+- `ThrowPromise` or `->willThrow` - causes the method to throw specific exception
+- `CallbackPromise` or `->will($callback)` - gives you a quick way to define your own custom logic
+
+Keep in mind, that you can always add even more promises by implementing
+`Prophecy\Promise\PromiseInterface`.
+
+#### Method prophecies idempotency
+
+Prophecy enforces same method prophecies and, as a consequence, same promises and
+predictions for the same method calls with the same arguments. This means:
+
+```php
+$methodProphecy1 = $prophecy->read('123');
+$methodProphecy2 = $prophecy->read('123');
+$methodProphecy3 = $prophecy->read('321');
+
+$methodProphecy1 === $methodProphecy2;
+$methodProphecy1 !== $methodProphecy3;
+```
+
+That's interesting, right? Now you might ask me how would you define more complex
+behaviors where some method call changes behavior of others. In PHPUnit or Mockery
+you do that by predicting how many times your method will be called. In Prophecy,
+you'll use promises for that:
+
+```php
+$user->getName()->willReturn(null);
+
+// For PHP 5.4
+$user->setName('everzet')->will(function() {
+ $this->getName()->willReturn('everzet');
+});
+
+// For PHP 5.3
+$user->setName('everzet')->will(function($args, $user) {
+ $user->getName()->willReturn('everzet');
+});
+
+// Or
+$user->setName('everzet')->will(function($args) use ($user) {
+ $user->getName()->willReturn('everzet');
+});
+```
+
+And now it doesn't matter how many times or in which order your methods are called.
+What matters is their behaviors and how well you faked it.
+
+#### Arguments wildcarding
+
+The previous example is awesome (at least I hope it is for you), but that's not
+optimal enough. We hardcoded `'everzet'` in our expectation. Isn't there a better
+way? In fact there is, but it involves understanding what this `'everzet'`
+actually is.
+
+You see, even if method arguments used during method prophecy creation look
+like simple method arguments, in reality they are not. They are argument token
+wildcards. As a matter of fact, `->setName('everzet')` looks like a simple call just
+because Prophecy automatically transforms it under the hood into:
+
+```php
+$user->setName(new Prophecy\Argument\Token\ExactValueToken('everzet'));
+```
+
+Those argument tokens are simple PHP classes, that implement
+`Prophecy\Argument\Token\TokenInterface` and tell Prophecy how to compare real arguments
+with your expectations. And yes, those classnames are damn big. That's why there's a
+shortcut class `Prophecy\Argument`, which you can use to create tokens like that:
+
+```php
+use Prophecy\Argument;
+
+$user->setName(Argument::exact('everzet'));
+```
+
+`ExactValueToken` is not very useful in our case as it forced us to hardcode the username.
+That's why Prophecy comes bundled with a bunch of other tokens:
+
+- `IdenticalValueToken` or `Argument::is($value)` - checks that the argument is identical to a specific value
+- `ExactValueToken` or `Argument::exact($value)` - checks that the argument matches a specific value
+- `TypeToken` or `Argument::type($typeOrClass)` - checks that the argument matches a specific type or
+ classname.
+- `ObjectStateToken` or `Argument::which($method, $value)` - checks that the argument method returns
+ a specific value
+- `CallbackToken` or `Argument::that(callback)` - checks that the argument matches a custom callback
+- `AnyValueToken` or `Argument::any()` - matches any argument
+- `AnyValuesToken` or `Argument::cetera()` - matches any arguments to the rest of the signature
+
+And you can add even more by implementing `TokenInterface` with your own custom classes.
+
+So, let's refactor our initial `{set,get}Name()` logic with argument tokens:
+
+```php
+use Prophecy\Argument;
+
+$user->getName()->willReturn(null);
+
+// For PHP 5.4
+$user->setName(Argument::type('string'))->will(function($args) {
+ $this->getName()->willReturn($args[0]);
+});
+
+// For PHP 5.3
+$user->setName(Argument::type('string'))->will(function($args, $user) {
+ $user->getName()->willReturn($args[0]);
+});
+
+// Or
+$user->setName(Argument::type('string'))->will(function($args) use ($user) {
+ $user->getName()->willReturn($args[0]);
+});
+```
+
+That's it. Now our `{set,get}Name()` prophecy will work with any string argument provided to it.
+We've just described how our stub object should behave, even though the original object could have
+no behavior whatsoever.
+
+One last bit about arguments now. You might ask, what happens in case of:
+
+```php
+use Prophecy\Argument;
+
+$user->getName()->willReturn(null);
+
+// For PHP 5.4
+$user->setName(Argument::type('string'))->will(function($args) {
+ $this->getName()->willReturn($args[0]);
+});
+
+// For PHP 5.3
+$user->setName(Argument::type('string'))->will(function($args, $user) {
+ $user->getName()->willReturn($args[0]);
+});
+
+// Or
+$user->setName(Argument::type('string'))->will(function($args) use ($user) {
+ $user->getName()->willReturn($args[0]);
+});
+
+$user->setName(Argument::any())->will(function(){});
+```
+
+Nothing. Your stub will continue behaving the way it did before. That's because of how
+arguments wildcarding works. Every argument token type has a different score level, which
+wildcard then uses to calculate the final arguments match score and use the method prophecy
+promise that has the highest score. In this case, `Argument::type()` in case of success
+scores `5` and `Argument::any()` scores `3`. So the type token wins, as does the first
+`setName()` method prophecy and its promise. The simple rule of thumb - more precise token
+always wins.
+
+#### Getting stub objects
+
+Ok, now we know how to define our prophecy method promises, let's get our stub from
+it:
+
+```php
+$stub = $prophecy->reveal();
+```
+
+As you might see, the only difference between how we get dummies and stubs is that with
+stubs we describe every object conversation instead of just agreeing with `null` returns
+(object being *dummy*). As a matter of fact, after you define your first promise
+(method call), Prophecy will force you to define all the communications - it throws
+the `UnexpectedCallException` for any call you didn't describe with object prophecy before
+calling it on a stub.
+
+### Mocks
+
+Now we know how to define doubles without behavior (dummies) and doubles with behavior but
+no expectations (stubs). What's left is doubles for which we have some expectations. These
+are called mocks and in Prophecy they look almost exactly the same as stubs, except that
+they define *predictions* instead of *promises* on method prophecies:
+
+```php
+$entityManager->flush()->shouldBeCalled();
+```
+
+#### Predictions
+
+The `shouldBeCalled()` method here assigns `CallPrediction` to our method prophecy.
+Predictions are a delayed behavior check for your prophecies. You see, during the entire lifetime
+of your doubles, Prophecy records every single call you're making against it inside your
+code. After that, Prophecy can use this collected information to check if it matches defined
+predictions. You can assign predictions to method prophecies using the
+`MethodProphecy::should(PredictionInterface $prediction)` method. As a matter of fact,
+the `shouldBeCalled()` method we used earlier is just a shortcut to:
+
+```php
+$entityManager->flush()->should(new Prophecy\Prediction\CallPrediction());
+```
+
+It checks if your method of interest (that matches both the method name and the arguments wildcard)
+was called 1 or more times. If the prediction failed then it throws an exception. When does this
+check happen? Whenever you call `checkPredictions()` on the main Prophet object:
+
+```php
+$prophet->checkPredictions();
+```
+
+In PHPUnit, you would want to put this call into the `tearDown()` method. If no predictions
+are defined, it would do nothing. So it won't harm to call it after every test.
+
+There are plenty more predictions you can play with:
+
+- `CallPrediction` or `shouldBeCalled()` - checks that the method has been called 1 or more times
+- `NoCallsPrediction` or `shouldNotBeCalled()` - checks that the method has not been called
+- `CallTimesPrediction` or `shouldBeCalledTimes($count)` - checks that the method has been called
+ `$count` times
+- `CallbackPrediction` or `should($callback)` - checks the method against your own custom callback
+
+Of course, you can always create your own custom prediction any time by implementing
+`PredictionInterface`.
+
+### Spies
+
+The last bit of awesomeness in Prophecy is out-of-the-box spies support. As I said in the previous
+section, Prophecy records every call made during the double's entire lifetime. This means
+you don't need to record predictions in order to check them. You can also do it
+manually by using the `MethodProphecy::shouldHave(PredictionInterface $prediction)` method:
+
+```php
+$em = $prophet->prophesize('Doctrine\ORM\EntityManager');
+
+$controller->createUser($em->reveal());
+
+$em->flush()->shouldHaveBeenCalled();
+```
+
+Such manipulation with doubles is called spying. And with Prophecy it just works.
diff --git a/vendor/phpspec/prophecy/composer.json b/vendor/phpspec/prophecy/composer.json
new file mode 100644
index 0000000..5fc7ab2
--- /dev/null
+++ b/vendor/phpspec/prophecy/composer.json
@@ -0,0 +1,39 @@
+{
+ "name": "phpspec/prophecy",
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"],
+ "homepage": "http://phpspec.org",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "require": {
+ "phpdocumentor/reflection-docblock": "~2.0",
+ "doctrine/instantiator": "~1.0,>=1.0.2"
+ },
+
+ "require-dev": {
+ "phpspec/phpspec": "~2.0"
+ },
+
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
new file mode 100644
index 0000000..9c271ed
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
@@ -0,0 +1,135 @@
+beConstructedWith(array(42, 'zet', $object));
+
+ $class = get_class($object->getWrappedObject());
+ $hash = spl_object_hash($object->getWrappedObject());
+
+ $this->__toString()->shouldReturn("exact(42), exact(\"zet\"), exact($class:$hash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_generates_string_representation_from_all_tokens_imploded($token1, $token2, $token3)
+ {
+ $token1->__toString()->willReturn('token_1');
+ $token2->__toString()->willReturn('token_2');
+ $token3->__toString()->willReturn('token_3');
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->__toString()->shouldReturn('token_1, token_2, token_3');
+ }
+
+ function it_returns_score_of_1_if_there_are_no_tokens_and_arguments()
+ {
+ $this->beConstructedWith(array());
+
+ $this->scoreArguments(array())->shouldReturn(1);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_should_return_match_score_based_on_all_tokens_score($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(5);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj))->shouldReturn(18);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_returns_false_if_there_is_less_arguments_than_tokens($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(5);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument(null)->willReturn(false);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_returns_false_if_there_is_less_tokens_than_arguments($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(5);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj, 4))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_should_return_false_if_one_of_the_tokens_returns_false($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(false);
+ $token2->isLast()->willReturn(false);
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_should_calculate_score_until_last_token($token1, $token2, $token3)
+ {
+ $token1->scoreArgument('one')->willReturn(3);
+ $token1->isLast()->willReturn(false);
+
+ $token2->scoreArgument(2)->willReturn(7);
+ $token2->isLast()->willReturn(true);
+
+ $token3->scoreArgument($obj = new \stdClass())->willReturn(10);
+ $token3->isLast()->willReturn(false);
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->scoreArguments(array('one', 2, $obj))->shouldReturn(10);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
new file mode 100644
index 0000000..a43e923
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
@@ -0,0 +1,28 @@
+shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function its_string_representation_is_star()
+ {
+ $this->__toString()->shouldReturn('*');
+ }
+
+ function it_scores_any_argument_as_3()
+ {
+ $this->scoreArgument(42)->shouldReturn(3);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
new file mode 100644
index 0000000..c29076f
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
@@ -0,0 +1,28 @@
+shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_last()
+ {
+ $this->shouldBeLast();
+ }
+
+ function its_string_representation_is_star_with_followup()
+ {
+ $this->__toString()->shouldReturn('* [, ...]');
+ }
+
+ function it_scores_any_argument_as_2()
+ {
+ $this->scoreArgument(42)->shouldReturn(2);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
new file mode 100644
index 0000000..5d040d5
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
@@ -0,0 +1,64 @@
+beConstructedWith(2);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_6_if_argument_array_has_proper_count()
+ {
+ $this->scoreArgument(array(1,2))->shouldReturn(6);
+ }
+
+ /**
+ * @param \Countable $countable
+ */
+ function it_scores_6_if_argument_countable_object_has_proper_count($countable)
+ {
+ $countable->count()->willReturn(2);
+ $this->scoreArgument($countable)->shouldReturn(6);
+ }
+
+ function it_does_not_score_if_argument_is_neither_array_nor_countable_object()
+ {
+ $this->scoreArgument('string')->shouldBe(false);
+ $this->scoreArgument(5)->shouldBe(false);
+ $this->scoreArgument(new \stdClass)->shouldBe(false);
+ }
+
+ function it_does_not_score_if_argument_array_has_wrong_count()
+ {
+ $this->scoreArgument(array(1))->shouldReturn(false);
+ }
+
+ /**
+ * @param \Countable $countable
+ */
+ function it_does_not_score_if_argument_countable_object_has_wrong_count($countable)
+ {
+ $countable->count()->willReturn(3);
+ $this->scoreArgument($countable)->shouldReturn(false);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldBe('count(2)');
+ }
+
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
new file mode 100644
index 0000000..8ff0f15
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
@@ -0,0 +1,229 @@
+beConstructedWith($key, $value);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_holds_key_and_value($key, $value)
+ {
+ $this->getKey()->shouldBe($key);
+ $this->getValue()->shouldBe($value);
+ }
+
+ function its_string_representation_tells_that_its_an_array_containing_the_key_value_pair($key, $value)
+ {
+ $key->__toString()->willReturn('key');
+ $value->__toString()->willReturn('value');
+ $this->__toString()->shouldBe('[..., key => value, ...]');
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $key
+ * @param \stdClass $object
+ */
+ function it_wraps_non_token_value_into_ExactValueToken($key, $object)
+ {
+ $this->beConstructedWith($key, $object);
+ $this->getValue()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
+ }
+
+ /**
+ * @param \stdClass $object
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ */
+ function it_wraps_non_token_key_into_ExactValueToken($object, $value)
+ {
+ $this->beConstructedWith($object, $value);
+ $this->getKey()->shouldHaveType('\Prophecy\Argument\Token\ExactValueToken');
+ }
+
+ function it_scores_array_half_of_combined_scores_from_key_and_value_tokens($key, $value)
+ {
+ $key->scoreArgument('key')->willReturn(4);
+ $value->scoreArgument('value')->willReturn(6);
+ $this->scoreArgument(array('key'=>'value'))->shouldBe(5);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \Iterator $object
+ */
+ function it_scores_traversable_object_half_of_combined_scores_from_key_and_value_tokens($key, $value, $object)
+ {
+ $object->current()->will(function () use ($object) {
+ $object->valid()->willReturn(false);
+
+ return 'value';
+ });
+ $object->key()->willReturn('key');
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $key->scoreArgument('key')->willReturn(6);
+ $value->scoreArgument('value')->willReturn(2);
+ $this->scoreArgument($object)->shouldBe(4);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\AnyValuesToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayAccess $object
+ */
+ function it_throws_exception_during_scoring_of_array_accessible_object_if_key_is_not_ExactValueToken($key, $value, $object)
+ {
+ $key->__toString()->willReturn('any_token');
+ $this->beConstructedWith($key,$value);
+ $errorMessage = 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
+ 'But you used `any_token`.';
+ $this->shouldThrow(new InvalidArgumentException($errorMessage))->duringScoreArgument($object);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\ExactValueToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayAccess $object
+ */
+ function it_scores_array_accessible_object_half_of_combined_scores_from_key_and_value_tokens($key, $value, $object)
+ {
+ $object->offsetExists('key')->willReturn(true);
+ $object->offsetGet('key')->willReturn('value');
+ $key->getValue()->willReturn('key');
+ $key->scoreArgument('key')->willReturn(3);
+ $value->scoreArgument('value')->willReturn(1);
+ $this->scoreArgument($object)->shouldBe(2);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\AnyValuesToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayIterator $object
+ */
+ function it_accepts_any_key_token_type_to_score_object_that_is_both_traversable_and_array_accessible($key, $value, $object)
+ {
+ $this->beConstructedWith($key, $value);
+ $object->current()->will(function () use ($object) {
+ $object->valid()->willReturn(false);
+
+ return 'value';
+ });
+ $object->key()->willReturn('key');
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $this->shouldNotThrow(new InvalidArgumentException)->duringScoreArgument($object);
+ }
+
+ function it_does_not_score_if_argument_is_neither_array_nor_traversable_nor_array_accessible()
+ {
+ $this->scoreArgument('string')->shouldBe(false);
+ $this->scoreArgument(new \stdClass)->shouldBe(false);
+ }
+
+ function it_does_not_score_empty_array()
+ {
+ $this->scoreArgument(array())->shouldBe(false);
+ }
+
+ function it_does_not_score_array_if_key_and_value_tokens_do_not_score_same_entry($key, $value)
+ {
+ $argument = array(1 => 'foo', 2 => 'bar');
+ $key->scoreArgument(1)->willReturn(true);
+ $key->scoreArgument(2)->willReturn(false);
+ $value->scoreArgument('foo')->willReturn(false);
+ $value->scoreArgument('bar')->willReturn(true);
+ $this->scoreArgument($argument)->shouldBe(false);
+ }
+
+ /**
+ * @param \Iterator $object
+ */
+ function it_does_not_score_traversable_object_without_entries($object)
+ {
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(false);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \Iterator $object
+ */
+ function it_does_not_score_traversable_object_if_key_and_value_tokens_do_not_score_same_entry($key, $value, $object)
+ {
+ $object->current()->willReturn('foo');
+ $object->current()->will(function () use ($object) {
+ $object->valid()->willReturn(false);
+
+ return 'bar';
+ });
+ $object->key()->willReturn(1);
+ $object->key()->willReturn(2);
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $key->scoreArgument(1)->willReturn(true);
+ $key->scoreArgument(2)->willReturn(false);
+ $value->scoreArgument('foo')->willReturn(false);
+ $value->scoreArgument('bar')->willReturn(true);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\ExactValueToken $key
+ * @param \ArrayAccess $object
+ */
+ function it_does_not_score_array_accessible_object_if_it_has_no_offset_with_key_token_value($key, $object)
+ {
+ $object->offsetExists('key')->willReturn(false);
+ $key->getValue()->willReturn('key');
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\ExactValueToken $key
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \ArrayAccess $object
+ */
+ function it_does_not_score_array_accessible_object_if_key_and_value_tokens_do_not_score_same_entry($key, $value, $object)
+ {
+ $object->offsetExists('key')->willReturn(true);
+ $object->offsetGet('key')->willReturn('value');
+ $key->getValue()->willReturn('key');
+ $value->scoreArgument('value')->willReturn(false);
+ $key->scoreArgument('key')->willReturn(true);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ function its_score_is_capped_at_8($key, $value)
+ {
+ $key->scoreArgument('key')->willReturn(10);
+ $value->scoreArgument('value')->willReturn(10);
+ $this->scoreArgument(array('key'=>'value'))->shouldBe(8);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
new file mode 100644
index 0000000..8662e7d
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
@@ -0,0 +1,109 @@
+beConstructedWith($value);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_holds_value($value)
+ {
+ $this->getValue()->shouldBe($value);
+ }
+
+ function its_string_representation_tells_that_its_an_array_containing_only_value($value)
+ {
+ $value->__toString()->willReturn('value');
+ $this->__toString()->shouldBe('[value, ..., value]');
+ }
+
+ /**
+ * @param \stdClass $stdClass
+ */
+ function it_wraps_non_token_value_into_ExactValueToken($stdClass)
+ {
+ $this->beConstructedWith($stdClass);
+ $this->getValue()->shouldHaveType('Prophecy\Argument\Token\ExactValueToken');
+ }
+
+ function it_does_not_score_if_argument_is_neither_array_nor_traversable()
+ {
+ $this->scoreArgument('string')->shouldBe(false);
+ $this->scoreArgument(new \stdClass)->shouldBe(false);
+ }
+
+ function it_does_not_score_empty_array()
+ {
+ $this->scoreArgument(array())->shouldBe(false);
+ }
+
+ /**
+ * @param \Iterator $object
+ */
+ function it_does_not_score_traversable_object_without_entries($object)
+ {
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(false);
+ $this->scoreArgument($object)->shouldBe(false);
+ }
+
+ function it_scores_avg_of_scores_from_value_tokens($value)
+ {
+ $value->scoreArgument('value1')->willReturn(6);
+ $value->scoreArgument('value2')->willReturn(3);
+ $this->scoreArgument(array('value1', 'value2'))->shouldBe(4.5);
+ }
+
+ function it_scores_false_if_entry_scores_false($value)
+ {
+ $value->scoreArgument('value1')->willReturn(6);
+ $value->scoreArgument('value2')->willReturn(false);
+ $this->scoreArgument(array('value1', 'value2'))->shouldBe(false);
+ }
+
+ function it_does_not_score_array_keys($value)
+ {
+ $value->scoreArgument('value')->willReturn(6);
+ $value->scoreArgument('key')->shouldNotBeCalled(0);
+ $this->scoreArgument(array('key' => 'value'))->shouldBe(6);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $value
+ * @param \Iterator $object
+ */
+ function it_scores_traversable_object_from_value_token($value, $object)
+ {
+ $object->current()->will(function ($args, $object) {
+ $object->valid()->willReturn(false);
+
+ return 'value';
+ });
+ $object->key()->willReturn('key');
+ $object->rewind()->willReturn(null);
+ $object->next()->willReturn(null);
+ $object->valid()->willReturn(true);
+ $value->scoreArgument('value')->willReturn(2);
+ $this->scoreArgument($object)->shouldBe(2);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
new file mode 100644
index 0000000..4395bf0
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
@@ -0,0 +1,42 @@
+beConstructedWith('get_class');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_7_if_argument_matches_callback()
+ {
+ $this->beConstructedWith(function ($argument) { return 2 === $argument; });
+
+ $this->scoreArgument(2)->shouldReturn(7);
+ }
+
+ function it_does_not_scores_if_argument_does_not_match_callback()
+ {
+ $this->beConstructedWith(function ($argument) { return 2 === $argument; });
+
+ $this->scoreArgument(5)->shouldReturn(false);
+ }
+
+ function its_string_representation_should_tell_that_its_callback()
+ {
+ $this->__toString()->shouldReturn('callback()');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
new file mode 100644
index 0000000..272c0ae
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
@@ -0,0 +1,140 @@
+beConstructedWith(42);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_holds_value()
+ {
+ $this->getValue()->shouldReturn(42);
+ }
+
+ function it_scores_10_if_value_is_equal_to_argument()
+ {
+ $this->scoreArgument(42)->shouldReturn(10);
+ $this->scoreArgument('42')->shouldReturn(10);
+ }
+
+ function it_scores_10_if_value_is_an_object_and_equal_to_argument()
+ {
+ $value = new \DateTime();
+ $value2 = clone $value;
+
+ $this->beConstructedWith($value);
+ $this->scoreArgument($value2)->shouldReturn(10);
+ }
+
+ function it_does_not_scores_if_value_is_not_equal_to_argument()
+ {
+ $this->scoreArgument(50)->shouldReturn(false);
+ $this->scoreArgument(new \stdClass())->shouldReturn(false);
+ }
+
+ function it_does_not_scores_if_value_an_object_and_is_not_equal_to_argument()
+ {
+ $value = new \stdClass();
+ $value2 = new \stdClass();
+ $value2->foo = 'bar';
+
+ $this->beConstructedWith($value);
+ $this->scoreArgument($value2)->shouldReturn(false);
+ }
+
+ function it_does_not_scores_if_value_type_and_is_not_equal_to_argument()
+ {
+ $this->beConstructedWith(false);
+ $this->scoreArgument(0)->shouldReturn(false);
+ }
+
+ function it_generates_proper_string_representation_for_integer()
+ {
+ $this->beConstructedWith(42);
+ $this->__toString()->shouldReturn('exact(42)');
+ }
+
+ function it_generates_proper_string_representation_for_string()
+ {
+ $this->beConstructedWith('some string');
+ $this->__toString()->shouldReturn('exact("some string")');
+ }
+
+ function it_generates_single_line_representation_for_multiline_string()
+ {
+ $this->beConstructedWith("some\nstring");
+ $this->__toString()->shouldReturn('exact("some\\nstring")');
+ }
+
+ function it_generates_proper_string_representation_for_double()
+ {
+ $this->beConstructedWith(42.3);
+ $this->__toString()->shouldReturn('exact(42.3)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_true()
+ {
+ $this->beConstructedWith(true);
+ $this->__toString()->shouldReturn('exact(true)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_false()
+ {
+ $this->beConstructedWith(false);
+ $this->__toString()->shouldReturn('exact(false)');
+ }
+
+ function it_generates_proper_string_representation_for_null()
+ {
+ $this->beConstructedWith(null);
+ $this->__toString()->shouldReturn('exact(null)');
+ }
+
+ function it_generates_proper_string_representation_for_empty_array()
+ {
+ $this->beConstructedWith(array());
+ $this->__toString()->shouldReturn('exact([])');
+ }
+
+ function it_generates_proper_string_representation_for_array()
+ {
+ $this->beConstructedWith(array('zet', 42));
+ $this->__toString()->shouldReturn('exact(["zet", 42])');
+ }
+
+ function it_generates_proper_string_representation_for_resource()
+ {
+ $resource = fopen(__FILE__, 'r');
+ $this->beConstructedWith($resource);
+ $this->__toString()->shouldReturn('exact(stream:'.$resource.')');
+ }
+
+ /**
+ * @param \stdClass $object
+ */
+ function it_generates_proper_string_representation_for_object($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ );
+
+ $this->beConstructedWith($object);
+ $this->__toString()->shouldReturn("exact($objHash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
new file mode 100644
index 0000000..00c3a21
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
@@ -0,0 +1,152 @@
+beConstructedWith(42);
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Argument\Token\IdenticalValueToken');
+ }
+
+ function it_scores_11_if_string_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith('foo');
+ $this->scoreArgument('foo')->shouldReturn(11);
+ }
+
+ function it_scores_11_if_boolean_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(false);
+ $this->scoreArgument(false)->shouldReturn(11);
+ }
+
+ function it_scores_11_if_integer_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(31);
+ $this->scoreArgument(31)->shouldReturn(11);
+ }
+
+ function it_scores_11_if_float_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(31.12);
+ $this->scoreArgument(31.12)->shouldReturn(11);
+ }
+
+ function it_scores_11_if_array_value_is_identical_to_argument()
+ {
+ $this->beConstructedWith(array('foo' => 'bar'));
+ $this->scoreArgument(array('foo' => 'bar'))->shouldReturn(11);
+ }
+
+ function it_scores_11_if_object_value_is_identical_to_argument()
+ {
+ $object = new \stdClass();
+
+ $this->beConstructedWith($object);
+ $this->scoreArgument($object)->shouldReturn(11);
+ }
+
+ function it_scores_false_if_value_is_not_identical_to_argument()
+ {
+ $this->beConstructedWith(new \stdClass());
+ $this->scoreArgument('foo')->shouldReturn(false);
+ }
+
+ function it_scores_false_if_object_value_is_not_the_same_instance_than_argument()
+ {
+ $this->beConstructedWith(new \stdClass());
+ $this->scoreArgument(new \stdClass())->shouldReturn(false);
+ }
+
+ function it_scores_false_if_integer_value_is_not_identical_to_boolean_argument()
+ {
+ $this->beConstructedWith(1);
+ $this->scoreArgument(true)->shouldReturn(false);
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_generates_proper_string_representation_for_integer()
+ {
+ $this->beConstructedWith(42);
+ $this->__toString()->shouldReturn('identical(42)');
+ }
+
+ function it_generates_proper_string_representation_for_string()
+ {
+ $this->beConstructedWith('some string');
+ $this->__toString()->shouldReturn('identical("some string")');
+ }
+
+ function it_generates_single_line_representation_for_multiline_string()
+ {
+ $this->beConstructedWith("some\nstring");
+ $this->__toString()->shouldReturn('identical("some\\nstring")');
+ }
+
+ function it_generates_proper_string_representation_for_double()
+ {
+ $this->beConstructedWith(42.3);
+ $this->__toString()->shouldReturn('identical(42.3)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_true()
+ {
+ $this->beConstructedWith(true);
+ $this->__toString()->shouldReturn('identical(true)');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_false()
+ {
+ $this->beConstructedWith(false);
+ $this->__toString()->shouldReturn('identical(false)');
+ }
+
+ function it_generates_proper_string_representation_for_null()
+ {
+ $this->beConstructedWith(null);
+ $this->__toString()->shouldReturn('identical(null)');
+ }
+
+ function it_generates_proper_string_representation_for_empty_array()
+ {
+ $this->beConstructedWith(array());
+ $this->__toString()->shouldReturn('identical([])');
+ }
+
+ function it_generates_proper_string_representation_for_array()
+ {
+ $this->beConstructedWith(array('zet', 42));
+ $this->__toString()->shouldReturn('identical(["zet", 42])');
+ }
+
+ function it_generates_proper_string_representation_for_resource()
+ {
+ $resource = fopen(__FILE__, 'r');
+ $this->beConstructedWith($resource);
+ $this->__toString()->shouldReturn('identical(stream:'.$resource.')');
+ }
+
+ function it_generates_proper_string_representation_for_object($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ );
+
+ $this->beConstructedWith($object);
+ $this->__toString()->shouldReturn("identical($objHash Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n))");
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
new file mode 100644
index 0000000..bb5e384
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
@@ -0,0 +1,78 @@
+beConstructedWith(array());
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->beConstructedWith(array());
+ $this->shouldNotBeLast();
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ * @param \Prophecy\Argument\Token\TokenInterface $token3
+ */
+ function it_generates_string_representation_from_all_tokens_imploded($token1, $token2, $token3)
+ {
+ $token1->__toString()->willReturn('token_1');
+ $token2->__toString()->willReturn('token_2');
+ $token3->__toString()->willReturn('token_3');
+
+ $this->beConstructedWith(array($token1, $token2, $token3));
+ $this->__toString()->shouldReturn('bool(token_1 AND token_2 AND token_3)');
+ }
+
+ function it_wraps_non_token_arguments_into_ExactValueToken()
+ {
+ $this->beConstructedWith(array(15, '1985'));
+ $this->__toString()->shouldReturn("bool(exact(15) AND exact(\"1985\"))");
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ */
+ function it_scores_the_maximum_score_from_all_scores_returned_by_tokens($token1, $token2)
+ {
+ $token1->scoreArgument(1)->willReturn(10);
+ $token2->scoreArgument(1)->willReturn(5);
+ $this->beConstructedWith(array($token1, $token2));
+ $this->scoreArgument(1)->shouldReturn(10);
+ }
+
+ function it_does_not_score_if_there_are_no_arguments_or_tokens()
+ {
+ $this->beConstructedWith(array());
+ $this->scoreArgument('any')->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token1
+ * @param \Prophecy\Argument\Token\TokenInterface $token2
+ */
+ function it_does_not_score_if_either_of_tokens_does_not_score($token1, $token2)
+ {
+ $token1->scoreArgument(1)->willReturn(10);
+ $token1->scoreArgument(2)->willReturn(false);
+
+ $token2->scoreArgument(1)->willReturn(false);
+ $token2->scoreArgument(2)->willReturn(10);
+
+ $this->beConstructedWith(array($token1, $token2));
+
+ $this->scoreArgument(1)->shouldReturn(false);
+ $this->scoreArgument(2)->shouldReturn(false);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
new file mode 100644
index 0000000..7ce7f3d
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
@@ -0,0 +1,65 @@
+beConstructedWith($token);
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_holds_originating_token($token)
+ {
+ $this->getOriginatingToken()->shouldReturn($token);
+ }
+
+ function it_has_simple_string_representation($token)
+ {
+ $token->__toString()->willReturn('value');
+ $this->__toString()->shouldBe('not(value)');
+ }
+
+ function it_wraps_non_token_argument_into_ExactValueToken()
+ {
+ $this->beConstructedWith(5);
+ $token = $this->getOriginatingToken();
+ $token->shouldhaveType('Prophecy\Argument\Token\ExactValueToken');
+ $token->getValue()->shouldBe(5);
+ }
+
+ function it_scores_4_if_preset_token_does_not_match_the_argument($token)
+ {
+ $token->scoreArgument('argument')->willReturn(false);
+ $this->scoreArgument('argument')->shouldBe(4);
+ }
+
+ function it_does_not_score_if_preset_token_matches_argument($token)
+ {
+ $token->scoreArgument('argument')->willReturn(5);
+ $this->scoreArgument('argument')->shouldBe(false);
+ }
+
+ function it_is_last_if_preset_token_is_last($token)
+ {
+ $token->isLast()->willReturn(true);
+ $this->shouldBeLast();
+ }
+
+ function it_is_not_last_if_preset_token_is_not_last($token)
+ {
+ $token->isLast()->willReturn(false);
+ $this->shouldNotBeLast();
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
new file mode 100644
index 0000000..37f1f1e
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
@@ -0,0 +1,85 @@
+beConstructedWith('getName', 'stdClass');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ /**
+ * @param \ReflectionClass $reflection
+ */
+ function it_scores_8_if_argument_object_has_specific_method_state($reflection)
+ {
+ $reflection->getName()->willReturn('stdClass');
+
+ $this->scoreArgument($reflection)->shouldReturn(8);
+ }
+
+ /**
+ * @param \stdClass $class
+ */
+ function it_scores_8_if_argument_object_has_specific_property_state($class)
+ {
+ $class->getName = 'stdClass';
+
+ $this->scoreArgument($class)->shouldReturn(8);
+ }
+
+ /**
+ * @param \ReflectionClass $reflection
+ */
+ function it_does_not_score_if_argument_method_state_does_not_match($reflection)
+ {
+ $reflection->getName()->willReturn('SplFileInfo');
+
+ $this->scoreArgument($reflection)->shouldReturn(false);
+ }
+
+ /**
+ * @param \stdClass $class
+ */
+ function it_does_not_score_if_argument_property_state_does_not_match($class)
+ {
+ $class->getName = 'SplFileInfo';
+
+ $this->scoreArgument($class)->shouldReturn(false);
+ }
+
+ /**
+ * @param \spec\Prophecy\Argument\Token\MyClass $class
+ */
+ function it_does_not_score_if_argument_object_does_not_have_method_or_property($class)
+ {
+ $this->scoreArgument($class)->shouldReturn(false);
+ }
+
+ function it_does_not_score_if_argument_is_not_object()
+ {
+ $this->scoreArgument(42)->shouldReturn(false);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldReturn('state(getName(), "stdClass")');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
new file mode 100644
index 0000000..c7fd265
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
@@ -0,0 +1,49 @@
+beConstructedWith('a substring');
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Argument\Token\StringContainsToken');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_holds_value()
+ {
+ $this->getValue()->shouldReturn('a substring');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_6_if_the_argument_contains_the_value()
+ {
+ $this->scoreArgument('Argument containing a substring')->shouldReturn(6);
+ }
+
+ function it_does_not_score_if_the_argument_does_not_contain_the_value()
+ {
+ $this->scoreArgument('Argument will not match')->shouldReturn(false);
+ }
+
+ function its_string_representation_shows_substring()
+ {
+ $this->__toString()->shouldReturn('contains("a substring")');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
new file mode 100644
index 0000000..f9a9507
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
@@ -0,0 +1,59 @@
+beConstructedWith('integer');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_5_if_argument_matches_simple_type()
+ {
+ $this->beConstructedWith('integer');
+
+ $this->scoreArgument(42)->shouldReturn(5);
+ }
+
+ function it_does_not_scores_if_argument_does_not_match_simple_type()
+ {
+ $this->beConstructedWith('integer');
+
+ $this->scoreArgument(42.0)->shouldReturn(false);
+ }
+
+ /**
+ * @param \ReflectionObject $object
+ */
+ function it_scores_5_if_argument_is_an_instance_of_specified_class($object)
+ {
+ $this->beConstructedWith('ReflectionClass');
+
+ $this->scoreArgument($object)->shouldReturn(5);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldReturn('type(integer)');
+ }
+
+ function it_scores_5_if_argument_is_an_instance_of_specified_interface(\Prophecy\Argument\Token\TokenInterface $interface)
+ {
+ $this->beConstructedWith('Prophecy\Argument\Token\TokenInterface');
+
+ $this->scoreArgument($interface)->shouldReturn(5);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
new file mode 100644
index 0000000..990aa80
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
@@ -0,0 +1,101 @@
+exact(42);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ExactValueToken');
+ $token->getValue()->shouldReturn(42);
+ }
+
+ function it_has_a_shortcut_for_any_argument_token()
+ {
+ $token = $this->any();
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValueToken');
+ }
+
+ function it_has_a_shortcut_for_multiple_arguments_token()
+ {
+ $token = $this->cetera();
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\AnyValuesToken');
+ }
+
+ function it_has_a_shortcut_for_type_token()
+ {
+ $token = $this->type('integer');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\TypeToken');
+ }
+
+ function it_has_a_shortcut_for_callback_token()
+ {
+ $token = $this->that('get_class');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\CallbackToken');
+ }
+
+ function it_has_a_shortcut_for_object_state_token()
+ {
+ $token = $this->which('getName', 'everzet');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ObjectStateToken');
+ }
+
+ function it_has_a_shortcut_for_logical_and_token()
+ {
+ $token = $this->allOf('integer', 5);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalAndToken');
+ }
+
+ function it_has_a_shortcut_for_array_count_token()
+ {
+ $token = $this->size(5);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayCountToken');
+ }
+
+ function it_has_a_shortcut_for_array_entry_token()
+ {
+ $token = $this->withEntry('key', 'value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
+ }
+
+ function it_has_a_shortcut_for_array_every_entry_token()
+ {
+ $token = $this->withEveryEntry('value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEveryEntryToken');
+ }
+
+ function it_has_a_shortcut_for_identical_value_token()
+ {
+ $token = $this->is('value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\IdenticalValueToken');
+ }
+
+ function it_has_a_shortcut_for_array_entry_token_matching_any_key()
+ {
+ $token = $this->containing('value');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
+ $token->getKey()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
+ }
+
+ function it_has_a_shortcut_for_array_entry_token_matching_any_value()
+ {
+ $token = $this->withKey('key');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ArrayEntryToken');
+ $token->getValue()->shouldHaveType('Prophecy\Argument\Token\AnyValueToken');
+ }
+
+ function it_has_a_shortcut_for_logical_not_token()
+ {
+ $token = $this->not('kagux');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\LogicalNotToken');
+ }
+
+ function it_has_a_shortcut_for_string_contains_token()
+ {
+ $token = $this->containingString('string');
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\StringContainsToken');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
new file mode 100644
index 0000000..e9b91c8
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
@@ -0,0 +1,188 @@
+scoreArguments(array(5, 2, 3))->willReturn(10);
+ $objectProphecy->getMethodProphecies()->willReturn(array());
+
+ $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3));
+
+ $calls = $this->findCalls('setValues', $wildcard);
+ $calls->shouldHaveCount(1);
+
+ $calls[0]->shouldBeAnInstanceOf('Prophecy\Call\Call');
+ $calls[0]->getMethodName()->shouldReturn('setValues');
+ $calls[0]->getArguments()->shouldReturn(array(5, 2, 3));
+ $calls[0]->getReturnValue()->shouldReturn(null);
+ }
+
+ function it_returns_null_for_any_call_through_makeCall_if_no_method_prophecies_added(
+ $objectProphecy
+ )
+ {
+ $objectProphecy->getMethodProphecies()->willReturn(array());
+
+ $this->makeCall($objectProphecy, 'setValues', array(5, 2, 3))->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Prophecy\MethodProphecy $method3
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments1
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments3
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_executes_promise_of_method_prophecy_that_matches_signature_passed_to_makeCall(
+ $objectProphecy, $method1, $method2, $method3, $arguments1, $arguments2, $arguments3,
+ $promise
+ )
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments1);
+ $arguments1->scoreArguments(array('world', 'everything'))->willReturn(false);
+
+ $method2->getMethodName()->willReturn('setTitle');
+ $method2->getArgumentsWildcard()->willReturn($arguments2);
+ $arguments2->scoreArguments(array('world', 'everything'))->willReturn(false);
+
+ $method3->getMethodName()->willReturn('getName');
+ $method3->getArgumentsWildcard()->willReturn($arguments3);
+ $method3->getPromise()->willReturn($promise);
+ $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
+
+ $objectProphecy->getMethodProphecies()->willReturn(array(
+ 'method1' => array($method1),
+ 'method2' => array($method2, $method3)
+ ));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array($method1, $method3));
+ $objectProphecy->reveal()->willReturn(new \stdClass());
+
+ $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method3)->willReturn(42);
+
+ $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))->shouldReturn(42);
+
+ $calls = $this->findCalls('getName', $arguments3);
+ $calls->shouldHaveCount(1);
+ $calls[0]->getReturnValue()->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Prophecy\MethodProphecy $method3
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments1
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments3
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_executes_promise_of_method_prophecy_that_matches_with_highest_score_to_makeCall(
+ $objectProphecy, $method1, $method2, $method3, $arguments1, $arguments2, $arguments3,
+ $promise
+ )
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments1);
+ $arguments1->scoreArguments(array('world', 'everything'))->willReturn(50);
+
+ $method2->getMethodName()->willReturn('getName');
+ $method2->getArgumentsWildcard()->willReturn($arguments2);
+ $method2->getPromise()->willReturn($promise);
+ $arguments2->scoreArguments(array('world', 'everything'))->willReturn(300);
+
+ $method3->getMethodName()->willReturn('getName');
+ $method3->getArgumentsWildcard()->willReturn($arguments3);
+ $arguments3->scoreArguments(array('world', 'everything'))->willReturn(200);
+
+ $objectProphecy->getMethodProphecies()->willReturn(array(
+ 'method1' => array($method1),
+ 'method2' => array($method2, $method3)
+ ));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array(
+ $method1, $method2, $method3
+ ));
+ $objectProphecy->reveal()->willReturn(new \stdClass());
+
+ $promise->execute(array('world', 'everything'), $objectProphecy->getWrappedObject(), $method2)
+ ->willReturn('second');
+
+ $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
+ ->shouldReturn('second');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_exception_if_call_does_not_match_any_of_defined_method_prophecies(
+ $objectProphecy, $method, $arguments
+ )
+ {
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->scoreArguments(array('world', 'everything'))->willReturn(false);
+ $arguments->__toString()->willReturn('arg1, arg2');
+
+ $objectProphecy->getMethodProphecies()->willReturn(array('method1' => array($method)));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
+
+ $this->shouldThrow('Prophecy\Exception\Call\UnexpectedCallException')
+ ->duringMakeCall($objectProphecy, 'getName', array('world', 'everything'));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_returns_null_if_method_prophecy_that_matches_makeCall_arguments_has_no_promise(
+ $objectProphecy, $method, $arguments
+ )
+ {
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $method->getPromise()->willReturn(null);
+ $arguments->scoreArguments(array('world', 'everything'))->willReturn(100);
+
+ $objectProphecy->getMethodProphecies()->willReturn(array($method));
+ $objectProphecy->getMethodProphecies('getName')->willReturn(array($method));
+
+ $this->makeCall($objectProphecy, 'getName', array('world', 'everything'))
+ ->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ */
+ function it_finds_recorded_calls_by_a_method_name_and_arguments_wildcard(
+ $objectProphecy, $wildcard
+ )
+ {
+ $objectProphecy->getMethodProphecies()->willReturn(array());
+
+ $this->makeCall($objectProphecy, 'getName', array('world'));
+ $this->makeCall($objectProphecy, 'getName', array('everything'));
+ $this->makeCall($objectProphecy, 'setName', array(42));
+
+ $wildcard->scoreArguments(array('world'))->willReturn(false);
+ $wildcard->scoreArguments(array('everything'))->willReturn(10);
+
+ $calls = $this->findCalls('getName', $wildcard);
+
+ $calls->shouldHaveCount(1);
+ $calls[0]->getMethodName()->shouldReturn('getName');
+ $calls[0]->getArguments()->shouldReturn(array('everything'));
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
new file mode 100644
index 0000000..d1a8539
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
@@ -0,0 +1,54 @@
+beConstructedWith('setValues', array(5, 2), 42, $exception, 'some_file.php', 23);
+ }
+
+ function it_exposes_method_name_through_getter()
+ {
+ $this->getMethodName()->shouldReturn('setValues');
+ }
+
+ function it_exposes_arguments_through_getter()
+ {
+ $this->getArguments()->shouldReturn(array(5, 2));
+ }
+
+ function it_exposes_return_value_through_getter()
+ {
+ $this->getReturnValue()->shouldReturn(42);
+ }
+
+ function it_exposes_exception_through_getter($exception)
+ {
+ $this->getException()->shouldReturn($exception);
+ }
+
+ function it_exposes_file_and_line_through_getter()
+ {
+ $this->getFile()->shouldReturn('some_file.php');
+ $this->getLine()->shouldReturn(23);
+ }
+
+ function it_returns_shortpath_to_callPlace()
+ {
+ $this->getCallPlace()->shouldReturn('some_file.php:23');
+ }
+
+ function it_returns_unknown_as_callPlace_if_no_file_or_line_provided()
+ {
+ $this->beConstructedWith('setValues', array(), 0, null, null, null);
+
+ $this->getCallPlace()->shouldReturn('unknown');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
new file mode 100644
index 0000000..2d7d934
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
@@ -0,0 +1,59 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_100()
+ {
+ $this->getPriority()->shouldReturn(100);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_anything($node)
+ {
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg2
+ */
+ function it_makes_all_constructor_arguments_optional($class, $method, $arg1, $arg2)
+ {
+ $class->hasMethod('__construct')->willReturn(true);
+ $class->getMethod('__construct')->willReturn($method);
+ $method->getArguments()->willReturn(array($arg1, $arg2));
+
+ $arg1->setDefault(null)->shouldBeCalled();
+ $arg2->setDefault(null)->shouldBeCalled();
+
+ $method->setCode(Argument::type('string'))->shouldBeCalled();
+
+ $this->apply($class);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_creates_new_constructor_if_object_has_none($class)
+ {
+ $class->hasMethod('__construct')->willReturn(false);
+ $class->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))
+ ->shouldBeCalled();
+
+ $this->apply($class);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
new file mode 100644
index 0000000..8c348b8
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
@@ -0,0 +1,37 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_minus_50()
+ {
+ $this->getPriority()->shouldReturn(-50);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $getterMethod
+ */
+ function it_uses_parent_code_for_setTraceOptions($node, $method, $getterMethod)
+ {
+ $node->hasMethod('setTraceOptions')->willReturn(true);
+ $node->getMethod('setTraceOptions')->willReturn($method);
+ $node->hasMethod('getTraceOptions')->willReturn(true);
+ $node->getMethod('getTraceOptions')->willReturn($getterMethod);
+
+ $method->useParentCode()->shouldBeCalled();
+ $getterMethod->useParentCode()->shouldBeCalled();
+
+ $this->apply($node);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
new file mode 100644
index 0000000..fe581f2
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
@@ -0,0 +1,44 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_50()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3
+ */
+ function it_will_remove_echo_and_eval_methods($node, $method1, $method2, $method3)
+ {
+ $node->removeMethod('eval')->shouldBeCalled();
+ $node->removeMethod('echo')->shouldBeCalled();
+
+ $method1->getName()->willReturn('echo');
+ $method2->getName()->willReturn('eval');
+ $method3->getName()->willReturn('notKeyword');
+
+ $node->getMethods()->willReturn(array(
+ 'echo' => $method1,
+ 'eval' => $method2,
+ 'notKeyword' => $method3,
+ ));
+
+ $this->apply($node);
+ }
+}
\ No newline at end of file
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
new file mode 100644
index 0000000..cb1d0f0
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
@@ -0,0 +1,76 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_anything($node)
+ {
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_discovers_api_using_phpdoc($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApi');
+
+ $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_ignores_existing_methods($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiExtended');
+
+ $node->addMethod(new MethodNode('undefinedMethod'))->shouldBeCalled();
+ $node->addMethod(new MethodNode('definedMethod'))->shouldNotBeCalled();
+
+ $this->apply($node);
+ }
+
+ function it_has_50_priority()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+}
+
+/**
+ * @method void undefinedMethod()
+ */
+class MagicalApi
+{
+ /**
+ * @return void
+ */
+ public function definedMethod()
+ {
+
+ }
+}
+
+/**
+ * @method void undefinedMethod()
+ * @method void definedMethod()
+ */
+class MagicalApiExtended extends MagicalApi
+{
+
+}
\ No newline at end of file
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
new file mode 100644
index 0000000..c460814
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
@@ -0,0 +1,83 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function it_has_priority_of_0()
+ {
+ $this->getPriority()->shouldReturn(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_any_class($node)
+ {
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_forces_class_to_implement_ProphecySubjectInterface($node)
+ {
+ $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->shouldBeCalled();
+
+ $node->addProperty('objectProphecy', 'private')->willReturn(null);
+ $node->getMethods()->willReturn(array());
+ $node->hasMethod(Argument::any())->willReturn(false);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $constructor
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3
+ */
+ function it_forces_all_class_methods_except_constructor_to_proxy_calls_into_prophecy_makeCall(
+ $node, $constructor, $method1, $method2, $method3
+ )
+ {
+ $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface')->willReturn(null);
+ $node->addProperty('objectProphecy', 'private')->willReturn(null);
+ $node->hasMethod(Argument::any())->willReturn(false);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+
+ $constructor->getName()->willReturn('__construct');
+ $method1->getName()->willReturn('method1');
+ $method2->getName()->willReturn('method2');
+ $method3->getName()->willReturn('method3');
+
+ $node->getMethods()->willReturn(array(
+ 'method1' => $method1,
+ 'method2' => $method2,
+ 'method3' => $method3,
+ ));
+
+ $constructor->setCode(Argument::any())->shouldNotBeCalled();
+
+ $method1->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
+ ->shouldBeCalled();
+ $method2->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
+ ->shouldBeCalled();
+ $method3->setCode('return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());')
+ ->shouldBeCalled();
+
+ $this->apply($node);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
new file mode 100644
index 0000000..4116e4d
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
@@ -0,0 +1,47 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_50()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $reflectionClassNode
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $anotherClassNode
+ */
+ function it_supports_ReflectionClass_only($reflectionClassNode, $anotherClassNode)
+ {
+ $reflectionClassNode->getParentClass()->willReturn('ReflectionClass');
+ $anotherClassNode->getParentClass()->willReturn('stdClass');
+
+ $this->supports($reflectionClassNode)->shouldReturn(true);
+ $this->supports($anotherClassNode)->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $arg2
+ */
+ function it_makes_all_newInstance_arguments_optional($class, $method, $arg1, $arg2)
+ {
+ $class->getMethod('newInstance')->willReturn($method);
+ $method->getArguments()->willReturn(array($arg1));
+ $arg1->setDefault(null)->shouldBeCalled();
+
+ $this->apply($class);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
new file mode 100644
index 0000000..37fe82f
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
@@ -0,0 +1,91 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_50()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_does_not_support_nodes_without_parent_class($node)
+ {
+ $node->getParentClass()->willReturn('stdClass');
+ $this->supports($node)->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_nodes_with_SplFileInfo_as_parent_class($node)
+ {
+ $node->getParentClass()->willReturn('SplFileInfo');
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_nodes_with_derivative_of_SplFileInfo_as_parent_class($node)
+ {
+ $node->getParentClass()->willReturn('SplFileInfo');
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_adds_a_method_to_node_if_not_exists($node)
+ {
+ $node->hasMethod('__construct')->willReturn(false);
+ $node->addMethod(Argument::any())->shouldBeCalled();
+ $node->getParentClass()->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_updates_existing_method_if_found($node, $method)
+ {
+ $node->hasMethod('__construct')->willReturn(true);
+ $node->getMethod('__construct')->willReturn($method);
+ $node->getParentClass()->shouldBeCalled();
+
+ $method->useParentCode()->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_should_not_supply_a_file_for_a_directory_iterator($node, $method)
+ {
+ $node->hasMethod('__construct')->willReturn(true);
+ $node->getMethod('__construct')->willReturn($method);
+ $node->getParentClass()->willReturn('DirectoryIterator');
+
+ $method->setCode(Argument::that(function($value) {
+ return strpos($value, '.php') === false;
+ }))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
new file mode 100644
index 0000000..2279b72
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
@@ -0,0 +1,61 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_supports_class_that_implements_only_Traversable($node)
+ {
+ $node->getInterfaces()->willReturn(array('Traversable'));
+
+ $this->supports($node)->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_does_not_support_class_that_implements_Iterator($node)
+ {
+ $node->getInterfaces()->willReturn(array('Traversable', 'Iterator'));
+
+ $this->supports($node)->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_does_not_support_class_that_implements_IteratorAggregate($node)
+ {
+ $node->getInterfaces()->willReturn(array('Traversable', 'IteratorAggregate'));
+
+ $this->supports($node)->shouldReturn(false);
+ }
+
+ function it_has_100_priority()
+ {
+ $this->getPriority()->shouldReturn(100);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_forces_node_to_implement_IteratorAggregate($node)
+ {
+ $node->addInterface('Iterator')->shouldBeCalled();
+
+ $node->addMethod(Argument::type('Prophecy\Doubler\Generator\Node\MethodNode'))->willReturn(null);
+
+ $this->apply($node);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
new file mode 100644
index 0000000..a39fa87
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
@@ -0,0 +1,122 @@
+beConstructedWith($mirror, $creator, $namer);
+ }
+
+ function it_does_not_have_patches_by_default()
+ {
+ $this->getClassPatches()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $patch
+ */
+ function its_registerClassPatch_adds_a_patch_to_the_doubler($patch)
+ {
+ $this->registerClassPatch($patch);
+ $this->getClassPatches()->shouldReturn(array($patch));
+ }
+
+ /**
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt3
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt4
+ */
+ function its_getClassPatches_sorts_patches_by_priority($alt1, $alt2, $alt3, $alt4)
+ {
+ $alt1->getPriority()->willReturn(2);
+ $alt2->getPriority()->willReturn(50);
+ $alt3->getPriority()->willReturn(10);
+ $alt4->getPriority()->willReturn(0);
+
+ $this->registerClassPatch($alt1);
+ $this->registerClassPatch($alt2);
+ $this->registerClassPatch($alt3);
+ $this->registerClassPatch($alt4);
+
+ $this->getClassPatches()->shouldReturn(array($alt2, $alt3, $alt1, $alt4));
+ }
+
+ /**
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt1
+ * @param \Prophecy\Doubler\ClassPatch\ClassPatchInterface $alt2
+ * @param \ReflectionClass $class
+ * @param \ReflectionClass $interface1
+ * @param \ReflectionClass $interface2
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function its_double_mirrors_alterates_and_instantiates_provided_class(
+ $mirror, $creator, $namer, $alt1, $alt2, $class, $interface1, $interface2, $node
+ )
+ {
+ $mirror->reflect($class, array($interface1, $interface2))->willReturn($node);
+ $alt1->supports($node)->willReturn(true);
+ $alt2->supports($node)->willReturn(false);
+ $alt1->getPriority()->willReturn(1);
+ $alt2->getPriority()->willReturn(2);
+ $namer->name($class, array($interface1, $interface2))->willReturn('SplStack');
+ $class->getName()->willReturn('stdClass');
+ $interface1->getName()->willReturn('ArrayAccess');
+ $interface2->getName()->willReturn('Iterator');
+
+ $alt1->apply($node)->shouldBeCalled();
+ $alt2->apply($node)->shouldNotBeCalled();
+ $creator->create('SplStack', $node)->shouldBeCalled();
+
+ $this->registerClassPatch($alt1);
+ $this->registerClassPatch($alt2);
+
+ $this->double($class, array($interface1, $interface2))
+ ->shouldReturnAnInstanceOf('SplStack');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_double_instantiates_a_class_with_constructor_argument($mirror, $class, $node, $namer)
+ {
+ $class->getName()->willReturn('ReflectionClass');
+ $mirror->reflect($class, array())->willReturn($node);
+ $namer->name($class, array())->willReturn('ReflectionClass');
+
+ $double = $this->double($class, array(), array('stdClass'));
+ $double->shouldBeAnInstanceOf('ReflectionClass');
+ $double->getName()->shouldReturn('stdClass');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_can_instantiate_class_with_final_constructor($mirror, $class, $node, $namer)
+ {
+ $class->getName()->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
+ $mirror->reflect($class, array())->willReturn($node);
+ $namer->name($class, array())->willReturn('spec\Prophecy\Doubler\WithFinalConstructor');
+
+ $double = $this->double($class, array());
+
+ $double->shouldBeAnInstanceOf('spec\Prophecy\Doubler\WithFinalConstructor');
+ }
+}
+
+class WithFinalConstructor
+{
+ final public function __construct() {}
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
new file mode 100644
index 0000000..867f183
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
@@ -0,0 +1,165 @@
+getParentClass()->willReturn('RuntimeException');
+ $class->getInterfaces()->willReturn(array(
+ 'Prophecy\Doubler\Generator\MirroredInterface', 'ArrayAccess', 'ArrayIterator'
+ ));
+ $class->getProperties()->willReturn(array('name' => 'public', 'email' => 'private'));
+ $class->getMethods()->willReturn(array($method1, $method2));
+
+ $method1->getName()->willReturn('getName');
+ $method1->getVisibility()->willReturn('public');
+ $method1->isStatic()->willReturn(true);
+ $method1->getArguments()->willReturn(array($argument11, $argument12));
+ $method1->getCode()->willReturn('return $this->name;');
+
+ $method2->getName()->willReturn('getEmail');
+ $method2->getVisibility()->willReturn('protected');
+ $method2->isStatic()->willReturn(false);
+ $method2->getArguments()->willReturn(array($argument21));
+ $method2->getCode()->willReturn('return $this->email;');
+
+ $argument11->getName()->willReturn('fullname');
+ $argument11->getTypeHint()->willReturn('array');
+ $argument11->isOptional()->willReturn(true);
+ $argument11->getDefault()->willReturn(null);
+ $argument11->isPassedByReference()->willReturn(false);
+
+ $argument12->getName()->willReturn('class');
+ $argument12->getTypeHint()->willReturn('ReflectionClass');
+ $argument12->isOptional()->willReturn(false);
+ $argument12->isPassedByReference()->willReturn(false);
+
+ $argument21->getName()->willReturn('default');
+ $argument21->getTypeHint()->willReturn(null);
+ $argument21->isOptional()->willReturn(true);
+ $argument21->getDefault()->willReturn('ever.zet@gmail.com');
+ $argument21->isPassedByReference()->willReturn(false);
+
+ $code = $this->generate('CustomClass', $class);
+ $expected = <<<'PHP'
+namespace {
+class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface, \ArrayAccess, \ArrayIterator {
+public $name;
+private $email;
+
+public static function getName(array $fullname = NULL, \ReflectionClass $class) {
+return $this->name;
+}
+protected function getEmail( $default = 'ever.zet@gmail.com') {
+return $this->email;
+}
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument
+ */
+ function it_overrides_properly_methods_with_args_passed_by_reference(
+ $class, $method, $argument
+ )
+ {
+ $class->getParentClass()->willReturn('RuntimeException');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array($method));
+
+ $method->getName()->willReturn('getName');
+ $method->getVisibility()->willReturn('public');
+ $method->isStatic()->willReturn(false);
+ $method->getArguments()->willReturn(array($argument));
+ $method->getCode()->willReturn('return $this->name;');
+
+ $argument->getName()->willReturn('fullname');
+ $argument->getTypeHint()->willReturn('array');
+ $argument->isOptional()->willReturn(true);
+ $argument->getDefault()->willReturn(null);
+ $argument->isPassedByReference()->willReturn(true);
+
+ $code = $this->generate('CustomClass', $class);
+ $expected =<<<'PHP'
+namespace {
+class CustomClass extends \RuntimeException implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+public function getName(array &$fullname = NULL) {
+return $this->name;
+}
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_generates_empty_class_for_empty_ClassNode($class)
+ {
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array());
+
+ $code = $this->generate('CustomClass', $class);
+ $expected =<<<'PHP'
+namespace {
+class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_wraps_class_in_namespace_if_it_is_namespaced($class)
+ {
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array());
+
+ $code = $this->generate('My\Awesome\CustomClass', $class);
+ $expected =<<<'PHP'
+namespace My\Awesome {
+class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+
+}
+}
+PHP;
+ $expected = strtr($expected, array("\r\n" => "\n", "\r" => "\n"));
+ $code->shouldBe($expected);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
new file mode 100644
index 0000000..c7b5700
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
@@ -0,0 +1,44 @@
+beConstructedWith($generator);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_evaluates_code_generated_by_ClassCodeGenerator($generator, $class)
+ {
+ $generator->generate('stdClass', $class)->shouldBeCalled()->willReturn(
+ 'return 42;'
+ );
+
+ $this->create('stdClass', $class)->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $class
+ */
+ function it_throws_an_exception_if_class_does_not_exist_after_evaluation($generator, $class)
+ {
+ $generator->generate('CustomClass', $class)->shouldBeCalled()->willReturn(
+ 'return 42;'
+ );
+
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Interface1', 'Interface2'));
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\ClassCreatorException')
+ ->duringCreate('CustomClass', $class);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php
new file mode 100644
index 0000000..fa9f462
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php
@@ -0,0 +1,491 @@
+getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array(
+ $method1, $method2, $method3
+ ));
+
+ $method1->getName()->willReturn('getName');
+ $method2->getName()->willReturn('isPublic');
+ $method3->getName()->willReturn('isAbstract');
+
+ $method1->isFinal()->willReturn(false);
+ $method2->isFinal()->willReturn(false);
+ $method3->isFinal()->willReturn(false);
+
+ $method1->isProtected()->willReturn(false);
+ $method2->isProtected()->willReturn(false);
+ $method3->isProtected()->willReturn(false);
+
+ $method1->isStatic()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(3);
+
+ $classNode->hasMethod('getName')->shouldReturn(true);
+ $classNode->hasMethod('isPublic')->shouldReturn(true);
+ $classNode->hasMethod('isAbstract')->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $parameter
+ */
+ function it_changes_argument_names_if_they_are_varying($class, $method, $parameter)
+ {
+
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+
+ $method->getParameters()->willReturn(array($parameter));
+ $method->getName()->willReturn('methodName');
+ $method->isFinal()->willReturn(false);
+ $method->isProtected()->willReturn(false);
+ $method->isStatic()->willReturn(false);
+
+ $parameter->getName()->willReturn('...');
+ $parameter->isDefaultValueAvailable()->willReturn(true);
+ $parameter->getDefaultValue()->willReturn(null);
+ $parameter->isPassedByReference()->willReturn(false);
+ $parameter->getClass()->willReturn($class);
+
+ $classNode = $this->reflect($class, array());
+
+ $methodNodes = $classNode->getMethods();
+
+ $argumentNodes = $methodNodes['methodName']->getArguments();
+ $argumentNode = $argumentNodes[0];
+
+ $argumentNode->getName()->shouldReturn('__dot_dot_dot__');
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_reflects_protected_abstract_methods($class, $method)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array($method));
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array());
+
+ $method->isProtected()->willReturn(true);
+ $method->isStatic()->willReturn(false);
+ $method->getParameters()->willReturn(array());
+ $method->getName()->willReturn('innerDetail');
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(1);
+
+ $methodNodes['innerDetail']->getVisibility()->shouldReturn('protected');
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_reflects_public_static_methods($class, $method)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array($method));
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array());
+
+ $method->isProtected()->willReturn(true);
+ $method->isStatic()->willReturn(true);
+ $method->getParameters()->willReturn(array());
+ $method->getName()->willReturn('innerDetail');
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(1);
+
+ $methodNodes['innerDetail']->getVisibility()->shouldReturn('protected');
+ $methodNodes['innerDetail']->isStatic()->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ * @param ReflectionParameter $param2
+ * @param ReflectionClass $typeHint
+ * @param ReflectionParameter $param3
+ */
+ function it_properly_reads_methods_arguments_with_types(
+ $class, $method, $param1, $param2, $typeHint, $param3
+ )
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->getName()->willReturn('methodWithArgs');
+ $method->isFinal()->willReturn(false);
+ $method->isProtected()->willReturn(true);
+ $method->isStatic()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1, $param2, $param3));
+
+ $param1->getName()->willReturn('arg_1');
+ $param1->isArray()->willReturn(true);
+ $param1->getClass()->willReturn(null);
+ $param1->isDefaultValueAvailable()->willReturn(true);
+ $param1->isPassedByReference()->willReturn(false);
+ $param1->allowsNull()->willReturn(false);
+ $param1->getDefaultValue()->willReturn(array());
+
+ $param2->getName()->willReturn('arg2');
+ $param2->isArray()->willReturn(false);
+ $param2->getClass()->willReturn($typeHint);
+ $param2->isDefaultValueAvailable()->willReturn(false);
+ $param2->isOptional()->willReturn(false);
+ $param2->isPassedByReference()->willReturn(false);
+ $param2->allowsNull()->willReturn(false);
+ $typeHint->getName()->willReturn('ArrayAccess');
+
+ $param3->getName()->willReturn('arg_3');
+ $param3->isArray()->willReturn(false);
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $param3->isCallable()->willReturn(true);
+ }
+ $param3->getClass()->willReturn(null);
+ $param3->isOptional()->willReturn(false);
+ $param3->isDefaultValueAvailable()->willReturn(false);
+ $param3->isPassedByReference()->willReturn(false);
+ $param3->allowsNull()->willReturn(true);
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $argNodes = $methodNodes['methodWithArgs']->getArguments();
+
+ $argNodes[0]->getName()->shouldReturn('arg_1');
+ $argNodes[0]->getTypeHint()->shouldReturn('array');
+ $argNodes[0]->isOptional()->shouldReturn(true);
+ $argNodes[0]->getDefault()->shouldReturn(array());
+
+ $argNodes[1]->getName()->shouldReturn('arg2');
+ $argNodes[1]->getTypeHint()->shouldReturn('ArrayAccess');
+ $argNodes[1]->isOptional()->shouldReturn(false);
+
+ $argNodes[2]->getName()->shouldReturn('arg_3');
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $argNodes[2]->getTypeHint()->shouldReturn('callable');
+ }
+ $argNodes[2]->isOptional()->shouldReturn(true);
+ $argNodes[2]->getDefault()->shouldReturn(null);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ * @param ReflectionParameter $param2
+ * @param ReflectionClass $typeHint
+ */
+ function it_marks_passed_by_reference_args_as_passed_by_reference(
+ $class, $method, $param1, $param2, $typeHint
+ )
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->getName()->willReturn('methodWithArgs');
+ $method->isFinal()->willReturn(false);
+ $method->isProtected()->willReturn(false);
+ $method->isStatic()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1, $param2));
+
+ $param1->getName()->willReturn('arg_1');
+ $param1->isArray()->willReturn(false);
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $param1->isCallable()->willReturn(false);
+ }
+ $param1->getClass()->willReturn(null);
+ $param1->isDefaultValueAvailable()->willReturn(false);
+ $param1->isOptional()->willReturn(true);
+ $param1->isPassedByReference()->willReturn(true);
+ $param1->allowsNull()->willReturn(false);
+ if (defined('HHVM_VERSION')) {
+ $param1->getTypehintText()->willReturn(null);
+ }
+
+ $param2->getName()->willReturn('arg2');
+ $param2->isArray()->willReturn(false);
+ $param2->getClass()->willReturn($typeHint);
+ $param2->isDefaultValueAvailable()->willReturn(false);
+ $param2->isOptional()->willReturn(false);
+ $param2->isPassedByReference()->willReturn(false);
+ $param2->allowsNull()->willReturn(false);
+ $typeHint->getName()->willReturn('ArrayAccess');
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $argNodes = $methodNodes['methodWithArgs']->getArguments();
+
+ $argNodes[0]->isPassedByReference()->shouldReturn(true);
+ $argNodes[1]->isPassedByReference()->shouldReturn(false);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ */
+ function it_throws_an_exception_if_class_is_final($class)
+ {
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(true);
+ $class->getName()->willReturn('Custom\ClassName');
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\ClassMirrorException')
+ ->duringReflect($class, array());
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_ignores_final_methods($class, $method)
+ {
+ $class->getName()->willReturn('Custom\ClassName');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->isFinal()->willReturn(true);
+ $method->getName()->willReturn('finalImplementation');
+
+ $classNode = $this->reflect($class, array());
+ $classNode->getMethods()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param ReflectionClass $interface
+ */
+ function it_throws_an_exception_if_interface_provided_instead_of_class($interface)
+ {
+ $interface->isInterface()->willReturn(true);
+ $interface->getName()->willReturn('Custom\ClassName');
+
+ $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')
+ ->duringReflect($interface, array());
+ }
+
+ /**
+ * @param ReflectionClass $interface1
+ * @param ReflectionClass $interface2
+ * @param ReflectionMethod $method1
+ * @param ReflectionMethod $method2
+ * @param ReflectionMethod $method3
+ */
+ function it_reflects_all_interfaces_methods(
+ $interface1, $interface2, $method1, $method2, $method3
+ )
+ {
+ $interface1->getName()->willReturn('MyInterface1');
+ $interface2->getName()->willReturn('MyInterface2');
+
+ $interface1->isInterface()->willReturn(true);
+ $interface2->isInterface()->willReturn(true);
+
+ $interface1->getMethods()->willReturn(array($method1));
+ $interface2->getMethods()->willReturn(array($method2, $method3));
+
+ $method1->getName()->willReturn('getName');
+ $method2->getName()->willReturn('isPublic');
+ $method3->getName()->willReturn('isAbstract');
+
+ $method1->isProtected()->willReturn(false);
+ $method2->isProtected()->willReturn(false);
+ $method3->isProtected()->willReturn(false);
+
+ $method1->isStatic()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ $classNode = $this->reflect(null, array($interface1, $interface2));
+
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('stdClass');
+ $classNode->getInterfaces()->shouldReturn(array(
+ 'Prophecy\Doubler\Generator\ReflectionInterface', 'MyInterface2', 'MyInterface1',
+ ));
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(3);
+
+ $classNode->hasMethod('getName')->shouldReturn(true);
+ $classNode->hasMethod('isPublic')->shouldReturn(true);
+ $classNode->hasMethod('isAbstract')->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method1
+ * @param ReflectionMethod $method2
+ * @param ReflectionMethod $method3
+ */
+ function it_ignores_virtually_private_methods($class, $method1, $method2, $method3)
+ {
+ $class->getName()->willReturn('SomeClass');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method1, $method2, $method3));
+
+ $method1->getName()->willReturn('_getName');
+ $method2->getName()->willReturn('__toString');
+ $method3->getName()->willReturn('isAbstract');
+
+ $method1->isFinal()->willReturn(false);
+ $method2->isFinal()->willReturn(false);
+ $method3->isFinal()->willReturn(false);
+
+ $method1->isProtected()->willReturn(false);
+ $method2->isProtected()->willReturn(false);
+ $method3->isProtected()->willReturn(false);
+
+ $method1->isStatic()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(2);
+
+ $classNode->hasMethod('isAbstract')->shouldReturn(true);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ */
+ function it_does_not_throw_exception_for_virtually_private_finals($class, $method)
+ {
+ $class->getName()->willReturn('SomeClass');
+ $class->isInterface()->willReturn(false);
+ $class->isFinal()->willReturn(false);
+ $class->getMethods(ReflectionMethod::IS_ABSTRACT)->willReturn(array());
+ $class->getMethods(ReflectionMethod::IS_PUBLIC)->willReturn(array($method));
+
+ $method->getName()->willReturn('__toString');
+ $method->isFinal()->willReturn(true);
+
+ $this->shouldNotThrow()->duringReflect($class, array());
+ }
+
+ /**
+ * @param ReflectionClass $class
+ */
+ function it_throws_an_exception_if_class_provided_in_interfaces_list($class)
+ {
+ $class->getName()->willReturn('MyClass');
+ $class->isInterface()->willReturn(false);
+
+ $this->shouldThrow('InvalidArgumentException')
+ ->duringReflect(null, array($class));
+ }
+
+ function it_throws_an_exception_if_not_reflection_provided_as_interface()
+ {
+ $this->shouldThrow('InvalidArgumentException')
+ ->duringReflect(null, array(null));
+ }
+
+ function it_doesnt_fail_to_typehint_nonexistent_FQCN()
+ {
+ $classNode = $this->reflect(new ReflectionClass('spec\Prophecy\Doubler\Generator\OptionalDepsClass'), array());
+ $method = $classNode->getMethod('iHaveAStrangeTypeHintedArg');
+ $arguments = $method->getArguments();
+ $arguments[0]->getTypeHint()->shouldBe('I\Simply\Am\Nonexistent');
+ }
+
+ function it_doesnt_fail_to_typehint_nonexistent_RQCN()
+ {
+ $classNode = $this->reflect(new ReflectionClass('spec\Prophecy\Doubler\Generator\OptionalDepsClass'), array());
+ $method = $classNode->getMethod('iHaveAnEvenStrangerTypeHintedArg');
+ $arguments = $method->getArguments();
+ $arguments[0]->getTypeHint()->shouldBe('I\Simply\Am\Not');
+ }
+
+ function it_doesnt_use_scalar_typehints()
+ {
+ $classNode = $this->reflect(new ReflectionClass('ReflectionMethod'), array());
+ $method = $classNode->getMethod('export');
+ $arguments = $method->getArguments();
+ $arguments[0]->getTypeHint()->shouldReturn(null);
+ $arguments[1]->getTypeHint()->shouldReturn(null);
+ $arguments[2]->getTypeHint()->shouldReturn(null);
+ }
+}
+
+class OptionalDepsClass
+{
+ public function iHaveAStrangeTypeHintedArg(\I\Simply\Am\Nonexistent $class)
+ {
+ }
+
+ public function iHaveAnEvenStrangerTypeHintedArg(Simply\Am\Not $class)
+ {
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
new file mode 100644
index 0000000..cea578f
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
@@ -0,0 +1,62 @@
+beConstructedWith('name');
+ }
+
+ function it_is_not_be_passed_by_reference_by_default()
+ {
+ $this->shouldNotBePassedByReference();
+ }
+
+ function it_is_passed_by_reference_if_marked()
+ {
+ $this->setAsPassedByReference();
+ $this->shouldBePassedByReference();
+ }
+
+ function it_has_name_with_which_it_was_been_constructed()
+ {
+ $this->getName()->shouldReturn('name');
+ }
+
+ function it_has_no_typehint_by_default()
+ {
+ $this->getTypeHint()->shouldReturn(null);
+ }
+
+ function its_typeHint_is_mutable()
+ {
+ $this->setTypeHint('array');
+ $this->getTypeHint()->shouldReturn('array');
+ }
+
+ function it_does_not_have_default_value_by_default()
+ {
+ $this->getDefault()->shouldReturn(null);
+ }
+
+ function it_is_not_optional_by_default()
+ {
+ $this->isOptional()->shouldReturn(false);
+ }
+
+ function its_default_is_mutable()
+ {
+ $this->setDefault(array());
+ $this->getDefault()->shouldReturn(array());
+ }
+
+ function it_is_marked_as_optional_when_default_is_set()
+ {
+ $this->setDefault(null);
+ $this->isOptional()->shouldReturn(true);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
new file mode 100644
index 0000000..18f0e1c
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
@@ -0,0 +1,154 @@
+getParentClass()->shouldReturn('stdClass');
+ }
+
+ function its_parentClass_is_mutable()
+ {
+ $this->setParentClass('Exception');
+ $this->getParentClass()->shouldReturn('Exception');
+ }
+
+ function its_parentClass_is_set_to_stdClass_if_user_set_null()
+ {
+ $this->setParentClass(null);
+ $this->getParentClass()->shouldReturn('stdClass');
+ }
+
+ function it_does_not_implement_any_interface_by_default()
+ {
+ $this->getInterfaces()->shouldHaveCount(0);
+ }
+
+ function its_addInterface_adds_item_to_the_list_of_implemented_interfaces()
+ {
+ $this->addInterface('MyInterface');
+ $this->getInterfaces()->shouldHaveCount(1);
+ }
+
+ function its_hasInterface_returns_true_if_class_implements_interface()
+ {
+ $this->addInterface('MyInterface');
+ $this->hasInterface('MyInterface')->shouldReturn(true);
+ }
+
+ function its_hasInterface_returns_false_if_class_does_not_implements_interface()
+ {
+ $this->hasInterface('MyInterface')->shouldReturn(false);
+ }
+
+ function it_supports_implementation_of_multiple_interfaces()
+ {
+ $this->addInterface('MyInterface');
+ $this->addInterface('MySecondInterface');
+ $this->getInterfaces()->shouldHaveCount(2);
+ }
+
+ function it_ignores_same_interfaces_added_twice()
+ {
+ $this->addInterface('MyInterface');
+ $this->addInterface('MyInterface');
+
+ $this->getInterfaces()->shouldHaveCount(1);
+ $this->getInterfaces()->shouldReturn(array('MyInterface'));
+ }
+
+ function it_does_not_have_methods_by_default()
+ {
+ $this->getMethods()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ */
+ function it_can_has_methods($method1, $method2)
+ {
+ $method1->getName()->willReturn('__construct');
+ $method2->getName()->willReturn('getName');
+
+ $this->addMethod($method1);
+ $this->addMethod($method2);
+
+ $this->getMethods()->shouldReturn(array(
+ '__construct' => $method1,
+ 'getName' => $method2
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function its_hasMethod_returns_true_if_method_exists($method)
+ {
+ $method->getName()->willReturn('getName');
+
+ $this->addMethod($method);
+
+ $this->hasMethod('getName')->shouldReturn(true);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function its_getMethod_returns_method_by_name($method)
+ {
+ $method->getName()->willReturn('getName');
+
+ $this->addMethod($method);
+
+ $this->getMethod('getName')->shouldReturn($method);
+ }
+
+ function its_hasMethod_returns_false_if_method_does_not_exists()
+ {
+ $this->hasMethod('getName')->shouldReturn(false);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function its_hasMethod_returns_false_if_method_has_been_removed($method)
+ {
+ $method->getName()->willReturn('getName');
+ $this->addMethod($method);
+ $this->removeMethod('getName');
+
+ $this->hasMethod('getName')->shouldReturn(false);
+ }
+
+
+ function it_does_not_have_properties_by_default()
+ {
+ $this->getProperties()->shouldHaveCount(0);
+ }
+
+ function it_is_able_to_have_properties()
+ {
+ $this->addProperty('title');
+ $this->addProperty('text', 'private');
+ $this->getProperties()->shouldReturn(array(
+ 'title' => 'public',
+ 'text' => 'private'
+ ));
+ }
+
+ function its_addProperty_does_not_accept_unsupported_visibility()
+ {
+ $this->shouldThrow('InvalidArgumentException')->duringAddProperty('title', 'town');
+ }
+
+ function its_addProperty_lowercases_visibility_before_setting()
+ {
+ $this->addProperty('text', 'PRIVATE');
+ $this->getProperties()->shouldReturn(array('text' => 'private'));
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
new file mode 100644
index 0000000..2fff40a
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
@@ -0,0 +1,105 @@
+beConstructedWith('getTitle');
+ }
+
+ function it_has_a_name()
+ {
+ $this->getName()->shouldReturn('getTitle');
+ }
+
+ function it_has_public_visibility_by_default()
+ {
+ $this->getVisibility()->shouldReturn('public');
+ }
+
+ function its_visibility_is_mutable()
+ {
+ $this->setVisibility('private');
+ $this->getVisibility()->shouldReturn('private');
+ }
+
+ function it_is_not_static_by_default()
+ {
+ $this->shouldNotBeStatic();
+ }
+
+ function it_should_be_settable_as_static_through_setter()
+ {
+ $this->setStatic();
+ $this->shouldBeStatic();
+ }
+
+ function it_accepts_only_supported_visibilities()
+ {
+ $this->shouldThrow('InvalidArgumentException')->duringSetVisibility('stealth');
+ }
+
+ function it_lowercases_visibility_before_setting_it()
+ {
+ $this->setVisibility('Public');
+ $this->getVisibility()->shouldReturn('public');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2
+ */
+ function its_useParentCode_causes_method_to_call_parent($argument1, $argument2)
+ {
+ $argument1->getName()->willReturn('objectName');
+ $argument2->getName()->willReturn('default');
+
+ $this->addArgument($argument1);
+ $this->addArgument($argument2);
+
+ $this->useParentCode();
+
+ $this->getCode()->shouldReturn(
+ 'return parent::getTitle($objectName, $default);'
+ );
+ }
+
+ function its_code_is_mutable()
+ {
+ $this->setCode('echo "code";');
+ $this->getCode()->shouldReturn('echo "code";');
+ }
+
+ function its_setCode_provided_with_null_cleans_method_body()
+ {
+ $this->setCode(null);
+ $this->getCode()->shouldReturn('');
+ }
+
+ function it_is_constructable_with_code()
+ {
+ $this->beConstructedWith('getTitle', 'die();');
+ $this->getCode()->shouldReturn('die();');
+ }
+
+ function it_does_not_have_arguments_by_default()
+ {
+ $this->getArguments()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2
+ */
+ function it_supports_adding_arguments($argument1, $argument2)
+ {
+ $this->addArgument($argument1);
+ $this->addArgument($argument2);
+
+ $this->getArguments()->shouldReturn(array($argument1, $argument2));
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
new file mode 100644
index 0000000..7026126
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
@@ -0,0 +1,96 @@
+beConstructedWith($doubler);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ */
+ function it_returns_anonymous_double_instance_by_default($doubler, $double)
+ {
+ $doubler->double(null, array())->willReturn($double);
+
+ $this->getInstance()->shouldReturn($double);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ * @param \ReflectionClass $class
+ */
+ function it_returns_class_double_instance_if_set($doubler, $double, $class)
+ {
+ $doubler->double($class, array())->willReturn($double);
+
+ $this->setParentClass($class);
+
+ $this->getInstance()->shouldReturn($double);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double1
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double2
+ */
+ function it_returns_same_double_instance_if_called_2_times(
+ $doubler, $double1, $double2
+ )
+ {
+ $doubler->double(null, array())->willReturn($double1);
+ $doubler->double(null, array())->willReturn($double2);
+
+ $this->getInstance()->shouldReturn($double2);
+ $this->getInstance()->shouldReturn($double2);
+ }
+
+ function its_setParentClass_throws_ClassNotFoundException_if_class_not_found()
+ {
+ $this->shouldThrow('Prophecy\Exception\Doubler\ClassNotFoundException')
+ ->duringSetParentClass('SomeUnexistingClass');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ */
+ function its_setParentClass_throws_exception_if_prophecy_is_already_created(
+ $doubler, $double
+ )
+ {
+ $doubler->double(null, array())->willReturn($double);
+
+ $this->getInstance();
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
+ ->duringSetParentClass('stdClass');
+ }
+
+ function its_addInterface_throws_InterfaceNotFoundException_if_no_interface_found()
+ {
+ $this->shouldThrow('Prophecy\Exception\Doubler\InterfaceNotFoundException')
+ ->duringAddInterface('SomeUnexistingInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $double
+ */
+ function its_addInterface_throws_exception_if_prophecy_is_already_created(
+ $doubler, $double
+ )
+ {
+ $doubler->double(null, array())->willReturn($double);
+
+ $this->getInstance();
+
+ $this->shouldThrow('Prophecy\Exception\Doubler\DoubleException')
+ ->duringAddInterface('ArrayAccess');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
new file mode 100644
index 0000000..a3e7491
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
@@ -0,0 +1,72 @@
+getName()->willReturn('stdClass');
+ $this->name($class, array())->shouldStartWith('Double\stdClass\\');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ */
+ function its_name_generates_name_based_on_namespaced_class_reflection($class)
+ {
+ $class->getName()->willReturn('Some\Custom\Class');
+ $this->name($class, array())->shouldStartWith('Double\Some\Custom\Class\P');
+ }
+
+ /**
+ * @param \ReflectionClass $interface1
+ * @param \ReflectionClass $interface2
+ */
+ function its_name_generates_name_based_on_interface_shortnames($interface1, $interface2)
+ {
+ $interface1->getShortName()->willReturn('HandlerInterface');
+ $interface2->getShortName()->willReturn('LoaderInterface');
+
+ $this->name(null, array($interface1, $interface2))->shouldStartWith(
+ 'Double\HandlerInterface\LoaderInterface\P'
+ );
+ }
+
+ function it_generates_proper_name_for_no_class_and_interfaces_list()
+ {
+ $this->name(null, array())->shouldStartWith('Double\stdClass\P');
+ }
+
+ /**
+ * @param \ReflectionClass $class
+ * @param \ReflectionClass $interface1
+ * @param \ReflectionClass $interface2
+ */
+ function its_name_generates_name_based_only_on_class_if_its_available(
+ $class, $interface1, $interface2
+ )
+ {
+ $class->getName()->willReturn('Some\Custom\Class');
+ $interface1->getShortName()->willReturn('HandlerInterface');
+ $interface2->getShortName()->willReturn('LoaderInterface');
+
+ $this->name($class, array($interface1, $interface2))->shouldStartWith(
+ 'Double\Some\Custom\Class\P'
+ );
+ }
+
+ public function getMatchers()
+ {
+ return array(
+ 'startWith' => function ($subject, $string) {
+ return 0 === strpos($subject, $string);
+ },
+ );
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
new file mode 100644
index 0000000..6fd1a5c
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
@@ -0,0 +1,32 @@
+beConstructedWith('msg', $objectProphecy, 'getName', array('arg1', 'arg2'));
+ }
+
+ function it_is_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
+ }
+
+ function it_exposes_method_name_through_getter()
+ {
+ $this->getMethodName()->shouldReturn('getName');
+ }
+
+ function it_exposes_arguments_through_getter()
+ {
+ $this->getArguments()->shouldReturn(array('arg1', 'arg2'));
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
new file mode 100644
index 0000000..5824138
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
@@ -0,0 +1,28 @@
+beConstructedWith('', $node);
+ }
+
+ function it_is_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
+ }
+
+ function it_contains_a_reflected_node($node)
+ {
+ $this->getClassNode()->shouldReturn($node);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
new file mode 100644
index 0000000..21e31a3
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
@@ -0,0 +1,27 @@
+beConstructedWith('', $class);
+ }
+
+ function it_is_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
+ }
+
+ function it_contains_a_reflected_class_link($class)
+ {
+ $this->getReflectedClass()->shouldReturn($class);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
new file mode 100644
index 0000000..251512b
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
@@ -0,0 +1,25 @@
+beConstructedWith('msg', 'CustomClass');
+ }
+
+ function it_is_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Exception');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoubleException');
+ }
+
+ function its_getClassname_returns_classname()
+ {
+ $this->getClassname()->shouldReturn('CustomClass');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
new file mode 100644
index 0000000..6fe5a19
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
@@ -0,0 +1,14 @@
+shouldBeAnInstanceOf('RuntimeException');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
new file mode 100644
index 0000000..ad1a439
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
@@ -0,0 +1,24 @@
+beConstructedWith('msg', 'CustomInterface');
+ }
+
+ function it_extends_ClassNotFoundException()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\ClassNotFoundException');
+ }
+
+ function its_getClassname_returns_classname()
+ {
+ $this->getClassname()->shouldReturn('CustomInterface');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
new file mode 100644
index 0000000..5bc0ee4
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
@@ -0,0 +1,29 @@
+beConstructedWith('', 'User', 'getName');
+ }
+
+ function it_is_DoubleException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Doubler\DoubleException');
+ }
+
+ function it_has_MethodName()
+ {
+ $this->getMethodName()->shouldReturn('getName');
+ }
+
+ function it_has_classnamej()
+ {
+ $this->getClassname()->shouldReturn('User');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
new file mode 100644
index 0000000..22a5ebd
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
@@ -0,0 +1,57 @@
+beConstructedWith(null);
+ }
+
+ function it_is_prediction_exception()
+ {
+ $this->shouldBeAnInstanceOf('RuntimeException');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\PredictionException');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ */
+ function it_can_store_objectProphecy_link($object)
+ {
+ $this->setObjectProphecy($object);
+ $this->getObjectProphecy()->shouldReturn($object);
+ }
+
+ function it_should_not_have_exceptions_at_the_beginning()
+ {
+ $this->getExceptions()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Exception\Prediction\PredictionException $exception
+ */
+ function it_should_append_exception_through_append_method($exception)
+ {
+ $exception->getMessage()->willReturn('Exception #1');
+
+ $this->append($exception);
+
+ $this->getExceptions()->shouldReturn(array($exception));
+ }
+
+ /**
+ * @param \Prophecy\Exception\Prediction\PredictionException $exception
+ */
+ function it_should_update_message_during_append($exception)
+ {
+ $exception->getMessage()->willReturn('Exception #1');
+
+ $this->append($exception);
+
+ $this->getMessage()->shouldReturn(" Exception #1");
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
new file mode 100644
index 0000000..473f1a2
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
@@ -0,0 +1,29 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy);
+ }
+
+ function it_is_PredictionException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
+ }
+
+ function it_extends_MethodProphecyException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
new file mode 100644
index 0000000..adad975
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
@@ -0,0 +1,31 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy, 5, array($call1, $call2));
+ }
+
+ function it_extends_UnexpectedCallsException()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prediction\UnexpectedCallsException');
+ }
+
+ function it_should_expose_expectedCount_through_getter()
+ {
+ $this->getExpectedCount()->shouldReturn(5);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
new file mode 100644
index 0000000..c0fe24d
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
@@ -0,0 +1,36 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy, array($call1, $call2));
+ }
+
+ function it_is_PredictionException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prediction\PredictionException');
+ }
+
+ function it_extends_MethodProphecyException()
+ {
+ $this->shouldHaveType('Prophecy\Exception\Prophecy\MethodProphecyException');
+ }
+
+ function it_should_expose_calls_list_through_getter($call1, $call2)
+ {
+ $this->getCalls()->shouldReturn(array($call1, $call2));
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
new file mode 100644
index 0000000..97cf9e1
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
@@ -0,0 +1,30 @@
+getObjectProphecy()->willReturn($objectProphecy);
+
+ $this->beConstructedWith('message', $methodProphecy);
+ }
+
+ function it_extends_DoubleException()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ObjectProphecyException');
+ }
+
+ function it_holds_a_stub_reference($methodProphecy)
+ {
+ $this->getMethodProphecy()->shouldReturn($methodProphecy);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
new file mode 100644
index 0000000..bcacfed
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
@@ -0,0 +1,27 @@
+beConstructedWith('message', $objectProphecy);
+ }
+
+ function it_should_be_a_prophecy_exception()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Prophecy\ProphecyException');
+ }
+
+ function it_holds_double_reference($objectProphecy)
+ {
+ $this->getObjectProphecy()->shouldReturn($objectProphecy);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
new file mode 100644
index 0000000..3da8c59
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
@@ -0,0 +1,42 @@
+shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ */
+ function it_does_nothing_if_there_is_more_than_one_call_been_made($object, $method, $call)
+ {
+ $this->check(array($call), $object, $method)->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_NoCallsException_if_no_calls_found($object, $method, $arguments)
+ {
+ $method->getObjectProphecy()->willReturn($object);
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->__toString()->willReturn('123');
+ $object->reveal()->willReturn(new \stdClass());
+ $object->findProphecyMethodCalls('getName', Argument::any())->willReturn(array());
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\NoCallsException')
+ ->duringCheck(array(), $object, $method);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
new file mode 100644
index 0000000..c670892
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
@@ -0,0 +1,54 @@
+beConstructedWith(2);
+ }
+
+ function it_is_prediction()
+ {
+ $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_does_nothing_if_there_were_exact_amount_of_calls_being_made(
+ $object, $method, $call1, $call2
+ )
+ {
+ $this->check(array($call1, $call2), $object, $method)->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_UnexpectedCallsCountException_if_calls_found(
+ $object, $method, $call, $arguments
+ )
+ {
+ $method->getObjectProphecy()->willReturn($object);
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->__toString()->willReturn('123');
+
+ $call->getMethodName()->willReturn('getName');
+ $call->getArguments()->willReturn(array(5, 4, 'three'));
+ $call->getCallPlace()->willReturn('unknown');
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsCountException')
+ ->duringCheck(array($call), $object, $method);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
new file mode 100644
index 0000000..7fe475e
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
@@ -0,0 +1,36 @@
+beConstructedWith('get_class');
+ }
+
+ function it_is_prediction()
+ {
+ $this->shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ */
+ function it_proxies_call_to_callback($object, $method, $call)
+ {
+ $returnFirstCallCallback = function ($calls, $object, $method) {
+ throw new RuntimeException;
+ };
+
+ $this->beConstructedWith($returnFirstCallCallback);
+
+ $this->shouldThrow('RuntimeException')->duringCheck(array($call), $object, $method);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
new file mode 100644
index 0000000..a3ef9bc
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
@@ -0,0 +1,43 @@
+shouldHaveType('Prophecy\Prediction\PredictionInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_does_nothing_if_there_is_no_calls_made($object, $method)
+ {
+ $this->check(array(), $object, $method)->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ * @param \Prophecy\Call\Call $call
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_throws_UnexpectedCallsException_if_calls_found($object, $method, $call, $arguments)
+ {
+ $method->getObjectProphecy()->willReturn($object);
+ $method->getMethodName()->willReturn('getName');
+ $method->getArgumentsWildcard()->willReturn($arguments);
+ $arguments->__toString()->willReturn('123');
+
+ $call->getMethodName()->willReturn('getName');
+ $call->getArguments()->willReturn(array(5, 4, 'three'));
+ $call->getCallPlace()->willReturn('unknown');
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\UnexpectedCallsException')
+ ->duringCheck(array($call), $object, $method);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
new file mode 100644
index 0000000..5d99b1b
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
@@ -0,0 +1,110 @@
+beConstructedWith('get_class');
+ }
+
+ function it_is_promise()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_closure_callback($object, $method)
+ {
+ $firstArgumentCallback = function ($args) {
+ return $args[0];
+ };
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_static_array_callback($object, $method)
+ {
+ $firstArgumentCallback = array('spec\Prophecy\Promise\ClassCallback', 'staticCallbackMethod');
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_instance_array_callback($object, $method)
+ {
+ $class = new ClassCallback();
+ $firstArgumentCallback = array($class, 'callbackMethod');
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_execute_string_function_callback($object, $method)
+ {
+ $firstArgumentCallback = 'spec\Prophecy\Promise\functionCallbackFirstArgument';
+
+ $this->beConstructedWith($firstArgumentCallback);
+
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+}
+
+/**
+ * Class used to test callbackpromise
+ *
+ * @param array
+ * @return string
+ */
+class ClassCallback
+{
+ /**
+ * @param array $args
+ */
+ function callbackMethod($args)
+ {
+ return $args[0];
+ }
+
+ /**
+ * @param array $args
+ */
+ static function staticCallbackMethod($args)
+ {
+ return $args[0];
+ }
+}
+
+/**
+ * Callback function used to test callbackpromise
+ *
+ * @param array
+ * @return string
+ */
+function functionCallbackFirstArgument($args)
+{
+ return $args[0];
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
new file mode 100644
index 0000000..1b534d9
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
@@ -0,0 +1,31 @@
+shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_return_first_argument_if_provided($object, $method)
+ {
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('one');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_return_null_if_no_arguments_provided($object, $method)
+ {
+ $this->execute(array(), $object, $method)->shouldReturn(null);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
new file mode 100644
index 0000000..18bfd87
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
@@ -0,0 +1,61 @@
+beConstructedWith(array(42));
+ }
+
+ function it_is_promise()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_returns_value_it_was_constructed_with($object, $method)
+ {
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_always_returns_last_value_left_in_the_return_values($object, $method)
+ {
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_consequently_returns_multiple_values_it_was_constructed_with($object, $method)
+ {
+ $this->beConstructedWith(array(42, 24, 12));
+
+ $this->execute(array(), $object, $method)->shouldReturn(42);
+ $this->execute(array(), $object, $method)->shouldReturn(24);
+ $this->execute(array(), $object, $method)->shouldReturn(12);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_returns_null_if_constructed_with_empty_array($object, $method)
+ {
+ $this->beConstructedWith(array());
+
+ $this->execute(array(), $object, $method)->shouldReturn(null);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
new file mode 100644
index 0000000..5f44897
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
@@ -0,0 +1,58 @@
+beConstructedWith('RuntimeException');
+ }
+
+ function it_is_promise()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Promise\PromiseInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_instantiates_and_throws_exception_from_provided_classname($object, $method)
+ {
+ $this->beConstructedWith('InvalidArgumentException');
+
+ $this->shouldThrow('InvalidArgumentException')
+ ->duringExecute(array(), $object, $method);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_instantiates_exceptions_with_required_arguments($object, $method)
+ {
+ $this->beConstructedWith('spec\Prophecy\Promise\RequiredArgumentException');
+
+ $this->shouldThrow('spec\Prophecy\Promise\RequiredArgumentException')
+ ->duringExecute(array(), $object, $method);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_throws_provided_exception($object, $method)
+ {
+ $this->beConstructedWith($exc = new \RuntimeException('Some exception'));
+
+ $this->shouldThrow($exc)->duringExecute(array(), $object, $method);
+ }
+}
+
+class RequiredArgumentException extends \Exception
+{
+ final public function __construct($message, $code) {}
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
new file mode 100644
index 0000000..4c4a76c
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
@@ -0,0 +1,371 @@
+reveal()->willReturn($reflection);
+
+ $this->beConstructedWith($objectProphecy, 'getName', null);
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Prophecy\MethodProphecy');
+ }
+
+ function its_constructor_throws_MethodNotFoundException_for_unexisting_method($objectProphecy)
+ {
+ $this->shouldThrow('Prophecy\Exception\Doubler\MethodNotFoundException')->during(
+ '__construct', array($objectProphecy, 'getUnexisting', null)
+ );
+ }
+
+ function its_constructor_throws_MethodProphecyException_for_final_methods($objectProphecy, ClassWithFinalMethod $subject)
+ {
+ $objectProphecy->reveal()->willReturn($subject);
+
+ $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->during(
+ '__construct', array($objectProphecy, 'finalMethod', null)
+ );
+ }
+
+ function its_constructor_transforms_array_passed_as_3rd_argument_to_ArgumentsWildcard(
+ $objectProphecy
+ )
+ {
+ $this->beConstructedWith($objectProphecy, 'getName', array(42, 33));
+
+ $wildcard = $this->getArgumentsWildcard();
+ $wildcard->shouldNotBe(null);
+ $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
+ }
+
+ function its_constructor_does_not_touch_third_argument_if_it_is_null($objectProphecy)
+ {
+ $this->beConstructedWith($objectProphecy, 'getName', null);
+
+ $wildcard = $this->getArgumentsWildcard();
+ $wildcard->shouldBe(null);
+ }
+
+ /**
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_records_promise_through_will_method($promise, $objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->will($promise);
+ $this->getPromise()->shouldReturn($promise);
+ }
+
+ /**
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_adds_itself_to_ObjectProphecy_during_call_to_will($objectProphecy, $promise)
+ {
+ $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
+
+ $this->will($promise);
+ }
+
+ function it_adds_ReturnPromise_during_willReturn_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willReturn(42);
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnPromise');
+ }
+
+ function it_adds_ThrowPromise_during_willThrow_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willThrow('RuntimeException');
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ThrowPromise');
+ }
+
+ function it_adds_ReturnArgumentPromise_during_willReturnArgument_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willReturnArgument();
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
+ }
+
+ function it_adds_CallbackPromise_during_will_call_with_callback_argument($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $callback = function () {};
+
+ $this->will($callback);
+ $this->getPromise()->shouldBeAnInstanceOf('Prophecy\Promise\CallbackPromise');
+ }
+
+ /**
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ */
+ function it_records_prediction_through_should_method($prediction, $objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('should', array($prediction));
+ $this->getPrediction()->shouldReturn($prediction);
+ }
+
+ function it_adds_CallbackPrediction_during_should_call_with_callback_argument($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $callback = function () {};
+
+ $this->callOnWrappedObject('should', array($callback));
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallbackPrediction');
+ }
+
+ /**
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ */
+ function it_adds_itself_to_ObjectProphecy_during_call_to_should($objectProphecy, $prediction)
+ {
+ $objectProphecy->addMethodProphecy($this)->shouldBeCalled();
+
+ $this->callOnWrappedObject('should', array($prediction));
+ }
+
+ function it_adds_CallPrediction_during_shouldBeCalled_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('shouldBeCalled', array());
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallPrediction');
+ }
+
+ function it_adds_NoCallsPrediction_during_shouldNotBeCalled_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('shouldNotBeCalled', array());
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\NoCallsPrediction');
+ }
+
+ function it_adds_CallTimesPrediction_during_shouldBeCalledTimes_call($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->callOnWrappedObject('shouldBeCalledTimes', array(5));
+ $this->getPrediction()->shouldBeAnInstanceOf('Prophecy\Prediction\CallTimesPrediction');
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_checks_prediction_via_shouldHave_method_call(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_sets_return_promise_during_shouldHave_call_if_none_was_set_before(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+
+ $this->getPromise()->shouldReturnAnInstanceOf('Prophecy\Promise\ReturnPromise');
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_does_not_set_return_promise_during_shouldHave_call_if_it_was_set_before(
+ $objectProphecy, $arguments, $prediction, $call1, $call2, $promise
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->will($promise);
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+
+ $this->getPromise()->shouldReturn($promise);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction1
+ * @param \Prophecy\Prediction\PredictionInterface $prediction2
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_records_checked_predictions(
+ $objectProphecy, $arguments, $prediction1, $prediction2, $call1, $call2, $promise
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction1->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
+ $prediction2->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willReturn();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->will($promise);
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('shouldHave', array($prediction1));
+ $this->callOnWrappedObject('shouldHave', array($prediction2));
+
+ $this->getCheckedPredictions()->shouldReturn(array($prediction1, $prediction2));
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ * @param \Prophecy\Promise\PromiseInterface $promise
+ */
+ function it_records_even_failed_checked_predictions(
+ $objectProphecy, $arguments, $prediction, $call1, $call2, $promise
+ )
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->willThrow(new \RuntimeException());
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->will($promise);
+ $this->withArguments($arguments);
+
+ try {
+ $this->callOnWrappedObject('shouldHave', array($prediction));
+ } catch (\Exception $e) {}
+
+ $this->getCheckedPredictions()->shouldReturn(array($prediction));
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_checks_prediction_via_shouldHave_method_call_with_callback(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $callback = function ($calls, $object, $method) {
+ throw new \RuntimeException;
+ };
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+
+ $this->withArguments($arguments);
+ $this->shouldThrow('RuntimeException')->duringShouldHave($callback);
+ }
+
+ function it_does_nothing_during_checkPrediction_if_no_prediction_set()
+ {
+ $this->checkPrediction()->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ * @param \Prophecy\Prediction\PredictionInterface $prediction
+ * @param \Prophecy\Call\Call $call1
+ * @param \Prophecy\Call\Call $call2
+ */
+ function it_checks_set_prediction_during_checkPrediction(
+ $objectProphecy, $arguments, $prediction, $call1, $call2
+ )
+ {
+ $prediction->check(array($call1, $call2), $objectProphecy->getWrappedObject(), $this)->shouldBeCalled();
+ $objectProphecy->findProphecyMethodCalls('getName', $arguments)->willReturn(array($call1, $call2));
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->withArguments($arguments);
+ $this->callOnWrappedObject('should', array($prediction));
+ $this->checkPrediction();
+ }
+
+ function it_links_back_to_ObjectProphecy_through_getter($objectProphecy)
+ {
+ $this->getObjectProphecy()->shouldReturn($objectProphecy);
+ }
+
+ function it_has_MethodName()
+ {
+ $this->getMethodName()->shouldReturn('getName');
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ */
+ function it_contains_ArgumentsWildcard_it_was_constructed_with($objectProphecy, $wildcard)
+ {
+ $this->beConstructedWith($objectProphecy, 'getName', $wildcard);
+
+ $this->getArgumentsWildcard()->shouldReturn($wildcard);
+ }
+
+ /**
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ */
+ function its_ArgumentWildcard_is_mutable_through_setter($wildcard)
+ {
+ $this->withArguments($wildcard);
+
+ $this->getArgumentsWildcard()->shouldReturn($wildcard);
+ }
+
+ function its_withArguments_transforms_passed_array_into_ArgumentsWildcard()
+ {
+ $this->withArguments(array(42, 33));
+
+ $wildcard = $this->getArgumentsWildcard();
+ $wildcard->shouldNotBe(null);
+ $wildcard->__toString()->shouldReturn('exact(42), exact(33)');
+ }
+
+ function its_withArguments_throws_exception_if_wrong_arguments_provided()
+ {
+ $this->shouldThrow('Prophecy\Exception\InvalidArgumentException')->duringWithArguments(42);
+ }
+}
+
+class ClassWithFinalMethod
+{
+ final public function finalMethod() {}
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
new file mode 100644
index 0000000..0ba3768
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
@@ -0,0 +1,286 @@
+beConstructedWith($lazyDouble);
+
+ $lazyDouble->getInstance()->willReturn($double);
+ }
+
+ function it_implements_ProphecyInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Prophecy\ProphecyInterface');
+ }
+
+ function it_sets_parentClass_during_willExtend_call($lazyDouble)
+ {
+ $lazyDouble->setParentClass('123')->shouldBeCalled();
+
+ $this->willExtend('123');
+ }
+
+ function it_adds_interface_during_willImplement_call($lazyDouble)
+ {
+ $lazyDouble->addInterface('222')->shouldBeCalled();
+
+ $this->willImplement('222');
+ }
+
+ function it_sets_constructor_arguments_during_willBeConstructedWith_call($lazyDouble)
+ {
+ $lazyDouble->setArguments(array(1, 2, 5))->shouldBeCalled();
+
+ $this->willBeConstructedWith(array(1, 2, 5));
+ }
+
+ function it_does_not_have_method_prophecies_by_default()
+ {
+ $this->getMethodProphecies()->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments
+ */
+ function it_should_get_method_prophecies_by_method_name($method1, $method2, $arguments)
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments);
+ $method2->getMethodName()->willReturn('setName');
+ $method2->getArgumentsWildcard()->willReturn($arguments);
+
+ $this->addMethodProphecy($method1);
+ $this->addMethodProphecy($method2);
+
+ $methods = $this->getMethodProphecies('setName');
+ $methods->shouldHaveCount(1);
+ $methods[0]->getMethodName()->shouldReturn('setName');
+ }
+
+ function it_should_return_empty_array_if_no_method_prophecies_found()
+ {
+ $methods = $this->getMethodProphecies('setName');
+ $methods->shouldHaveCount(0);
+ }
+
+ /**
+ * @param \Prophecy\Call\CallCenter $callCenter
+ */
+ function it_should_proxy_makeProphecyMethodCall_to_CallCenter($lazyDouble, $callCenter)
+ {
+ $this->beConstructedWith($lazyDouble, $callCenter);
+
+ $callCenter->makeCall($this->getWrappedObject(), 'setName', array('everzet'))->willReturn(42);
+
+ $this->makeProphecyMethodCall('setName', array('everzet'))->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Call\CallCenter $callCenter
+ * @param \Prophecy\Prophecy\RevealerInterface $revealer
+ */
+ function it_should_reveal_arguments_and_return_values_from_callCenter(
+ $lazyDouble, $callCenter, $revealer
+ )
+ {
+ $this->beConstructedWith($lazyDouble, $callCenter, $revealer);
+
+ $revealer->reveal(array('question'))->willReturn(array('life'));
+ $revealer->reveal('answer')->willReturn(42);
+
+ $callCenter->makeCall($this->getWrappedObject(), 'setName', array('life'))->willReturn('answer');
+
+ $this->makeProphecyMethodCall('setName', array('question'))->shouldReturn(42);
+ }
+
+ /**
+ * @param \Prophecy\Call\CallCenter $callCenter
+ * @param \Prophecy\Argument\ArgumentsWildcard $wildcard
+ * @param \Prophecy\Call\Call $call
+ */
+ function it_should_proxy_getProphecyMethodCalls_to_CallCenter(
+ $lazyDouble, $callCenter, $wildcard, $call
+ )
+ {
+ $this->beConstructedWith($lazyDouble, $callCenter);
+
+ $callCenter->findCalls('setName', $wildcard)->willReturn(array($call));
+
+ $this->findProphecyMethodCalls('setName', $wildcard)->shouldReturn(array($call));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard
+ */
+ function its_addMethodProphecy_adds_method_prophecy(
+ $methodProphecy, $argumentsWildcard
+ )
+ {
+ $methodProphecy->getArgumentsWildcard()->willReturn($argumentsWildcard);
+ $methodProphecy->getMethodName()->willReturn('getUsername');
+
+ $this->addMethodProphecy($methodProphecy);
+
+ $this->getMethodProphecies()->shouldReturn(array(
+ 'getUsername' => array($methodProphecy)
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
+ */
+ function its_addMethodProphecy_handles_prophecies_with_different_arguments(
+ $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
+ )
+ {
+ $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
+ $methodProphecy1->getMethodName()->willReturn('getUsername');
+
+ $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
+ $methodProphecy2->getMethodName()->willReturn('getUsername');
+
+ $this->addMethodProphecy($methodProphecy1);
+ $this->addMethodProphecy($methodProphecy2);
+
+ $this->getMethodProphecies()->shouldReturn(array(
+ 'getUsername' => array(
+ $methodProphecy1,
+ $methodProphecy2,
+ )
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
+ */
+ function its_addMethodProphecy_handles_prophecies_for_different_methods(
+ $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
+ )
+ {
+ $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
+ $methodProphecy1->getMethodName()->willReturn('getUsername');
+
+ $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
+ $methodProphecy2->getMethodName()->willReturn('isUsername');
+
+ $this->addMethodProphecy($methodProphecy1);
+ $this->addMethodProphecy($methodProphecy2);
+
+ $this->getMethodProphecies()->shouldReturn(array(
+ 'getUsername' => array(
+ $methodProphecy1
+ ),
+ 'isUsername' => array(
+ $methodProphecy2
+ )
+ ));
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy
+ */
+ function its_addMethodProphecy_throws_exception_when_method_has_no_ArgumentsWildcard(
+ $methodProphecy
+ )
+ {
+ $methodProphecy->getArgumentsWildcard()->willReturn(null);
+ $methodProphecy->getObjectProphecy()->willReturn($this);
+ $methodProphecy->getMethodName()->willReturn('getTitle');
+
+ $this->shouldThrow('Prophecy\Exception\Prophecy\MethodProphecyException')->duringAddMethodProphecy(
+ $methodProphecy
+ );
+ }
+
+ function it_returns_null_after_checkPredictions_call_if_there_is_no_method_prophecies()
+ {
+ $this->checkProphecyMethodsPredictions()->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy1
+ * @param \Prophecy\Prophecy\MethodProphecy $methodProphecy2
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard1
+ * @param \Prophecy\Argument\ArgumentsWildcard $argumentsWildcard2
+ */
+ function it_throws_AggregateException_during_checkPredictions_if_predictions_fail(
+ $methodProphecy1, $methodProphecy2, $argumentsWildcard1, $argumentsWildcard2
+ )
+ {
+ $methodProphecy1->getMethodName()->willReturn('getName');
+ $methodProphecy1->getArgumentsWildcard()->willReturn($argumentsWildcard1);
+ $methodProphecy1->checkPrediction()
+ ->willThrow('Prophecy\Exception\Prediction\AggregateException');
+
+ $methodProphecy2->getMethodName()->willReturn('setName');
+ $methodProphecy2->getArgumentsWildcard()->willReturn($argumentsWildcard2);
+ $methodProphecy2->checkPrediction()
+ ->willThrow('Prophecy\Exception\Prediction\AggregateException');
+
+ $this->addMethodProphecy($methodProphecy1);
+ $this->addMethodProphecy($methodProphecy2);
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
+ ->duringCheckProphecyMethodsPredictions();
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_new_MethodProphecy_instance_for_arbitrary_call($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $return = $this->getProphecy();
+ $return->shouldBeAnInstanceOf('Prophecy\Prophecy\MethodProphecy');
+ $return->getMethodName()->shouldReturn('getProphecy');
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_same_MethodProphecy_for_same_registered_signature($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3));
+ $methodProphecy2 = $this->getProphecy(1, 2, 3);
+
+ $methodProphecy2->shouldBe($methodProphecy1);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_new_MethodProphecy_for_different_signatures($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(3, 2, 1));
+ $methodProphecy2 = $this->getProphecy(1, 2, 3);
+
+ $methodProphecy2->shouldNotBe($methodProphecy1);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
new file mode 100644
index 0000000..4d83d73
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
@@ -0,0 +1,51 @@
+shouldBeAnInstanceOf('Prophecy\Prophecy\RevealerInterface');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecyInterface $prophecy
+ * @param \stdClass $object
+ */
+ function it_reveals_single_instance_of_ProphecyInterface($prophecy, $object)
+ {
+ $prophecy->reveal()->willReturn($object);
+
+ $this->reveal($prophecy)->shouldReturn($object);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecyInterface $prophecy1
+ * @param \Prophecy\Prophecy\ProphecyInterface $prophecy2
+ * @param \stdClass $object1
+ * @param \stdClass $object2
+ */
+ function it_reveals_instances_of_ProphecyInterface_inside_array(
+ $prophecy1, $prophecy2, $object1, $object2
+ )
+ {
+ $prophecy1->reveal()->willReturn($object1);
+ $prophecy2->reveal()->willReturn($object2);
+
+ $this->reveal(array(
+ array('item' => $prophecy2),
+ $prophecy1
+ ))->shouldReturn(array(
+ array('item' => $object2),
+ $object1
+ ));
+ }
+
+ function it_does_not_touch_non_prophecy_interface()
+ {
+ $this->reveal(42)->shouldReturn(42);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
new file mode 100644
index 0000000..74d5976
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
@@ -0,0 +1,91 @@
+double(null, array())->willReturn($double);
+
+ $this->beConstructedWith($doubler);
+ }
+
+ function it_constructs_new_prophecy_on_prophesize_call()
+ {
+ $prophecy = $this->prophesize();
+ $prophecy->shouldBeAnInstanceOf('Prophecy\Prophecy\ObjectProphecy');
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $newDouble
+ */
+ function it_constructs_new_prophecy_with_parent_class_if_specified($doubler, $newDouble)
+ {
+ $doubler->double(Argument::any(), array())->willReturn($newDouble);
+
+ $this->prophesize('Prophecy\Prophet')->reveal()->shouldReturn($newDouble);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $newDouble
+ */
+ function it_constructs_new_prophecy_with_interface_if_specified($doubler, $newDouble)
+ {
+ $doubler->double(null, Argument::any())->willReturn($newDouble);
+
+ $this->prophesize('ArrayAccess')->reveal()->shouldReturn($newDouble);
+ }
+
+ function it_exposes_all_created_prophecies_through_getter()
+ {
+ $prophecy1 = $this->prophesize();
+ $prophecy2 = $this->prophesize();
+
+ $this->getProphecies()->shouldReturn(array($prophecy1, $prophecy2));
+ }
+
+ function it_does_nothing_during_checkPredictions_call_if_no_predictions_defined()
+ {
+ $this->checkPredictions()->shouldReturn(null);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\MethodProphecy $method1
+ * @param \Prophecy\Prophecy\MethodProphecy $method2
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments1
+ * @param \Prophecy\Argument\ArgumentsWildcard $arguments2
+ */
+ function it_throws_AggregateException_if_defined_predictions_fail(
+ $method1, $method2, $arguments1, $arguments2
+ )
+ {
+ $method1->getMethodName()->willReturn('getName');
+ $method1->getArgumentsWildcard()->willReturn($arguments1);
+ $method1->checkPrediction()->willReturn(null);
+
+ $method2->getMethodName()->willReturn('isSet');
+ $method2->getArgumentsWildcard()->willReturn($arguments2);
+ $method2->checkPrediction()->willThrow(
+ 'Prophecy\Exception\Prediction\AggregateException'
+ );
+
+ $this->prophesize()->addMethodProphecy($method1);
+ $this->prophesize()->addMethodProphecy($method2);
+
+ $this->shouldThrow('Prophecy\Exception\Prediction\AggregateException')
+ ->duringCheckPredictions();
+ }
+
+ function it_exposes_doubler_through_getter($doubler)
+ {
+ $this->getDoubler()->shouldReturn($doubler);
+ }
+}
diff --git a/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php b/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
new file mode 100644
index 0000000..e4835d8
--- /dev/null
+++ b/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
@@ -0,0 +1,92 @@
+stringify(42)->shouldReturn('42');
+ }
+
+ function it_generates_proper_string_representation_for_string()
+ {
+ $this->stringify('some string')->shouldReturn('"some string"');
+ }
+
+ function it_generates_single_line_representation_for_multiline_string()
+ {
+ $this->stringify("some\nstring")->shouldReturn('"some\\nstring"');
+ }
+
+ function it_generates_proper_string_representation_for_double()
+ {
+ $this->stringify(42.3)->shouldReturn('42.3');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_true()
+ {
+ $this->stringify(true)->shouldReturn('true');
+ }
+
+ function it_generates_proper_string_representation_for_boolean_false()
+ {
+ $this->stringify(false)->shouldReturn('false');
+ }
+
+ function it_generates_proper_string_representation_for_null()
+ {
+ $this->stringify(null)->shouldReturn('null');
+ }
+
+ function it_generates_proper_string_representation_for_empty_array()
+ {
+ $this->stringify(array())->shouldReturn('[]');
+ }
+
+ function it_generates_proper_string_representation_for_array()
+ {
+ $this->stringify(array('zet', 42))->shouldReturn('["zet", 42]');
+ }
+
+ function it_generates_proper_string_representation_for_hash()
+ {
+ $this->stringify(array('ever' => 'zet', 52 => 'hey', 'num' => 42))->shouldReturn(
+ '["ever" => "zet", 52 => "hey", "num" => 42]'
+ );
+ }
+
+ function it_generates_proper_string_representation_for_resource()
+ {
+ $resource = fopen(__FILE__, 'r');
+ $this->stringify($resource)->shouldReturn('stream:'.$resource);
+ }
+
+ /**
+ * @param \stdClass $object
+ */
+ function it_generates_proper_string_representation_for_object($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ ) . " Object (\n 'objectProphecy' => Prophecy\Prophecy\ObjectProphecy Object (*Prophecy*)\n)";
+
+ $this->stringify($object)->shouldReturn("$objHash");
+ }
+
+ /**
+ * @param stdClass $object
+ */
+ function it_generates_proper_string_representation_for_object_without_exporting($object)
+ {
+ $objHash = sprintf('%s:%s',
+ get_class($object->getWrappedObject()),
+ spl_object_hash($object->getWrappedObject())
+ );
+
+ $this->stringify($object, false)->shouldReturn("$objHash");
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument.php b/vendor/phpspec/prophecy/src/Prophecy/Argument.php
new file mode 100644
index 0000000..f2b3364
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument.php
@@ -0,0 +1,198 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy;
+
+use Prophecy\Argument\Token;
+
+/**
+ * Argument tokens shortcuts.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Argument
+{
+ /**
+ * Checks that argument is exact value or object.
+ *
+ * @param mixed $value
+ *
+ * @return Token\ExactValueToken
+ */
+ public static function exact($value)
+ {
+ return new Token\ExactValueToken($value);
+ }
+
+ /**
+ * Checks that argument is of specific type or instance of specific class.
+ *
+ * @param string $type Type name (`integer`, `string`) or full class name
+ *
+ * @return Token\TypeToken
+ */
+ public static function type($type)
+ {
+ return new Token\TypeToken($type);
+ }
+
+ /**
+ * Checks that argument object has specific state.
+ *
+ * @param string $methodName
+ * @param mixed $value
+ *
+ * @return Token\ObjectStateToken
+ */
+ public static function which($methodName, $value)
+ {
+ return new Token\ObjectStateToken($methodName, $value);
+ }
+
+ /**
+ * Checks that argument matches provided callback.
+ *
+ * @param callable $callback
+ *
+ * @return Token\CallbackToken
+ */
+ public static function that($callback)
+ {
+ return new Token\CallbackToken($callback);
+ }
+
+ /**
+ * Matches any single value.
+ *
+ * @return Token\AnyValueToken
+ */
+ public static function any()
+ {
+ return new Token\AnyValueToken;
+ }
+
+ /**
+ * Matches all values to the rest of the signature.
+ *
+ * @return Token\AnyValuesToken
+ */
+ public static function cetera()
+ {
+ return new Token\AnyValuesToken;
+ }
+
+ /**
+ * Checks that argument matches all tokens
+ *
+ * @param mixed ... a list of tokens
+ *
+ * @return Token\LogicalAndToken
+ */
+ public static function allOf()
+ {
+ return new Token\LogicalAndToken(func_get_args());
+ }
+
+ /**
+ * Checks that argument array or countable object has exact number of elements.
+ *
+ * @param integer $value array elements count
+ *
+ * @return Token\ArrayCountToken
+ */
+ public static function size($value)
+ {
+ return new Token\ArrayCountToken($value);
+ }
+
+ /**
+ * Checks that argument array contains (key, value) pair
+ *
+ * @param mixed $key exact value or token
+ * @param mixed $value exact value or token
+ *
+ * @return Token\ArrayEntryToken
+ */
+ public static function withEntry($key, $value)
+ {
+ return new Token\ArrayEntryToken($key, $value);
+ }
+
+ /**
+ * Checks that arguments array entries all match value
+ *
+ * @param mixed $value
+ *
+ * @return Token\ArrayEveryEntryToken
+ */
+ public static function withEveryEntry($value)
+ {
+ return new Token\ArrayEveryEntryToken($value);
+ }
+
+ /**
+ * Checks that argument array contains value
+ *
+ * @param mixed $value
+ *
+ * @return Token\ArrayEntryToken
+ */
+ public static function containing($value)
+ {
+ return new Token\ArrayEntryToken(self::any(), $value);
+ }
+
+ /**
+ * Checks that argument array has key
+ *
+ * @param mixed $key exact value or token
+ *
+ * @return Token\ArrayEntryToken
+ */
+ public static function withKey($key)
+ {
+ return new Token\ArrayEntryToken($key, self::any());
+ }
+
+ /**
+ * Checks that argument does not match the value|token.
+ *
+ * @param mixed $value either exact value or argument token
+ *
+ * @return Token\LogicalNotToken
+ */
+ public static function not($value)
+ {
+ return new Token\LogicalNotToken($value);
+ }
+
+ /**
+ * @param string $value
+ *
+ * @return Token\StringContainsToken
+ */
+ public static function containingString($value)
+ {
+ return new Token\StringContainsToken($value);
+ }
+
+ /**
+ * Checks that argument is identical value.
+ *
+ * @param mixed $value
+ *
+ * @return Token\IdenticalValueToken
+ */
+ public static function is($value)
+ {
+ return new Token\IdenticalValueToken($value);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
new file mode 100644
index 0000000..2e78051
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
@@ -0,0 +1,93 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument;
+
+/**
+ * Arguments wildcarding.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ArgumentsWildcard
+{
+ /**
+ * @var Token\TokenInterface[]
+ */
+ private $tokens = array();
+ private $string;
+
+ /**
+ * Initializes wildcard.
+ *
+ * @param array $arguments Array of argument tokens or values
+ */
+ public function __construct(array $arguments)
+ {
+ foreach ($arguments as $argument) {
+ if (!$argument instanceof Token\TokenInterface) {
+ $argument = new Token\ExactValueToken($argument);
+ }
+
+ $this->tokens[] = $argument;
+ }
+ }
+
+ /**
+ * Calculates wildcard match score for provided arguments.
+ *
+ * @param array $arguments
+ *
+ * @return false|int False OR integer score (higher - better)
+ */
+ public function scoreArguments(array $arguments)
+ {
+ if (0 == count($arguments) && 0 == count($this->tokens)) {
+ return 1;
+ }
+
+ $arguments = array_values($arguments);
+ $totalScore = 0;
+ foreach ($this->tokens as $i => $token) {
+ $argument = isset($arguments[$i]) ? $arguments[$i] : null;
+ if (1 >= $score = $token->scoreArgument($argument)) {
+ return false;
+ }
+
+ $totalScore += $score;
+
+ if (true === $token->isLast()) {
+ return $totalScore;
+ }
+ }
+
+ if (count($arguments) > count($this->tokens)) {
+ return false;
+ }
+
+ return $totalScore;
+ }
+
+ /**
+ * Returns string representation for wildcard.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (null === $this->string) {
+ $this->string = implode(', ', array_map(function ($token) {
+ return (string) $token;
+ }, $this->tokens));
+ }
+
+ return $this->string;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php
new file mode 100644
index 0000000..5098811
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php
@@ -0,0 +1,52 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Any single value token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class AnyValueToken implements TokenInterface
+{
+ /**
+ * Always scores 3 for any argument.
+ *
+ * @param $argument
+ *
+ * @return int
+ */
+ public function scoreArgument($argument)
+ {
+ return 3;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return '*';
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php
new file mode 100644
index 0000000..f76b17b
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php
@@ -0,0 +1,52 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Any values token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class AnyValuesToken implements TokenInterface
+{
+ /**
+ * Always scores 2 for any argument.
+ *
+ * @param $argument
+ *
+ * @return int
+ */
+ public function scoreArgument($argument)
+ {
+ return 2;
+ }
+
+ /**
+ * Returns true to stop wildcard from processing other tokens.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return true;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return '* [, ...]';
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php
new file mode 100644
index 0000000..96b4bef
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php
@@ -0,0 +1,86 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Array elements count token.
+ *
+ * @author Boris Mikhaylov
+ */
+
+class ArrayCountToken implements TokenInterface
+{
+ private $count;
+
+ /**
+ * @param integer $value
+ */
+ public function __construct($value)
+ {
+ $this->count = $value;
+ }
+
+ /**
+ * Scores 6 when argument has preset number of elements.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return $this->isCountable($argument) && $this->hasProperCount($argument) ? 6 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return boolean
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('count(%s)', $this->count);
+ }
+
+ /**
+ * Returns true if object is either array or instance of \Countable
+ *
+ * @param $argument
+ * @return bool
+ */
+ private function isCountable($argument)
+ {
+ return (is_array($argument) || $argument instanceof \Countable);
+ }
+
+ /**
+ * Returns true if $argument has expected number of elements
+ *
+ * @param array|\Countable $argument
+ *
+ * @return bool
+ */
+ private function hasProperCount($argument)
+ {
+ return $this->count === count($argument);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php
new file mode 100644
index 0000000..0305fc7
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php
@@ -0,0 +1,143 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Array entry token.
+ *
+ * @author Boris Mikhaylov
+ */
+class ArrayEntryToken implements TokenInterface
+{
+ /** @var \Prophecy\Argument\Token\TokenInterface */
+ private $key;
+ /** @var \Prophecy\Argument\Token\TokenInterface */
+ private $value;
+
+ /**
+ * @param mixed $key exact value or token
+ * @param mixed $value exact value or token
+ */
+ public function __construct($key, $value)
+ {
+ $this->key = $this->wrapIntoExactValueToken($key);
+ $this->value = $this->wrapIntoExactValueToken($value);
+ }
+
+ /**
+ * Scores half of combined scores from key and value tokens for same entry. Capped at 8.
+ * If argument implements \ArrayAccess without \Traversable, then key token is restricted to ExactValueToken.
+ *
+ * @param array|\ArrayAccess|\Traversable $argument
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if ($argument instanceof \Traversable) {
+ $argument = iterator_to_array($argument);
+ }
+
+ if ($argument instanceof \ArrayAccess) {
+ $argument = $this->convertArrayAccessToEntry($argument);
+ }
+
+ if (!is_array($argument) || empty($argument)) {
+ return false;
+ }
+
+ $keyScores = array_map(array($this->key,'scoreArgument'), array_keys($argument));
+ $valueScores = array_map(array($this->value,'scoreArgument'), $argument);
+ $scoreEntry = function ($value, $key) {
+ return $value && $key ? min(8, ($key + $value) / 2) : false;
+ };
+
+ return max(array_map($scoreEntry, $valueScores, $keyScores));
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return boolean
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('[..., %s => %s, ...]', $this->key, $this->value);
+ }
+
+ /**
+ * Returns key
+ *
+ * @return TokenInterface
+ */
+ public function getKey()
+ {
+ return $this->key;
+ }
+
+ /**
+ * Returns value
+ *
+ * @return TokenInterface
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Wraps non token $value into ExactValueToken
+ *
+ * @param $value
+ * @return TokenInterface
+ */
+ private function wrapIntoExactValueToken($value)
+ {
+ return $value instanceof TokenInterface ? $value : new ExactValueToken($value);
+ }
+
+ /**
+ * Converts instance of \ArrayAccess to key => value array entry
+ *
+ * @param \ArrayAccess $object
+ *
+ * @return array|null
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ private function convertArrayAccessToEntry(\ArrayAccess $object)
+ {
+ if (!$this->key instanceof ExactValueToken) {
+ throw new InvalidArgumentException(sprintf(
+ 'You can only use exact value tokens to match key of ArrayAccess object'.PHP_EOL.
+ 'But you used `%s`.',
+ $this->key
+ ));
+ }
+
+ $key = $this->key->getValue();
+
+ return $object->offsetExists($key) ? array($key => $object[$key]) : array();
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php
new file mode 100644
index 0000000..5d41fa4
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php
@@ -0,0 +1,82 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Array every entry token.
+ *
+ * @author Adrien Brault
+ */
+class ArrayEveryEntryToken implements TokenInterface
+{
+ /**
+ * @var TokenInterface
+ */
+ private $value;
+
+ /**
+ * @param mixed $value exact value or token
+ */
+ public function __construct($value)
+ {
+ if (!$value instanceof TokenInterface) {
+ $value = new ExactValueToken($value);
+ }
+
+ $this->value = $value;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function scoreArgument($argument)
+ {
+ if (!$argument instanceof \Traversable && !is_array($argument)) {
+ return false;
+ }
+
+ $scores = array();
+ foreach ($argument as $key => $argumentEntry) {
+ $scores[] = $this->value->scoreArgument($argumentEntry);
+ }
+
+ if (empty($scores) || in_array(false, $scores, true)) {
+ return false;
+ }
+
+ return array_sum($scores) / count($scores);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function __toString()
+ {
+ return sprintf('[%s, ..., %s]', $this->value, $this->value);
+ }
+
+ /**
+ * @return TokenInterface
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php
new file mode 100644
index 0000000..f45ba20
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php
@@ -0,0 +1,75 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Callback-verified token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallbackToken implements TokenInterface
+{
+ private $callback;
+
+ /**
+ * Initializes token.
+ *
+ * @param callable $callback
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function __construct($callback)
+ {
+ if (!is_callable($callback)) {
+ throw new InvalidArgumentException(sprintf(
+ 'Callable expected as an argument to CallbackToken, but got %s.',
+ gettype($callback)
+ ));
+ }
+
+ $this->callback = $callback;
+ }
+
+ /**
+ * Scores 7 if callback returns true, false otherwise.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return call_user_func($this->callback, $argument) ? 7 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'callback()';
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
new file mode 100644
index 0000000..3204118
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
@@ -0,0 +1,103 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Util\StringUtil;
+
+/**
+ * Exact value token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ExactValueToken implements TokenInterface
+{
+ private $value;
+ private $string;
+ private $util;
+
+ /**
+ * Initializes token.
+ *
+ * @param mixed $value
+ * @param StringUtil $util
+ */
+ public function __construct($value, StringUtil $util = null)
+ {
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil();
+ }
+
+ /**
+ * Scores 10 if argument matches preset value.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if (is_object($argument) && is_object($this->value) && $argument == $this->value) {
+ return 10;
+ }
+
+ // If either one is an object it should castable to a string
+ if (is_object($argument) xor is_object($this->value)) {
+ if (is_object($argument) && !method_exists($argument, '__toString')) {
+ return false;
+ }
+
+ if (is_object($this->value) && !method_exists($this->value, '__toString')) {
+ return false;
+ }
+ } elseif (is_numeric($argument) && is_numeric($this->value)) {
+ // noop
+ } elseif (gettype($argument) !== gettype($this->value)) {
+ return false;
+ }
+
+ return $argument == $this->value ? 10 : false;
+ }
+
+ /**
+ * Returns preset value against which token checks arguments.
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (null === $this->string) {
+ $this->string = sprintf('exact(%s)', $this->util->stringify($this->value));
+ }
+
+ return $this->string;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php
new file mode 100644
index 0000000..0b6d23a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php
@@ -0,0 +1,74 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Util\StringUtil;
+
+/**
+ * Identical value token.
+ *
+ * @author Florian Voutzinos
+ */
+class IdenticalValueToken implements TokenInterface
+{
+ private $value;
+ private $string;
+ private $util;
+
+ /**
+ * Initializes token.
+ *
+ * @param mixed $value
+ * @param StringUtil $util
+ */
+ public function __construct($value, StringUtil $util = null)
+ {
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil();
+ }
+
+ /**
+ * Scores 11 if argument matches preset value.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return $argument === $this->value ? 11 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if (null === $this->string) {
+ $this->string = sprintf('identical(%s)', $this->util->stringify($this->value));
+ }
+
+ return $this->string;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php
new file mode 100644
index 0000000..4ee1b25
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php
@@ -0,0 +1,80 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Logical AND token.
+ *
+ * @author Boris Mikhaylov
+ */
+class LogicalAndToken implements TokenInterface
+{
+ private $tokens = array();
+
+ /**
+ * @param array $arguments exact values or tokens
+ */
+ public function __construct(array $arguments)
+ {
+ foreach ($arguments as $argument) {
+ if (!$argument instanceof TokenInterface) {
+ $argument = new ExactValueToken($argument);
+ }
+ $this->tokens[] = $argument;
+ }
+ }
+
+ /**
+ * Scores maximum score from scores returned by tokens for this argument if all of them score.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if (0 === count($this->tokens)) {
+ return false;
+ }
+
+ $maxScore = 0;
+ foreach ($this->tokens as $token) {
+ $score = $token->scoreArgument($argument);
+ if (false === $score) {
+ return false;
+ }
+ $maxScore = max($score, $maxScore);
+ }
+
+ return $maxScore;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return boolean
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('bool(%s)', implode(' AND ', $this->tokens));
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php
new file mode 100644
index 0000000..623efa5
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php
@@ -0,0 +1,73 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Logical NOT token.
+ *
+ * @author Boris Mikhaylov
+ */
+class LogicalNotToken implements TokenInterface
+{
+ /** @var \Prophecy\Argument\Token\TokenInterface */
+ private $token;
+
+ /**
+ * @param mixed $value exact value or token
+ */
+ public function __construct($value)
+ {
+ $this->token = $value instanceof TokenInterface? $value : new ExactValueToken($value);
+ }
+
+ /**
+ * Scores 4 when preset token does not match the argument.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ return false === $this->token->scoreArgument($argument) ? 4 : false;
+ }
+
+ /**
+ * Returns true if preset token is last.
+ *
+ * @return bool|int
+ */
+ public function isLast()
+ {
+ return $this->token->isLast();
+ }
+
+ /**
+ * Returns originating token.
+ *
+ * @return TokenInterface
+ */
+ public function getOriginatingToken()
+ {
+ return $this->token;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('not(%s)', $this->token);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
new file mode 100644
index 0000000..8701add
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
@@ -0,0 +1,85 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Util\StringUtil;
+
+/**
+ * Object state-checker token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ObjectStateToken implements TokenInterface
+{
+ private $name;
+ private $value;
+ private $util;
+
+ /**
+ * Initializes token.
+ *
+ * @param string $methodName
+ * @param mixed $value Expected return value
+ * @param null|StringUtil $util
+ */
+ public function __construct($methodName, $value, StringUtil $util = null)
+ {
+ $this->name = $methodName;
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil;
+ }
+
+ /**
+ * Scores 8 if argument is an object, which method returns expected value.
+ *
+ * @param mixed $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if (is_object($argument) && method_exists($argument, $this->name)) {
+ $actual = call_user_func(array($argument, $this->name));
+
+ return $actual == $this->value ? 8 : false;
+ }
+
+ if (is_object($argument) && property_exists($argument, $this->name)) {
+ return $argument->{$this->name} === $this->value ? 8 : false;
+ }
+
+ return false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('state(%s(), %s)',
+ $this->name,
+ $this->util->stringify($this->value)
+ );
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
new file mode 100644
index 0000000..24ff8c2
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
@@ -0,0 +1,67 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * String contains token.
+ *
+ * @author Peter Mitchell
+ */
+class StringContainsToken implements TokenInterface
+{
+ private $value;
+
+ /**
+ * Initializes token.
+ *
+ * @param string $value
+ */
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ public function scoreArgument($argument)
+ {
+ return strpos($argument, $this->value) !== false ? 6 : false;
+ }
+
+ /**
+ * Returns preset value against which token checks arguments.
+ *
+ * @return mixed
+ */
+ public function getValue()
+ {
+ return $this->value;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('contains("%s")', $this->value);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php
new file mode 100644
index 0000000..625d3ba
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php
@@ -0,0 +1,43 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+/**
+ * Argument token interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface TokenInterface
+{
+ /**
+ * Calculates token match score for provided argument.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument);
+
+ /**
+ * Returns true if this token prevents check of other tokens (is last one).
+ *
+ * @return bool|int
+ */
+ public function isLast();
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString();
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php
new file mode 100644
index 0000000..cb65132
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php
@@ -0,0 +1,76 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Argument\Token;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Value type token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class TypeToken implements TokenInterface
+{
+ private $type;
+
+ /**
+ * @param string $type
+ */
+ public function __construct($type)
+ {
+ $checker = "is_{$type}";
+ if (!function_exists($checker) && !interface_exists($type) && !class_exists($type)) {
+ throw new InvalidArgumentException(sprintf(
+ 'Type or class name expected as an argument to TypeToken, but got %s.', $type
+ ));
+ }
+
+ $this->type = $type;
+ }
+
+ /**
+ * Scores 5 if argument has the same type this token was constructed with.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ $checker = "is_{$this->type}";
+ if (function_exists($checker)) {
+ return call_user_func($checker, $argument) ? 5 : false;
+ }
+
+ return $argument instanceof $this->type ? 5 : false;
+ }
+
+ /**
+ * Returns false.
+ *
+ * @return bool
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('type(%s)', $this->type);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
new file mode 100644
index 0000000..2f3fbad
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
@@ -0,0 +1,127 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Call;
+
+use Exception;
+
+/**
+ * Call object.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Call
+{
+ private $methodName;
+ private $arguments;
+ private $returnValue;
+ private $exception;
+ private $file;
+ private $line;
+
+ /**
+ * Initializes call.
+ *
+ * @param string $methodName
+ * @param array $arguments
+ * @param mixed $returnValue
+ * @param Exception $exception
+ * @param null|string $file
+ * @param null|int $line
+ */
+ public function __construct($methodName, array $arguments, $returnValue,
+ Exception $exception = null, $file, $line)
+ {
+ $this->methodName = $methodName;
+ $this->arguments = $arguments;
+ $this->returnValue = $returnValue;
+ $this->exception = $exception;
+
+ if ($file) {
+ $this->file = $file;
+ $this->line = intval($line);
+ }
+ }
+
+ /**
+ * Returns called method name.
+ *
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * Returns called method arguments.
+ *
+ * @return array
+ */
+ public function getArguments()
+ {
+ return $this->arguments;
+ }
+
+ /**
+ * Returns called method return value.
+ *
+ * @return null|mixed
+ */
+ public function getReturnValue()
+ {
+ return $this->returnValue;
+ }
+
+ /**
+ * Returns exception that call thrown.
+ *
+ * @return null|Exception
+ */
+ public function getException()
+ {
+ return $this->exception;
+ }
+
+ /**
+ * Returns callee filename.
+ *
+ * @return string
+ */
+ public function getFile()
+ {
+ return $this->file;
+ }
+
+ /**
+ * Returns callee line number.
+ *
+ * @return int
+ */
+ public function getLine()
+ {
+ return $this->line;
+ }
+
+ /**
+ * Returns short notation for callee place.
+ *
+ * @return string
+ */
+ public function getCallPlace()
+ {
+ if (null === $this->file) {
+ return 'unknown';
+ }
+
+ return sprintf('%s:%d', $this->file, $this->line);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
new file mode 100644
index 0000000..34cd5de
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
@@ -0,0 +1,153 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Call;
+
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Argument\ArgumentsWildcard;
+use Prophecy\Util\StringUtil;
+use Prophecy\Exception\Call\UnexpectedCallException;
+
+/**
+ * Calls receiver & manager.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallCenter
+{
+ private $util;
+
+ /**
+ * @var Call[]
+ */
+ private $recordedCalls = array();
+
+ /**
+ * Initializes call center.
+ *
+ * @param StringUtil $util
+ */
+ public function __construct(StringUtil $util = null)
+ {
+ $this->util = $util ?: new StringUtil;
+ }
+
+ /**
+ * Makes and records specific method call for object prophecy.
+ *
+ * @param ObjectProphecy $prophecy
+ * @param string $methodName
+ * @param array $arguments
+ *
+ * @return mixed Returns null if no promise for prophecy found or promise return value.
+ *
+ * @throws \Prophecy\Exception\Call\UnexpectedCallException If no appropriate method prophecy found
+ */
+ public function makeCall(ObjectProphecy $prophecy, $methodName, array $arguments)
+ {
+ $backtrace = debug_backtrace();
+
+ $file = $line = null;
+ if (isset($backtrace[2]) && isset($backtrace[2]['file'])) {
+ $file = $backtrace[2]['file'];
+ $line = $backtrace[2]['line'];
+ }
+
+ // If no method prophecies defined, then it's a dummy, so we'll just return null
+ if ('__destruct' === $methodName || 0 == count($prophecy->getMethodProphecies())) {
+ $this->recordedCalls[] = new Call($methodName, $arguments, null, null, $file, $line);
+
+ return null;
+ }
+
+ // There are method prophecies, so it's a fake/stub. Searching prophecy for this call
+ $matches = array();
+ foreach ($prophecy->getMethodProphecies($methodName) as $methodProphecy) {
+ if (0 < $score = $methodProphecy->getArgumentsWildcard()->scoreArguments($arguments)) {
+ $matches[] = array($score, $methodProphecy);
+ }
+ }
+
+ // If fake/stub doesn't have method prophecy for this call - throw exception
+ if (!count($matches)) {
+ throw $this->createUnexpectedCallException($prophecy, $methodName, $arguments);
+ }
+
+ // Sort matches by their score value
+ @usort($matches, function ($match1, $match2) { return $match2[0] - $match1[0]; });
+
+ // If Highest rated method prophecy has a promise - execute it or return null instead
+ $returnValue = null;
+ $exception = null;
+ if ($promise = $matches[0][1]->getPromise()) {
+ try {
+ $returnValue = $promise->execute($arguments, $prophecy, $matches[0][1]);
+ } catch (\Exception $e) {
+ $exception = $e;
+ }
+ }
+
+ $this->recordedCalls[] = new Call(
+ $methodName, $arguments, $returnValue, $exception, $file, $line
+ );
+
+ if (null !== $exception) {
+ throw $exception;
+ }
+
+ return $returnValue;
+ }
+
+ /**
+ * Searches for calls by method name & arguments wildcard.
+ *
+ * @param string $methodName
+ * @param ArgumentsWildcard $wildcard
+ *
+ * @return Call[]
+ */
+ public function findCalls($methodName, ArgumentsWildcard $wildcard)
+ {
+ return array_values(
+ array_filter($this->recordedCalls, function (Call $call) use ($methodName, $wildcard) {
+ return $methodName === $call->getMethodName()
+ && 0 < $wildcard->scoreArguments($call->getArguments())
+ ;
+ })
+ );
+ }
+
+ private function createUnexpectedCallException(ObjectProphecy $prophecy, $methodName,
+ array $arguments)
+ {
+ $classname = get_class($prophecy->reveal());
+ $argstring = implode(', ', array_map(array($this->util, 'stringify'), $arguments));
+ $expected = implode("\n", array_map(function (MethodProphecy $methodProphecy) {
+ return sprintf(' - %s(%s)',
+ $methodProphecy->getMethodName(),
+ $methodProphecy->getArgumentsWildcard()
+ );
+ }, call_user_func_array('array_merge', $prophecy->getMethodProphecies())));
+
+ return new UnexpectedCallException(
+ sprintf(
+ "Method call:\n".
+ " %s->%s(%s)\n".
+ "was not expected.\n".
+ "Expected calls are:\n%s",
+
+ $classname, $methodName, $argstring, $expected
+ ),
+ $prophecy, $methodName, $arguments
+ );
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
new file mode 100644
index 0000000..d6b6b1a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
@@ -0,0 +1,68 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler;
+
+use ReflectionClass;
+
+/**
+ * Cached class doubler.
+ * Prevents mirroring/creation of the same structure twice.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CachedDoubler extends Doubler
+{
+ private $classes = array();
+
+ /**
+ * {@inheritdoc}
+ */
+ public function registerClassPatch(ClassPatch\ClassPatchInterface $patch)
+ {
+ $this->classes[] = array();
+
+ parent::registerClassPatch($patch);
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
+ {
+ $classId = $this->generateClassId($class, $interfaces);
+ if (isset($this->classes[$classId])) {
+ return $this->classes[$classId];
+ }
+
+ return $this->classes[$classId] = parent::createDoubleClass($class, $interfaces);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionClass[] $interfaces
+ *
+ * @return string
+ */
+ private function generateClassId(ReflectionClass $class = null, array $interfaces)
+ {
+ $parts = array();
+ if (null !== $class) {
+ $parts[] = $class->getName();
+ }
+ foreach ($interfaces as $interface) {
+ $parts[] = $interface->getName();
+ }
+ sort($parts);
+
+ return md5(implode('', $parts));
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php
new file mode 100644
index 0000000..d6d1968
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php
@@ -0,0 +1,48 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * Class patch interface.
+ * Class patches extend doubles functionality or help
+ * Prophecy to avoid some internal PHP bugs.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface ClassPatchInterface
+{
+ /**
+ * Checks if patch supports specific class node.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node);
+
+ /**
+ * Applies patch to the specific class node.
+ *
+ * @param ClassNode $node
+ * @return void
+ */
+ public function apply(ClassNode $node);
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority();
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
new file mode 100644
index 0000000..61998fc
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
@@ -0,0 +1,72 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+
+/**
+ * Disable constructor.
+ * Makes all constructor arguments optional.
+ *
+ * @author Konstantin Kudryashov
+ */
+class DisableConstructorPatch implements ClassPatchInterface
+{
+ /**
+ * Checks if class has `__construct` method.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Makes all class constructor arguments optional.
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ if (!$node->hasMethod('__construct')) {
+ $node->addMethod(new MethodNode('__construct', ''));
+
+ return;
+ }
+
+ $constructor = $node->getMethod('__construct');
+ foreach ($constructor->getArguments() as $argument) {
+ $argument->setDefault(null);
+ }
+
+ $constructor->setCode(<<
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * Exception patch for HHVM to remove the stubs from special methods
+ *
+ * @author Christophe Coevoet
+ */
+class HhvmExceptionPatch implements ClassPatchInterface
+{
+ /**
+ * Supports exceptions on HHVM.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ if (!defined('HHVM_VERSION')) {
+ return false;
+ }
+
+ return 'Exception' === $node->getParentClass() || is_subclass_of($node->getParentClass(), 'Exception');
+ }
+
+ /**
+ * Removes special exception static methods from the doubled methods.
+ *
+ * @param ClassNode $node
+ *
+ * @return void
+ */
+ public function apply(ClassNode $node)
+ {
+ if ($node->hasMethod('setTraceOptions')) {
+ $node->getMethod('setTraceOptions')->useParentCode();
+ }
+ if ($node->hasMethod('getTraceOptions')) {
+ $node->getMethod('getTraceOptions')->useParentCode();
+ }
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getPriority()
+ {
+ return -50;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
new file mode 100644
index 0000000..0501892
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
@@ -0,0 +1,135 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * Remove method functionality from the double which will clash with php keywords.
+ *
+ * @author Milan Magudia
+ */
+class KeywordPatch implements ClassPatchInterface
+{
+ /**
+ * Support any class
+ *
+ * @param ClassNode $node
+ *
+ * @return boolean
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Remove methods that clash with php keywords
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ $methodNames = array_keys($node->getMethods());
+ $methodsToRemove = array_intersect($methodNames, $this->getKeywords());
+ foreach ($methodsToRemove as $methodName) {
+ $node->removeMethod($methodName);
+ }
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority() {
+ return 50;
+ }
+
+ /**
+ * Returns array of php keywords.
+ *
+ * @return array
+ */
+ private function getKeywords() {
+
+ return array(
+ '__halt_compiler',
+ 'abstract',
+ 'and',
+ 'array',
+ 'as',
+ 'break',
+ 'callable',
+ 'case',
+ 'catch',
+ 'class',
+ 'clone',
+ 'const',
+ 'continue',
+ 'declare',
+ 'default',
+ 'die',
+ 'do',
+ 'echo',
+ 'else',
+ 'elseif',
+ 'empty',
+ 'enddeclare',
+ 'endfor',
+ 'endforeach',
+ 'endif',
+ 'endswitch',
+ 'endwhile',
+ 'eval',
+ 'exit',
+ 'extends',
+ 'final',
+ 'finally',
+ 'for',
+ 'foreach',
+ 'function',
+ 'global',
+ 'goto',
+ 'if',
+ 'implements',
+ 'include',
+ 'include_once',
+ 'instanceof',
+ 'insteadof',
+ 'interface',
+ 'isset',
+ 'list',
+ 'namespace',
+ 'new',
+ 'or',
+ 'print',
+ 'private',
+ 'protected',
+ 'public',
+ 'require',
+ 'require_once',
+ 'return',
+ 'static',
+ 'switch',
+ 'throw',
+ 'trait',
+ 'try',
+ 'unset',
+ 'use',
+ 'var',
+ 'while',
+ 'xor',
+ 'yield',
+ );
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
new file mode 100644
index 0000000..da45450
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
@@ -0,0 +1,73 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use phpDocumentor\Reflection\DocBlock;
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+
+/**
+ * Discover Magical API using "@method" PHPDoc format.
+ *
+ * @author Thomas Tourlourat
+ */
+class MagicCallPatch implements ClassPatchInterface
+{
+ /**
+ * Support any class
+ *
+ * @param ClassNode $node
+ *
+ * @return boolean
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Discover Magical API
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ $parentClass = $node->getParentClass();
+ $reflectionClass = new \ReflectionClass($parentClass);
+
+ $phpdoc = new DocBlock($reflectionClass->getDocComment());
+
+ $tagList = $phpdoc->getTagsByName('method');
+
+ foreach($tagList as $tag) {
+ $methodName = $tag->getMethodName();
+
+ if (!$reflectionClass->hasMethod($methodName)) {
+ $methodNode = new MethodNode($tag->getMethodName());
+ $methodNode->setStatic($tag->isStatic());
+
+ $node->addMethod($methodNode);
+ }
+ }
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return integer Priority number (higher - earlier)
+ */
+ public function getPriority()
+ {
+ return 50;
+ }
+}
+
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
new file mode 100644
index 0000000..ab0bb7c
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
@@ -0,0 +1,98 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+use Prophecy\Doubler\Generator\Node\ArgumentNode;
+
+/**
+ * Add Prophecy functionality to the double.
+ * This is a core class patch for Prophecy.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ProphecySubjectPatch implements ClassPatchInterface
+{
+ /**
+ * Always returns true.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ return true;
+ }
+
+ /**
+ * Apply Prophecy functionality to class node.
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ $node->addInterface('Prophecy\Prophecy\ProphecySubjectInterface');
+ $node->addProperty('objectProphecy', 'private');
+
+ foreach ($node->getMethods() as $name => $method) {
+ if ('__construct' === strtolower($name)) {
+ continue;
+ }
+
+ $method->setCode(
+ 'return $this->getProphecy()->makeProphecyMethodCall(__FUNCTION__, func_get_args());'
+ );
+ }
+
+ $prophecySetter = new MethodNode('setProphecy');
+ $prophecyArgument = new ArgumentNode('prophecy');
+ $prophecyArgument->setTypeHint('Prophecy\Prophecy\ProphecyInterface');
+ $prophecySetter->addArgument($prophecyArgument);
+ $prophecySetter->setCode('$this->objectProphecy = $prophecy;');
+
+ $prophecyGetter = new MethodNode('getProphecy');
+ $prophecyGetter->setCode('return $this->objectProphecy;');
+
+ if ($node->hasMethod('__call')) {
+ $__call = $node->getMethod('__call');
+ } else {
+ $__call = new MethodNode('__call');
+ $__call->addArgument(new ArgumentNode('name'));
+ $__call->addArgument(new ArgumentNode('arguments'));
+
+ $node->addMethod($__call);
+ }
+
+ $__call->setCode(<<getProphecy(), func_get_arg(0)
+);
+PHP
+ );
+
+ $node->addMethod($prophecySetter);
+ $node->addMethod($prophecyGetter);
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority()
+ {
+ return 0;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php
new file mode 100644
index 0000000..9166aee
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php
@@ -0,0 +1,57 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+/**
+ * ReflectionClass::newInstance patch.
+ * Makes first argument of newInstance optional, since it works but signature is misleading
+ *
+ * @author Florian Klein
+ */
+class ReflectionClassNewInstancePatch implements ClassPatchInterface
+{
+ /**
+ * Supports ReflectionClass
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ return 'ReflectionClass' === $node->getParentClass();
+ }
+
+ /**
+ * Updates newInstance's first argument to make it optional
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ foreach ($node->getMethod('newInstance')->getArguments() as $argument) {
+ $argument->setDefault(null);
+ }
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher = earlier)
+ */
+ public function getPriority()
+ {
+ return 50;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
new file mode 100644
index 0000000..8401159
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
@@ -0,0 +1,85 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+
+/**
+ * SplFileInfo patch.
+ * Makes SplFileInfo and derivative classes usable with Prophecy.
+ *
+ * @author Konstantin Kudryashov
+ */
+class SplFileInfoPatch implements ClassPatchInterface
+{
+ /**
+ * Supports everything that extends SplFileInfo.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ if (null === $node->getParentClass()) {
+ return false;
+ }
+
+ return 'SplFileInfo' === $node->getParentClass()
+ || is_subclass_of($node->getParentClass(), 'SplFileInfo')
+ ;
+ }
+
+ /**
+ * Updated constructor code to call parent one with dummy file argument.
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ if ($node->hasMethod('__construct')) {
+ $constructor = $node->getMethod('__construct');
+ } else {
+ $constructor = new MethodNode('__construct');
+ $node->addMethod($constructor);
+ }
+
+ if ($this->nodeIsDirectoryIterator($node)) {
+ $constructor->setCode('return parent::__construct("' . __DIR__ . '");');
+ return;
+ }
+
+ $constructor->useParentCode();
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority()
+ {
+ return 50;
+ }
+
+ /**
+ * @param ClassNode $node
+ * @return boolean
+ */
+ private function nodeIsDirectoryIterator(ClassNode $node)
+ {
+ $parent = $node->getParentClass();
+ return 'DirectoryIterator' === $parent
+ || is_subclass_of($parent, 'DirectoryIterator');
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php
new file mode 100644
index 0000000..eea0202
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php
@@ -0,0 +1,83 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\ClassPatch;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+use Prophecy\Doubler\Generator\Node\MethodNode;
+
+/**
+ * Traversable interface patch.
+ * Forces classes that implement interfaces, that extend Traversable to also implement Iterator.
+ *
+ * @author Konstantin Kudryashov
+ */
+class TraversablePatch implements ClassPatchInterface
+{
+ /**
+ * Supports nodetree, that implement Traversable, but not Iterator or IteratorAggregate.
+ *
+ * @param ClassNode $node
+ *
+ * @return bool
+ */
+ public function supports(ClassNode $node)
+ {
+ if (in_array('Iterator', $node->getInterfaces())) {
+ return false;
+ }
+ if (in_array('IteratorAggregate', $node->getInterfaces())) {
+ return false;
+ }
+
+ foreach ($node->getInterfaces() as $interface) {
+ if ('Traversable' !== $interface && !is_subclass_of($interface, 'Traversable')) {
+ continue;
+ }
+ if ('Iterator' === $interface || is_subclass_of($interface, 'Iterator')) {
+ continue;
+ }
+ if ('IteratorAggregate' === $interface || is_subclass_of($interface, 'IteratorAggregate')) {
+ continue;
+ }
+
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * Forces class to implement Iterator interface.
+ *
+ * @param ClassNode $node
+ */
+ public function apply(ClassNode $node)
+ {
+ $node->addInterface('Iterator');
+
+ $node->addMethod(new MethodNode('current'));
+ $node->addMethod(new MethodNode('key'));
+ $node->addMethod(new MethodNode('next'));
+ $node->addMethod(new MethodNode('rewind'));
+ $node->addMethod(new MethodNode('valid'));
+ }
+
+ /**
+ * Returns patch priority, which determines when patch will be applied.
+ *
+ * @return int Priority number (higher - earlier)
+ */
+ public function getPriority()
+ {
+ return 100;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php
new file mode 100644
index 0000000..699be3a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php
@@ -0,0 +1,22 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler;
+
+/**
+ * Core double interface.
+ * All doubled classes will implement this one.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface DoubleInterface
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php
new file mode 100644
index 0000000..a378ae2
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php
@@ -0,0 +1,146 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler;
+
+use Doctrine\Instantiator\Instantiator;
+use Prophecy\Doubler\ClassPatch\ClassPatchInterface;
+use Prophecy\Doubler\Generator\ClassMirror;
+use Prophecy\Doubler\Generator\ClassCreator;
+use Prophecy\Exception\InvalidArgumentException;
+use ReflectionClass;
+
+/**
+ * Cached class doubler.
+ * Prevents mirroring/creation of the same structure twice.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Doubler
+{
+ private $mirror;
+ private $creator;
+ private $namer;
+
+ /**
+ * @var ClassPatchInterface[]
+ */
+ private $patches = array();
+
+ /**
+ * @var \Doctrine\Instantiator\Instantiator
+ */
+ private $instantiator;
+
+ /**
+ * Initializes doubler.
+ *
+ * @param ClassMirror $mirror
+ * @param ClassCreator $creator
+ * @param NameGenerator $namer
+ */
+ public function __construct(ClassMirror $mirror = null, ClassCreator $creator = null,
+ NameGenerator $namer = null)
+ {
+ $this->mirror = $mirror ?: new ClassMirror;
+ $this->creator = $creator ?: new ClassCreator;
+ $this->namer = $namer ?: new NameGenerator;
+ }
+
+ /**
+ * Returns list of registered class patches.
+ *
+ * @return ClassPatchInterface[]
+ */
+ public function getClassPatches()
+ {
+ return $this->patches;
+ }
+
+ /**
+ * Registers new class patch.
+ *
+ * @param ClassPatchInterface $patch
+ */
+ public function registerClassPatch(ClassPatchInterface $patch)
+ {
+ $this->patches[] = $patch;
+
+ @usort($this->patches, function (ClassPatchInterface $patch1, ClassPatchInterface $patch2) {
+ return $patch2->getPriority() - $patch1->getPriority();
+ });
+ }
+
+ /**
+ * Creates double from specific class or/and list of interfaces.
+ *
+ * @param ReflectionClass $class
+ * @param ReflectionClass[] $interfaces Array of ReflectionClass instances
+ * @param array $args Constructor arguments
+ *
+ * @return DoubleInterface
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function double(ReflectionClass $class = null, array $interfaces, array $args = null)
+ {
+ foreach ($interfaces as $interface) {
+ if (!$interface instanceof ReflectionClass) {
+ throw new InvalidArgumentException(sprintf(
+ "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
+ "a second argument to `Doubler::double(...)`, but got %s.",
+ is_object($interface) ? get_class($interface).' class' : gettype($interface)
+ ));
+ }
+ }
+
+ $classname = $this->createDoubleClass($class, $interfaces);
+ $reflection = new ReflectionClass($classname);
+
+ if (null !== $args) {
+ return $reflection->newInstanceArgs($args);
+ }
+ if ((null === $constructor = $reflection->getConstructor())
+ || ($constructor->isPublic() && !$constructor->isFinal())) {
+ return $reflection->newInstance();
+ }
+
+ if (!$this->instantiator) {
+ $this->instantiator = new Instantiator();
+ }
+
+ return $this->instantiator->instantiate($classname);
+ }
+
+ /**
+ * Creates double class and returns its FQN.
+ *
+ * @param ReflectionClass $class
+ * @param ReflectionClass[] $interfaces
+ *
+ * @return string
+ */
+ protected function createDoubleClass(ReflectionClass $class = null, array $interfaces)
+ {
+ $name = $this->namer->name($class, $interfaces);
+ $node = $this->mirror->reflect($class, $interfaces);
+
+ foreach ($this->patches as $patch) {
+ if ($patch->supports($node)) {
+ $patch->apply($node);
+ }
+ }
+
+ $this->creator->create($name, $node);
+
+ return $name;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
new file mode 100644
index 0000000..426ef3c
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
@@ -0,0 +1,90 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\Generator;
+
+/**
+ * Class code creator.
+ * Generates PHP code for specific class node tree.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ClassCodeGenerator
+{
+ /**
+ * Generates PHP code for class node.
+ *
+ * @param string $classname
+ * @param Node\ClassNode $class
+ *
+ * @return string
+ */
+ public function generate($classname, Node\ClassNode $class)
+ {
+ $parts = explode('\\', $classname);
+ $classname = array_pop($parts);
+ $namespace = implode('\\', $parts);
+
+ $code = sprintf("class %s extends \%s implements %s {\n",
+ $classname, $class->getParentClass(), implode(', ',
+ array_map(function ($interface) {return '\\'.$interface;}, $class->getInterfaces())
+ )
+ );
+
+ foreach ($class->getProperties() as $name => $visibility) {
+ $code .= sprintf("%s \$%s;\n", $visibility, $name);
+ }
+ $code .= "\n";
+
+ foreach ($class->getMethods() as $method) {
+ $code .= $this->generateMethod($method)."\n";
+ }
+ $code .= "\n}";
+
+ return sprintf("namespace %s {\n%s\n}", $namespace, $code);
+ }
+
+ private function generateMethod(Node\MethodNode $method)
+ {
+ $php = sprintf("%s %s function %s(%s) {\n",
+ $method->getVisibility(),
+ $method->isStatic() ? 'static' : '',
+ $method->getName(),
+ implode(', ', $this->generateArguments($method->getArguments()))
+ );
+ $php .= $method->getCode()."\n";
+
+ return $php.'}';
+ }
+
+ private function generateArguments(array $arguments)
+ {
+ return array_map(function (Node\ArgumentNode $argument) {
+ $php = '';
+
+ if ($hint = $argument->getTypeHint()) {
+ if ('array' === $hint || 'callable' === $hint) {
+ $php .= $hint;
+ } else {
+ $php .= '\\'.$hint;
+ }
+ }
+
+ $php .= ' '.($argument->isPassedByReference() ? '&' : '').'$'.$argument->getName();
+
+ if ($argument->isOptional()) {
+ $php .= ' = '.var_export($argument->getDefault(), true);
+ }
+
+ return $php;
+ }, $arguments);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php
new file mode 100644
index 0000000..882a4a4
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php
@@ -0,0 +1,67 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\Generator;
+
+use Prophecy\Exception\Doubler\ClassCreatorException;
+
+/**
+ * Class creator.
+ * Creates specific class in current environment.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ClassCreator
+{
+ private $generator;
+
+ /**
+ * Initializes creator.
+ *
+ * @param ClassCodeGenerator $generator
+ */
+ public function __construct(ClassCodeGenerator $generator = null)
+ {
+ $this->generator = $generator ?: new ClassCodeGenerator;
+ }
+
+ /**
+ * Creates class.
+ *
+ * @param string $classname
+ * @param Node\ClassNode $class
+ *
+ * @return mixed
+ *
+ * @throws \Prophecy\Exception\Doubler\ClassCreatorException
+ */
+ public function create($classname, Node\ClassNode $class)
+ {
+ $code = $this->generator->generate($classname, $class);
+ $return = eval($code);
+
+ if (!class_exists($classname, false)) {
+ if (count($class->getInterfaces())) {
+ throw new ClassCreatorException(sprintf(
+ 'Could not double `%s` and implement interfaces: [%s].',
+ $class->getParentClass(), implode(', ', $class->getInterfaces())
+ ), $class);
+ }
+
+ throw new ClassCreatorException(
+ sprintf('Could not double `%s`.', $class->getParentClass()),
+ $class
+ );
+ }
+
+ return $return;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
new file mode 100644
index 0000000..5c33a93
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
@@ -0,0 +1,196 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\Generator;
+
+use Prophecy\Exception\InvalidArgumentException;
+use Prophecy\Exception\Doubler\ClassMirrorException;
+use ReflectionClass;
+use ReflectionMethod;
+use ReflectionParameter;
+
+/**
+ * Class mirror.
+ * Core doubler class. Mirrors specific class and/or interfaces into class node tree.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ClassMirror
+{
+ private static $reflectableMethods = array(
+ '__construct',
+ '__destruct',
+ '__sleep',
+ '__wakeup',
+ '__toString',
+ '__call',
+ );
+
+ /**
+ * Reflects provided arguments into class node.
+ *
+ * @param ReflectionClass $class
+ * @param ReflectionClass[] $interfaces
+ *
+ * @return Node\ClassNode
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function reflect(ReflectionClass $class = null, array $interfaces)
+ {
+ $node = new Node\ClassNode;
+
+ if (null !== $class) {
+ if (true === $class->isInterface()) {
+ throw new InvalidArgumentException(sprintf(
+ "Could not reflect %s as a class, because it\n".
+ "is interface - use the second argument instead.",
+ $class->getName()
+ ));
+ }
+
+ $this->reflectClassToNode($class, $node);
+ }
+
+ foreach ($interfaces as $interface) {
+ if (!$interface instanceof ReflectionClass) {
+ throw new InvalidArgumentException(sprintf(
+ "[ReflectionClass \$interface1 [, ReflectionClass \$interface2]] array expected as\n".
+ "a second argument to `ClassMirror::reflect(...)`, but got %s.",
+ is_object($interface) ? get_class($interface).' class' : gettype($interface)
+ ));
+ }
+ if (false === $interface->isInterface()) {
+ throw new InvalidArgumentException(sprintf(
+ "Could not reflect %s as an interface, because it\n".
+ "is class - use the first argument instead.",
+ $interface->getName()
+ ));
+ }
+
+ $this->reflectInterfaceToNode($interface, $node);
+ }
+
+ $node->addInterface('Prophecy\Doubler\Generator\ReflectionInterface');
+
+ return $node;
+ }
+
+ private function reflectClassToNode(ReflectionClass $class, Node\ClassNode $node)
+ {
+ if (true === $class->isFinal()) {
+ throw new ClassMirrorException(sprintf(
+ 'Could not reflect class %s as it is marked final.', $class->getName()
+ ), $class);
+ }
+
+ $node->setParentClass($class->getName());
+
+ foreach ($class->getMethods(ReflectionMethod::IS_ABSTRACT) as $method) {
+ if (false === $method->isProtected()) {
+ continue;
+ }
+
+ $this->reflectMethodToNode($method, $node);
+ }
+
+ foreach ($class->getMethods(ReflectionMethod::IS_PUBLIC) as $method) {
+ if (0 === strpos($method->getName(), '_')
+ && !in_array($method->getName(), self::$reflectableMethods)) {
+ continue;
+ }
+
+ if (true === $method->isFinal()) {
+ continue;
+ }
+
+ $this->reflectMethodToNode($method, $node);
+ }
+ }
+
+ private function reflectInterfaceToNode(ReflectionClass $interface, Node\ClassNode $node)
+ {
+ $node->addInterface($interface->getName());
+
+ foreach ($interface->getMethods() as $method) {
+ $this->reflectMethodToNode($method, $node);
+ }
+ }
+
+ private function reflectMethodToNode(ReflectionMethod $method, Node\ClassNode $classNode)
+ {
+ $node = new Node\MethodNode($method->getName());
+
+ if (true === $method->isProtected()) {
+ $node->setVisibility('protected');
+ }
+
+ if (true === $method->isStatic()) {
+ $node->setStatic();
+ }
+
+ if (is_array($params = $method->getParameters()) && count($params)) {
+ foreach ($params as $param) {
+ $this->reflectArgumentToNode($param, $node);
+ }
+ }
+
+ $classNode->addMethod($node);
+ }
+
+ private function reflectArgumentToNode(ReflectionParameter $parameter, Node\MethodNode $methodNode)
+ {
+ $name = $parameter->getName() == '...' ? '__dot_dot_dot__' : $parameter->getName();
+ $node = new Node\ArgumentNode($name);
+
+ $node->setTypeHint($this->getTypeHint($parameter));
+
+ if (true === $parameter->isDefaultValueAvailable()) {
+ $node->setDefault($parameter->getDefaultValue());
+ } elseif (true === $parameter->isOptional() || true === $parameter->allowsNull()) {
+ $node->setDefault(null);
+ }
+
+ if (true === $parameter->isPassedByReference()) {
+ $node->setAsPassedByReference();
+ }
+
+ $methodNode->addArgument($node);
+ }
+
+ private function getTypeHint(ReflectionParameter $parameter)
+ {
+ if (null !== $className = $this->getParameterClassName($parameter)) {
+ return $className;
+ }
+
+ if (true === $parameter->isArray()) {
+ return 'array';
+ }
+
+ if (version_compare(PHP_VERSION, '5.4', '>=') && true === $parameter->isCallable()) {
+ return 'callable';
+ }
+
+ return null;
+ }
+
+ private function getParameterClassName(ReflectionParameter $parameter)
+ {
+ try {
+ return $parameter->getClass() ? $parameter->getClass()->getName() : null;
+ } catch (\ReflectionException $e) {
+ preg_match('/\[\s\<\w+?>\s([\w,\\\]+)/s', $parameter, $matches);
+
+ return isset($matches[1]) ? $matches[1] : null;
+ }
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php
new file mode 100644
index 0000000..a6c42a3
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php
@@ -0,0 +1,75 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\Generator\Node;
+
+/**
+ * Argument node.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ArgumentNode
+{
+ private $name;
+ private $typeHint;
+ private $default;
+ private $optional = false;
+ private $byReference = false;
+
+ /**
+ * @param string $name
+ */
+ public function __construct($name)
+ {
+ $this->name = $name;
+ }
+
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function getTypeHint()
+ {
+ return $this->typeHint;
+ }
+
+ public function setTypeHint($typeHint = null)
+ {
+ $this->typeHint = $typeHint;
+ }
+
+ public function getDefault()
+ {
+ return $this->default;
+ }
+
+ public function setDefault($default = null)
+ {
+ $this->optional = true;
+ $this->default = $default;
+ }
+
+ public function isOptional()
+ {
+ return $this->optional;
+ }
+
+ public function setAsPassedByReference($byReference = true)
+ {
+ $this->byReference = $byReference;
+ }
+
+ public function isPassedByReference()
+ {
+ return $this->byReference;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
new file mode 100644
index 0000000..b38cb4e
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
@@ -0,0 +1,130 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\Generator\Node;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Class node.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ClassNode
+{
+ private $parentClass = 'stdClass';
+ private $interfaces = array();
+ private $properties = array();
+
+ /**
+ * @var MethodNode[]
+ */
+ private $methods = array();
+
+ public function getParentClass()
+ {
+ return $this->parentClass;
+ }
+
+ /**
+ * @param string $class
+ */
+ public function setParentClass($class)
+ {
+ $this->parentClass = $class ?: 'stdClass';
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getInterfaces()
+ {
+ return $this->interfaces;
+ }
+
+ /**
+ * @param string $interface
+ */
+ public function addInterface($interface)
+ {
+ if ($this->hasInterface($interface)) {
+ return;
+ }
+
+ array_unshift($this->interfaces, $interface);
+ }
+
+ /**
+ * @param string $interface
+ *
+ * @return bool
+ */
+ public function hasInterface($interface)
+ {
+ return in_array($interface, $this->interfaces);
+ }
+
+ public function getProperties()
+ {
+ return $this->properties;
+ }
+
+ public function addProperty($name, $visibility = 'public')
+ {
+ $visibility = strtolower($visibility);
+
+ if (!in_array($visibility, array('public', 'private', 'protected'))) {
+ throw new InvalidArgumentException(sprintf(
+ '`%s` property visibility is not supported.', $visibility
+ ));
+ }
+
+ $this->properties[$name] = $visibility;
+ }
+
+ /**
+ * @return MethodNode[]
+ */
+ public function getMethods()
+ {
+ return $this->methods;
+ }
+
+ public function addMethod(MethodNode $method)
+ {
+ $this->methods[$method->getName()] = $method;
+ }
+
+ public function removeMethod($name)
+ {
+ unset($this->methods[$name]);
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return MethodNode|null
+ */
+ public function getMethod($name)
+ {
+ return $this->hasMethod($name) ? $this->methods[$name] : null;
+ }
+
+ /**
+ * @param string $name
+ *
+ * @return bool
+ */
+ public function hasMethod($name)
+ {
+ return isset($this->methods[$name]);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
new file mode 100644
index 0000000..e793876
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
@@ -0,0 +1,113 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\Generator\Node;
+
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Method node.
+ *
+ * @author Konstantin Kudryashov
+ */
+class MethodNode
+{
+ private $name;
+ private $code;
+ private $visibility = 'public';
+ private $static = false;
+
+ /**
+ * @var ArgumentNode[]
+ */
+ private $arguments = array();
+
+ /**
+ * @param string $name
+ * @param string $code
+ */
+ public function __construct($name, $code = null)
+ {
+ $this->name = $name;
+ $this->code = $code;
+ }
+
+ public function getVisibility()
+ {
+ return $this->visibility;
+ }
+
+ /**
+ * @param string $visibility
+ */
+ public function setVisibility($visibility)
+ {
+ $visibility = strtolower($visibility);
+
+ if (!in_array($visibility, array('public', 'private', 'protected'))) {
+ throw new InvalidArgumentException(sprintf(
+ '`%s` method visibility is not supported.', $visibility
+ ));
+ }
+
+ $this->visibility = $visibility;
+ }
+
+ public function isStatic()
+ {
+ return $this->static;
+ }
+
+ public function setStatic($static = true)
+ {
+ $this->static = (bool) $static;
+ }
+
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function addArgument(ArgumentNode $argument)
+ {
+ $this->arguments[] = $argument;
+ }
+
+ /**
+ * @return ArgumentNode[]
+ */
+ public function getArguments()
+ {
+ return $this->arguments;
+ }
+
+ /**
+ * @param string $code
+ */
+ public function setCode($code)
+ {
+ $this->code = $code;
+ }
+
+ public function getCode()
+ {
+ return (string) $this->code;
+ }
+
+ public function useParentCode()
+ {
+ $this->code = sprintf(
+ 'return parent::%s(%s);', $this->getName(), implode(', ',
+ array_map(function (ArgumentNode $arg) { return '$'.$arg->getName(); }, $this->arguments)
+ )
+ );
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php
new file mode 100644
index 0000000..d720b15
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php
@@ -0,0 +1,22 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler\Generator;
+
+/**
+ * Reflection interface.
+ * All reflected classes implement this interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface ReflectionInterface
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php
new file mode 100644
index 0000000..8a99c4c
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php
@@ -0,0 +1,127 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler;
+
+use Prophecy\Exception\Doubler\DoubleException;
+use Prophecy\Exception\Doubler\ClassNotFoundException;
+use Prophecy\Exception\Doubler\InterfaceNotFoundException;
+use ReflectionClass;
+
+/**
+ * Lazy double.
+ * Gives simple interface to describe double before creating it.
+ *
+ * @author Konstantin Kudryashov
+ */
+class LazyDouble
+{
+ private $doubler;
+ private $class;
+ private $interfaces = array();
+ private $arguments = null;
+ private $double;
+
+ /**
+ * Initializes lazy double.
+ *
+ * @param Doubler $doubler
+ */
+ public function __construct(Doubler $doubler)
+ {
+ $this->doubler = $doubler;
+ }
+
+ /**
+ * Tells doubler to use specific class as parent one for double.
+ *
+ * @param string|ReflectionClass $class
+ *
+ * @throws \Prophecy\Exception\Doubler\ClassNotFoundException
+ * @throws \Prophecy\Exception\Doubler\DoubleException
+ */
+ public function setParentClass($class)
+ {
+ if (null !== $this->double) {
+ throw new DoubleException('Can not extend class with already instantiated double.');
+ }
+
+ if (!$class instanceof ReflectionClass) {
+ if (!class_exists($class)) {
+ throw new ClassNotFoundException(sprintf('Class %s not found.', $class), $class);
+ }
+
+ $class = new ReflectionClass($class);
+ }
+
+ $this->class = $class;
+ }
+
+ /**
+ * Tells doubler to implement specific interface with double.
+ *
+ * @param string|ReflectionClass $interface
+ *
+ * @throws \Prophecy\Exception\Doubler\InterfaceNotFoundException
+ * @throws \Prophecy\Exception\Doubler\DoubleException
+ */
+ public function addInterface($interface)
+ {
+ if (null !== $this->double) {
+ throw new DoubleException(
+ 'Can not implement interface with already instantiated double.'
+ );
+ }
+
+ if (!$interface instanceof ReflectionClass) {
+ if (!interface_exists($interface)) {
+ throw new InterfaceNotFoundException(
+ sprintf('Interface %s not found.', $interface),
+ $interface
+ );
+ }
+
+ $interface = new ReflectionClass($interface);
+ }
+
+ $this->interfaces[] = $interface;
+ }
+
+ /**
+ * Sets constructor arguments.
+ *
+ * @param array $arguments
+ */
+ public function setArguments(array $arguments = null)
+ {
+ $this->arguments = $arguments;
+ }
+
+ /**
+ * Creates double instance or returns already created one.
+ *
+ * @return DoubleInterface
+ */
+ public function getInstance()
+ {
+ if (null === $this->double) {
+ if (null !== $this->arguments) {
+ return $this->double = $this->doubler->double(
+ $this->class, $this->interfaces, $this->arguments
+ );
+ }
+
+ $this->double = $this->doubler->double($this->class, $this->interfaces);
+ }
+
+ return $this->double;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php b/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php
new file mode 100644
index 0000000..d67ec6a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php
@@ -0,0 +1,52 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Doubler;
+
+use ReflectionClass;
+
+/**
+ * Name generator.
+ * Generates classname for double.
+ *
+ * @author Konstantin Kudryashov
+ */
+class NameGenerator
+{
+ private static $counter = 1;
+
+ /**
+ * Generates name.
+ *
+ * @param ReflectionClass $class
+ * @param ReflectionClass[] $interfaces
+ *
+ * @return string
+ */
+ public function name(ReflectionClass $class = null, array $interfaces)
+ {
+ $parts = array();
+
+ if (null !== $class) {
+ $parts[] = $class->getName();
+ } else {
+ foreach ($interfaces as $interface) {
+ $parts[] = $interface->getShortName();
+ }
+ }
+
+ if (!count($parts)) {
+ $parts[] = 'stdClass';
+ }
+
+ return sprintf('Double\%s\P%d', implode('\\', $parts), self::$counter++);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php
new file mode 100644
index 0000000..48ed225
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php
@@ -0,0 +1,40 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Call;
+
+use Prophecy\Exception\Prophecy\ObjectProphecyException;
+use Prophecy\Prophecy\ObjectProphecy;
+
+class UnexpectedCallException extends ObjectProphecyException
+{
+ private $methodName;
+ private $arguments;
+
+ public function __construct($message, ObjectProphecy $objectProphecy,
+ $methodName, array $arguments)
+ {
+ parent::__construct($message, $objectProphecy);
+
+ $this->methodName = $methodName;
+ $this->arguments = $arguments;
+ }
+
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ public function getArguments()
+ {
+ return $this->arguments;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php
new file mode 100644
index 0000000..822918a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php
@@ -0,0 +1,31 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Doubler;
+
+use Prophecy\Doubler\Generator\Node\ClassNode;
+
+class ClassCreatorException extends \RuntimeException implements DoublerException
+{
+ private $node;
+
+ public function __construct($message, ClassNode $node)
+ {
+ parent::__construct($message);
+
+ $this->node = $node;
+ }
+
+ public function getClassNode()
+ {
+ return $this->node;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php
new file mode 100644
index 0000000..8fc53b8
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php
@@ -0,0 +1,31 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Doubler;
+
+use ReflectionClass;
+
+class ClassMirrorException extends \RuntimeException implements DoublerException
+{
+ private $class;
+
+ public function __construct($message, ReflectionClass $class)
+ {
+ parent::__construct($message);
+
+ $this->class = $class;
+ }
+
+ public function getReflectedClass()
+ {
+ return $this->class;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php
new file mode 100644
index 0000000..5bc826d
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php
@@ -0,0 +1,33 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Doubler;
+
+class ClassNotFoundException extends DoubleException
+{
+ private $classname;
+
+ /**
+ * @param string $message
+ * @param string $classname
+ */
+ public function __construct($message, $classname)
+ {
+ parent::__construct($message);
+
+ $this->classname = $classname;
+ }
+
+ public function getClassname()
+ {
+ return $this->classname;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php
new file mode 100644
index 0000000..6642a58
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php
@@ -0,0 +1,18 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Doubler;
+
+use RuntimeException;
+
+class DoubleException extends RuntimeException implements DoublerException
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php
new file mode 100644
index 0000000..9d6be17
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php
@@ -0,0 +1,18 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Doubler;
+
+use Prophecy\Exception\Exception;
+
+interface DoublerException extends Exception
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php
new file mode 100644
index 0000000..e344dea
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php
@@ -0,0 +1,20 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Doubler;
+
+class InterfaceNotFoundException extends ClassNotFoundException
+{
+ public function getInterfaceName()
+ {
+ return $this->getClassname();
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
new file mode 100644
index 0000000..a978642
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
@@ -0,0 +1,41 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Doubler;
+
+class MethodNotFoundException extends DoubleException
+{
+ private $classname;
+ private $methodName;
+
+ /**
+ * @param string $message
+ * @param string $classname
+ * @param string $methodName
+ */
+ public function __construct($message, $classname, $methodName)
+ {
+ parent::__construct($message);
+
+ $this->classname = $classname;
+ $this->methodName = $methodName;
+ }
+
+ public function getClassname()
+ {
+ return $this->classname;
+ }
+
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php
new file mode 100644
index 0000000..ac9fe4d
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php
@@ -0,0 +1,26 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception;
+
+/**
+ * Core Prophecy exception interface.
+ * All Prophecy exceptions implement it.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface Exception
+{
+ /**
+ * @return string
+ */
+ public function getMessage();
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000..bc91c69
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php
@@ -0,0 +1,16 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception;
+
+class InvalidArgumentException extends \InvalidArgumentException implements Exception
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
new file mode 100644
index 0000000..44b598a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
@@ -0,0 +1,50 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prediction;
+
+use Prophecy\Prophecy\ObjectProphecy;
+
+class AggregateException extends \RuntimeException implements PredictionException
+{
+ private $exceptions = array();
+ private $objectProphecy;
+
+ public function append(PredictionException $exception)
+ {
+ $message = $exception->getMessage();
+ $message = ' '.strtr($message, array("\n" => "\n "))."\n";
+
+ $this->message = rtrim($this->message.$message);
+ $this->exceptions[] = $exception;
+ }
+
+ /**
+ * @return PredictionException[]
+ */
+ public function getExceptions()
+ {
+ return $this->exceptions;
+ }
+
+ public function setObjectProphecy(ObjectProphecy $objectProphecy)
+ {
+ $this->objectProphecy = $objectProphecy;
+ }
+
+ /**
+ * @return ObjectProphecy
+ */
+ public function getObjectProphecy()
+ {
+ return $this->objectProphecy;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php
new file mode 100644
index 0000000..bbbbc3d
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php
@@ -0,0 +1,24 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prediction;
+
+use RuntimeException;
+
+/**
+ * Basic failed prediction exception.
+ * Use it for custom prediction failures.
+ *
+ * @author Konstantin Kudryashov
+ */
+class FailedPredictionException extends RuntimeException implements PredictionException
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php
new file mode 100644
index 0000000..05ea4aa
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php
@@ -0,0 +1,18 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prediction;
+
+use Prophecy\Exception\Prophecy\MethodProphecyException;
+
+class NoCallsException extends MethodProphecyException implements PredictionException
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php
new file mode 100644
index 0000000..2596b1e
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php
@@ -0,0 +1,18 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prediction;
+
+use Prophecy\Exception\Exception;
+
+interface PredictionException extends Exception
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php
new file mode 100644
index 0000000..9d90543
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php
@@ -0,0 +1,31 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prediction;
+
+use Prophecy\Prophecy\MethodProphecy;
+
+class UnexpectedCallsCountException extends UnexpectedCallsException
+{
+ private $expectedCount;
+
+ public function __construct($message, MethodProphecy $methodProphecy, $count, array $calls)
+ {
+ parent::__construct($message, $methodProphecy, $calls);
+
+ $this->expectedCount = intval($count);
+ }
+
+ public function getExpectedCount()
+ {
+ return $this->expectedCount;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php
new file mode 100644
index 0000000..7a99c2d
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php
@@ -0,0 +1,32 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prediction;
+
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Exception\Prophecy\MethodProphecyException;
+
+class UnexpectedCallsException extends MethodProphecyException implements PredictionException
+{
+ private $calls = array();
+
+ public function __construct($message, MethodProphecy $methodProphecy, array $calls)
+ {
+ parent::__construct($message, $methodProphecy);
+
+ $this->calls = $calls;
+ }
+
+ public function getCalls()
+ {
+ return $this->calls;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php
new file mode 100644
index 0000000..1b03eaf
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php
@@ -0,0 +1,34 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prophecy;
+
+use Prophecy\Prophecy\MethodProphecy;
+
+class MethodProphecyException extends ObjectProphecyException
+{
+ private $methodProphecy;
+
+ public function __construct($message, MethodProphecy $methodProphecy)
+ {
+ parent::__construct($message, $methodProphecy->getObjectProphecy());
+
+ $this->methodProphecy = $methodProphecy;
+ }
+
+ /**
+ * @return MethodProphecy
+ */
+ public function getMethodProphecy()
+ {
+ return $this->methodProphecy;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php
new file mode 100644
index 0000000..e345402
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php
@@ -0,0 +1,34 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prophecy;
+
+use Prophecy\Prophecy\ObjectProphecy;
+
+class ObjectProphecyException extends \RuntimeException implements ProphecyException
+{
+ private $objectProphecy;
+
+ public function __construct($message, ObjectProphecy $objectProphecy)
+ {
+ parent::__construct($message);
+
+ $this->objectProphecy = $objectProphecy;
+ }
+
+ /**
+ * @return ObjectProphecy
+ */
+ public function getObjectProphecy()
+ {
+ return $this->objectProphecy;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php
new file mode 100644
index 0000000..9157332
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php
@@ -0,0 +1,18 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Exception\Prophecy;
+
+use Prophecy\Exception\Exception;
+
+interface ProphecyException extends Exception
+{
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php
new file mode 100644
index 0000000..5bdcdc4
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php
@@ -0,0 +1,86 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prediction;
+
+use Prophecy\Call\Call;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Argument\ArgumentsWildcard;
+use Prophecy\Argument\Token\AnyValuesToken;
+use Prophecy\Util\StringUtil;
+use Prophecy\Exception\Prediction\NoCallsException;
+
+/**
+ * Call prediction.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallPrediction implements PredictionInterface
+{
+ private $util;
+
+ /**
+ * Initializes prediction.
+ *
+ * @param StringUtil $util
+ */
+ public function __construct(StringUtil $util = null)
+ {
+ $this->util = $util ?: new StringUtil;
+ }
+
+ /**
+ * Tests that there was at least one call.
+ *
+ * @param Call[] $calls
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @throws \Prophecy\Exception\Prediction\NoCallsException
+ */
+ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
+ {
+ if (count($calls)) {
+ return;
+ }
+
+ $methodCalls = $object->findProphecyMethodCalls(
+ $method->getMethodName(),
+ new ArgumentsWildcard(array(new AnyValuesToken))
+ );
+
+ if (count($methodCalls)) {
+ throw new NoCallsException(sprintf(
+ "No calls been made that match:\n".
+ " %s->%s(%s)\n".
+ "but expected at least one.\n".
+ "Recorded `%s(...)` calls:\n%s",
+
+ get_class($object->reveal()),
+ $method->getMethodName(),
+ $method->getArgumentsWildcard(),
+ $method->getMethodName(),
+ $this->util->stringifyCalls($methodCalls)
+ ), $method);
+ }
+
+ throw new NoCallsException(sprintf(
+ "No calls been made that match:\n".
+ " %s->%s(%s)\n".
+ "but expected at least one.",
+
+ get_class($object->reveal()),
+ $method->getMethodName(),
+ $method->getArgumentsWildcard()
+ ), $method);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php
new file mode 100644
index 0000000..31c6c57
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php
@@ -0,0 +1,107 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prediction;
+
+use Prophecy\Call\Call;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Argument\ArgumentsWildcard;
+use Prophecy\Argument\Token\AnyValuesToken;
+use Prophecy\Util\StringUtil;
+use Prophecy\Exception\Prediction\UnexpectedCallsCountException;
+
+/**
+ * Prediction interface.
+ * Predictions are logical test blocks, tied to `should...` keyword.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallTimesPrediction implements PredictionInterface
+{
+ private $times;
+ private $util;
+
+ /**
+ * Initializes prediction.
+ *
+ * @param int $times
+ * @param StringUtil $util
+ */
+ public function __construct($times, StringUtil $util = null)
+ {
+ $this->times = intval($times);
+ $this->util = $util ?: new StringUtil;
+ }
+
+ /**
+ * Tests that there was exact amount of calls made.
+ *
+ * @param Call[] $calls
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @throws \Prophecy\Exception\Prediction\UnexpectedCallsCountException
+ */
+ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
+ {
+ if ($this->times == count($calls)) {
+ return;
+ }
+
+ $methodCalls = $object->findProphecyMethodCalls(
+ $method->getMethodName(),
+ new ArgumentsWildcard(array(new AnyValuesToken))
+ );
+
+ if (count($calls)) {
+ $message = sprintf(
+ "Expected exactly %d calls that match:\n".
+ " %s->%s(%s)\n".
+ "but %d were made:\n%s",
+
+ $this->times,
+ get_class($object->reveal()),
+ $method->getMethodName(),
+ $method->getArgumentsWildcard(),
+ count($calls),
+ $this->util->stringifyCalls($calls)
+ );
+ } elseif (count($methodCalls)) {
+ $message = sprintf(
+ "Expected exactly %d calls that match:\n".
+ " %s->%s(%s)\n".
+ "but none were made.\n".
+ "Recorded `%s(...)` calls:\n%s",
+
+ $this->times,
+ get_class($object->reveal()),
+ $method->getMethodName(),
+ $method->getArgumentsWildcard(),
+ $method->getMethodName(),
+ $this->util->stringifyCalls($methodCalls)
+ );
+ } else {
+ $message = sprintf(
+ "Expected exactly %d calls that match:\n".
+ " %s->%s(%s)\n".
+ "but none were made.",
+
+ $this->times,
+ get_class($object->reveal()),
+ $method->getMethodName(),
+ $method->getArgumentsWildcard()
+ );
+ }
+
+ throw new UnexpectedCallsCountException($message, $method, $this->times, $calls);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php
new file mode 100644
index 0000000..44bc782
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php
@@ -0,0 +1,65 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prediction;
+
+use Prophecy\Call\Call;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Exception\InvalidArgumentException;
+use Closure;
+
+/**
+ * Callback prediction.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallbackPrediction implements PredictionInterface
+{
+ private $callback;
+
+ /**
+ * Initializes callback prediction.
+ *
+ * @param callable $callback Custom callback
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function __construct($callback)
+ {
+ if (!is_callable($callback)) {
+ throw new InvalidArgumentException(sprintf(
+ 'Callable expected as an argument to CallbackPrediction, but got %s.',
+ gettype($callback)
+ ));
+ }
+
+ $this->callback = $callback;
+ }
+
+ /**
+ * Executes preset callback.
+ *
+ * @param Call[] $calls
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ */
+ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
+ {
+ $callback = $this->callback;
+
+ if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
+ $callback = Closure::bind($callback, $object);
+ }
+
+ call_user_func($callback, $calls, $object, $method);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php
new file mode 100644
index 0000000..b663f47
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php
@@ -0,0 +1,66 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prediction;
+
+use Prophecy\Call\Call;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Util\StringUtil;
+use Prophecy\Exception\Prediction\UnexpectedCallsException;
+
+/**
+ * No calls prediction.
+ *
+ * @author Konstantin Kudryashov
+ */
+class NoCallsPrediction implements PredictionInterface
+{
+ private $util;
+
+ /**
+ * Initializes prediction.
+ *
+ * @param null|StringUtil $util
+ */
+ public function __construct(StringUtil $util = null)
+ {
+ $this->util = $util ?: new StringUtil;
+ }
+
+ /**
+ * Tests that there were no calls made.
+ *
+ * @param Call[] $calls
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @throws \Prophecy\Exception\Prediction\UnexpectedCallsException
+ */
+ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method)
+ {
+ if (!count($calls)) {
+ return;
+ }
+
+ throw new UnexpectedCallsException(sprintf(
+ "No calls expected that match:\n".
+ " %s->%s(%s)\n".
+ "but %d were made:\n%s",
+
+ get_class($object->reveal()),
+ $method->getMethodName(),
+ $method->getArgumentsWildcard(),
+ count($calls),
+ $this->util->stringifyCalls($calls)
+ ), $method, $calls);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php
new file mode 100644
index 0000000..f7fb06a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php
@@ -0,0 +1,37 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prediction;
+
+use Prophecy\Call\Call;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+
+/**
+ * Prediction interface.
+ * Predictions are logical test blocks, tied to `should...` keyword.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface PredictionInterface
+{
+ /**
+ * Tests that double fulfilled prediction.
+ *
+ * @param Call[] $calls
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @throws object
+ * @return void
+ */
+ public function check(array $calls, ObjectProphecy $object, MethodProphecy $method);
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php
new file mode 100644
index 0000000..5f406bf
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php
@@ -0,0 +1,66 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Promise;
+
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Exception\InvalidArgumentException;
+use Closure;
+
+/**
+ * Callback promise.
+ *
+ * @author Konstantin Kudryashov
+ */
+class CallbackPromise implements PromiseInterface
+{
+ private $callback;
+
+ /**
+ * Initializes callback promise.
+ *
+ * @param callable $callback Custom callback
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function __construct($callback)
+ {
+ if (!is_callable($callback)) {
+ throw new InvalidArgumentException(sprintf(
+ 'Callable expected as an argument to CallbackPromise, but got %s.',
+ gettype($callback)
+ ));
+ }
+
+ $this->callback = $callback;
+ }
+
+ /**
+ * Evaluates promise callback.
+ *
+ * @param array $args
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @return mixed
+ */
+ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
+ {
+ $callback = $this->callback;
+
+ if ($callback instanceof Closure && method_exists('Closure', 'bind')) {
+ $callback = Closure::bind($callback, $object);
+ }
+
+ return call_user_func($callback, $args, $object, $method);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php
new file mode 100644
index 0000000..382537b
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php
@@ -0,0 +1,35 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Promise;
+
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+
+/**
+ * Promise interface.
+ * Promises are logical blocks, tied to `will...` keyword.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface PromiseInterface
+{
+ /**
+ * Evaluates promise.
+ *
+ * @param array $args
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @return mixed
+ */
+ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method);
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php
new file mode 100644
index 0000000..98500d2
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnArgumentPromise.php
@@ -0,0 +1,37 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Promise;
+
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+
+/**
+ * Return argument promise.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ReturnArgumentPromise implements PromiseInterface
+{
+ /**
+ * Returns first argument if has one, null otherwise.
+ *
+ * @param array $args
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @return null|mixed
+ */
+ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
+ {
+ return count($args) ? $args[0] : null;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php
new file mode 100644
index 0000000..c7d5ac5
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/ReturnPromise.php
@@ -0,0 +1,55 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Promise;
+
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+
+/**
+ * Return promise.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ReturnPromise implements PromiseInterface
+{
+ private $returnValues = array();
+
+ /**
+ * Initializes promise.
+ *
+ * @param array $returnValues Array of values
+ */
+ public function __construct(array $returnValues)
+ {
+ $this->returnValues = $returnValues;
+ }
+
+ /**
+ * Returns saved values one by one until last one, then continuously returns last value.
+ *
+ * @param array $args
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @return mixed
+ */
+ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
+ {
+ $value = array_shift($this->returnValues);
+
+ if (!count($this->returnValues)) {
+ $this->returnValues[] = $value;
+ }
+
+ return $value;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php b/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php
new file mode 100644
index 0000000..8007330
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Promise/ThrowPromise.php
@@ -0,0 +1,91 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Promise;
+
+use Doctrine\Instantiator\Instantiator;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\MethodProphecy;
+use Prophecy\Exception\InvalidArgumentException;
+use ReflectionClass;
+
+/**
+ * Throw promise.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ThrowPromise implements PromiseInterface
+{
+ private $exception;
+
+ /**
+ * @var \Doctrine\Instantiator\Instantiator
+ */
+ private $instantiator;
+
+ /**
+ * Initializes promise.
+ *
+ * @param string|\Exception $exception Exception class name or instance
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function __construct($exception)
+ {
+ if (is_string($exception)) {
+ if (!class_exists($exception)
+ && 'Exception' !== $exception
+ && !is_subclass_of($exception, 'Exception')) {
+ throw new InvalidArgumentException(sprintf(
+ 'Exception class or instance expected as argument to ThrowPromise, but got %s.',
+ gettype($exception)
+ ));
+ }
+ } elseif (!$exception instanceof \Exception) {
+ throw new InvalidArgumentException(sprintf(
+ 'Exception class or instance expected as argument to ThrowPromise, but got %s.',
+ gettype($exception)
+ ));
+ }
+
+ $this->exception = $exception;
+ }
+
+ /**
+ * Throws predefined exception.
+ *
+ * @param array $args
+ * @param ObjectProphecy $object
+ * @param MethodProphecy $method
+ *
+ * @throws object
+ */
+ public function execute(array $args, ObjectProphecy $object, MethodProphecy $method)
+ {
+ if (is_string($this->exception)) {
+ $classname = $this->exception;
+ $reflection = new ReflectionClass($classname);
+ $constructor = $reflection->getConstructor();
+
+ if ($constructor->isPublic() && 0 == $constructor->getNumberOfRequiredParameters()) {
+ throw $reflection->newInstance();
+ }
+
+ if (!$this->instantiator) {
+ $this->instantiator = new Instantiator();
+ }
+
+ throw $this->instantiator->instantiate($classname);
+ }
+
+ throw $this->exception;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
new file mode 100644
index 0000000..28d0dbd
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/MethodProphecy.php
@@ -0,0 +1,407 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prophecy;
+
+use Prophecy\Argument;
+use Prophecy\Promise;
+use Prophecy\Prediction;
+use Prophecy\Exception\Doubler\MethodNotFoundException;
+use Prophecy\Exception\InvalidArgumentException;
+use Prophecy\Exception\Prophecy\MethodProphecyException;
+
+/**
+ * Method prophecy.
+ *
+ * @author Konstantin Kudryashov
+ */
+class MethodProphecy
+{
+ private $objectProphecy;
+ private $methodName;
+ private $argumentsWildcard;
+ private $promise;
+ private $prediction;
+ private $checkedPredictions = array();
+ private $bound = false;
+
+ /**
+ * Initializes method prophecy.
+ *
+ * @param ObjectProphecy $objectProphecy
+ * @param string $methodName
+ * @param null|Argument\ArgumentsWildcard|array $arguments
+ *
+ * @throws \Prophecy\Exception\Doubler\MethodNotFoundException If method not found
+ */
+ public function __construct(ObjectProphecy $objectProphecy, $methodName, $arguments = null)
+ {
+ $double = $objectProphecy->reveal();
+ if (!method_exists($double, $methodName)) {
+ throw new MethodNotFoundException(sprintf(
+ 'Method `%s::%s()` is not defined.', get_class($double), $methodName
+ ), get_class($double), $methodName);
+ }
+
+ $this->objectProphecy = $objectProphecy;
+ $this->methodName = $methodName;
+
+ $reflectedMethod = new \ReflectionMethod($double, $methodName);
+ if ($reflectedMethod->isFinal()) {
+ throw new MethodProphecyException(sprintf(
+ "Can not add prophecy for a method `%s::%s()`\n".
+ "as it is a final method.",
+ get_class($double),
+ $methodName
+ ), $this);
+ }
+
+ if (null !== $arguments) {
+ $this->withArguments($arguments);
+ }
+ }
+
+ /**
+ * Sets argument wildcard.
+ *
+ * @param array|Argument\ArgumentsWildcard $arguments
+ *
+ * @return $this
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function withArguments($arguments)
+ {
+ if (is_array($arguments)) {
+ $arguments = new Argument\ArgumentsWildcard($arguments);
+ }
+
+ if (!$arguments instanceof Argument\ArgumentsWildcard) {
+ throw new InvalidArgumentException(sprintf(
+ "Either an array or an instance of ArgumentsWildcard expected as\n".
+ 'a `MethodProphecy::withArguments()` argument, but got %s.',
+ gettype($arguments)
+ ));
+ }
+
+ $this->argumentsWildcard = $arguments;
+
+ return $this;
+ }
+
+ /**
+ * Sets custom promise to the prophecy.
+ *
+ * @param callable|Promise\PromiseInterface $promise
+ *
+ * @return $this
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function will($promise)
+ {
+ if (is_callable($promise)) {
+ $promise = new Promise\CallbackPromise($promise);
+ }
+
+ if (!$promise instanceof Promise\PromiseInterface) {
+ throw new InvalidArgumentException(sprintf(
+ 'Expected callable or instance of PromiseInterface, but got %s.',
+ gettype($promise)
+ ));
+ }
+
+ $this->bindToObjectProphecy();
+ $this->promise = $promise;
+
+ return $this;
+ }
+
+ /**
+ * Sets return promise to the prophecy.
+ *
+ * @see Prophecy\Promise\ReturnPromise
+ *
+ * @return $this
+ */
+ public function willReturn()
+ {
+ return $this->will(new Promise\ReturnPromise(func_get_args()));
+ }
+
+ /**
+ * Sets return argument promise to the prophecy.
+ *
+ * @see Prophecy\Promise\ReturnArgumentPromise
+ *
+ * @return $this
+ */
+ public function willReturnArgument()
+ {
+ return $this->will(new Promise\ReturnArgumentPromise);
+ }
+
+ /**
+ * Sets throw promise to the prophecy.
+ *
+ * @see Prophecy\Promise\ThrowPromise
+ *
+ * @param string|\Exception $exception Exception class or instance
+ *
+ * @return $this
+ */
+ public function willThrow($exception)
+ {
+ return $this->will(new Promise\ThrowPromise($exception));
+ }
+
+ /**
+ * Sets custom prediction to the prophecy.
+ *
+ * @param callable|Prediction\PredictionInterface $prediction
+ *
+ * @return $this
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function should($prediction)
+ {
+ if (is_callable($prediction)) {
+ $prediction = new Prediction\CallbackPrediction($prediction);
+ }
+
+ if (!$prediction instanceof Prediction\PredictionInterface) {
+ throw new InvalidArgumentException(sprintf(
+ 'Expected callable or instance of PredictionInterface, but got %s.',
+ gettype($prediction)
+ ));
+ }
+
+ $this->bindToObjectProphecy();
+ $this->prediction = $prediction;
+
+ return $this;
+ }
+
+ /**
+ * Sets call prediction to the prophecy.
+ *
+ * @see Prophecy\Prediction\CallPrediction
+ *
+ * @return $this
+ */
+ public function shouldBeCalled()
+ {
+ return $this->should(new Prediction\CallPrediction);
+ }
+
+ /**
+ * Sets no calls prediction to the prophecy.
+ *
+ * @see Prophecy\Prediction\NoCallsPrediction
+ *
+ * @return $this
+ */
+ public function shouldNotBeCalled()
+ {
+ return $this->should(new Prediction\NoCallsPrediction);
+ }
+
+ /**
+ * Sets call times prediction to the prophecy.
+ *
+ * @see Prophecy\Prediction\CallTimesPrediction
+ *
+ * @param $count
+ *
+ * @return $this
+ */
+ public function shouldBeCalledTimes($count)
+ {
+ return $this->should(new Prediction\CallTimesPrediction($count));
+ }
+
+ /**
+ * Checks provided prediction immediately.
+ *
+ * @param callable|Prediction\PredictionInterface $prediction
+ *
+ * @return $this
+ *
+ * @throws \Prophecy\Exception\InvalidArgumentException
+ */
+ public function shouldHave($prediction)
+ {
+ if (is_callable($prediction)) {
+ $prediction = new Prediction\CallbackPrediction($prediction);
+ }
+
+ if (!$prediction instanceof Prediction\PredictionInterface) {
+ throw new InvalidArgumentException(sprintf(
+ 'Expected callable or instance of PredictionInterface, but got %s.',
+ gettype($prediction)
+ ));
+ }
+
+ if (null === $this->promise) {
+ $this->willReturn();
+ }
+
+ $calls = $this->getObjectProphecy()->findProphecyMethodCalls(
+ $this->getMethodName(),
+ $this->getArgumentsWildcard()
+ );
+
+ try {
+ $prediction->check($calls, $this->getObjectProphecy(), $this);
+ $this->checkedPredictions[] = $prediction;
+ } catch (\Exception $e) {
+ $this->checkedPredictions[] = $prediction;
+
+ throw $e;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Checks call prediction.
+ *
+ * @see Prophecy\Prediction\CallPrediction
+ *
+ * @return $this
+ */
+ public function shouldHaveBeenCalled()
+ {
+ return $this->shouldHave(new Prediction\CallPrediction);
+ }
+
+ /**
+ * Checks no calls prediction.
+ *
+ * @see Prophecy\Prediction\NoCallsPrediction
+ *
+ * @return $this
+ */
+ public function shouldNotHaveBeenCalled()
+ {
+ return $this->shouldHave(new Prediction\NoCallsPrediction);
+ }
+
+ /**
+ * Checks no calls prediction.
+ *
+ * @see Prophecy\Prediction\NoCallsPrediction
+ * @deprecated
+ *
+ * @return $this
+ */
+ public function shouldNotBeenCalled()
+ {
+ return $this->shouldNotHaveBeenCalled();
+ }
+
+ /**
+ * Checks call times prediction.
+ *
+ * @see Prophecy\Prediction\CallTimesPrediction
+ *
+ * @param int $count
+ *
+ * @return $this
+ */
+ public function shouldHaveBeenCalledTimes($count)
+ {
+ return $this->shouldHave(new Prediction\CallTimesPrediction($count));
+ }
+
+ /**
+ * Checks currently registered [with should(...)] prediction.
+ */
+ public function checkPrediction()
+ {
+ if (null === $this->prediction) {
+ return;
+ }
+
+ $this->shouldHave($this->prediction);
+ }
+
+ /**
+ * Returns currently registered promise.
+ *
+ * @return null|Promise\PromiseInterface
+ */
+ public function getPromise()
+ {
+ return $this->promise;
+ }
+
+ /**
+ * Returns currently registered prediction.
+ *
+ * @return null|Prediction\PredictionInterface
+ */
+ public function getPrediction()
+ {
+ return $this->prediction;
+ }
+
+ /**
+ * Returns predictions that were checked on this object.
+ *
+ * @return PredictionInterface[]
+ */
+ public function getCheckedPredictions()
+ {
+ return $this->checkedPredictions;
+ }
+
+ /**
+ * Returns object prophecy this method prophecy is tied to.
+ *
+ * @return ObjectProphecy
+ */
+ public function getObjectProphecy()
+ {
+ return $this->objectProphecy;
+ }
+
+ /**
+ * Returns method name.
+ *
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * Returns arguments wildcard.
+ *
+ * @return Argument\ArgumentsWildcard
+ */
+ public function getArgumentsWildcard()
+ {
+ return $this->argumentsWildcard;
+ }
+
+ private function bindToObjectProphecy()
+ {
+ if ($this->bound) {
+ return;
+ }
+
+ $this->getObjectProphecy()->addMethodProphecy($this);
+ $this->bound = true;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php
new file mode 100644
index 0000000..6c69b73
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ObjectProphecy.php
@@ -0,0 +1,265 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prophecy;
+
+use Prophecy\Call\Call;
+use Prophecy\Doubler\LazyDouble;
+use Prophecy\Argument\ArgumentsWildcard;
+use Prophecy\Call\CallCenter;
+use Prophecy\Exception\Prophecy\ObjectProphecyException;
+use Prophecy\Exception\Prophecy\MethodProphecyException;
+use Prophecy\Exception\Prediction\AggregateException;
+use Prophecy\Exception\Prediction\PredictionException;
+
+/**
+ * Object prophecy.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ObjectProphecy implements ProphecyInterface
+{
+ private $lazyDouble;
+ private $callCenter;
+ private $revealer;
+
+ /**
+ * @var MethodProphecy[][]
+ */
+ private $methodProphecies = array();
+
+ /**
+ * Initializes object prophecy.
+ *
+ * @param LazyDouble $lazyDouble
+ * @param CallCenter $callCenter
+ * @param RevealerInterface $revealer
+ */
+ public function __construct(LazyDouble $lazyDouble, CallCenter $callCenter = null,
+ RevealerInterface $revealer = null)
+ {
+ $this->lazyDouble = $lazyDouble;
+ $this->callCenter = $callCenter ?: new CallCenter;
+ $this->revealer = $revealer ?: new Revealer;
+ }
+
+ /**
+ * Forces double to extend specific class.
+ *
+ * @param string $class
+ *
+ * @return $this
+ */
+ public function willExtend($class)
+ {
+ $this->lazyDouble->setParentClass($class);
+
+ return $this;
+ }
+
+ /**
+ * Forces double to implement specific interface.
+ *
+ * @param string $interface
+ *
+ * @return $this
+ */
+ public function willImplement($interface)
+ {
+ $this->lazyDouble->addInterface($interface);
+
+ return $this;
+ }
+
+ /**
+ * Sets constructor arguments.
+ *
+ * @param array $arguments
+ *
+ * @return $this
+ */
+ public function willBeConstructedWith(array $arguments = null)
+ {
+ $this->lazyDouble->setArguments($arguments);
+
+ return $this;
+ }
+
+ /**
+ * Reveals double.
+ *
+ * @return object
+ *
+ * @throws \Prophecy\Exception\Prophecy\ObjectProphecyException If double doesn't implement needed interface
+ */
+ public function reveal()
+ {
+ $double = $this->lazyDouble->getInstance();
+
+ if (null === $double || !$double instanceof ProphecySubjectInterface) {
+ throw new ObjectProphecyException(
+ "Generated double must implement ProphecySubjectInterface, but it does not.\n".
+ 'It seems you have wrongly configured doubler without required ClassPatch.',
+ $this
+ );
+ }
+
+ $double->setProphecy($this);
+
+ return $double;
+ }
+
+ /**
+ * Adds method prophecy to object prophecy.
+ *
+ * @param MethodProphecy $methodProphecy
+ *
+ * @throws \Prophecy\Exception\Prophecy\MethodProphecyException If method prophecy doesn't
+ * have arguments wildcard
+ */
+ public function addMethodProphecy(MethodProphecy $methodProphecy)
+ {
+ $argumentsWildcard = $methodProphecy->getArgumentsWildcard();
+ if (null === $argumentsWildcard) {
+ throw new MethodProphecyException(sprintf(
+ "Can not add prophecy for a method `%s::%s()`\n".
+ "as you did not specify arguments wildcard for it.",
+ get_class($this->reveal()),
+ $methodProphecy->getMethodName()
+ ), $methodProphecy);
+ }
+
+ $methodName = $methodProphecy->getMethodName();
+
+ if (!isset($this->methodProphecies[$methodName])) {
+ $this->methodProphecies[$methodName] = array();
+ }
+
+ $this->methodProphecies[$methodName][] = $methodProphecy;
+ }
+
+ /**
+ * Returns either all or related to single method prophecies.
+ *
+ * @param null|string $methodName
+ *
+ * @return MethodProphecy[]
+ */
+ public function getMethodProphecies($methodName = null)
+ {
+ if (null === $methodName) {
+ return $this->methodProphecies;
+ }
+
+ if (!isset($this->methodProphecies[$methodName])) {
+ return array();
+ }
+
+ return $this->methodProphecies[$methodName];
+ }
+
+ /**
+ * Makes specific method call.
+ *
+ * @param string $methodName
+ * @param array $arguments
+ *
+ * @return mixed
+ */
+ public function makeProphecyMethodCall($methodName, array $arguments)
+ {
+ $arguments = $this->revealer->reveal($arguments);
+ $return = $this->callCenter->makeCall($this, $methodName, $arguments);
+
+ return $this->revealer->reveal($return);
+ }
+
+ /**
+ * Finds calls by method name & arguments wildcard.
+ *
+ * @param string $methodName
+ * @param ArgumentsWildcard $wildcard
+ *
+ * @return Call[]
+ */
+ public function findProphecyMethodCalls($methodName, ArgumentsWildcard $wildcard)
+ {
+ return $this->callCenter->findCalls($methodName, $wildcard);
+ }
+
+ /**
+ * Checks that registered method predictions do not fail.
+ *
+ * @throws \Prophecy\Exception\Prediction\AggregateException If any of registered predictions fail
+ */
+ public function checkProphecyMethodsPredictions()
+ {
+ $exception = new AggregateException(sprintf("%s:\n", get_class($this->reveal())));
+ $exception->setObjectProphecy($this);
+
+ foreach ($this->methodProphecies as $prophecies) {
+ foreach ($prophecies as $prophecy) {
+ try {
+ $prophecy->checkPrediction();
+ } catch (PredictionException $e) {
+ $exception->append($e);
+ }
+ }
+ }
+
+ if (count($exception->getExceptions())) {
+ throw $exception;
+ }
+ }
+
+ /**
+ * Creates new method prophecy using specified method name and arguments.
+ *
+ * @param string $methodName
+ * @param array $arguments
+ *
+ * @return MethodProphecy
+ */
+ public function __call($methodName, array $arguments)
+ {
+ $arguments = new ArgumentsWildcard($this->revealer->reveal($arguments));
+
+ foreach ($this->getMethodProphecies($methodName) as $prophecy) {
+ // Use the silence operator to suppress any notice about object to integer casting
+ if (@($prophecy->getArgumentsWildcard() == $arguments)) {
+ return $prophecy;
+ }
+ }
+
+ return new MethodProphecy($this, $methodName, $arguments);
+ }
+
+ /**
+ * Tries to get property value from double.
+ *
+ * @param string $name
+ */
+ public function __get($name)
+ {
+ return $this->reveal()->$name;
+ }
+
+ /**
+ * Tries to set property value to double.
+ *
+ * @param string $name
+ * @param string $value
+ */
+ public function __set($name, $value)
+ {
+ $this->reveal()->$name = $this->revealer->reveal($value);
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php
new file mode 100644
index 0000000..462f15a
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecyInterface.php
@@ -0,0 +1,27 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prophecy;
+
+/**
+ * Core Prophecy interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface ProphecyInterface
+{
+ /**
+ * Reveals prophecy object (double) .
+ *
+ * @return object
+ */
+ public function reveal();
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php
new file mode 100644
index 0000000..2d83958
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/ProphecySubjectInterface.php
@@ -0,0 +1,34 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prophecy;
+
+/**
+ * Controllable doubles interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface ProphecySubjectInterface
+{
+ /**
+ * Sets subject prophecy.
+ *
+ * @param ProphecyInterface $prophecy
+ */
+ public function setProphecy(ProphecyInterface $prophecy);
+
+ /**
+ * Returns subject prophecy.
+ *
+ * @return ProphecyInterface
+ */
+ public function getProphecy();
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php
new file mode 100644
index 0000000..60ecdac
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/Revealer.php
@@ -0,0 +1,44 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prophecy;
+
+/**
+ * Basic prophecies revealer.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Revealer implements RevealerInterface
+{
+ /**
+ * Unwraps value(s).
+ *
+ * @param mixed $value
+ *
+ * @return mixed
+ */
+ public function reveal($value)
+ {
+ if (is_array($value)) {
+ return array_map(array($this, __FUNCTION__), $value);
+ }
+
+ if (!is_object($value)) {
+ return $value;
+ }
+
+ if ($value instanceof ProphecyInterface) {
+ $value = $value->reveal();
+ }
+
+ return $value;
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php
new file mode 100644
index 0000000..ffc82bb
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophecy/RevealerInterface.php
@@ -0,0 +1,29 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Prophecy;
+
+/**
+ * Prophecies revealer interface.
+ *
+ * @author Konstantin Kudryashov
+ */
+interface RevealerInterface
+{
+ /**
+ * Unwraps value(s).
+ *
+ * @param mixed $value
+ *
+ * @return mixed
+ */
+ public function reveal($value);
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Prophet.php b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php
new file mode 100644
index 0000000..ac64923
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Prophet.php
@@ -0,0 +1,134 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy;
+
+use Prophecy\Doubler\Doubler;
+use Prophecy\Doubler\LazyDouble;
+use Prophecy\Doubler\ClassPatch;
+use Prophecy\Prophecy\ObjectProphecy;
+use Prophecy\Prophecy\RevealerInterface;
+use Prophecy\Prophecy\Revealer;
+use Prophecy\Call\CallCenter;
+use Prophecy\Util\StringUtil;
+use Prophecy\Exception\Prediction\PredictionException;
+use Prophecy\Exception\Prediction\AggregateException;
+
+/**
+ * Prophet creates prophecies.
+ *
+ * @author Konstantin Kudryashov
+ */
+class Prophet
+{
+ private $doubler;
+ private $revealer;
+ private $util;
+
+ /**
+ * @var ObjectProphecy[]
+ */
+ private $prophecies = array();
+
+ /**
+ * Initializes Prophet.
+ *
+ * @param null|Doubler $doubler
+ * @param null|RevealerInterface $revealer
+ * @param null|StringUtil $util
+ */
+ public function __construct(Doubler $doubler = null, RevealerInterface $revealer = null,
+ StringUtil $util = null)
+ {
+ if (null === $doubler) {
+ $doubler = new Doubler;
+ $doubler->registerClassPatch(new ClassPatch\SplFileInfoPatch);
+ $doubler->registerClassPatch(new ClassPatch\TraversablePatch);
+ $doubler->registerClassPatch(new ClassPatch\DisableConstructorPatch);
+ $doubler->registerClassPatch(new ClassPatch\ProphecySubjectPatch);
+ $doubler->registerClassPatch(new ClassPatch\ReflectionClassNewInstancePatch);
+ $doubler->registerClassPatch(new ClassPatch\HhvmExceptionPatch());
+ $doubler->registerClassPatch(new ClassPatch\MagicCallPatch);
+ $doubler->registerClassPatch(new ClassPatch\KeywordPatch);
+ }
+
+ $this->doubler = $doubler;
+ $this->revealer = $revealer ?: new Revealer;
+ $this->util = $util ?: new StringUtil;
+ }
+
+ /**
+ * Creates new object prophecy.
+ *
+ * @param null|string $classOrInterface Class or interface name
+ *
+ * @return ObjectProphecy
+ */
+ public function prophesize($classOrInterface = null)
+ {
+ $this->prophecies[] = $prophecy = new ObjectProphecy(
+ new LazyDouble($this->doubler),
+ new CallCenter($this->util),
+ $this->revealer
+ );
+
+ if ($classOrInterface && class_exists($classOrInterface)) {
+ return $prophecy->willExtend($classOrInterface);
+ }
+
+ if ($classOrInterface && interface_exists($classOrInterface)) {
+ return $prophecy->willImplement($classOrInterface);
+ }
+
+ return $prophecy;
+ }
+
+ /**
+ * Returns all created object prophecies.
+ *
+ * @return ObjectProphecy[]
+ */
+ public function getProphecies()
+ {
+ return $this->prophecies;
+ }
+
+ /**
+ * Returns Doubler instance assigned to this Prophet.
+ *
+ * @return Doubler
+ */
+ public function getDoubler()
+ {
+ return $this->doubler;
+ }
+
+ /**
+ * Checks all predictions defined by prophecies of this Prophet.
+ *
+ * @throws Exception\Prediction\AggregateException If any prediction fails
+ */
+ public function checkPredictions()
+ {
+ $exception = new AggregateException("Some predictions failed:\n");
+ foreach ($this->prophecies as $prophecy) {
+ try {
+ $prophecy->checkProphecyMethodsPredictions();
+ } catch (PredictionException $e) {
+ $exception->append($e);
+ }
+ }
+
+ if (count($exception->getExceptions())) {
+ throw $exception;
+ }
+ }
+}
diff --git a/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php b/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php
new file mode 100644
index 0000000..54d3832
--- /dev/null
+++ b/vendor/phpspec/prophecy/src/Prophecy/Util/ExportUtil.php
@@ -0,0 +1,185 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+/**
+ * Exporting utility.
+ *
+ * This class is derived from the PHPUnit testing framework.
+ *
+ * @author Sebastiaan Stok