" >&2
+ exit 1
+fi
+
+# --- Config
+allowunannotated=$(git config --bool hooks.allowunannotated)
+allowdeletebranch=$(git config --bool hooks.allowdeletebranch)
+denycreatebranch=$(git config --bool hooks.denycreatebranch)
+allowdeletetag=$(git config --bool hooks.allowdeletetag)
+allowmodifytag=$(git config --bool hooks.allowmodifytag)
+
+# check for no description
+projectdesc=$(sed -e '1q' "$GIT_DIR/description")
+case "$projectdesc" in
+"Unnamed repository"* | "")
+ echo "*** Project description file hasn't been set" >&2
+ exit 1
+ ;;
+esac
+
+# --- Check types
+# if $newrev is 0000...0000, it's a commit to delete a ref.
+zero="0000000000000000000000000000000000000000"
+if [ "$newrev" = "$zero" ]; then
+ newrev_type=delete
+else
+ newrev_type=$(git cat-file -t $newrev)
+fi
+
+case "$refname","$newrev_type" in
+ refs/tags/*,commit)
+ # un-annotated tag
+ short_refname=${refname##refs/tags/}
+ if [ "$allowunannotated" != "true" ]; then
+ echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2
+ echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,delete)
+ # delete tag
+ if [ "$allowdeletetag" != "true" ]; then
+ echo "*** Deleting a tag is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/tags/*,tag)
+ # annotated tag
+ if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1
+ then
+ echo "*** Tag '$refname' already exists." >&2
+ echo "*** Modifying a tag is not allowed in this repository." >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,commit)
+ # branch
+ if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then
+ echo "*** Creating a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/heads/*,delete)
+ # delete branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ refs/remotes/*,commit)
+ # tracking branch
+ ;;
+ refs/remotes/*,delete)
+ # delete tracking branch
+ if [ "$allowdeletebranch" != "true" ]; then
+ echo "*** Deleting a tracking branch is not allowed in this repository" >&2
+ exit 1
+ fi
+ ;;
+ *)
+ # Anything else (is there anything else?)
+ echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2
+ exit 1
+ ;;
+esac
+
+# --- Finished
+exit 0
diff --git a/info/exclude b/info/exclude
new file mode 100644
index 0000000..a5196d1
--- /dev/null
+++ b/info/exclude
@@ -0,0 +1,6 @@
+# git ls-files --others --exclude-from=.git/info/exclude
+# Lines that start with '#' are comments.
+# For a project mostly in C, the following would be a good set of
+# exclude patterns (uncomment them if you want to use them):
+# *.[oa]
+# *~
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..87481c7
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+ "private": true,
+ "scripts": {
+ "prod": "gulp --production",
+ "dev": "gulp watch"
+ },
+ "devDependencies": {
+ "gulp": "^3.9.1",
+ "laravel-elixir": "^5.0.0",
+ "bootstrap-sass": "^3.3.0"
+ }
+}
diff --git a/packages/jai/Contact/Views/contact.blade.php b/packages/jai/Contact/Views/contact.blade.php
new file mode 100644
index 0000000..e70df22
--- /dev/null
+++ b/packages/jai/Contact/Views/contact.blade.php
@@ -0,0 +1,10 @@
+@extends('contact::template')
+
+
+@section('content')
+
+ Displaying Blade Template
+
+ {{ $message }}
+
+@stop
\ No newline at end of file
diff --git a/packages/jai/Contact/Views/template.blade.php b/packages/jai/Contact/Views/template.blade.php
new file mode 100644
index 0000000..cd85fb2
--- /dev/null
+++ b/packages/jai/Contact/Views/template.blade.php
@@ -0,0 +1,9 @@
+
+
+
+ title
+
+
+@yield('content')
+
+
\ No newline at end of file
diff --git a/packages/jai/Contact/composer.json b/packages/jai/Contact/composer.json
new file mode 100644
index 0000000..5fd0b0d
--- /dev/null
+++ b/packages/jai/Contact/composer.json
@@ -0,0 +1,20 @@
+{
+ "name": "jai/contact",
+ "description": "A simple Example to Create a Laravel test Package",
+ "license": "MTI",
+ "authors": [
+ {
+ "name": "Jai Kora",
+ "email": "kora.jayaram@gmail.com"
+ }
+ ],
+ "require": {},
+ "require-dev": {
+ "phpunit/phpunit": "4.8.*"
+ },
+ "autoload-dev": {
+ "classmap": [
+ "tests/testPackageCase.php"
+ ]
+ }
+}
diff --git a/packages/jai/Contact/composer.lock b/packages/jai/Contact/composer.lock
new file mode 100644
index 0000000..2e64ef1
--- /dev/null
+++ b/packages/jai/Contact/composer.lock
@@ -0,0 +1,1121 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "760b1ecb968aafd3754f3ff85d3fb421",
+ "content-hash": "4efd44bd56e0757f792875d4e75acc76",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "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"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-06-14 21:17:01"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-12-27 11:43:31"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "9270140b940ff02e58ec577c237274e92cd40cdd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd",
+ "reference": "9270140b940ff02e58ec577c237274e92cd40cdd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2016-06-10 09:48:41"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-06-10 07:14:17"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "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": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2016-06-07 08:13:47"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "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.3.2",
+ "sebastian/version": "~1.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.x-dev"
+ }
+ },
+ "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": "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"
+ ],
+ "time": "2015-10-06 15:47:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "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": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2015-06-21 13:08:43"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21 13:50:34"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
+ "type": "library",
+ "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": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2016-05-12 18:03:57"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-09-15 10:49:45"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.8.26",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74",
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74",
+ "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.1",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "~1.3",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.8.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2016-05-17 03:09:28"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-10-02 06:51:40"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-07-26 15:48:44"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "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": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2015-12-08 07:14:41"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2016-05-17 03:18:57"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "7ae5513327cb536431847bcc0c10edba2701064e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e",
+ "reference": "7ae5513327cb536431847bcc0c10edba2701064e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "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"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2015-06-21 07:55:53"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-10-12 03:26:01"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2015-11-11 19:50:13"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2015-06-21 13:59:46"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "eca51b7b65eb9be6af88ad7cc91685f1556f5c9a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/eca51b7b65eb9be6af88ad7cc91685f1556f5c9a",
+ "reference": "eca51b7b65eb9be6af88ad7cc91685f1556f5c9a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2016-05-26 21:46:24"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde",
+ "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2015-08-24 13:29:44"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": []
+}
diff --git a/packages/jai/Contact/phpunit.xml b/packages/jai/Contact/phpunit.xml
new file mode 100644
index 0000000..f7c61e9
--- /dev/null
+++ b/packages/jai/Contact/phpunit.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ ./tests/
+
+
+
\ No newline at end of file
diff --git a/packages/jai/Contact/src/ContactServiceprovider.php b/packages/jai/Contact/src/ContactServiceprovider.php
new file mode 100644
index 0000000..4c6b985
--- /dev/null
+++ b/packages/jai/Contact/src/ContactServiceprovider.php
@@ -0,0 +1,71 @@
+
+ */
+
+use Illuminate\Support\ServiceProvider;
+use Illuminate\Routing\Router;
+
+class ContactServiceprovider extends ServiceProvider
+{
+
+
+ /**
+ * Indicates if loading of the provider is deferred.
+ *
+ * @var bool
+ */
+ protected $defer = false;
+
+ public function boot()
+ {
+
+ $this->loadViewsFrom(realpath(__DIR__ . '/../views'), 'contact');
+ $this->setupRoutes($this->app->router);
+
+
+ // this for Config
+ $this->publishes([
+ __DIR__ . '/config/contact.php' => config_path('contact.php'),
+ ]);
+
+ }
+
+ /**
+ * Define the routes for the application.
+ *
+ * @param \Illuminate\Routing\Router $router
+ *
+ * @return void
+ */
+ public function setupRoutes(Router $router)
+ {
+ $router->group(['namespace' => 'Jai\Contact\Http\Controllers'], function ($router) {
+ require __DIR__ . '/Http/routes.php';
+ });
+ }
+
+
+ /**
+ * @return void
+ */
+ public function register()
+ {
+ $this->registerContact();
+ config([
+ 'config/contact.php',
+ ]);
+ }
+
+ /**
+ * @return void
+ */
+ private function registerContact()
+ {
+ $this->app->bind('contact', function ($app) {
+ return new Contact($app);
+ });
+ }
+}
diff --git a/packages/jai/Contact/src/Http/Controllers/ContactController.php b/packages/jai/Contact/src/Http/Controllers/ContactController.php
new file mode 100644
index 0000000..c2cd248
--- /dev/null
+++ b/packages/jai/Contact/src/Http/Controllers/ContactController.php
@@ -0,0 +1,27 @@
+
+ */
+
+
+use App\Http\Controllers\Controller;
+use Illuminate\Support\Facades\Config;
+
+
+class ContactController extends Controller
+{
+
+ /**
+ * Show the application welcome screen to the user.
+ *
+ * @return Response
+ */
+ public function index()
+ {
+ $message = Config::get("contact.message");
+
+ return view('contact::contact', compact('message'));
+ }
+}
diff --git a/packages/jai/Contact/src/Http/routes.php b/packages/jai/Contact/src/Http/routes.php
new file mode 100644
index 0000000..295ca8c
--- /dev/null
+++ b/packages/jai/Contact/src/Http/routes.php
@@ -0,0 +1,2 @@
+ "Welcome to your new package"
+];
\ No newline at end of file
diff --git a/packages/jai/Contact/tests/ContactTest.php b/packages/jai/Contact/tests/ContactTest.php
new file mode 100644
index 0000000..1ff0615
--- /dev/null
+++ b/packages/jai/Contact/tests/ContactTest.php
@@ -0,0 +1,19 @@
+visit('/contact')
+ ->See('Welcome to your new package ');
+ }
+}
\ No newline at end of file
diff --git a/packages/jai/Contact/tests/TestPackageCase.php b/packages/jai/Contact/tests/TestPackageCase.php
new file mode 100644
index 0000000..c3a0739
--- /dev/null
+++ b/packages/jai/Contact/tests/TestPackageCase.php
@@ -0,0 +1,26 @@
+make(\Illuminate\Contracts\Console\Kernel::class)->bootstrap();
+
+ return $app;
+ }
+}
\ No newline at end of file
diff --git a/packages/jai/Contact/vendor/autoload.php b/packages/jai/Contact/vendor/autoload.php
new file mode 100644
index 0000000..de2b05a
--- /dev/null
+++ b/packages/jai/Contact/vendor/autoload.php
@@ -0,0 +1,7 @@
+
+ * Jordi Boggiano
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0, PSR-4 and classmap class loader.
+ *
+ * $loader = new \Composer\Autoload\ClassLoader();
+ *
+ * // register classes with namespaces
+ * $loader->add('Symfony\Component', __DIR__.'/component');
+ * $loader->add('Symfony', __DIR__.'/framework');
+ *
+ * // activate the autoloader
+ * $loader->register();
+ *
+ * // to enable searching the include path (eg. for PEAR packages)
+ * $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier
+ * @author Jordi Boggiano
+ * @see http://www.php-fig.org/psr/psr-0/
+ * @see http://www.php-fig.org/psr/psr-4/
+ */
+class ClassLoader
+{
+ // PSR-4
+ private $prefixLengthsPsr4 = array();
+ private $prefixDirsPsr4 = array();
+ private $fallbackDirsPsr4 = array();
+
+ // PSR-0
+ private $prefixesPsr0 = array();
+ private $fallbackDirsPsr0 = array();
+
+ private $useIncludePath = false;
+ private $classMap = array();
+
+ private $classMapAuthoritative = false;
+
+ public function getPrefixes()
+ {
+ 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->fallbackDirsPsr0;
+ }
+
+ public function getFallbackDirsPsr4()
+ {
+ return $this->fallbackDirsPsr4;
+ }
+
+ public function getClassMap()
+ {
+ return $this->classMap;
+ }
+
+ /**
+ * @param array $classMap Class to filename map
+ */
+ public function addClassMap(array $classMap)
+ {
+ if ($this->classMap) {
+ $this->classMap = array_merge($this->classMap, $classMap);
+ } else {
+ $this->classMap = $classMap;
+ }
+ }
+
+ /**
+ * 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 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->fallbackDirsPsr0 = array_merge(
+ (array) $paths,
+ $this->fallbackDirsPsr0
+ );
+ } else {
+ $this->fallbackDirsPsr0 = array_merge(
+ $this->fallbackDirsPsr0,
+ (array) $paths
+ );
+ }
+
+ return;
+ }
+
+ $first = $prefix[0];
+ if (!isset($this->prefixesPsr0[$first][$prefix])) {
+ $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+ return;
+ }
+ if ($prepend) {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ (array) $paths,
+ $this->prefixesPsr0[$first][$prefix]
+ );
+ } else {
+ $this->prefixesPsr0[$first][$prefix] = array_merge(
+ $this->prefixesPsr0[$first][$prefix],
+ (array) $paths
+ );
+ }
+ }
+
+ /**
+ * 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-4 base directories
+ * @param bool $prepend Whether to prepend the directories
+ *
+ * @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->fallbackDirsPsr0 = (array) $paths;
+ } else {
+ $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+ }
+ }
+
+ /**
+ * 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;
+ }
+ }
+
+ /**
+ * Turns on searching the include path for class files.
+ *
+ * @param bool $useIncludePath
+ */
+ public function setUseIncludePath($useIncludePath)
+ {
+ $this->useIncludePath = $useIncludePath;
+ }
+
+ /**
+ * Can be used to check if the autoloader uses the include path to check
+ * for classes.
+ *
+ * @return bool
+ */
+ public function getUseIncludePath()
+ {
+ return $this->useIncludePath;
+ }
+
+ /**
+ * Turns off searching the prefix and fallback directories for classes
+ * that have not been registered with the class map.
+ *
+ * @param bool $classMapAuthoritative
+ */
+ public function setClassMapAuthoritative($classMapAuthoritative)
+ {
+ $this->classMapAuthoritative = $classMapAuthoritative;
+ }
+
+ /**
+ * Should class lookup fail if not found in the current class map?
+ *
+ * @return bool
+ */
+ public function isClassMapAuthoritative()
+ {
+ return $this->classMapAuthoritative;
+ }
+
+ /**
+ * Registers this instance as an autoloader.
+ *
+ * @param bool $prepend Whether to prepend the autoloader or not
+ */
+ public function register($prepend = false)
+ {
+ spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+ }
+
+ /**
+ * Unregisters this instance as an autoloader.
+ */
+ public function unregister()
+ {
+ spl_autoload_unregister(array($this, 'loadClass'));
+ }
+
+ /**
+ * Loads the given class or interface.
+ *
+ * @param string $class The name of the class
+ * @return bool|null True if loaded, null otherwise
+ */
+ public function loadClass($class)
+ {
+ if ($file = $this->findFile($class)) {
+ includeFile($file);
+
+ return true;
+ }
+ }
+
+ /**
+ * Finds the path to the file where the class is defined.
+ *
+ * @param string $class The name of the class
+ *
+ * @return string|false The path if found, false otherwise
+ */
+ 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];
+ }
+ if ($this->classMapAuthoritative) {
+ return false;
+ }
+
+ $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
+ $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1)
+ . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR);
+ } else {
+ // PEAR-like class name
+ $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext;
+ }
+
+ 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;
+ }
+ }
+ }
+ }
+ }
+
+ // PSR-0 fallback dirs
+ foreach ($this->fallbackDirsPsr0 as $dir) {
+ if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+ return $file;
+ }
+ }
+
+ // PSR-0 include paths.
+ if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+ return $file;
+ }
+ }
+}
+
+/**
+ * Scope isolated include.
+ *
+ * Prevents access to $this/self from included files.
+ */
+function includeFile($file)
+{
+ include $file;
+}
diff --git a/packages/jai/Contact/vendor/composer/LICENSE b/packages/jai/Contact/vendor/composer/LICENSE
new file mode 100644
index 0000000..1a28124
--- /dev/null
+++ b/packages/jai/Contact/vendor/composer/LICENSE
@@ -0,0 +1,21 @@
+
+Copyright (c) 2016 Nils Adermann, Jordi Boggiano
+
+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/packages/jai/Contact/vendor/composer/autoload_classmap.php b/packages/jai/Contact/vendor/composer/autoload_classmap.php
new file mode 100644
index 0000000..a596bd3
--- /dev/null
+++ b/packages/jai/Contact/vendor/composer/autoload_classmap.php
@@ -0,0 +1,445 @@
+ $vendorDir . '/phpunit/php-file-iterator/src/Iterator.php',
+ 'File_Iterator_Facade' => $vendorDir . '/phpunit/php-file-iterator/src/Facade.php',
+ 'File_Iterator_Factory' => $vendorDir . '/phpunit/php-file-iterator/src/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_PHPDBG' => $vendorDir . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.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/src/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_ASYNC' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AWAIT' => $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_COALESCE' => $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_COMPILER_HALT_OFFSET' => $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_ENUM' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUAL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUALS' => $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_IN' => $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_JOIN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_ARROW' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_CP' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_OP' => $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_ONUMBER' => $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_SHAPE' => $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_SPACESHIP' => $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_TYPE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_LT' => $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_WHERE' => $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_XHP_ATTRIBUTE' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CHILDREN' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_LABEL' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_REQUIRED' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_GT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_LT' => $vendorDir . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TEXT' => $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',
+ 'PHP_Token_YIELD_FROM' => $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\\Exporter' => $vendorDir . '/sebastian/exporter/src/Exporter.php',
+ 'SebastianBergmann\\GlobalState\\Blacklist' => $vendorDir . '/sebastian/global-state/src/Blacklist.php',
+ 'SebastianBergmann\\GlobalState\\CodeExporter' => $vendorDir . '/sebastian/global-state/src/CodeExporter.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\\RecursionContext\\Context' => $vendorDir . '/sebastian/recursion-context/src/Context.php',
+ 'SebastianBergmann\\RecursionContext\\Exception' => $vendorDir . '/sebastian/recursion-context/src/Exception.php',
+ 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => $vendorDir . '/sebastian/recursion-context/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\Version' => $vendorDir . '/sebastian/version/src/Version.php',
+ 'Text_Template' => $vendorDir . '/phpunit/php-text-template/src/Template.php',
+ 'testPackageCase' => $baseDir . '/tests/testPackageCase.php',
+);
diff --git a/packages/jai/Contact/vendor/composer/autoload_namespaces.php b/packages/jai/Contact/vendor/composer/autoload_namespaces.php
new file mode 100644
index 0000000..b24b217
--- /dev/null
+++ b/packages/jai/Contact/vendor/composer/autoload_namespaces.php
@@ -0,0 +1,10 @@
+ array($vendorDir . '/phpspec/prophecy/src'),
+);
diff --git a/packages/jai/Contact/vendor/composer/autoload_psr4.php b/packages/jai/Contact/vendor/composer/autoload_psr4.php
new file mode 100644
index 0000000..d5be7e9
--- /dev/null
+++ b/packages/jai/Contact/vendor/composer/autoload_psr4.php
@@ -0,0 +1,13 @@
+ array($vendorDir . '/phpdocumentor/reflection-common/src', $vendorDir . '/phpdocumentor/type-resolver/src', $vendorDir . '/phpdocumentor/reflection-docblock/src'),
+ 'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
+ 'Symfony\\Component\\Yaml\\' => array($vendorDir . '/symfony/yaml'),
+ 'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
+);
diff --git a/packages/jai/Contact/vendor/composer/autoload_real.php b/packages/jai/Contact/vendor/composer/autoload_real.php
new file mode 100644
index 0000000..01b8fab
--- /dev/null
+++ b/packages/jai/Contact/vendor/composer/autoload_real.php
@@ -0,0 +1,52 @@
+= 50600 && !defined('HHVM_VERSION');
+ if ($useStaticLoader) {
+ require_once __DIR__ . '/autoload_static.php';
+
+ call_user_func(\Composer\Autoload\ComposerStaticInit97cf90c549d7a6edab5e08dd7bc0aacf::getInitializer($loader));
+ } else {
+ $map = require __DIR__ . '/autoload_namespaces.php';
+ foreach ($map as $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';
+ if ($classMap) {
+ $loader->addClassMap($classMap);
+ }
+ }
+
+ $loader->register(true);
+
+ return $loader;
+ }
+}
diff --git a/packages/jai/Contact/vendor/composer/autoload_static.php b/packages/jai/Contact/vendor/composer/autoload_static.php
new file mode 100644
index 0000000..3834194
--- /dev/null
+++ b/packages/jai/Contact/vendor/composer/autoload_static.php
@@ -0,0 +1,508 @@
+
+ array (
+ 'phpDocumentor\\Reflection\\' => 25,
+ ),
+ 'W' =>
+ array (
+ 'Webmozart\\Assert\\' => 17,
+ ),
+ 'S' =>
+ array (
+ 'Symfony\\Component\\Yaml\\' => 23,
+ ),
+ 'D' =>
+ array (
+ 'Doctrine\\Instantiator\\' => 22,
+ ),
+ );
+
+ public static $prefixDirsPsr4 = array (
+ 'phpDocumentor\\Reflection\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/phpdocumentor/reflection-common/src',
+ 1 => __DIR__ . '/..' . '/phpdocumentor/type-resolver/src',
+ 2 => __DIR__ . '/..' . '/phpdocumentor/reflection-docblock/src',
+ ),
+ 'Webmozart\\Assert\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/webmozart/assert/src',
+ ),
+ 'Symfony\\Component\\Yaml\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/symfony/yaml',
+ ),
+ 'Doctrine\\Instantiator\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator',
+ ),
+ );
+
+ public static $prefixesPsr0 = array (
+ 'P' =>
+ array (
+ 'Prophecy\\' =>
+ array (
+ 0 => __DIR__ . '/..' . '/phpspec/prophecy/src',
+ ),
+ ),
+ );
+
+ public static $classMap = array (
+ 'File_Iterator' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Iterator.php',
+ 'File_Iterator_Facade' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Facade.php',
+ 'File_Iterator_Factory' => __DIR__ . '/..' . '/phpunit/php-file-iterator/src/Factory.php',
+ 'PHPUnit_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Exception.php',
+ 'PHPUnit_Extensions_GroupTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/GroupTestSuite.php',
+ 'PHPUnit_Extensions_PhptTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestCase.php',
+ 'PHPUnit_Extensions_PhptTestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/PhptTestSuite.php',
+ 'PHPUnit_Extensions_RepeatedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/RepeatedTest.php',
+ 'PHPUnit_Extensions_TestDecorator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TestDecorator.php',
+ 'PHPUnit_Extensions_TicketListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Extensions/TicketListener.php',
+ 'PHPUnit_Framework_Assert' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert.php',
+ 'PHPUnit_Framework_AssertionFailedError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/AssertionFailedError.php',
+ 'PHPUnit_Framework_BaseTestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/BaseTestListener.php',
+ 'PHPUnit_Framework_CodeCoverageException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/CodeCoverageException.php',
+ 'PHPUnit_Framework_Constraint' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint.php',
+ 'PHPUnit_Framework_Constraint_And' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/And.php',
+ 'PHPUnit_Framework_Constraint_ArrayHasKey' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArrayHasKey.php',
+ 'PHPUnit_Framework_Constraint_ArraySubset' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ArraySubset.php',
+ 'PHPUnit_Framework_Constraint_Attribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Attribute.php',
+ 'PHPUnit_Framework_Constraint_Callback' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Callback.php',
+ 'PHPUnit_Framework_Constraint_ClassHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_ClassHasStaticAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ClassHasStaticAttribute.php',
+ 'PHPUnit_Framework_Constraint_Composite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Composite.php',
+ 'PHPUnit_Framework_Constraint_Count' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Count.php',
+ 'PHPUnit_Framework_Constraint_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Exception.php',
+ 'PHPUnit_Framework_Constraint_ExceptionCode' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionCode.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessage' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessage.php',
+ 'PHPUnit_Framework_Constraint_ExceptionMessageRegExp' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ExceptionMessageRegExp.php',
+ 'PHPUnit_Framework_Constraint_FileExists' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/FileExists.php',
+ 'PHPUnit_Framework_Constraint_GreaterThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/GreaterThan.php',
+ 'PHPUnit_Framework_Constraint_IsAnything' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsAnything.php',
+ 'PHPUnit_Framework_Constraint_IsEmpty' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEmpty.php',
+ 'PHPUnit_Framework_Constraint_IsEqual' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsEqual.php',
+ 'PHPUnit_Framework_Constraint_IsFalse' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsFalse.php',
+ 'PHPUnit_Framework_Constraint_IsIdentical' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsIdentical.php',
+ 'PHPUnit_Framework_Constraint_IsInstanceOf' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsInstanceOf.php',
+ 'PHPUnit_Framework_Constraint_IsJson' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsJson.php',
+ 'PHPUnit_Framework_Constraint_IsNull' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsNull.php',
+ 'PHPUnit_Framework_Constraint_IsTrue' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsTrue.php',
+ 'PHPUnit_Framework_Constraint_IsType' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/IsType.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches.php',
+ 'PHPUnit_Framework_Constraint_JsonMatches_ErrorMessageProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/JsonMatches/ErrorMessageProvider.php',
+ 'PHPUnit_Framework_Constraint_LessThan' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/LessThan.php',
+ 'PHPUnit_Framework_Constraint_Not' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Not.php',
+ 'PHPUnit_Framework_Constraint_ObjectHasAttribute' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/ObjectHasAttribute.php',
+ 'PHPUnit_Framework_Constraint_Or' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Or.php',
+ 'PHPUnit_Framework_Constraint_PCREMatch' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/PCREMatch.php',
+ 'PHPUnit_Framework_Constraint_SameSize' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/SameSize.php',
+ 'PHPUnit_Framework_Constraint_StringContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringContains.php',
+ 'PHPUnit_Framework_Constraint_StringEndsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringEndsWith.php',
+ 'PHPUnit_Framework_Constraint_StringMatches' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringMatches.php',
+ 'PHPUnit_Framework_Constraint_StringStartsWith' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/StringStartsWith.php',
+ 'PHPUnit_Framework_Constraint_TraversableContains' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContains.php',
+ 'PHPUnit_Framework_Constraint_TraversableContainsOnly' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/TraversableContainsOnly.php',
+ 'PHPUnit_Framework_Constraint_Xor' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Constraint/Xor.php',
+ 'PHPUnit_Framework_Error' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error.php',
+ 'PHPUnit_Framework_Error_Deprecated' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Deprecated.php',
+ 'PHPUnit_Framework_Error_Notice' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Notice.php',
+ 'PHPUnit_Framework_Error_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Error/Warning.php',
+ 'PHPUnit_Framework_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Exception.php',
+ 'PHPUnit_Framework_ExceptionWrapper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExceptionWrapper.php',
+ 'PHPUnit_Framework_ExpectationFailedException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/ExpectationFailedException.php',
+ 'PHPUnit_Framework_IncompleteTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTest.php',
+ 'PHPUnit_Framework_IncompleteTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestCase.php',
+ 'PHPUnit_Framework_IncompleteTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/IncompleteTestError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetError.php',
+ 'PHPUnit_Framework_InvalidCoversTargetException' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/InvalidCoversTargetException.php',
+ 'PHPUnit_Framework_MockObject_BadMethodCallException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/BadMethodCallException.php',
+ 'PHPUnit_Framework_MockObject_Builder_Identity' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Identity.php',
+ 'PHPUnit_Framework_MockObject_Builder_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Builder_Match' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Match.php',
+ 'PHPUnit_Framework_MockObject_Builder_MethodNameMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/MethodNameMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Namespace' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Namespace.php',
+ 'PHPUnit_Framework_MockObject_Builder_ParametersMatch' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/ParametersMatch.php',
+ 'PHPUnit_Framework_MockObject_Builder_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Builder/Stub.php',
+ 'PHPUnit_Framework_MockObject_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/Exception.php',
+ 'PHPUnit_Framework_MockObject_Generator' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Generator.php',
+ 'PHPUnit_Framework_MockObject_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation.php',
+ 'PHPUnit_Framework_MockObject_InvocationMocker' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/InvocationMocker.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Object' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Object.php',
+ 'PHPUnit_Framework_MockObject_Invocation_Static' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invocation/Static.php',
+ 'PHPUnit_Framework_MockObject_Invokable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Invokable.php',
+ 'PHPUnit_Framework_MockObject_Matcher' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyInvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyInvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_AnyParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/AnyParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_ConsecutiveParameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/ConsecutiveParameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Invocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Invocation.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtIndex' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtIndex.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtLeastOnce' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtLeastOnce.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedAtMostCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedAtMostCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedCount' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedCount.php',
+ 'PHPUnit_Framework_MockObject_Matcher_InvokedRecorder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/InvokedRecorder.php',
+ 'PHPUnit_Framework_MockObject_Matcher_MethodName' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/MethodName.php',
+ 'PHPUnit_Framework_MockObject_Matcher_Parameters' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/Parameters.php',
+ 'PHPUnit_Framework_MockObject_Matcher_StatelessInvocation' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Matcher/StatelessInvocation.php',
+ 'PHPUnit_Framework_MockObject_MockBuilder' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockBuilder.php',
+ 'PHPUnit_Framework_MockObject_MockObject' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/MockObject.php',
+ 'PHPUnit_Framework_MockObject_RuntimeException' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Exception/RuntimeException.php',
+ 'PHPUnit_Framework_MockObject_Stub' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub.php',
+ 'PHPUnit_Framework_MockObject_Stub_ConsecutiveCalls' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ConsecutiveCalls.php',
+ 'PHPUnit_Framework_MockObject_Stub_Exception' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Exception.php',
+ 'PHPUnit_Framework_MockObject_Stub_MatcherCollection' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/MatcherCollection.php',
+ 'PHPUnit_Framework_MockObject_Stub_Return' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/Return.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnArgument' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnArgument.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnCallback' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnCallback.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnSelf' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnSelf.php',
+ 'PHPUnit_Framework_MockObject_Stub_ReturnValueMap' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Stub/ReturnValueMap.php',
+ 'PHPUnit_Framework_MockObject_Verifiable' => __DIR__ . '/..' . '/phpunit/phpunit-mock-objects/src/Framework/MockObject/Verifiable.php',
+ 'PHPUnit_Framework_OutputError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/OutputError.php',
+ 'PHPUnit_Framework_RiskyTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTest.php',
+ 'PHPUnit_Framework_RiskyTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/RiskyTestError.php',
+ 'PHPUnit_Framework_SelfDescribing' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SelfDescribing.php',
+ 'PHPUnit_Framework_SkippedTest' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTest.php',
+ 'PHPUnit_Framework_SkippedTestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestCase.php',
+ 'PHPUnit_Framework_SkippedTestError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestError.php',
+ 'PHPUnit_Framework_SkippedTestSuiteError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SkippedTestSuiteError.php',
+ 'PHPUnit_Framework_SyntheticError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/SyntheticError.php',
+ 'PHPUnit_Framework_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Test.php',
+ 'PHPUnit_Framework_TestCase' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestCase.php',
+ 'PHPUnit_Framework_TestFailure' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestFailure.php',
+ 'PHPUnit_Framework_TestListener' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestListener.php',
+ 'PHPUnit_Framework_TestResult' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestResult.php',
+ 'PHPUnit_Framework_TestSuite' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite.php',
+ 'PHPUnit_Framework_TestSuite_DataProvider' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/TestSuite/DataProvider.php',
+ 'PHPUnit_Framework_UnintentionallyCoveredCodeError' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/UnintentionallyCoveredCodeError.php',
+ 'PHPUnit_Framework_Warning' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Warning.php',
+ 'PHPUnit_Runner_BaseTestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/BaseTestRunner.php',
+ 'PHPUnit_Runner_Exception' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Exception.php',
+ 'PHPUnit_Runner_Filter_Factory' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Factory.php',
+ 'PHPUnit_Runner_Filter_GroupFilterIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group.php',
+ 'PHPUnit_Runner_Filter_Group_Exclude' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Exclude.php',
+ 'PHPUnit_Runner_Filter_Group_Include' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Group/Include.php',
+ 'PHPUnit_Runner_Filter_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Filter/Test.php',
+ 'PHPUnit_Runner_StandardTestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/StandardTestSuiteLoader.php',
+ 'PHPUnit_Runner_TestSuiteLoader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/TestSuiteLoader.php',
+ 'PHPUnit_Runner_Version' => __DIR__ . '/..' . '/phpunit/phpunit/src/Runner/Version.php',
+ 'PHPUnit_TextUI_Command' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/Command.php',
+ 'PHPUnit_TextUI_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/ResultPrinter.php',
+ 'PHPUnit_TextUI_TestRunner' => __DIR__ . '/..' . '/phpunit/phpunit/src/TextUI/TestRunner.php',
+ 'PHPUnit_Util_Blacklist' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Blacklist.php',
+ 'PHPUnit_Util_Configuration' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Configuration.php',
+ 'PHPUnit_Util_ErrorHandler' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/ErrorHandler.php',
+ 'PHPUnit_Util_Fileloader' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Fileloader.php',
+ 'PHPUnit_Util_Filesystem' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filesystem.php',
+ 'PHPUnit_Util_Filter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Filter.php',
+ 'PHPUnit_Util_Getopt' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Getopt.php',
+ 'PHPUnit_Util_GlobalState' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/GlobalState.php',
+ 'PHPUnit_Util_InvalidArgumentHelper' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/InvalidArgumentHelper.php',
+ 'PHPUnit_Util_Log_JSON' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JSON.php',
+ 'PHPUnit_Util_Log_JUnit' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/JUnit.php',
+ 'PHPUnit_Util_Log_TAP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Log/TAP.php',
+ 'PHPUnit_Util_PHP' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP.php',
+ 'PHPUnit_Util_PHP_Default' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Default.php',
+ 'PHPUnit_Util_PHP_Windows' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/PHP/Windows.php',
+ 'PHPUnit_Util_Printer' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Printer.php',
+ 'PHPUnit_Util_Regex' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Regex.php',
+ 'PHPUnit_Util_String' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/String.php',
+ 'PHPUnit_Util_Test' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Test.php',
+ 'PHPUnit_Util_TestDox_NamePrettifier' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/NamePrettifier.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_HTML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/HTML.php',
+ 'PHPUnit_Util_TestDox_ResultPrinter_Text' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestDox/ResultPrinter/Text.php',
+ 'PHPUnit_Util_TestSuiteIterator' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/TestSuiteIterator.php',
+ 'PHPUnit_Util_Type' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/Type.php',
+ 'PHPUnit_Util_XML' => __DIR__ . '/..' . '/phpunit/phpunit/src/Util/XML.php',
+ 'PHP_CodeCoverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage.php',
+ 'PHP_CodeCoverage_Driver' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver.php',
+ 'PHP_CodeCoverage_Driver_HHVM' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/HHVM.php',
+ 'PHP_CodeCoverage_Driver_PHPDBG' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/PHPDBG.php',
+ 'PHP_CodeCoverage_Driver_Xdebug' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Driver/Xdebug.php',
+ 'PHP_CodeCoverage_Exception' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Exception.php',
+ 'PHP_CodeCoverage_Exception_UnintentionallyCoveredCode' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Exception/UnintentionallyCoveredCode.php',
+ 'PHP_CodeCoverage_Filter' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Filter.php',
+ 'PHP_CodeCoverage_Report_Clover' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Clover.php',
+ 'PHP_CodeCoverage_Report_Crap4j' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Crap4j.php',
+ 'PHP_CodeCoverage_Report_Factory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Factory.php',
+ 'PHP_CodeCoverage_Report_HTML' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer_Dashboard' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Dashboard.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer_Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/Directory.php',
+ 'PHP_CodeCoverage_Report_HTML_Renderer_File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/HTML/Renderer/File.php',
+ 'PHP_CodeCoverage_Report_Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node.php',
+ 'PHP_CodeCoverage_Report_Node_Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Directory.php',
+ 'PHP_CodeCoverage_Report_Node_File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/File.php',
+ 'PHP_CodeCoverage_Report_Node_Iterator' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Node/Iterator.php',
+ 'PHP_CodeCoverage_Report_PHP' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/PHP.php',
+ 'PHP_CodeCoverage_Report_Text' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/Text.php',
+ 'PHP_CodeCoverage_Report_XML' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML.php',
+ 'PHP_CodeCoverage_Report_XML_Directory' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Directory.php',
+ 'PHP_CodeCoverage_Report_XML_File' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File.php',
+ 'PHP_CodeCoverage_Report_XML_File_Coverage' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Coverage.php',
+ 'PHP_CodeCoverage_Report_XML_File_Method' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Method.php',
+ 'PHP_CodeCoverage_Report_XML_File_Report' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Report.php',
+ 'PHP_CodeCoverage_Report_XML_File_Unit' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/File/Unit.php',
+ 'PHP_CodeCoverage_Report_XML_Node' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Node.php',
+ 'PHP_CodeCoverage_Report_XML_Project' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Project.php',
+ 'PHP_CodeCoverage_Report_XML_Tests' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Tests.php',
+ 'PHP_CodeCoverage_Report_XML_Totals' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Report/XML/Totals.php',
+ 'PHP_CodeCoverage_Util' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Util.php',
+ 'PHP_CodeCoverage_Util_InvalidArgumentHelper' => __DIR__ . '/..' . '/phpunit/php-code-coverage/src/CodeCoverage/Util/InvalidArgumentHelper.php',
+ 'PHP_Timer' => __DIR__ . '/..' . '/phpunit/php-timer/src/Timer.php',
+ 'PHP_Token' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScope' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_TokenWithScopeAndVisibility' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ABSTRACT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AMPERSAND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AND_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ARRAY_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ASYNC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_AWAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BACKTICK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BAD_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOLEAN_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BOOL_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_BREAK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CALLABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CARET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CASE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CATCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CHARACTER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLASS_NAME_CONSTANT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLONE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CLOSE_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COALESCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMA' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_COMPILER_HALT_OFFSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONCAT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONSTANT_ENCAPSED_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CONTINUE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_CURLY_OPEN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DEFAULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DIV_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOC_COMMENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOLLAR_OPEN_CURLY_BRACES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_COLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_DOUBLE_QUOTES' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELLIPSIS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ELSEIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EMPTY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENCAPSED_AND_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDDECLARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDFOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDIF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDSWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENDWHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_END_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ENUM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EQUALS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EVAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXCLAMATION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_EXTENDS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FINALLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FOREACH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNCTION' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_FUNC_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GLOBAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GOTO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_HALT_COMPILER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IMPLEMENTS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INCLUDE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INLINE_HTML' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTANCEOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INSTEADOF' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INTERFACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_INT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ISSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_GREATER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_NOT_IDENTICAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_IS_SMALLER_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Includes' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_JOIN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_ARROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_CP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LAMBDA_OP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LINE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LIST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LNUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_AND' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_OR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LOGICAL_XOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_METHOD_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MINUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MOD_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MULT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_MUL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NAMESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NEW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NS_SEPARATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_NUM_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OBJECT_OPERATOR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_ONUMBER' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_BRACKET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_CURLY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_SQUARE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OPEN_TAG_WITH_ECHO' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_OR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PAAMAYIM_NEKUDOTAYIM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PERCENT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PIPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PLUS_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_POW_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRINT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PRIVATE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PROTECTED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_PUBLIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_QUESTION_MARK' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_REQUIRE_ONCE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_RETURN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SEMICOLON' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SHAPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SL_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SPACESHIP' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_START_HEREDOC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STATIC' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_STRING_VARNAME' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_SWITCH' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_Stream' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream.php',
+ 'PHP_Token_Stream_CachingFactory' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token/Stream/CachingFactory.php',
+ 'PHP_Token_THROW' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TILDE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRAIT_C' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TRY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_TYPELIST_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_UNSET_CAST' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_USE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VAR' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_VARIABLE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHERE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHILE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_WHITESPACE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_ATTRIBUTE' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CATEGORY_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_CHILDREN' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_LABEL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_REQUIRED' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_GT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TAG_LT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XHP_TEXT' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_XOR_EQUAL' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'PHP_Token_YIELD_FROM' => __DIR__ . '/..' . '/phpunit/php-token-stream/src/Token.php',
+ 'SebastianBergmann\\Comparator\\ArrayComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ArrayComparator.php',
+ 'SebastianBergmann\\Comparator\\Comparator' => __DIR__ . '/..' . '/sebastian/comparator/src/Comparator.php',
+ 'SebastianBergmann\\Comparator\\ComparisonFailure' => __DIR__ . '/..' . '/sebastian/comparator/src/ComparisonFailure.php',
+ 'SebastianBergmann\\Comparator\\DOMNodeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DOMNodeComparator.php',
+ 'SebastianBergmann\\Comparator\\DateTimeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DateTimeComparator.php',
+ 'SebastianBergmann\\Comparator\\DoubleComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/DoubleComparator.php',
+ 'SebastianBergmann\\Comparator\\ExceptionComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ExceptionComparator.php',
+ 'SebastianBergmann\\Comparator\\Factory' => __DIR__ . '/..' . '/sebastian/comparator/src/Factory.php',
+ 'SebastianBergmann\\Comparator\\MockObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/MockObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\NumericComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/NumericComparator.php',
+ 'SebastianBergmann\\Comparator\\ObjectComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ObjectComparator.php',
+ 'SebastianBergmann\\Comparator\\ResourceComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ResourceComparator.php',
+ 'SebastianBergmann\\Comparator\\ScalarComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/ScalarComparator.php',
+ 'SebastianBergmann\\Comparator\\SplObjectStorageComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/SplObjectStorageComparator.php',
+ 'SebastianBergmann\\Comparator\\TypeComparator' => __DIR__ . '/..' . '/sebastian/comparator/src/TypeComparator.php',
+ 'SebastianBergmann\\Diff\\Chunk' => __DIR__ . '/..' . '/sebastian/diff/src/Chunk.php',
+ 'SebastianBergmann\\Diff\\Diff' => __DIR__ . '/..' . '/sebastian/diff/src/Diff.php',
+ 'SebastianBergmann\\Diff\\Differ' => __DIR__ . '/..' . '/sebastian/diff/src/Differ.php',
+ 'SebastianBergmann\\Diff\\LCS\\LongestCommonSubsequence' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/LongestCommonSubsequence.php',
+ 'SebastianBergmann\\Diff\\LCS\\MemoryEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/MemoryEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\LCS\\TimeEfficientImplementation' => __DIR__ . '/..' . '/sebastian/diff/src/LCS/TimeEfficientLongestCommonSubsequenceImplementation.php',
+ 'SebastianBergmann\\Diff\\Line' => __DIR__ . '/..' . '/sebastian/diff/src/Line.php',
+ 'SebastianBergmann\\Diff\\Parser' => __DIR__ . '/..' . '/sebastian/diff/src/Parser.php',
+ 'SebastianBergmann\\Environment\\Console' => __DIR__ . '/..' . '/sebastian/environment/src/Console.php',
+ 'SebastianBergmann\\Environment\\Runtime' => __DIR__ . '/..' . '/sebastian/environment/src/Runtime.php',
+ 'SebastianBergmann\\Exporter\\Exporter' => __DIR__ . '/..' . '/sebastian/exporter/src/Exporter.php',
+ 'SebastianBergmann\\GlobalState\\Blacklist' => __DIR__ . '/..' . '/sebastian/global-state/src/Blacklist.php',
+ 'SebastianBergmann\\GlobalState\\CodeExporter' => __DIR__ . '/..' . '/sebastian/global-state/src/CodeExporter.php',
+ 'SebastianBergmann\\GlobalState\\Exception' => __DIR__ . '/..' . '/sebastian/global-state/src/Exception.php',
+ 'SebastianBergmann\\GlobalState\\Restorer' => __DIR__ . '/..' . '/sebastian/global-state/src/Restorer.php',
+ 'SebastianBergmann\\GlobalState\\RuntimeException' => __DIR__ . '/..' . '/sebastian/global-state/src/RuntimeException.php',
+ 'SebastianBergmann\\GlobalState\\Snapshot' => __DIR__ . '/..' . '/sebastian/global-state/src/Snapshot.php',
+ 'SebastianBergmann\\RecursionContext\\Context' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Context.php',
+ 'SebastianBergmann\\RecursionContext\\Exception' => __DIR__ . '/..' . '/sebastian/recursion-context/src/Exception.php',
+ 'SebastianBergmann\\RecursionContext\\InvalidArgumentException' => __DIR__ . '/..' . '/sebastian/recursion-context/src/InvalidArgumentException.php',
+ 'SebastianBergmann\\Version' => __DIR__ . '/..' . '/sebastian/version/src/Version.php',
+ 'Text_Template' => __DIR__ . '/..' . '/phpunit/php-text-template/src/Template.php',
+ 'testPackageCase' => __DIR__ . '/../..' . '/tests/testPackageCase.php',
+ );
+
+ public static function getInitializer(ClassLoader $loader)
+ {
+ return \Closure::bind(function () use ($loader) {
+ $loader->prefixLengthsPsr4 = ComposerStaticInit97cf90c549d7a6edab5e08dd7bc0aacf::$prefixLengthsPsr4;
+ $loader->prefixDirsPsr4 = ComposerStaticInit97cf90c549d7a6edab5e08dd7bc0aacf::$prefixDirsPsr4;
+ $loader->prefixesPsr0 = ComposerStaticInit97cf90c549d7a6edab5e08dd7bc0aacf::$prefixesPsr0;
+ $loader->classMap = ComposerStaticInit97cf90c549d7a6edab5e08dd7bc0aacf::$classMap;
+
+ }, null, ClassLoader::class);
+ }
+}
diff --git a/packages/jai/Contact/vendor/composer/installed.json b/packages/jai/Contact/vendor/composer/installed.json
new file mode 100644
index 0000000..edafa48
--- /dev/null
+++ b/packages/jai/Contact/vendor/composer/installed.json
@@ -0,0 +1,1146 @@
+[
+ {
+ "name": "sebastian/version",
+ "version": "1.0.6",
+ "version_normalized": "1.0.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "shasum": ""
+ },
+ "time": "2015-06-21 13:59:46",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "version_normalized": "1.1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "time": "2015-10-12 03:26:01",
+ "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/recursion-context",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/913401df809e99e4f47b27cdd781f4a258d58791",
+ "reference": "913401df809e99e4f47b27cdd781f4a258d58791",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2015-11-11 19:50:13",
+ "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": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.1",
+ "version_normalized": "1.2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "7ae5513327cb536431847bcc0c10edba2701064e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/7ae5513327cb536431847bcc0c10edba2701064e",
+ "reference": "7ae5513327cb536431847bcc0c10edba2701064e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2015-06-21 07:55:53",
+ "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": "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"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ]
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.3.7",
+ "version_normalized": "1.3.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/4e8f0da10ac5802913afc151413bc8c53b6c2716",
+ "reference": "4e8f0da10ac5802913afc151413bc8c53b6c2716",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2016-05-17 03:18:57",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.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": "sebastian/diff",
+ "version": "1.4.1",
+ "version_normalized": "1.4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "reference": "13edfd8706462032c2f52b4b862974dd46b71c9e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.8"
+ },
+ "time": "2015-12-08 07:14:41",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-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": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ]
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.0",
+ "version_normalized": "1.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/937efb279bd37a375bcadf584dec0726f84dbf22",
+ "reference": "937efb279bd37a375bcadf584dec0726f84dbf22",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "time": "2015-07-26 15:48:44",
+ "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": "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": "symfony/yaml",
+ "version": "v3.1.0",
+ "version_normalized": "3.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "eca51b7b65eb9be6af88ad7cc91685f1556f5c9a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/eca51b7b65eb9be6af88ad7cc91685f1556f5c9a",
+ "reference": "eca51b7b65eb9be6af88ad7cc91685f1556f5c9a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5.9"
+ },
+ "time": "2016-05-26 21:46:24",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "version_normalized": "1.0.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "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"
+ },
+ "time": "2015-06-14 21:17:01",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "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": "webmozart/assert",
+ "version": "1.0.2",
+ "version_normalized": "1.0.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde",
+ "reference": "30eed06dd6bc88410a4ff7f77b6d22f3ce13dbde",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "time": "2015-08-24 13:29:44",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ]
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0",
+ "version_normalized": "1.0.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "time": "2015-12-27 11:43:31",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ]
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "version_normalized": "0.2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "time": "2016-06-10 07:14:17",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ]
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "3.1.0",
+ "version_normalized": "3.1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "9270140b940ff02e58ec577c237274e92cd40cdd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9270140b940ff02e58ec577c237274e92cd40cdd",
+ "reference": "9270140b940ff02e58ec577c237274e92cd40cdd",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "time": "2016-06-10 09:48:41",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock."
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.6.1",
+ "version_normalized": "1.6.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/58a8137754bc24b25740d4281399a4a3596058e0",
+ "reference": "58a8137754bc24b25740d4281399a4a3596058e0",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "sebastian/recursion-context": "^1.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+ "time": "2016-06-07 08:13:47",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "installation-source": "dist",
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "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": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ]
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "version_normalized": "1.2.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2015-06-21 13:50:34",
+ "type": "library",
+ "installation-source": "dist",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ]
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.8",
+ "version_normalized": "2.3.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "reference": "ac8e7a3db35738d56ee9a76e78a4e03d97628983",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "time": "2015-10-02 06:51:40",
+ "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": "phpunit/php-timer",
+ "version": "1.0.8",
+ "version_normalized": "1.0.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "reference": "38e9124049cf1a164f1e4537caf19c99bf1eb260",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4|~5"
+ },
+ "time": "2016-05-12 18:03:57",
+ "type": "library",
+ "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": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ]
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.8",
+ "version_normalized": "1.4.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "reference": "3144ae21711fb6cac0b1ab4cbe63b75ce3d4e8da",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "time": "2015-09-15 10:49:45",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-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-file-iterator",
+ "version": "1.4.1",
+ "version_normalized": "1.4.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "reference": "6150bf2c35d3fc379e50c7602b75caceaa39dbf0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "time": "2015-06-21 13:08:43",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.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": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ]
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.2.4",
+ "version_normalized": "2.2.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "reference": "eabf68b476ac7d0f73793aada060f1c1a9bf8979",
+ "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.3.2",
+ "sebastian/version": "~1.0"
+ },
+ "require-dev": {
+ "ext-xdebug": ">=2.1.4",
+ "phpunit/phpunit": "~4"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "time": "2015-10-06 15:47:00",
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.2.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": "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": "phpunit/phpunit",
+ "version": "4.8.26",
+ "version_normalized": "4.8.26.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/fc1d8cd5b5de11625979125c5639347896ac2c74",
+ "reference": "fc1d8cd5b5de11625979125c5639347896ac2c74",
+ "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.1",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.1",
+ "sebastian/diff": "~1.2",
+ "sebastian/environment": "~1.3",
+ "sebastian/exporter": "~1.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "time": "2016-05-17 03:09:28",
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.8.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",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ]
+ }
+]
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/.gitignore b/packages/jai/Contact/vendor/doctrine/instantiator/.gitignore
new file mode 100644
index 0000000..e3e368d
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/.gitignore
@@ -0,0 +1,5 @@
+phpunit.xml
+composer.lock
+build
+vendor
+coverage.clover
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/.scrutinizer.yml b/packages/jai/Contact/vendor/doctrine/instantiator/.scrutinizer.yml
new file mode 100644
index 0000000..aad5e40
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/doctrine/instantiator/.travis.install.sh b/packages/jai/Contact/vendor/doctrine/instantiator/.travis.install.sh
new file mode 100755
index 0000000..2819188
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/.travis.install.sh
@@ -0,0 +1,14 @@
+#!/bin/sh
+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/packages/jai/Contact/vendor/doctrine/instantiator/.travis.yml b/packages/jai/Contact/vendor/doctrine/instantiator/.travis.yml
new file mode 100644
index 0000000..7f1ec5f
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/.travis.yml
@@ -0,0 +1,22 @@
+language: php
+
+php:
+ - 5.3.3
+ - 5.3
+ - 5.4
+ - 5.5
+ - 5.6
+ - hhvm
+
+before_script:
+ - ./.travis.install.sh
+ - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then PHPUNIT_FLAGS="--coverage-clover coverage.clover"; else PHPUNIT_FLAGS=""; fi
+
+script:
+ - if [ $TRAVIS_PHP_VERSION = '5.3.3' ]; then phpunit; fi
+ - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpunit $PHPUNIT_FLAGS; fi
+ - if [ $TRAVIS_PHP_VERSION != '5.3.3' ]; then ./vendor/bin/phpcs --standard=PSR2 ./src/ ./tests/; fi
+ - 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:
+ - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/CONTRIBUTING.md b/packages/jai/Contact/vendor/doctrine/instantiator/CONTRIBUTING.md
new file mode 100644
index 0000000..75b84b2
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/doctrine/instantiator/LICENSE b/packages/jai/Contact/vendor/doctrine/instantiator/LICENSE
new file mode 100644
index 0000000..4d983d1
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/doctrine/instantiator/README.md b/packages/jai/Contact/vendor/doctrine/instantiator/README.md
new file mode 100644
index 0000000..393ec7c
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/doctrine/instantiator/composer.json b/packages/jai/Contact/vendor/doctrine/instantiator/composer.json
new file mode 100644
index 0000000..4823890
--- /dev/null
+++ b/packages/jai/Contact/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",
+ "athletic/athletic": "~0.1.8"
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "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/packages/jai/Contact/vendor/doctrine/instantiator/phpmd.xml.dist b/packages/jai/Contact/vendor/doctrine/instantiator/phpmd.xml.dist
new file mode 100644
index 0000000..8254105
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/phpmd.xml.dist
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/phpunit.xml.dist b/packages/jai/Contact/vendor/doctrine/instantiator/phpunit.xml.dist
new file mode 100644
index 0000000..0a8d570
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/phpunit.xml.dist
@@ -0,0 +1,22 @@
+
+
+
+ ./tests/DoctrineTest/InstantiatorTest
+
+
+
+ ./src
+
+
+
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
new file mode 100644
index 0000000..3065375
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/ExceptionInterface.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+/**
+ * Base exception marker interface for the instantiator component
+ *
+ * @author Marco Pivetta
+ */
+interface ExceptionInterface
+{
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000..ea8d28c
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/InvalidArgumentException.php
@@ -0,0 +1,62 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+use InvalidArgumentException as BaseInvalidArgumentException;
+use ReflectionClass;
+
+/**
+ * Exception for invalid arguments provided to the instantiator
+ *
+ * @author Marco Pivetta
+ */
+class InvalidArgumentException extends BaseInvalidArgumentException implements ExceptionInterface
+{
+ /**
+ * @param string $className
+ *
+ * @return self
+ */
+ public static function fromNonExistingClass($className)
+ {
+ if (interface_exists($className)) {
+ return new self(sprintf('The provided type "%s" is an interface, and can not be instantiated', $className));
+ }
+
+ if (PHP_VERSION_ID >= 50400 && trait_exists($className)) {
+ return new self(sprintf('The provided type "%s" is a trait, and can not be instantiated', $className));
+ }
+
+ return new self(sprintf('The provided class "%s" does not exist', $className));
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return self
+ */
+ public static function fromAbstractClass(ReflectionClass $reflectionClass)
+ {
+ return new self(sprintf(
+ 'The provided class "%s" is abstract, and can not be instantiated',
+ $reflectionClass->getName()
+ ));
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
new file mode 100644
index 0000000..1681e56
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Exception/UnexpectedValueException.php
@@ -0,0 +1,79 @@
+.
+ */
+
+namespace Doctrine\Instantiator\Exception;
+
+use Exception;
+use ReflectionClass;
+use UnexpectedValueException as BaseUnexpectedValueException;
+
+/**
+ * Exception for given parameters causing invalid/unexpected state on instantiation
+ *
+ * @author Marco Pivetta
+ */
+class UnexpectedValueException extends BaseUnexpectedValueException implements ExceptionInterface
+{
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param Exception $exception
+ *
+ * @return self
+ */
+ public static function fromSerializationTriggeredException(ReflectionClass $reflectionClass, Exception $exception)
+ {
+ return new self(
+ sprintf(
+ 'An exception was raised while trying to instantiate an instance of "%s" via un-serialization',
+ $reflectionClass->getName()
+ ),
+ 0,
+ $exception
+ );
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $errorString
+ * @param int $errorCode
+ * @param string $errorFile
+ * @param int $errorLine
+ *
+ * @return UnexpectedValueException
+ */
+ public static function fromUncleanUnSerialization(
+ ReflectionClass $reflectionClass,
+ $errorString,
+ $errorCode,
+ $errorFile,
+ $errorLine
+ ) {
+ return new self(
+ sprintf(
+ 'Could not produce an instance of "%s" via un-serialization, since an error was triggered '
+ . 'in file "%s" at line "%d"',
+ $reflectionClass->getName(),
+ $errorFile,
+ $errorLine
+ ),
+ 0,
+ new Exception($errorString, $errorCode)
+ );
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
new file mode 100644
index 0000000..6d5b3b6
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/Instantiator.php
@@ -0,0 +1,273 @@
+.
+ */
+
+namespace Doctrine\Instantiator;
+
+use Closure;
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Exception;
+use ReflectionClass;
+
+/**
+ * {@inheritDoc}
+ *
+ * @author Marco Pivetta
+ */
+final class Instantiator implements InstantiatorInterface
+{
+ /**
+ * Markers used internally by PHP to define whether {@see \unserialize} should invoke
+ * the method {@see \Serializable::unserialize()} when dealing with classes implementing
+ * the {@see \Serializable} interface.
+ */
+ const SERIALIZATION_FORMAT_USE_UNSERIALIZER = 'C';
+ const SERIALIZATION_FORMAT_AVOID_UNSERIALIZER = 'O';
+
+ /**
+ * @var \Closure[] of {@see \Closure} instances used to instantiate specific classes
+ */
+ private static $cachedInstantiators = array();
+
+ /**
+ * @var object[] of objects that can directly be cloned
+ */
+ private static $cachedCloneables = array();
+
+ /**
+ * {@inheritDoc}
+ */
+ public function instantiate($className)
+ {
+ if (isset(self::$cachedCloneables[$className])) {
+ return clone self::$cachedCloneables[$className];
+ }
+
+ if (isset(self::$cachedInstantiators[$className])) {
+ $factory = self::$cachedInstantiators[$className];
+
+ return $factory();
+ }
+
+ return $this->buildAndCacheFromFactory($className);
+ }
+
+ /**
+ * Builds the requested object and caches it in static properties for performance
+ *
+ * @param string $className
+ *
+ * @return object
+ */
+ private function buildAndCacheFromFactory($className)
+ {
+ $factory = self::$cachedInstantiators[$className] = $this->buildFactory($className);
+ $instance = $factory();
+
+ if ($this->isSafeToClone(new ReflectionClass($instance))) {
+ self::$cachedCloneables[$className] = clone $instance;
+ }
+
+ return $instance;
+ }
+
+ /**
+ * Builds a {@see \Closure} capable of instantiating the given $className without
+ * invoking its constructor.
+ *
+ * @param string $className
+ *
+ * @return Closure
+ */
+ private function buildFactory($className)
+ {
+ $reflectionClass = $this->getReflectionClass($className);
+
+ if ($this->isInstantiableViaReflection($reflectionClass)) {
+ return function () use ($reflectionClass) {
+ return $reflectionClass->newInstanceWithoutConstructor();
+ };
+ }
+
+ $serializedString = sprintf(
+ '%s:%d:"%s":0:{}',
+ $this->getSerializationFormat($reflectionClass),
+ strlen($className),
+ $className
+ );
+
+ $this->checkIfUnSerializationIsSupported($reflectionClass, $serializedString);
+
+ return function () use ($serializedString) {
+ return unserialize($serializedString);
+ };
+ }
+
+ /**
+ * @param string $className
+ *
+ * @return ReflectionClass
+ *
+ * @throws InvalidArgumentException
+ */
+ private function getReflectionClass($className)
+ {
+ if (! class_exists($className)) {
+ throw InvalidArgumentException::fromNonExistingClass($className);
+ }
+
+ $reflection = new ReflectionClass($className);
+
+ if ($reflection->isAbstract()) {
+ throw InvalidArgumentException::fromAbstractClass($reflection);
+ }
+
+ return $reflection;
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $serializedString
+ *
+ * @throws UnexpectedValueException
+ *
+ * @return void
+ */
+ private function checkIfUnSerializationIsSupported(ReflectionClass $reflectionClass, $serializedString)
+ {
+ set_error_handler(function ($code, $message, $file, $line) use ($reflectionClass, & $error) {
+ $error = UnexpectedValueException::fromUncleanUnSerialization(
+ $reflectionClass,
+ $message,
+ $code,
+ $file,
+ $line
+ );
+ });
+
+ $this->attemptInstantiationViaUnSerialization($reflectionClass, $serializedString);
+
+ restore_error_handler();
+
+ if ($error) {
+ throw $error;
+ }
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ * @param string $serializedString
+ *
+ * @throws UnexpectedValueException
+ *
+ * @return void
+ */
+ private function attemptInstantiationViaUnSerialization(ReflectionClass $reflectionClass, $serializedString)
+ {
+ try {
+ unserialize($serializedString);
+ } catch (Exception $exception) {
+ restore_error_handler();
+
+ throw UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $exception);
+ }
+ }
+
+ /**
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return bool
+ */
+ private function isInstantiableViaReflection(ReflectionClass $reflectionClass)
+ {
+ if (\PHP_VERSION_ID >= 50600) {
+ return ! ($this->hasInternalAncestors($reflectionClass) && $reflectionClass->isFinal());
+ }
+
+ return \PHP_VERSION_ID >= 50400 && ! $this->hasInternalAncestors($reflectionClass);
+ }
+
+ /**
+ * Verifies whether the given class is to be considered internal
+ *
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return bool
+ */
+ private function hasInternalAncestors(ReflectionClass $reflectionClass)
+ {
+ do {
+ if ($reflectionClass->isInternal()) {
+ return true;
+ }
+ } while ($reflectionClass = $reflectionClass->getParentClass());
+
+ return false;
+ }
+
+ /**
+ * Verifies if the given PHP version implements the `Serializable` interface serialization
+ * with an incompatible serialization format. If that's the case, use serialization marker
+ * "C" instead of "O".
+ *
+ * @link http://news.php.net/php.internals/74654
+ *
+ * @param ReflectionClass $reflectionClass
+ *
+ * @return string the serialization format marker, either self::SERIALIZATION_FORMAT_USE_UNSERIALIZER
+ * or self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER
+ */
+ private function getSerializationFormat(ReflectionClass $reflectionClass)
+ {
+ if ($this->isPhpVersionWithBrokenSerializationFormat()
+ && $reflectionClass->implementsInterface('Serializable')
+ ) {
+ return self::SERIALIZATION_FORMAT_USE_UNSERIALIZER;
+ }
+
+ return self::SERIALIZATION_FORMAT_AVOID_UNSERIALIZER;
+ }
+
+ /**
+ * Checks whether the current PHP runtime uses an incompatible serialization format
+ *
+ * @return bool
+ */
+ private function isPhpVersionWithBrokenSerializationFormat()
+ {
+ return PHP_VERSION_ID === 50429 || PHP_VERSION_ID === 50513;
+ }
+
+ /**
+ * Checks if a class is cloneable
+ *
+ * @param ReflectionClass $reflection
+ *
+ * @return bool
+ */
+ private function isSafeToClone(ReflectionClass $reflection)
+ {
+ if (method_exists($reflection, 'isCloneable') && ! $reflection->isCloneable()) {
+ return false;
+ }
+
+ // not cloneable if it implements `__clone`, as we want to avoid calling it
+ return ! $reflection->hasMethod('__clone');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
new file mode 100644
index 0000000..b665bea
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/src/Doctrine/Instantiator/InstantiatorInterface.php
@@ -0,0 +1,37 @@
+.
+ */
+
+namespace Doctrine\Instantiator;
+
+/**
+ * Instantiator provides utility methods to build objects without invoking their constructors
+ *
+ * @author Marco Pivetta
+ */
+interface InstantiatorInterface
+{
+ /**
+ * @param string $className
+ *
+ * @return object
+ *
+ * @throws \Doctrine\Instantiator\Exception\ExceptionInterface
+ */
+ public function instantiate($className);
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php
new file mode 100644
index 0000000..3e8fc6f
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorPerformance/InstantiatorPerformanceEvent.php
@@ -0,0 +1,96 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorPerformance;
+
+use Athletic\AthleticEvent;
+use Doctrine\Instantiator\Instantiator;
+
+/**
+ * Performance tests for {@see \Doctrine\Instantiator\Instantiator}
+ *
+ * @author Marco Pivetta
+ */
+class InstantiatorPerformanceEvent extends AthleticEvent
+{
+ /**
+ * @var \Doctrine\Instantiator\Instantiator
+ */
+ private $instantiator;
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function setUp()
+ {
+ $this->instantiator = new Instantiator();
+
+ $this->instantiator->instantiate(__CLASS__);
+ $this->instantiator->instantiate('ArrayObject');
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset');
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset');
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset');
+ }
+
+ /**
+ * @iterations 20000
+ * @baseline
+ * @group instantiation
+ */
+ public function testInstantiateSelf()
+ {
+ $this->instantiator->instantiate(__CLASS__);
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateInternalClass()
+ {
+ $this->instantiator->instantiate('ArrayObject');
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateSimpleSerializableAssetClass()
+ {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset');
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateSerializableArrayObjectAsset()
+ {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset');
+ }
+
+ /**
+ * @iterations 20000
+ * @group instantiation
+ */
+ public function testInstantiateUnCloneableAsset()
+ {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php
new file mode 100644
index 0000000..39d9b94
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/InvalidArgumentExceptionTest.php
@@ -0,0 +1,83 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTest\Exception;
+
+use Doctrine\Instantiator\Exception\InvalidArgumentException;
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \Doctrine\Instantiator\Exception\InvalidArgumentException}
+ *
+ * @author Marco Pivetta
+ *
+ * @covers \Doctrine\Instantiator\Exception\InvalidArgumentException
+ */
+class InvalidArgumentExceptionTest extends PHPUnit_Framework_TestCase
+{
+ public function testFromNonExistingTypeWithNonExistingClass()
+ {
+ $className = __CLASS__ . uniqid();
+ $exception = InvalidArgumentException::fromNonExistingClass($className);
+
+ $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\InvalidArgumentException', $exception);
+ $this->assertSame('The provided class "' . $className . '" does not exist', $exception->getMessage());
+ }
+
+ public function testFromNonExistingTypeWithTrait()
+ {
+ if (PHP_VERSION_ID < 50400) {
+ $this->markTestSkipped('Need at least PHP 5.4.0, as this test requires traits support to run');
+ }
+
+ $exception = InvalidArgumentException::fromNonExistingClass(
+ 'DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset'
+ );
+
+ $this->assertSame(
+ 'The provided type "DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset" is a trait, '
+ . 'and can not be instantiated',
+ $exception->getMessage()
+ );
+ }
+
+ public function testFromNonExistingTypeWithInterface()
+ {
+ $exception = InvalidArgumentException::fromNonExistingClass('Doctrine\\Instantiator\\InstantiatorInterface');
+
+ $this->assertSame(
+ 'The provided type "Doctrine\\Instantiator\\InstantiatorInterface" is an interface, '
+ . 'and can not be instantiated',
+ $exception->getMessage()
+ );
+ }
+
+ public function testFromAbstractClass()
+ {
+ $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset');
+ $exception = InvalidArgumentException::fromAbstractClass($reflection);
+
+ $this->assertSame(
+ 'The provided class "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" is abstract, '
+ . 'and can not be instantiated',
+ $exception->getMessage()
+ );
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php
new file mode 100644
index 0000000..84154e7
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/Exception/UnexpectedValueExceptionTest.php
@@ -0,0 +1,69 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTest\Exception;
+
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Exception;
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \Doctrine\Instantiator\Exception\UnexpectedValueException}
+ *
+ * @author Marco Pivetta
+ *
+ * @covers \Doctrine\Instantiator\Exception\UnexpectedValueException
+ */
+class UnexpectedValueExceptionTest extends PHPUnit_Framework_TestCase
+{
+ public function testFromSerializationTriggeredException()
+ {
+ $reflectionClass = new ReflectionClass($this);
+ $previous = new Exception();
+ $exception = UnexpectedValueException::fromSerializationTriggeredException($reflectionClass, $previous);
+
+ $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception);
+ $this->assertSame($previous, $exception->getPrevious());
+ $this->assertSame(
+ 'An exception was raised while trying to instantiate an instance of "'
+ . __CLASS__ . '" via un-serialization',
+ $exception->getMessage()
+ );
+ }
+
+ public function testFromUncleanUnSerialization()
+ {
+ $reflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset');
+ $exception = UnexpectedValueException::fromUncleanUnSerialization($reflection, 'foo', 123, 'bar', 456);
+
+ $this->assertInstanceOf('Doctrine\\Instantiator\\Exception\\UnexpectedValueException', $exception);
+ $this->assertSame(
+ 'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset" '
+ . 'via un-serialization, since an error was triggered in file "bar" at line "456"',
+ $exception->getMessage()
+ );
+
+ $previous = $exception->getPrevious();
+
+ $this->assertInstanceOf('Exception', $previous);
+ $this->assertSame('foo', $previous->getMessage());
+ $this->assertSame(123, $previous->getCode());
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php
new file mode 100644
index 0000000..0a2cb93
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTest/InstantiatorTest.php
@@ -0,0 +1,219 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTest;
+
+use Doctrine\Instantiator\Exception\UnexpectedValueException;
+use Doctrine\Instantiator\Instantiator;
+use PHPUnit_Framework_TestCase;
+use ReflectionClass;
+
+/**
+ * Tests for {@see \Doctrine\Instantiator\Instantiator}
+ *
+ * @author Marco Pivetta
+ *
+ * @covers \Doctrine\Instantiator\Instantiator
+ */
+class InstantiatorTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @var Instantiator
+ */
+ private $instantiator;
+
+ /**
+ * {@inheritDoc}
+ */
+ protected function setUp()
+ {
+ $this->instantiator = new Instantiator();
+ }
+
+ /**
+ * @param string $className
+ *
+ * @dataProvider getInstantiableClasses
+ */
+ public function testCanInstantiate($className)
+ {
+ $this->assertInstanceOf($className, $this->instantiator->instantiate($className));
+ }
+
+ /**
+ * @param string $className
+ *
+ * @dataProvider getInstantiableClasses
+ */
+ public function testInstantiatesSeparateInstances($className)
+ {
+ $instance1 = $this->instantiator->instantiate($className);
+ $instance2 = $this->instantiator->instantiate($className);
+
+ $this->assertEquals($instance1, $instance2);
+ $this->assertNotSame($instance1, $instance2);
+ }
+
+ public function testExceptionOnUnSerializationException()
+ {
+ if (defined('HHVM_VERSION')) {
+ $this->markTestSkipped(
+ 'As of facebook/hhvm#3432, HHVM has no PDORow, and therefore '
+ . ' no internal final classes that cannot be instantiated'
+ );
+ }
+
+ $className = 'DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset';
+
+ if (\PHP_VERSION_ID >= 50600) {
+ $className = 'PDORow';
+ }
+
+ if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) {
+ $className = 'DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset';
+ }
+
+ $this->setExpectedException('Doctrine\\Instantiator\\Exception\\UnexpectedValueException');
+
+ $this->instantiator->instantiate($className);
+ }
+
+ public function testNoticeOnUnSerializationException()
+ {
+ if (\PHP_VERSION_ID >= 50600) {
+ $this->markTestSkipped(
+ 'PHP 5.6 supports `ReflectionClass#newInstanceWithoutConstructor()` for some internal classes'
+ );
+ }
+
+ try {
+ $this->instantiator->instantiate('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
+
+ $this->fail('No exception was raised');
+ } catch (UnexpectedValueException $exception) {
+ $wakeUpNoticesReflection = new ReflectionClass('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
+ $previous = $exception->getPrevious();
+
+ $this->assertInstanceOf('Exception', $previous);
+
+ // in PHP 5.4.29 and PHP 5.5.13, this case is not a notice, but an exception being thrown
+ if (! (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513)) {
+ $this->assertSame(
+ 'Could not produce an instance of "DoctrineTest\\InstantiatorTestAsset\WakeUpNoticesAsset" '
+ . 'via un-serialization, since an error was triggered in file "'
+ . $wakeUpNoticesReflection->getFileName() . '" at line "36"',
+ $exception->getMessage()
+ );
+
+ $this->assertSame('Something went bananas while un-serializing this instance', $previous->getMessage());
+ $this->assertSame(\E_USER_NOTICE, $previous->getCode());
+ }
+ }
+ }
+
+ /**
+ * @param string $invalidClassName
+ *
+ * @dataProvider getInvalidClassNames
+ */
+ public function testInstantiationFromNonExistingClass($invalidClassName)
+ {
+ $this->setExpectedException('Doctrine\\Instantiator\\Exception\\InvalidArgumentException');
+
+ $this->instantiator->instantiate($invalidClassName);
+ }
+
+ public function testInstancesAreNotCloned()
+ {
+ $className = 'TemporaryClass' . uniqid();
+
+ eval('namespace ' . __NAMESPACE__ . '; class ' . $className . '{}');
+
+ $instance = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className);
+
+ $instance->foo = 'bar';
+
+ $instance2 = $this->instantiator->instantiate(__NAMESPACE__ . '\\' . $className);
+
+ $this->assertObjectNotHasAttribute('foo', $instance2);
+ }
+
+ /**
+ * Provides a list of instantiable classes (existing)
+ *
+ * @return string[][]
+ */
+ public function getInstantiableClasses()
+ {
+ $classes = array(
+ array('stdClass'),
+ array(__CLASS__),
+ array('Doctrine\\Instantiator\\Instantiator'),
+ array('Exception'),
+ array('PharException'),
+ array('DoctrineTest\\InstantiatorTestAsset\\SimpleSerializableAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\ExceptionAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\FinalExceptionAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\PharExceptionAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\UnCloneableAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\XMLReaderAsset'),
+ );
+
+ if (\PHP_VERSION_ID === 50429 || \PHP_VERSION_ID === 50513) {
+ return $classes;
+ }
+
+ $classes = array_merge(
+ $classes,
+ array(
+ array('PharException'),
+ array('ArrayObject'),
+ array('DoctrineTest\\InstantiatorTestAsset\\ArrayObjectAsset'),
+ array('DoctrineTest\\InstantiatorTestAsset\\SerializableArrayObjectAsset'),
+ )
+ );
+
+ if (\PHP_VERSION_ID >= 50600) {
+ $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\WakeUpNoticesAsset');
+ $classes[] = array('DoctrineTest\\InstantiatorTestAsset\\UnserializeExceptionArrayObjectAsset');
+ }
+
+ return $classes;
+ }
+
+ /**
+ * Provides a list of instantiable classes (existing)
+ *
+ * @return string[][]
+ */
+ public function getInvalidClassNames()
+ {
+ $classNames = array(
+ array(__CLASS__ . uniqid()),
+ array('Doctrine\\Instantiator\\InstantiatorInterface'),
+ array('DoctrineTest\\InstantiatorTestAsset\\AbstractClassAsset'),
+ );
+
+ if (\PHP_VERSION_ID >= 50400) {
+ $classNames[] = array('DoctrineTest\\InstantiatorTestAsset\\SimpleTraitAsset');
+ }
+
+ return $classNames;
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php
new file mode 100644
index 0000000..fbe28dd
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/AbstractClassAsset.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+/**
+ * A simple asset for an abstract class
+ *
+ * @author Marco Pivetta
+ */
+abstract class AbstractClassAsset
+{
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php
new file mode 100644
index 0000000..56146d7
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ArrayObjectAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+use BadMethodCallException;
+
+/**
+ * Test asset that extends an internal PHP class
+ *
+ * @author Marco Pivetta
+ */
+class ArrayObjectAsset extends ArrayObject
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php
new file mode 100644
index 0000000..43bbe46
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/ExceptionAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Exception;
+
+/**
+ * Test asset that extends an internal PHP base exception
+ *
+ * @author Marco Pivetta
+ */
+class ExceptionAsset extends Exception
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php
new file mode 100644
index 0000000..7d268f5
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/FinalExceptionAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Exception;
+
+/**
+ * Test asset that extends an internal PHP base exception
+ *
+ * @author Marco Pivetta
+ */
+final class FinalExceptionAsset extends Exception
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php
new file mode 100644
index 0000000..553fd56
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Phar;
+
+/**
+ * Test asset that extends an internal PHP class
+ *
+ * @author Marco Pivetta
+ */
+class PharAsset extends Phar
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php
new file mode 100644
index 0000000..42bf73e
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/PharExceptionAsset.php
@@ -0,0 +1,44 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use PharException;
+
+/**
+ * Test asset that extends an internal PHP class
+ * This class should be serializable without problems
+ * and without getting the "Erroneous data format for unserializing"
+ * error
+ *
+ * @author Marco Pivetta
+ */
+class PharExceptionAsset extends PharException
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php
new file mode 100644
index 0000000..ba19aaf
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SerializableArrayObjectAsset.php
@@ -0,0 +1,62 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+use BadMethodCallException;
+use Serializable;
+
+/**
+ * Serializable test asset that also extends an internal class
+ *
+ * @author Marco Pivetta
+ */
+class SerializableArrayObjectAsset extends ArrayObject implements Serializable
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function serialize()
+ {
+ return '';
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function unserialize($serialized)
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php
new file mode 100644
index 0000000..39f84a6
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleSerializableAsset.php
@@ -0,0 +1,61 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use Serializable;
+
+/**
+ * Base serializable test asset
+ *
+ * @author Marco Pivetta
+ */
+class SimpleSerializableAsset implements Serializable
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function serialize()
+ {
+ return '';
+ }
+
+ /**
+ * {@inheritDoc}
+ *
+ * Should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function unserialize($serialized)
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php
new file mode 100644
index 0000000..04e7806
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/SimpleTraitAsset.php
@@ -0,0 +1,29 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+/**
+ * A simple trait with no attached logic
+ *
+ * @author Marco Pivetta
+ */
+trait SimpleTraitAsset
+{
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php
new file mode 100644
index 0000000..7d03bda
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnCloneableAsset.php
@@ -0,0 +1,50 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+
+/**
+ * Base un-cloneable asset
+ *
+ * @author Marco Pivetta
+ */
+class UnCloneableAsset
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+
+ /**
+ * Magic `__clone` - should not be invoked
+ *
+ * @throws BadMethodCallException
+ */
+ public function __clone()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php
new file mode 100644
index 0000000..b348a40
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/UnserializeExceptionArrayObjectAsset.php
@@ -0,0 +1,39 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+use BadMethodCallException;
+
+/**
+ * A simple asset for an abstract class
+ *
+ * @author Marco Pivetta
+ */
+class UnserializeExceptionArrayObjectAsset extends ArrayObject
+{
+ /**
+ * {@inheritDoc}
+ */
+ public function __wakeup()
+ {
+ throw new BadMethodCallException();
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php
new file mode 100644
index 0000000..18dc671
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/WakeUpNoticesAsset.php
@@ -0,0 +1,38 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use ArrayObject;
+
+/**
+ * A simple asset for an abstract class
+ *
+ * @author Marco Pivetta
+ */
+class WakeUpNoticesAsset extends ArrayObject
+{
+ /**
+ * Wakeup method called after un-serialization
+ */
+ public function __wakeup()
+ {
+ trigger_error('Something went bananas while un-serializing this instance');
+ }
+}
diff --git a/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php
new file mode 100644
index 0000000..39ee699
--- /dev/null
+++ b/packages/jai/Contact/vendor/doctrine/instantiator/tests/DoctrineTest/InstantiatorTestAsset/XMLReaderAsset.php
@@ -0,0 +1,41 @@
+.
+ */
+
+namespace DoctrineTest\InstantiatorTestAsset;
+
+use BadMethodCallException;
+use XMLReader;
+
+/**
+ * Test asset that extends an internal PHP class
+ *
+ * @author Dave Marshall
+ */
+class XMLReaderAsset extends XMLReader
+{
+ /**
+ * Constructor - should not be called
+ *
+ * @throws BadMethodCallException
+ */
+ public function __construct()
+ {
+ throw new BadMethodCallException('Not supposed to be called!');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/.gitignore b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/.gitignore
new file mode 100644
index 0000000..c56f671
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/.gitignore
@@ -0,0 +1,4 @@
+composer.phar
+vendor/
+build/
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/LICENSE b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/LICENSE
new file mode 100644
index 0000000..ed6926c
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 phpDocumentor
+
+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/packages/jai/Contact/vendor/phpdocumentor/reflection-common/README.md b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/README.md
new file mode 100644
index 0000000..52b12bc
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/README.md
@@ -0,0 +1 @@
+# ReflectionCommon
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/composer.json b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/composer.json
new file mode 100644
index 0000000..90eee0f
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/composer.json
@@ -0,0 +1,29 @@
+{
+ "name": "phpdocumentor/reflection-common",
+ "keywords": ["phpdoc", "phpDocumentor", "reflection", "static analysis", "FQSEN"],
+ "homepage": "http://www.phpdoc.org",
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "require": {
+ "php": ">=5.5"
+ },
+ "autoload" : {
+ "psr-4" : {
+ "phpDocumentor\\Reflection\\": ["src"]
+ }
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/composer.lock b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/composer.lock
new file mode 100644
index 0000000..e01dc3c
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/composer.lock
@@ -0,0 +1,974 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "49ee00389e4ccd00d7e93a147103b2ab",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.4",
+ "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"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2014-10-13 12:58:55"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "dflydev/markdown": "~1.0",
+ "erusev/parsedown": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "mike.vanriel@naenius.com"
+ }
+ ],
+ "time": "2015-02-03 12:10:50"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373",
+ "reference": "3132b1f44c7bf2ec4c7eb2d3cb78fdeca760d373",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "phpdocumentor/reflection-docblock": "~2.0",
+ "sebastian/comparator": "~1.1"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "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": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2015-04-27 22:15:08"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f",
+ "reference": "6b7d2094ca2a685a2cad846cb7cd7a30e8b9470f",
+ "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"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "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": "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"
+ ],
+ "time": "2015-06-01 07:35:26"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a923bb15680d0089e2316f7a4af8f437046e96bb",
+ "reference": "a923bb15680d0089e2316f7a4af8f437046e96bb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "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": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2015-04-02 05:19:05"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+ "reference": "206dfefc0ffe9cebf65c413e3d0e809c82fbf00a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "Text/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "include-path": [
+ ""
+ ],
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2014-01-30 17:20:04"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.5",
+ "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"
+ },
+ "type": "library",
+ "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"
+ ],
+ "time": "2013-08-02 07:42:54"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "eab81d02569310739373308137284e0158424330"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/eab81d02569310739373308137284e0158424330",
+ "reference": "eab81d02569310739373308137284e0158424330",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-04-08 04:46:07"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.6.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/816d12536a7a032adc3b68737f82cfbbf98b79c1",
+ "reference": "816d12536a7a032adc3b68737f82cfbbf98b79c1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.3",
+ "phpspec/prophecy": "~1.3,>=1.3.1",
+ "phpunit/php-code-coverage": "~2.0,>=2.0.11",
+ "phpunit/php-file-iterator": "~1.4",
+ "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.2",
+ "sebastian/global-state": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.6.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-05-29 06:00:03"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/253c005852591fd547fc18cd5b7b43a1ec82d8f7",
+ "reference": "253c005852591fd547fc18cd5b7b43a1ec82d8f7",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "~1.0,>=1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-05-29 05:19:18"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-01-29 16:28:08"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-02-22 15:13:53"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-01-01 10:01:08"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "84839970d05254c73cde183a721c7af13aede943"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943",
+ "reference": "84839970d05254c73cde183a721c7af13aede943",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "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"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2015-01-27 07:23:06"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.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": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2014-10-06 09:23:50"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2015-01-24 09:48:32"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
+ "reference": "ab931d46cd0d3204a91e1b9a40c4bc13032b58e4",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2015-02-24 06:35:25"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v2.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Yaml.git",
+ "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Yaml/zipball/4a29a5248aed4fb45f626a7bbbd330291492f5c3",
+ "reference": "4a29a5248aed4fb45f626a7bbbd330291492f5c3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-05-02 15:21:08"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": []
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/phpunit.xml.dist b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/phpunit.xml.dist
new file mode 100644
index 0000000..3181150
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/phpunit.xml.dist
@@ -0,0 +1,26 @@
+
+
+
+
+
+ ./tests/unit/
+
+
+
+
+ src
+
+
+
+
+
+
+
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Element.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Element.php
new file mode 100644
index 0000000..712e30e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Element.php
@@ -0,0 +1,32 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+/**
+ * Interface for files processed by the ProjectFactory
+ */
+interface File
+{
+ /**
+ * Returns the content of the file as a string.
+ *
+ * @return string
+ */
+ public function getContents();
+
+ /**
+ * Returns md5 hash of the file.
+ *
+ * @return string
+ */
+ public function md5();
+
+ /**
+ * Returns an relative path to the file.
+ *
+ * @return string
+ */
+ public function path();
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Fqsen.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Fqsen.php
new file mode 100644
index 0000000..c7be3f1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Fqsen.php
@@ -0,0 +1,78 @@
+fqsen = $fqsen;
+
+ if (isset($matches[2])) {
+ $this->name = $matches[2];
+ } else {
+ $matches = explode('\\', $fqsen);
+ $this->name = trim(end($matches), '()');
+ }
+ }
+
+ /**
+ * converts this class to string.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->fqsen;
+ }
+
+ /**
+ * Returns the name of the element without path.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Location.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Location.php
new file mode 100644
index 0000000..5760321
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Location.php
@@ -0,0 +1,57 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+/**
+ * The location where an element occurs within a file.
+ */
+final class Location
+{
+ /** @var int */
+ private $lineNumber = 0;
+
+ /** @var int */
+ private $columnNumber = 0;
+
+ /**
+ * Initializes the location for an element using its line number in the file and optionally the column number.
+ *
+ * @param int $lineNumber
+ * @param int $columnNumber
+ */
+ public function __construct($lineNumber, $columnNumber = 0)
+ {
+ $this->lineNumber = $lineNumber;
+ $this->columnNumber = $columnNumber;
+ }
+
+ /**
+ * Returns the line number that is covered by this location.
+ *
+ * @return integer
+ */
+ public function getLineNumber()
+ {
+ return $this->lineNumber;
+ }
+
+ /**
+ * Returns the column number (character position on a line) for this location object.
+ *
+ * @return integer
+ */
+ public function getColumnNumber()
+ {
+ return $this->columnNumber;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Project.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Project.php
new file mode 100644
index 0000000..3ed1e39
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-common/src/Project.php
@@ -0,0 +1,25 @@
+assertEquals($name, $instance->getName());
+ }
+
+ /**
+ * Data provider for ValidFormats tests. Contains a complete list from psr-5 draft.
+ *
+ * @return array
+ */
+ public function validFqsenProvider()
+ {
+ return [
+ ['\\', ''],
+ ['\My\Space', 'Space'],
+ ['\My\Space\myFunction()', 'myFunction'],
+ ['\My\Space\MY_CONSTANT', 'MY_CONSTANT'],
+ ['\My\Space\MY_CONSTANT2', 'MY_CONSTANT2'],
+ ['\My\Space\MyClass', 'MyClass'],
+ ['\My\Space\MyInterface', 'MyInterface'],
+ ['\My\Space\MyTrait', 'MyTrait'],
+ ['\My\Space\MyClass::myMethod()', 'myMethod'],
+ ['\My\Space\MyClass::$my_property', 'my_property'],
+ ['\My\Space\MyClass::MY_CONSTANT', 'MY_CONSTANT'],
+ ];
+ }
+
+ /**
+ * @param string $fqsen
+ * @covers ::__construct
+ * @dataProvider invalidFqsenProvider
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInValidFormats($fqsen)
+ {
+ new Fqsen($fqsen);
+ }
+
+ /**
+ * Data provider for invalidFormats tests. Contains a complete list from psr-5 draft.
+ *
+ * @return array
+ */
+ public function invalidFqsenProvider()
+ {
+ return [
+ ['\My\*'],
+ ['\My\Space\.()'],
+ ['My\Space'],
+ ];
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ */
+ public function testToString()
+ {
+ $className = new Fqsen('\\phpDocumentor\\Application');
+
+ $this->assertEquals('\\phpDocumentor\\Application', (string)$className);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.gitignore b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.gitignore
new file mode 100644
index 0000000..3ce5adb
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.gitignore
@@ -0,0 +1,2 @@
+.idea
+vendor
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml
new file mode 100644
index 0000000..5061d52
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.scrutinizer.yml
@@ -0,0 +1,32 @@
+before_commands:
+ - "composer install --no-dev --prefer-source"
+
+tools:
+ external_code_coverage: true
+ php_code_sniffer:
+ enabled: true
+ config:
+ standard: PSR2
+ filter:
+ paths: ["src/*", "tests/*"]
+ php_cpd:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_loc:
+ enabled: true
+ excluded_dirs: ["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: ["tests", "vendor"]
+ php_analyzer:
+ enabled: true
+ filter:
+ paths: ["src/*", "tests/*"]
+ sensiolabs_security_checker: true
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.travis.yml b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.travis.yml
new file mode 100644
index 0000000..920958d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/.travis.yml
@@ -0,0 +1,36 @@
+language: php
+php:
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+ - nightly
+
+matrix:
+ allow_failures:
+ - php:
+ - hhvm
+ - nightly
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+script:
+ - vendor/bin/phpunit --coverage-clover=coverage.clover -v
+ - composer update --no-interaction --prefer-source
+ - vendor/bin/phpunit -v
+
+before_script:
+ - composer install --no-interaction
+
+after_script:
+ - wget https://scrutinizer-ci.com/ocular.phar
+ - php ocular.phar code-coverage:upload --format=php-clover coverage.clover
+
+notifications:
+ irc: "irc.freenode.org#phpdocumentor"
+ email:
+ - mike.vanriel@naenius.com
+ - ashnazg@php.net
+ - boen.robot@gmail.com
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/LICENSE b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/LICENSE
new file mode 100644
index 0000000..792e404
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2010 Mike van Riel
+
+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/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/README.md b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/README.md
new file mode 100644
index 0000000..a1984a1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/README.md
@@ -0,0 +1,69 @@
+The ReflectionDocBlock Component [![Build Status](https://secure.travis-ci.org/phpDocumentor/ReflectionDocBlock.png)](https://travis-ci.org/phpDocumentor/ReflectionDocBlock)
+================================
+
+Introduction
+------------
+
+The ReflectionDocBlock component of phpDocumentor provides a DocBlock parser
+that is 100% compatible with the [PHPDoc standard](http://phpdoc.org/docs/latest).
+
+With this component, a library can provide support for annotations via DocBlocks
+or otherwise retrieve information that is embedded in a DocBlock.
+
+> **Note**: *this is a core component of phpDocumentor and is constantly being
+> optimized for performance.*
+
+Installation
+------------
+
+You can install the component in the following ways:
+
+* Use the official Github repository (https://github.com/phpDocumentor/ReflectionDocBlock)
+* Via Composer (http://packagist.org/packages/phpdocumentor/reflection-docblock)
+
+Usage
+-----
+
+In order to parse the DocBlock one needs a DocBlockFactory that can be
+instantiated using its `createInstance` factory method like this:
+
+```php
+$factory = \phpDocumentor\Reflection\DocBlockFactory::createInstance();
+```
+
+Then we can use the `create` method of the factory to interpret the DocBlock.
+Please note that it is also possible to provide a class that has the
+`getDocComment()` method, such as an object of type `ReflectionClass`, the
+create method will read that if it exists.
+
+```php
+$docComment = <<create($docComment);
+```
+
+The `create` method will yield an object of type `\phpDocumentor\Reflection\DocBlock`
+whose methods can be queried as shown in the following example.
+
+```php
+// Should contain the summary for this DocBlock
+$summary = $docblock->getSummary();
+
+// Contains an object of type \phpDocumentor\Reflection\DocBlock\Description;
+// you can either cast it to string or use the render method to get a string
+// representation of the Description.
+$description = $docblock->getDescription();
+```
+
+> For more examples it would be best to review the scripts in the `/examples`
+> folder.
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/composer.json b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/composer.json
new file mode 100644
index 0000000..85be2fd
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/composer.json
@@ -0,0 +1,28 @@
+{
+ "name": "phpdocumentor/reflection-docblock",
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.2.0",
+ "webmozart/assert": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]}
+ },
+ "autoload-dev": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]}
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/composer.lock b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/composer.lock
new file mode 100644
index 0000000..b4da3c1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/composer.lock
@@ -0,0 +1,1120 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "hash": "9dfabded4193c3fd2ec85874de3b2e3c",
+ "content-hash": "69f6ae6608b8524fa04ddb0264bbf091",
+ "packages": [
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "dev-master",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/9969bd1c9661a73fdab104df7dbf132639d5c4d8",
+ "reference": "9969bd1c9661a73fdab104df7dbf132639d5c4d8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2015-06-12 22:21:38"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "reference": "b39c7a5b194f9ed7bd0dd345c751007a41862443",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2016-06-10 07:14:17"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab",
+ "reference": "b8ef76d0f0c3b9a0a1bc987085fe0a0ddba984ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2015-05-12 15:19:25"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "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"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-06-14 21:17:01"
+ },
+ {
+ "name": "hamcrest/hamcrest-php",
+ "version": "v1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/hamcrest/hamcrest-php.git",
+ "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/hamcrest/hamcrest-php/zipball/b37020aa976fa52d3de9aa904aa2522dc518f79c",
+ "reference": "b37020aa976fa52d3de9aa904aa2522dc518f79c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "replace": {
+ "cordoval/hamcrest-php": "*",
+ "davedevelopment/hamcrest-php": "*",
+ "kodova/hamcrest-php": "*"
+ },
+ "require-dev": {
+ "phpunit/php-file-iterator": "1.3.3",
+ "satooshi/php-coveralls": "dev-master"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "hamcrest"
+ ],
+ "files": [
+ "hamcrest/Hamcrest.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD"
+ ],
+ "description": "This is the PHP port of Hamcrest Matchers",
+ "keywords": [
+ "test"
+ ],
+ "time": "2015-05-11 14:41:42"
+ },
+ {
+ "name": "mockery/mockery",
+ "version": "0.9.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/padraic/mockery.git",
+ "reference": "70bba85e4aabc9449626651f48b9018ede04f86b"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/padraic/mockery/zipball/70bba85e4aabc9449626651f48b9018ede04f86b",
+ "reference": "70bba85e4aabc9449626651f48b9018ede04f86b",
+ "shasum": ""
+ },
+ "require": {
+ "hamcrest/hamcrest-php": "~1.1",
+ "lib-pcre": ">=7.0",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.9.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Mockery": "library/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Pádraic Brady",
+ "email": "padraic.brady@gmail.com",
+ "homepage": "http://blog.astrumfutura.com"
+ },
+ {
+ "name": "Dave Marshall",
+ "email": "dave.marshall@atstsolutions.co.uk",
+ "homepage": "http://davedevelopment.co.uk"
+ }
+ ],
+ "description": "Mockery is a simple yet flexible PHP mock object framework for use in unit testing with PHPUnit, PHPSpec or any other testing framework. Its core goal is to offer a test double framework with a succinct API capable of clearly defining all possible object operations and interactions using a human readable Domain Specific Language (DSL). Designed as a drop in alternative to PHPUnit's phpunit-mock-objects library, Mockery is easy to integrate with PHPUnit and can operate alongside phpunit-mock-objects without the World ending.",
+ "homepage": "http://github.com/padraic/mockery",
+ "keywords": [
+ "BDD",
+ "TDD",
+ "library",
+ "mock",
+ "mock objects",
+ "mockery",
+ "stub",
+ "test",
+ "test double",
+ "testing"
+ ],
+ "time": "2015-04-02 19:54:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.1.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/631e365cf26bb2c078683e8d9bcf8bc631ac4d44",
+ "reference": "631e365cf26bb2c078683e8d9bcf8bc631ac4d44",
+ "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"
+ },
+ "suggest": {
+ "ext-dom": "*",
+ "ext-xdebug": ">=2.2.1",
+ "ext-xmlwriter": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.1.x-dev"
+ }
+ },
+ "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": "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"
+ ],
+ "time": "2015-06-19 07:11:55"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.3.4",
+ "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"
+ },
+ "type": "library",
+ "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"
+ ],
+ "time": "2013-10-10 15:34:57"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21 13:50:34"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/83fe1bdc5d47658b727595c14da140da92b3d66d",
+ "reference": "83fe1bdc5d47658b727595c14da140da92b3d66d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "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": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2015-06-13 07:35:30"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "1.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/7a9b0969488c3c54fd62b4d504b3ec758fd005d9",
+ "reference": "7a9b0969488c3c54fd62b4d504b3ec758fd005d9",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-06-19 03:43:16"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "4.4.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2e8580deebb7d1ac92ac878595e6bffe01069c2a",
+ "reference": "2e8580deebb7d1ac92ac878595e6bffe01069c2a",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-pcre": "*",
+ "ext-reflection": "*",
+ "ext-spl": "*",
+ "php": ">=5.3.3",
+ "phpunit/php-code-coverage": "~2.0",
+ "phpunit/php-file-iterator": "~1.3.2",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "~1.0.2",
+ "phpunit/phpunit-mock-objects": "~2.3",
+ "sebastian/comparator": "~1.0",
+ "sebastian/diff": "~1.1",
+ "sebastian/environment": "~1.1",
+ "sebastian/exporter": "~1.1",
+ "sebastian/global-state": "~1.0",
+ "sebastian/recursion-context": "~1.0",
+ "sebastian/version": "~1.0",
+ "symfony/yaml": "~2.0"
+ },
+ "suggest": {
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.4.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-01-27 16:06:15"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "2.3.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/92408bb1968a81b3217a6fdf6c1a198da83caa35",
+ "reference": "92408bb1968a81b3217a6fdf6c1a198da83caa35",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "~1.0,>=1.0.2",
+ "php": ">=5.3.3",
+ "phpunit/php-text-template": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.3.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-06-11 15:55:48"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/1dd8869519a225f7f2b9eb663e225298fade819e",
+ "reference": "1dd8869519a225f7f2b9eb663e225298fade819e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.1.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-01-29 16:28:08"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "reference": "863df9687835c62aa423a22412d26fa2ebde3fd3",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-02-22 15:13:53"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "reference": "5a8c7d31914337b69923db26c4221b81ff5a196e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2015-01-01 10:01:08"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "84839970d05254c73cde183a721c7af13aede943"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/84839970d05254c73cde183a721c7af13aede943",
+ "reference": "84839970d05254c73cde183a721c7af13aede943",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "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"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2015-01-27 07:23:06"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.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": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "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"
+ ],
+ "time": "2014-10-06 09:23:50"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/3989662bbb30a29d20d9faa04a846af79b276252",
+ "reference": "3989662bbb30a29d20d9faa04a846af79b276252",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2015-01-24 09:48:32"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "1.0.6",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "reference": "58b3a85e7999757d6ad81c787a1fbf5ff6c628c6",
+ "shasum": ""
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2015-06-21 13:59:46"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v2.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/Yaml.git",
+ "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/Yaml/zipball/9808e75c609a14f6db02f70fccf4ca4aab53c160",
+ "reference": "9808e75c609a14f6db02f70fccf4ca4aab53c160",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.9"
+ },
+ "require-dev": {
+ "symfony/phpunit-bridge": "~2.7"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.7-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2015-06-10 15:30:22"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {
+ "phpdocumentor/reflection-common": 20
+ },
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=5.5"
+ },
+ "platform-dev": []
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php
new file mode 100644
index 0000000..6d67dea
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/01-interpreting-a-simple-docblock.php
@@ -0,0 +1,27 @@
+create($docComment);
+
+// Should contain the first line of the DocBlock
+$summary = $docblock->getSummary();
+
+// Contains an object of type Description; you can either cast it to string or use
+// the render method to get a string representation of the Description.
+//
+// In subsequent examples we will be fiddling a bit more with the Description.
+$description = $docblock->getDescription();
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php
new file mode 100644
index 0000000..2399588
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/02-interpreting-tags.php
@@ -0,0 +1,24 @@
+create($docComment);
+
+// You can check if a DocBlock has one or more see tags
+$hasSeeTag = $docblock->hasTag('see');
+
+// Or we can get a complete list of all tags
+$tags = $docblock->getTags();
+
+// But we can also grab all tags of a specific type, such as `see`
+$seeTags = $docblock->getTagsByName('see');
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php
new file mode 100644
index 0000000..6bc10ba
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/03-reconstituting-a-docblock.php
@@ -0,0 +1,27 @@
+create($docComment);
+
+// Create the serializer that will reconstitute the DocBlock back to its original form.
+$serializer = new Serializer();
+
+// Reconstitution is performed by the `getDocComment()` method.
+$reconstitutedDocComment = $serializer->getDocComment($docblock);
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php
new file mode 100644
index 0000000..026d606
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/04-adding-your-own-tag.php
@@ -0,0 +1,135 @@
+ Important: Tag classes that act as Factories using the `create` method should implement the TagFactory interface.
+ */
+final class MyTag extends BaseTag implements StaticMethod
+{
+ /**
+ * A required property that is used by Formatters to reconstitute the complete tag line.
+ *
+ * @see Formatter
+ *
+ * @var string
+ */
+ protected $name = 'my-tag';
+
+ /**
+ * The constructor for this Tag; this should contain all properties for this object.
+ *
+ * @param Description $description An example of how to add a Description to the tag; the Description is often
+ * an optional variable so passing null is allowed in this instance (though you can
+ * also construct an empty description object).
+ *
+ * @see BaseTag for the declaration of the description property and getDescription method.
+ */
+ public function __construct(Description $description = null)
+ {
+ $this->description = $description;
+ }
+
+ /**
+ * A static Factory that creates a new instance of the current Tag.
+ *
+ * In this example the MyTag tag can be created by passing a description text as $body. Because we have added
+ * a $descriptionFactory that is type-hinted as DescriptionFactory we can now construct a new Description object
+ * and pass that to the constructor.
+ *
+ * > You could directly instantiate a Description object here but that won't be parsed for inline tags and Types
+ * > won't be resolved. The DescriptionFactory will take care of those actions.
+ *
+ * The `create` method's interface states that this method only features a single parameter (`$body`) but the
+ * {@see TagFactory} will read the signature of this method and if it has more parameters then it will try
+ * to find declarations for it in the ServiceLocator of the TagFactory (see {@see TagFactory::$serviceLocator}).
+ *
+ * > Important: all properties following the `$body` should default to `null`, otherwise PHP will error because
+ * > it no longer matches the interface. This is why you often see the default tags check that an optional argument
+ * > is not null nonetheless.
+ *
+ * @param string $body
+ * @param DescriptionFactory $descriptionFactory
+ * @param Context|null $context The Context is used to resolve Types and FQSENs, although optional
+ * it is highly recommended to pass it. If you omit it then it is assumed that
+ * the DocBlock is in the global namespace and has no `use` statements.
+ *
+ * @see Tag for the interface declaration of the `create` method.
+ * @see Tag::create() for more information on this method's workings.
+ *
+ * @return MyTag
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, Context $context = null)
+ {
+ Assert::string($body);
+ Assert::notNull($descriptionFactory);
+
+ return new static($descriptionFactory->create($body, $context));
+ }
+
+ /**
+ * Returns a rendition of the original tag line.
+ *
+ * This method is used to reconstitute a DocBlock into its original form by the {@see Serializer}. It should
+ * feature all parts of the tag so that the serializer can put it back together.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return (string)$this->description;
+ }
+}
+
+$docComment = << MyTag::class];
+
+// Do pass the list of custom tags to the Factory for the DocBlockFactory.
+$factory = DocBlockFactory::createInstance($customTags);
+// You can also add Tags later using `$factory->registerTagHandler()` with a tag name and Tag class name.
+
+// Create the DocBlock
+$docblock = $factory->create($docComment);
+
+// Take a look: the $customTagObjects now contain an array with your newly added tag
+$customTagObjects = $docblock->getTagsByName('my-tag');
+
+// As an experiment: let's reconstitute the DocBlock and observe that because we added a __toString() method
+// to the tag class that we can now also see it.
+$serializer = new Serializer();
+$reconstitutedDocComment = $serializer->getDocComment($docblock);
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php
new file mode 100644
index 0000000..5ec772f
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/examples/playing-with-descriptions/02-escaping.php
@@ -0,0 +1,47 @@
+create($docComment);
+
+// Escaping is automatic so this happens in the DescriptionFactory.
+$description = $docblock->getDescription();
+
+// This is the rendition that we will receive of the Description.
+$receivedDocComment = <<render();
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist
new file mode 100644
index 0000000..9abf85c
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/phpmd.xml.dist
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+
+
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist
new file mode 100644
index 0000000..3c2e9a3
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/phpunit.xml.dist
@@ -0,0 +1,33 @@
+
+
+
+
+
+ ./tests/unit
+
+
+ ./tests/integration
+
+
+
+
+ ./src/
+
+
+ ./vendor/
+
+
+
+
+
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php
new file mode 100644
index 0000000..3991140
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock.php
@@ -0,0 +1,220 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+use Webmozart\Assert\Assert;
+
+final class DocBlock
+{
+ /** @var string The opening line for this docblock. */
+ private $summary = '';
+
+ /** @var DocBlock\Description The actual description for this docblock. */
+ private $description = null;
+
+ /** @var Tag[] An array containing all the tags in this docblock; except inline. */
+ private $tags = array();
+
+ /** @var Types\Context Information about the context of this DocBlock. */
+ private $context = null;
+
+ /** @var Location Information about the location of this DocBlock. */
+ private $location = null;
+
+ /** @var bool Is this DocBlock (the start of) a template? */
+ private $isTemplateStart = false;
+
+ /** @var bool Does this DocBlock signify the end of a DocBlock template? */
+ private $isTemplateEnd = false;
+
+ /**
+ * @param string $summary
+ * @param DocBlock\Description $description
+ * @param DocBlock\Tag[] $tags
+ * @param Types\Context $context The context in which the DocBlock occurs.
+ * @param Location $location The location within the file that this DocBlock occurs in.
+ * @param bool $isTemplateStart
+ * @param bool $isTemplateEnd
+ */
+ public function __construct(
+ $summary = '',
+ DocBlock\Description $description = null,
+ array $tags = [],
+ Types\Context $context = null,
+ Location $location = null,
+ $isTemplateStart = false,
+ $isTemplateEnd = false
+ )
+ {
+ Assert::string($summary);
+ Assert::boolean($isTemplateStart);
+ Assert::boolean($isTemplateEnd);
+ Assert::allIsInstanceOf($tags, Tag::class);
+
+ $this->summary = $summary;
+ $this->description = $description ?: new DocBlock\Description('');
+ foreach ($tags as $tag) {
+ $this->addTag($tag);
+ }
+
+ $this->context = $context;
+ $this->location = $location;
+
+ $this->isTemplateEnd = $isTemplateEnd;
+ $this->isTemplateStart = $isTemplateStart;
+ }
+
+ /**
+ * @return string
+ */
+ public function getSummary()
+ {
+ return $this->summary;
+ }
+
+ /**
+ * @return DocBlock\Description
+ */
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ /**
+ * Returns the current context.
+ *
+ * @return Types\Context
+ */
+ public function getContext()
+ {
+ return $this->context;
+ }
+
+ /**
+ * Returns the current location.
+ *
+ * @return Location
+ */
+ public function getLocation()
+ {
+ return $this->location;
+ }
+
+ /**
+ * Returns whether this DocBlock is the start of a Template section.
+ *
+ * A Docblock may serve as template for a series of subsequent DocBlocks. This is indicated by a special marker
+ * (`#@+`) that is appended directly after the opening `/**` of a DocBlock.
+ *
+ * An example of such an opening is:
+ *
+ * ```
+ * /**#@+
+ * * My DocBlock
+ * * /
+ * ```
+ *
+ * The description and tags (not the summary!) are copied onto all subsequent DocBlocks and also applied to all
+ * elements that follow until another DocBlock is found that contains the closing marker (`#@-`).
+ *
+ * @see self::isTemplateEnd() for the check whether a closing marker was provided.
+ *
+ * @return boolean
+ */
+ public function isTemplateStart()
+ {
+ return $this->isTemplateStart;
+ }
+
+ /**
+ * Returns whether this DocBlock is the end of a Template section.
+ *
+ * @see self::isTemplateStart() for a more complete description of the Docblock Template functionality.
+ *
+ * @return boolean
+ */
+ public function isTemplateEnd()
+ {
+ return $this->isTemplateEnd;
+ }
+
+ /**
+ * Returns the tags for this DocBlock.
+ *
+ * @return Tag[]
+ */
+ public function getTags()
+ {
+ return $this->tags;
+ }
+
+ /**
+ * Returns an array of tags matching the given name. If no tags are found
+ * an empty array is returned.
+ *
+ * @param string $name String to search by.
+ *
+ * @return Tag[]
+ */
+ public function getTagsByName($name)
+ {
+ Assert::string($name);
+
+ $result = array();
+
+ /** @var Tag $tag */
+ foreach ($this->getTags() as $tag) {
+ if ($tag->getName() != $name) {
+ continue;
+ }
+
+ $result[] = $tag;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Checks if a tag of a certain type is present in this DocBlock.
+ *
+ * @param string $name Tag name to check for.
+ *
+ * @return bool
+ */
+ public function hasTag($name)
+ {
+ Assert::string($name);
+
+ /** @var Tag $tag */
+ foreach ($this->getTags() as $tag) {
+ if ($tag->getName() == $name) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * Adds a tag to this DocBlock.
+ *
+ * @param Tag $tag The tag to add.
+ *
+ * @return void
+ */
+ private function addTag(Tag $tag)
+ {
+ $this->tags[] = $tag;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php
new file mode 100644
index 0000000..d1d7fc6
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Description.php
@@ -0,0 +1,103 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
+use Webmozart\Assert\Assert;
+
+/**
+ * Object representing to description for a DocBlock.
+ *
+ * A Description object can consist of plain text but can also include tags. A Description Formatter can then combine
+ * a body template with sprintf-style placeholders together with formatted tags in order to reconstitute a complete
+ * description text using the format that you would prefer.
+ *
+ * Because parsing a Description text can be a verbose process this is handled by the {@see DescriptionFactory}. It is
+ * thus recommended to use that to create a Description object, like this:
+ *
+ * $description = $descriptionFactory->create('This is a {@see Description}', $context);
+ *
+ * The description factory will interpret the given body and create a body template and list of tags from them, and pass
+ * that onto the constructor if this class.
+ *
+ * > The $context variable is a class of type {@see \phpDocumentor\Reflection\Types\Context} and contains the namespace
+ * > and the namespace aliases that apply to this DocBlock. These are used by the Factory to resolve and expand partial
+ * > type names and FQSENs.
+ *
+ * If you do not want to use the DescriptionFactory you can pass a body template and tag listing like this:
+ *
+ * $description = new Description(
+ * 'This is a %1$s',
+ * [ new See(new Fqsen('\phpDocumentor\Reflection\DocBlock\Description')) ]
+ * );
+ *
+ * It is generally recommended to use the Factory as that will also apply escaping rules, while the Description object
+ * is mainly responsible for rendering.
+ *
+ * @see DescriptionFactory to create a new Description.
+ * @see Description\Formatter for the formatting of the body and tags.
+ */
+class Description
+{
+ /** @var string */
+ private $bodyTemplate;
+
+ /** @var Tag[] */
+ private $tags;
+
+ /**
+ * Initializes a Description with its body (template) and a listing of the tags used in the body template.
+ *
+ * @param string $bodyTemplate
+ * @param Tag[] $tags
+ */
+ public function __construct($bodyTemplate, array $tags = [])
+ {
+ Assert::string($bodyTemplate);
+
+ $this->bodyTemplate = $bodyTemplate;
+ $this->tags = $tags;
+ }
+
+ /**
+ * Renders this description as a string where the provided formatter will format the tags in the expected string
+ * format.
+ *
+ * @param Formatter|null $formatter
+ *
+ * @return string
+ */
+ public function render(Formatter $formatter = null)
+ {
+ if ($formatter === null) {
+ $formatter = new PassthroughFormatter();
+ }
+
+ $tags = [];
+ foreach ($this->tags as $tag) {
+ $tags[] = '{' . $formatter->format($tag) . '}';
+ }
+ return vsprintf($this->bodyTemplate, $tags);
+ }
+
+ /**
+ * Returns a plain string representation of this description.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->render();
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php
new file mode 100644
index 0000000..d59858b
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/DescriptionFactory.php
@@ -0,0 +1,191 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+
+/**
+ * Creates a new Description object given a body of text.
+ *
+ * Descriptions in phpDocumentor are somewhat complex entities as they can contain one or more tags inside their
+ * body that can be replaced with a readable output. The replacing is done by passing a Formatter object to the
+ * Description object's `render` method.
+ *
+ * In addition to the above does a Description support two types of escape sequences:
+ *
+ * 1. `{@}` to escape the `@` character to prevent it from being interpreted as part of a tag, i.e. `{{@}link}`
+ * 2. `{}` to escape the `}` character, this can be used if you want to use the `}` character in the description
+ * of an inline tag.
+ *
+ * If a body consists of multiple lines then this factory will also remove any superfluous whitespace at the beginning
+ * of each line while maintaining any indentation that is used. This will prevent formatting parsers from tripping
+ * over unexpected spaces as can be observed with tag descriptions.
+ */
+class DescriptionFactory
+{
+ /** @var TagFactory */
+ private $tagFactory;
+
+ /**
+ * Initializes this factory with the means to construct (inline) tags.
+ *
+ * @param TagFactory $tagFactory
+ */
+ public function __construct(TagFactory $tagFactory)
+ {
+ $this->tagFactory = $tagFactory;
+ }
+
+ /**
+ * Returns the parsed text of this description.
+ *
+ * @param string $contents
+ * @param TypeContext $context
+ *
+ * @return Description
+ */
+ public function create($contents, TypeContext $context = null)
+ {
+ list($text, $tags) = $this->parse($this->lex($contents), $context);
+
+ return new Description($text, $tags);
+ }
+
+ /**
+ * Strips the contents from superfluous whitespace and splits the description into a series of tokens.
+ *
+ * @param string $contents
+ *
+ * @return string[] A series of tokens of which the description text is composed.
+ */
+ private function lex($contents)
+ {
+ $contents = $this->removeSuperfluousStartingWhitespace($contents);
+
+ // performance optimalization; if there is no inline tag, don't bother splitting it up.
+ if (strpos($contents, '{@') === false) {
+ return [$contents];
+ }
+
+ return preg_split(
+ '/\{
+ # "{@}" is not a valid inline tag. This ensures that we do not treat it as one, but treat it literally.
+ (?!@\})
+ # We want to capture the whole tag line, but without the inline tag delimiters.
+ (\@
+ # Match everything up to the next delimiter.
+ [^{}]*
+ # Nested inline tag content should not be captured, or it will appear in the result separately.
+ (?:
+ # Match nested inline tags.
+ (?:
+ # Because we did not catch the tag delimiters earlier, we must be explicit with them here.
+ # Notice that this also matches "{}", as a way to later introduce it as an escape sequence.
+ \{(?1)?\}
+ |
+ # Make sure we match hanging "{".
+ \{
+ )
+ # Match content after the nested inline tag.
+ [^{}]*
+ )* # If there are more inline tags, match them as well. We use "*" since there may not be any
+ # nested inline tags.
+ )
+ \}/Sux',
+ $contents,
+ null,
+ PREG_SPLIT_DELIM_CAPTURE
+ );
+ }
+
+ /**
+ * Parses the stream of tokens in to a new set of tokens containing Tags.
+ *
+ * @param string[] $tokens
+ * @param TypeContext $context
+ *
+ * @return string[]|Tag[]
+ */
+ private function parse($tokens, TypeContext $context)
+ {
+ $count = count($tokens);
+ $tagCount = 0;
+ $tags = [];
+
+ for ($i = 1; $i < $count; $i += 2) {
+ $tags[] = $this->tagFactory->create($tokens[$i], $context);
+ $tokens[$i] = '%' . ++$tagCount . '$s';
+ }
+
+ //In order to allow "literal" inline tags, the otherwise invalid
+ //sequence "{@}" is changed to "@", and "{}" is changed to "}".
+ //See unit tests for examples.
+ for ($i = 0; $i < $count; $i += 2) {
+ $tokens[$i] = str_replace(['{@}', '{}'], ['@', '}'], $tokens[$i]);
+ }
+
+ return [implode('', $tokens), $tags];
+ }
+
+ /**
+ * Removes the superfluous from a multi-line description.
+ *
+ * When a description has more than one line then it can happen that the second and subsequent lines have an
+ * additional indentation. This is commonly in use with tags like this:
+ *
+ * {@}since 1.1.0 This is an example
+ * description where we have an
+ * indentation in the second and
+ * subsequent lines.
+ *
+ * If we do not normalize the indentation then we have superfluous whitespace on the second and subsequent
+ * lines and this may cause rendering issues when, for example, using a Markdown converter.
+ *
+ * @param string $contents
+ *
+ * @return string
+ */
+ private function removeSuperfluousStartingWhitespace($contents)
+ {
+ $lines = explode("\n", $contents);
+
+ // if there is only one line then we don't have lines with superfluous whitespace and
+ // can use the contents as-is
+ if (count($lines) <= 1) {
+ return $contents;
+ }
+
+ // determine how many whitespace characters need to be stripped
+ $startingSpaceCount = 9999999;
+ for ($i = 1; $i < count($lines); $i++) {
+ // lines with a no length do not count as they are not indented at all
+ if (strlen(trim($lines[$i])) === 0) {
+ continue;
+ }
+
+ // determine the number of prefixing spaces by checking the difference in line length before and after
+ // an ltrim
+ $startingSpaceCount = min($startingSpaceCount, strlen($lines[$i]) - strlen(ltrim($lines[$i])));
+ }
+
+ // strip the number of spaces from each line
+ if ($startingSpaceCount > 0) {
+ for ($i = 1; $i < count($lines); $i++) {
+ $lines[$i] = substr($lines[$i], $startingSpaceCount);
+ }
+ }
+
+ return implode("\n", $lines);
+ }
+
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php
new file mode 100644
index 0000000..3cc5dab
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/ExampleFinder.php
@@ -0,0 +1,170 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Example;
+
+/**
+ * Class used to find an example file's location based on a given ExampleDescriptor.
+ */
+class ExampleFinder
+{
+ /** @var string */
+ private $sourceDirectory = '';
+
+ /** @var string[] */
+ private $exampleDirectories = array();
+
+ /**
+ * Attempts to find the example contents for the given descriptor.
+ *
+ * @param Example $example
+ *
+ * @return string
+ */
+ public function find(Example $example)
+ {
+ $filename = $example->getFilePath();
+
+ $file = $this->getExampleFileContents($filename);
+ if (!$file) {
+ return "** File not found : {$filename} **";
+ }
+
+ return implode('', array_slice($file, $example->getStartingLine() - 1, $example->getLineCount()));
+ }
+
+ /**
+ * Registers the project's root directory where an 'examples' folder can be expected.
+ *
+ * @param string $directory
+ *
+ * @return void
+ */
+ public function setSourceDirectory($directory = '')
+ {
+ $this->sourceDirectory = $directory;
+ }
+
+ /**
+ * Returns the project's root directory where an 'examples' folder can be expected.
+ *
+ * @return string
+ */
+ public function getSourceDirectory()
+ {
+ return $this->sourceDirectory;
+ }
+
+ /**
+ * Registers a series of directories that may contain examples.
+ *
+ * @param string[] $directories
+ */
+ public function setExampleDirectories(array $directories)
+ {
+ $this->exampleDirectories = $directories;
+ }
+
+ /**
+ * Returns a series of directories that may contain examples.
+ *
+ * @return string[]
+ */
+ public function getExampleDirectories()
+ {
+ return $this->exampleDirectories;
+ }
+
+ /**
+ * Attempts to find the requested example file and returns its contents or null if no file was found.
+ *
+ * This method will try several methods in search of the given example file, the first one it encounters is
+ * returned:
+ *
+ * 1. Iterates through all examples folders for the given filename
+ * 2. Checks the source folder for the given filename
+ * 3. Checks the 'examples' folder in the current working directory for examples
+ * 4. Checks the path relative to the current working directory for the given filename
+ *
+ * @param string $filename
+ *
+ * @return string|null
+ */
+ private function getExampleFileContents($filename)
+ {
+ $normalizedPath = null;
+
+ foreach ($this->exampleDirectories as $directory) {
+ $exampleFileFromConfig = $this->constructExamplePath($directory, $filename);
+ if (is_readable($exampleFileFromConfig)) {
+ $normalizedPath = $exampleFileFromConfig;
+ break;
+ }
+ }
+
+ if (!$normalizedPath) {
+ if (is_readable($this->getExamplePathFromSource($filename))) {
+ $normalizedPath = $this->getExamplePathFromSource($filename);
+ } elseif (is_readable($this->getExamplePathFromExampleDirectory($filename))) {
+ $normalizedPath = $this->getExamplePathFromExampleDirectory($filename);
+ } elseif (is_readable($filename)) {
+ $normalizedPath = $filename;
+ }
+ }
+
+ return $normalizedPath && is_readable($normalizedPath) ? file($normalizedPath) : null;
+ }
+
+ /**
+ * Get example filepath based on the example directory inside your project.
+ *
+ * @param string $file
+ *
+ * @return string
+ */
+ private function getExamplePathFromExampleDirectory($file)
+ {
+ return getcwd() . DIRECTORY_SEPARATOR . 'examples' . DIRECTORY_SEPARATOR . $file;
+ }
+
+ /**
+ * Returns a path to the example file in the given directory..
+ *
+ * @param string $directory
+ * @param string $file
+ *
+ * @return string
+ */
+ private function constructExamplePath($directory, $file)
+ {
+ return rtrim($directory, '\\/') . DIRECTORY_SEPARATOR . $file;
+ }
+
+ /**
+ * Get example filepath based on sourcecode.
+ *
+ * @param string $file
+ *
+ * @return string
+ */
+ private function getExamplePathFromSource($file)
+ {
+ return sprintf(
+ '%s%s%s',
+ trim($this->getSourceDirectory(), '\\/'),
+ DIRECTORY_SEPARATOR,
+ trim($file, '"')
+ );
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
new file mode 100644
index 0000000..7f1c89d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Serializer.php
@@ -0,0 +1,143 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock;
+use Webmozart\Assert\Assert;
+
+/**
+ * Converts a DocBlock back from an object to a complete DocComment including Asterisks.
+ */
+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 with the given indent amount and string. */
+ 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)
+ {
+ Assert::integer($indent);
+ Assert::string($indentString);
+ Assert::boolean($indentFirstLine);
+ Assert::nullOrInteger($lineLength);
+
+ $this->indent = $indent;
+ $this->indentString = $indentString;
+ $this->isFirstLineIndented = $indentFirstLine;
+ $this->lineLength = $lineLength;
+ }
+
+ /**
+ * Generate a DocBlock comment.
+ *
+ * @param DocBlock $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 : '';
+ // 3 === strlen(' * ')
+ $wrapLength = $this->lineLength ? $this->lineLength - strlen($indent) - 3 : null;
+
+ $text = $this->removeTrailingSpaces(
+ $indent,
+ $this->addAsterisksForEachLine(
+ $indent,
+ $this->getSummaryAndDescriptionTextBlock($docblock, $wrapLength)
+ )
+ );
+
+ $comment = "{$firstIndent}/**\n{$indent} * {$text}\n{$indent} *\n";
+ $comment = $this->addTagBlock($docblock, $wrapLength, $indent, $comment);
+ $comment .= $indent . ' */';
+
+ return $comment;
+ }
+
+ /**
+ * @param $indent
+ * @param $text
+ * @return mixed
+ */
+ private function removeTrailingSpaces($indent, $text)
+ {
+ return str_replace("\n{$indent} * \n", "\n{$indent} *\n", $text);
+ }
+
+ /**
+ * @param $indent
+ * @param $text
+ * @return mixed
+ */
+ private function addAsterisksForEachLine($indent, $text)
+ {
+ return str_replace("\n", "\n{$indent} * ", $text);
+ }
+
+ /**
+ * @param DocBlock $docblock
+ * @param $wrapLength
+ * @return string
+ */
+ private function getSummaryAndDescriptionTextBlock(DocBlock $docblock, $wrapLength)
+ {
+ $text = $docblock->getSummary() . ((string)$docblock->getDescription() ? "\n\n" . $docblock->getDescription()
+ : '');
+ if ($wrapLength !== null) {
+ $text = wordwrap($text, $wrapLength);
+ return $text;
+ }
+ return $text;
+ }
+
+ /**
+ * @param DocBlock $docblock
+ * @param $wrapLength
+ * @param $indent
+ * @param $comment
+ * @return string
+ */
+ private function addTagBlock(DocBlock $docblock, $wrapLength, $indent, $comment)
+ {
+ foreach ($docblock->getTags() as $tag) {
+ $formatter = new DocBlock\Tags\Formatter\PassthroughFormatter();
+ $tagText = $formatter->format($tag);
+ if ($wrapLength !== null) {
+ $tagText = wordwrap($tagText, $wrapLength);
+ }
+ $tagText = str_replace("\n", "\n{$indent} * ", $tagText);
+
+ $comment .= "{$indent} * {$tagText}\n";
+ }
+
+ return $comment;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php
new file mode 100644
index 0000000..0a65646
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/StandardTagFactory.php
@@ -0,0 +1,314 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Factory\StaticMethod;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Creates a Tag object given the contents of a tag.
+ *
+ * This Factory is capable of determining the appropriate class for a tag and instantiate it using its `create`
+ * factory method. The `create` factory method of a Tag can have a variable number of arguments; this way you can
+ * pass the dependencies that you need to construct a tag object.
+ *
+ * > Important: each parameter in addition to the body variable for the `create` method must default to null, otherwise
+ * > it violates the constraint with the interface; it is recommended to use the {@see Assert::notNull()} method to
+ * > verify that a dependency is actually passed.
+ *
+ * This Factory also features a Service Locator component that is used to pass the right dependencies to the
+ * `create` method of a tag; each dependency should be registered as a service or as a parameter.
+ *
+ * When you want to use a Tag of your own with custom handling you need to call the `registerTagHandler` method, pass
+ * the name of the tag and a Fully Qualified Class Name pointing to a class that implements the Tag interface.
+ */
+final class StandardTagFactory implements TagFactory
+{
+ /** PCRE regular expression matching a tag name. */
+ const REGEX_TAGNAME = '[\w\-\_\\\\]+';
+
+ /**
+ * @var string[] An array with a tag as a key, and an FQCN to a class that handles it as an array value.
+ */
+ private $tagHandlerMappings = [
+ 'author' => '\phpDocumentor\Reflection\DocBlock\Tags\Author',
+ 'covers' => '\phpDocumentor\Reflection\DocBlock\Tags\Covers',
+ 'deprecated' => '\phpDocumentor\Reflection\DocBlock\Tags\Deprecated',
+ // 'example' => '\phpDocumentor\Reflection\DocBlock\Tags\Example',
+ 'link' => '\phpDocumentor\Reflection\DocBlock\Tags\Link',
+ 'method' => '\phpDocumentor\Reflection\DocBlock\Tags\Method',
+ 'param' => '\phpDocumentor\Reflection\DocBlock\Tags\Param',
+ 'property-read' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyRead',
+ 'property' => '\phpDocumentor\Reflection\DocBlock\Tags\Property',
+ 'property-write' => '\phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite',
+ 'return' => '\phpDocumentor\Reflection\DocBlock\Tags\Return_',
+ 'see' => '\phpDocumentor\Reflection\DocBlock\Tags\See',
+ 'since' => '\phpDocumentor\Reflection\DocBlock\Tags\Since',
+ 'source' => '\phpDocumentor\Reflection\DocBlock\Tags\Source',
+ 'throw' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws',
+ 'throws' => '\phpDocumentor\Reflection\DocBlock\Tags\Throws',
+ 'uses' => '\phpDocumentor\Reflection\DocBlock\Tags\Uses',
+ 'var' => '\phpDocumentor\Reflection\DocBlock\Tags\Var_',
+ 'version' => '\phpDocumentor\Reflection\DocBlock\Tags\Version'
+ ];
+
+ /**
+ * @var \ReflectionParameter[][] a lazy-loading cache containing parameters for each tagHandler that has been used.
+ */
+ private $tagHandlerParameterCache = [];
+
+ /**
+ * @var FqsenResolver
+ */
+ private $fqsenResolver;
+
+ /**
+ * @var mixed[] an array representing a simple Service Locator where we can store parameters and
+ * services that can be inserted into the Factory Methods of Tag Handlers.
+ */
+ private $serviceLocator = [];
+
+ /**
+ * Initialize this tag factory with the means to resolve an FQSEN and optionally a list of tag handlers.
+ *
+ * If no tag handlers are provided than the default list in the {@see self::$tagHandlerMappings} property
+ * is used.
+ *
+ * @param FqsenResolver $fqsenResolver
+ * @param string[] $tagHandlers
+ *
+ * @see self::registerTagHandler() to add a new tag handler to the existing default list.
+ */
+ public function __construct(FqsenResolver $fqsenResolver, array $tagHandlers = null)
+ {
+ $this->fqsenResolver = $fqsenResolver;
+ if ($tagHandlers !== null) {
+ $this->tagHandlerMappings = $tagHandlers;
+ }
+
+ $this->addService($fqsenResolver, FqsenResolver::class);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function create($tagLine, TypeContext $context = null)
+ {
+ if (! $context) {
+ $context = new TypeContext('');
+ }
+
+ list($tagName, $tagBody) = $this->extractTagParts($tagLine);
+
+ return $this->createTag($tagBody, $tagName, $context);
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function addParameter($name, $value)
+ {
+ $this->serviceLocator[$name] = $value;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function addService($service, $alias = null)
+ {
+ $this->serviceLocator[$alias ?: get_class($service)] = $service;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ public function registerTagHandler($tagName, $handler)
+ {
+ Assert::stringNotEmpty($tagName);
+ Assert::stringNotEmpty($handler);
+ Assert::classExists($handler);
+ Assert::implementsInterface($handler, StaticMethod::class);
+
+ if (strpos($tagName, '\\') && $tagName[0] !== '\\') {
+ throw new \InvalidArgumentException(
+ 'A namespaced tag must have a leading backslash as it must be fully qualified'
+ );
+ }
+
+ $this->tagHandlerMappings[$tagName] = $handler;
+ }
+
+ /**
+ * Extracts all components for a tag.
+ *
+ * @param string $tagLine
+ *
+ * @return string[]
+ */
+ private function extractTagParts($tagLine)
+ {
+ $matches = array();
+ if (! preg_match('/^@(' . self::REGEX_TAGNAME . ')(?:\s*([^\s].*)|$)?/us', $tagLine, $matches)) {
+ throw new \InvalidArgumentException(
+ 'The tag "' . $tagLine . '" does not seem to be wellformed, please check it for errors'
+ );
+ }
+
+ if (count($matches) < 3) {
+ $matches[] = '';
+ }
+
+ return array_slice($matches, 1);
+ }
+
+ /**
+ * Creates a new tag object with the given name and body or returns null if the tag name was recognized but the
+ * body was invalid.
+ *
+ * @param string $body
+ * @param string $name
+ * @param TypeContext $context
+ *
+ * @return Tag|null
+ */
+ private function createTag($body, $name, TypeContext $context)
+ {
+ $handlerClassName = $this->findHandlerClassName($name, $context);
+ $arguments = $this->getArgumentsForParametersFromWiring(
+ $this->fetchParametersForHandlerFactoryMethod($handlerClassName),
+ $this->getServiceLocatorWithDynamicParameters($context, $name, $body)
+ )
+ ;
+
+ return call_user_func_array([$handlerClassName, 'create'], $arguments);
+ }
+
+ /**
+ * Determines the Fully Qualified Class Name of the Factory or Tag (containing a Factory Method `create`).
+ *
+ * @param string $tagName
+ * @param TypeContext $context
+ *
+ * @return string
+ */
+ private function findHandlerClassName($tagName, TypeContext $context)
+ {
+ $handlerClassName = Generic::class;
+ if (isset($this->tagHandlerMappings[$tagName])) {
+ $handlerClassName = $this->tagHandlerMappings[$tagName];
+ } elseif ($this->isAnnotation($tagName)) {
+ // TODO: Annotation support is planned for a later stage and as such is disabled for now
+ // $tagName = (string)$this->fqsenResolver->resolve($tagName, $context);
+ // if (isset($this->annotationMappings[$tagName])) {
+ // $handlerClassName = $this->annotationMappings[$tagName];
+ // }
+ }
+
+ return $handlerClassName;
+ }
+
+ /**
+ * Retrieves the arguments that need to be passed to the Factory Method with the given Parameters.
+ *
+ * @param \ReflectionParameter[] $parameters
+ * @param mixed[] $locator
+ *
+ * @return mixed[] A series of values that can be passed to the Factory Method of the tag whose parameters
+ * is provided with this method.
+ */
+ private function getArgumentsForParametersFromWiring($parameters, $locator)
+ {
+ $arguments = [];
+ foreach ($parameters as $index => $parameter) {
+ $typeHint = $parameter->getClass() ? $parameter->getClass()->getName() : null;
+ if (isset($locator[$typeHint])) {
+ $arguments[] = $locator[$typeHint];
+ continue;
+ }
+
+ $parameterName = $parameter->getName();
+ if (isset($locator[$parameterName])) {
+ $arguments[] = $locator[$parameterName];
+ continue;
+ }
+
+ $arguments[] = null;
+ }
+
+ return $arguments;
+ }
+
+ /**
+ * Retrieves a series of ReflectionParameter objects for the static 'create' method of the given
+ * tag handler class name.
+ *
+ * @param string $handlerClassName
+ *
+ * @return \ReflectionParameter[]
+ */
+ private function fetchParametersForHandlerFactoryMethod($handlerClassName)
+ {
+ if (! isset($this->tagHandlerParameterCache[$handlerClassName])) {
+ $methodReflection = new \ReflectionMethod($handlerClassName, 'create');
+ $this->tagHandlerParameterCache[$handlerClassName] = $methodReflection->getParameters();
+ }
+
+ return $this->tagHandlerParameterCache[$handlerClassName];
+ }
+
+ /**
+ * Returns a copy of this class' Service Locator with added dynamic parameters, such as the tag's name, body and
+ * Context.
+ *
+ * @param TypeContext $context The Context (namespace and aliasses) that may be passed and is used to resolve FQSENs.
+ * @param string $tagName The name of the tag that may be passed onto the factory method of the Tag class.
+ * @param string $tagBody The body of the tag that may be passed onto the factory method of the Tag class.
+ *
+ * @return mixed[]
+ */
+ private function getServiceLocatorWithDynamicParameters(TypeContext $context, $tagName, $tagBody)
+ {
+ $locator = array_merge(
+ $this->serviceLocator,
+ [
+ 'name' => $tagName,
+ 'body' => $tagBody,
+ TypeContext::class => $context
+ ]
+ );
+
+ return $locator;
+ }
+
+ /**
+ * Returns whether the given tag belongs to an annotation.
+ *
+ * @param string $tagContent
+ *
+ * @todo this method should be populated once we implement Annotation notation support.
+ *
+ * @return bool
+ */
+ private function isAnnotation($tagContent)
+ {
+ // 1. Contains a namespace separator
+ // 2. Contains parenthesis
+ // 3. Is present in a list of known annotations (make the algorithm smart by first checking is the last part
+ // of the annotation class name matches the found tag name
+
+ return false;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php
new file mode 100644
index 0000000..e765367
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tag.php
@@ -0,0 +1,26 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+interface Tag
+{
+ public function getName();
+
+ public static function create($body);
+
+ public function render(Formatter $formatter = null);
+
+ public function __toString();
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php
new file mode 100644
index 0000000..3c1d113
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/TagFactory.php
@@ -0,0 +1,93 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+
+interface TagFactory
+{
+ /**
+ * Adds a parameter to the service locator that can be injected in a tag's factory method.
+ *
+ * When calling a tag's "create" method we always check the signature for dependencies to inject. One way is to
+ * typehint a parameter in the signature so that we can use that interface or class name to inject a dependency
+ * (see {@see addService()} for more information on that).
+ *
+ * Another way is to check the name of the argument against the names in the Service Locator. With this method
+ * you can add a variable that will be inserted when a tag's create method is not typehinted and has a matching
+ * name.
+ *
+ * Be aware that there are two reserved names:
+ *
+ * - name, representing the name of the tag.
+ * - body, representing the complete body of the tag.
+ *
+ * These parameters are injected at the last moment and will override any existing parameter with those names.
+ *
+ * @param string $name
+ * @param mixed $value
+ *
+ * @return void
+ */
+ public function addParameter($name, $value);
+
+ /**
+ * Registers a service with the Service Locator using the FQCN of the class or the alias, if provided.
+ *
+ * When calling a tag's "create" method we always check the signature for dependencies to inject. If a parameter
+ * has a typehint then the ServiceLocator is queried to see if a Service is registered for that typehint.
+ *
+ * Because interfaces are regularly used as type-hints this method provides an alias parameter; if the FQCN of the
+ * interface is passed as alias then every time that interface is requested the provided service will be returned.
+ *
+ * @param object $service
+ * @param string $alias
+ *
+ * @return void
+ */
+ public function addService($service);
+
+ /**
+ * Factory method responsible for instantiating the correct sub type.
+ *
+ * @param string $tagLine The text for this tag, including description.
+ * @param TypeContext $context
+ *
+ * @throws \InvalidArgumentException if an invalid tag line was presented.
+ *
+ * @return Tag A new tag object.
+ */
+ public function create($tagLine, TypeContext $context = null);
+
+ /**
+ * Registers a handler for tags.
+ *
+ * If you want to use your own tags then you can use this method to instruct the TagFactory to register the name
+ * of a tag with the FQCN of a 'Tag Handler'. The Tag handler should implement the {@see Tag} interface (and thus
+ * the create method).
+ *
+ * @param string $tagName Name of tag to register a handler for. When registering a namespaced tag, the full
+ * name, along with a prefixing slash MUST be provided.
+ * @param string $handler FQCN of handler.
+ *
+ * @throws \InvalidArgumentException if the tag name is not a string
+ * @throws \InvalidArgumentException if the tag name is namespaced (contains backslashes) but does not start with
+ * a backslash
+ * @throws \InvalidArgumentException if the handler is not a string
+ * @throws \InvalidArgumentException if the handler is not an existing class
+ * @throws \InvalidArgumentException if the handler does not implement the {@see Tag} interface
+ *
+ * @return void
+ */
+ public function registerTagHandler($tagName, $handler);
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php
new file mode 100644
index 0000000..41a2788
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Author.php
@@ -0,0 +1,100 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for an {@}author tag in a Docblock.
+ */
+final class Author extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string register that this is the author tag. */
+ protected $name = 'author';
+
+ /** @var string The name of the author */
+ private $authorName = '';
+
+ /** @var string The email of the author */
+ private $authorEmail = '';
+
+ /**
+ * Initializes this tag with the author name and e-mail.
+ *
+ * @param string $authorName
+ * @param string $authorEmail
+ */
+ public function __construct($authorName, $authorEmail)
+ {
+ Assert::string($authorName);
+ Assert::string($authorEmail);
+ if ($authorEmail && !filter_var($authorEmail, FILTER_VALIDATE_EMAIL)) {
+ throw new \InvalidArgumentException('The author tag does not have a valid e-mail address');
+ }
+
+ $this->authorName = $authorName;
+ $this->authorEmail = $authorEmail;
+ }
+
+ /**
+ * Gets the author's name.
+ *
+ * @return string The author's name.
+ */
+ public function getAuthorName()
+ {
+ return $this->authorName;
+ }
+
+ /**
+ * Returns the author's email.
+ *
+ * @return string The author's email.
+ */
+ public function getEmail()
+ {
+ return $this->authorEmail;
+ }
+
+ /**
+ * Returns this tag in string form.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->authorName . '<' . $this->authorEmail . '>';
+ }
+
+ /**
+ * Attempts to create a new Author object based on †he tag body.
+ *
+ * @param string $body
+ *
+ * @return static
+ */
+ public static function create($body)
+ {
+ Assert::string($body);
+
+ $splitTagContent = preg_match('/^([^\<]*)(?:\<([^\>]*)\>)?$/u', $body, $matches);
+ if (!$splitTagContent) {
+ return null;
+ }
+
+ $authorName = trim($matches[1]);
+ $email = isset($matches[2]) ? trim($matches[2]) : '';
+
+ return new static($authorName, $email);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php
new file mode 100644
index 0000000..14bb717
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/BaseTag.php
@@ -0,0 +1,52 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock;
+use phpDocumentor\Reflection\DocBlock\Description;
+
+/**
+ * Parses a tag definition for a DocBlock.
+ */
+abstract class BaseTag implements DocBlock\Tag
+{
+ /** @var string Name of the tag */
+ protected $name = '';
+
+ /** @var Description|null Description of the tag. */
+ protected $description;
+
+ /**
+ * Gets the name of this tag.
+ *
+ * @return string The name of this tag.
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function getDescription()
+ {
+ return $this->description;
+ }
+
+ public function render(Formatter $formatter = null)
+ {
+ if ($formatter === null) {
+ $formatter = new Formatter\PassthroughFormatter();
+ }
+
+ return $formatter->format($this);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php
new file mode 100644
index 0000000..31b4f82
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Covers.php
@@ -0,0 +1,84 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\FqsenResolver;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a @covers tag in a Docblock.
+ */
+final class Covers extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'covers';
+
+ /** @var Fqsen */
+ private $refers = null;
+
+ /**
+ * Initializes this tag.
+ *
+ * @param Fqsen $refers
+ * @param Description $description
+ */
+ public function __construct(Fqsen $refers, Description $description = null)
+ {
+ $this->refers = $refers;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ DescriptionFactory $descriptionFactory = null,
+ FqsenResolver $resolver = null,
+ TypeContext $context = null
+ )
+ {
+ Assert::string($body);
+ Assert::notEmpty($body);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ return new static(
+ $resolver->resolve($parts[0], $context),
+ $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context)
+ );
+ }
+
+ /**
+ * Returns the structural element this tag refers to.
+ *
+ * @return Fqsen
+ */
+ public function getReference()
+ {
+ return $this->refers;
+ }
+
+ /**
+ * Returns a string representation of this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->refers . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php
new file mode 100644
index 0000000..d3a0bd7
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Deprecated.php
@@ -0,0 +1,94 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}deprecated tag in a Docblock.
+ */
+final class Deprecated extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'deprecated';
+
+ /**
+ * 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. */
+ private $version = '';
+
+ public function __construct($version = null, Description $description = null)
+ {
+ Assert::nullOrStringNotEmpty($version);
+
+ $this->version = $version;
+ $this->description = $description;
+ }
+
+ /**
+ * @return static
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::nullOrString($body);
+ if (empty($body)) {
+ return new static();
+ }
+
+ $matches = [];
+ if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) {
+ return null;
+ }
+
+ return new static(
+ $matches[1],
+ $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context)
+ );
+ }
+
+ /**
+ * Gets the version section of the tag.
+ *
+ * @return string
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->version . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php
new file mode 100644
index 0000000..571ef8d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Example.php
@@ -0,0 +1,158 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+/**
+ * Reflection class for a {@}example tag in a Docblock.
+ */
+final class Example extends BaseTag
+{
+ /**
+ * @var string Path to a file to use as an example. May also be an absolute URI.
+ */
+ private $filePath = '';
+
+ /**
+ * @var bool Whether the file path component represents an URI. This determines how the file portion
+ * appears at {@link getContent()}.
+ */
+ private $isURI = false;
+
+ /**
+ * {@inheritdoc}
+ */
+ public function getContent()
+ {
+ if (null === $this->description) {
+ $filePath = '"' . $this->filePath . '"';
+ if ($this->isURI) {
+ $filePath = $this->isUriRelative($this->filePath)
+ ? str_replace('%2F', '/', rawurlencode($this->filePath))
+ :$this->filePath;
+ }
+
+ $this->description = $filePath . ' ' . parent::getContent();
+ }
+
+ return $this->description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create($body)
+ {
+ // File component: File path in quotes or File URI / Source information
+ if (! preg_match('/^(?:\"([^\"]+)\"|(\S+))(?:\s+(.*))?$/sux', $body, $matches)) {
+ return null;
+ }
+
+ $filePath = null;
+ $fileUri = null;
+ if ('' !== $matches[1]) {
+ $filePath = $matches[1];
+ } else {
+ $fileUri = $matches[2];
+ }
+
+ $startingLine = 1;
+ $lineCount = null;
+ $description = null;
+
+ // Starting line / Number of lines / Description
+ if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $matches[3], $matches)) {
+ $startingLine = (int)$matches[1];
+ if (isset($matches[2]) && $matches[2] !== '') {
+ $lineCount = (int)$matches[2];
+ }
+ $description = $matches[3];
+ }
+
+ return new static($filePath, $fileUri, $startingLine, $lineCount, $description);
+ }
+
+ /**
+ * 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->description = null;
+ return $this;
+ }
+
+ /**
+ * Sets the file path as an URI.
+ *
+ * This function is equivalent to {@link setFilePath()}, except that it
+ * converts an URI to a file path before that.
+ *
+ * There is no getFileURI(), as {@link getFilePath()} is compatible.
+ *
+ * @param string $uri The new file URI to use as an example.
+ *
+ * @return $this
+ */
+ public function setFileURI($uri)
+ {
+ $this->isURI = true;
+ $this->description = null;
+
+ $this->filePath = $this->isUriRelative($uri)
+ ? rawurldecode(str_replace(array('/', '\\'), '%2F', $uri))
+ : $this->filePath = $uri;
+
+ return $this;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->filePath . ($this->description ? ' ' . $this->description->render() : '');
+ }
+
+ /**
+ * Returns true if the provided URI is relative or contains a complete scheme (and thus is absolute).
+ *
+ * @param string $uri
+ *
+ * @return bool
+ */
+ private function isUriRelative($uri)
+ {
+ return false === strpos($uri, ':');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php
new file mode 100644
index 0000000..98aea45
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/StaticMethod.php
@@ -0,0 +1,18 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Factory;
+
+interface StaticMethod
+{
+ public static function create($body);
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php
new file mode 100644
index 0000000..b9ca0b8
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Factory/Strategy.php
@@ -0,0 +1,18 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Factory;
+
+interface Strategy
+{
+ public function create($body);
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php
new file mode 100644
index 0000000..64b2c60
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter.php
@@ -0,0 +1,27 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+
+interface Formatter
+{
+ /**
+ * Formats a tag into a string representation according to a specific format, such as Markdown.
+ *
+ * @param Tag $tag
+ *
+ * @return string
+ */
+ public function format(Tag $tag);
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php
new file mode 100644
index 0000000..aa97572
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Formatter/PassthroughFormatter.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+class PassthroughFormatter implements Formatter
+{
+ /**
+ * Formats the given tag to return a simple plain text version.
+ *
+ * @param Tag $tag
+ *
+ * @return string
+ */
+ public function format(Tag $tag)
+ {
+ return '@' . $tag->getName() . ' ' . (string)$tag;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php
new file mode 100644
index 0000000..e4c53e0
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Generic.php
@@ -0,0 +1,91 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Parses a tag definition for a DocBlock.
+ */
+class Generic extends BaseTag implements Factory\StaticMethod
+{
+ /**
+ * Parses a tag and populates the member variables.
+ *
+ * @param string $name Name of the tag.
+ * @param Description $description The contents of the given tag.
+ */
+ public function __construct($name, Description $description = null)
+ {
+ $this->validateTagName($name);
+
+ $this->name = $name;
+ $this->description = $description;
+ }
+
+ /**
+ * Creates a new tag that represents any unknown tag type.
+ *
+ * @param string $body
+ * @param string $name
+ * @param DescriptionFactory $descriptionFactory
+ * @param TypeContext $context
+ *
+ * @return static
+ */
+ public static function create(
+ $body,
+ $name = '',
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::stringNotEmpty($name);
+ Assert::notNull($descriptionFactory);
+
+ $description = $descriptionFactory && $body ? $descriptionFactory->create($body, $context) : null;
+
+ return new static($name, $description);
+ }
+
+ /**
+ * Returns the tag as a serialized string
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->description ? $this->description->render() : '');
+ }
+
+ /**
+ * Validates if the tag name matches the expected format, otherwise throws an exception.
+ *
+ * @param string $name
+ *
+ * @return void
+ */
+ private function validateTagName($name)
+ {
+ if (! preg_match('/^' . StandardTagFactory::REGEX_TAGNAME . '$/u', $name)) {
+ throw new \InvalidArgumentException(
+ 'The tag name "' . $name . '" is not wellformed. Tags may only consist of letters, underscores, '
+ . 'hyphens and backslashes.'
+ );
+ }
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php
new file mode 100644
index 0000000..9c0e367
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Link.php
@@ -0,0 +1,77 @@
+
+ * @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\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a @link tag in a Docblock.
+ */
+final class Link extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'link';
+
+ /** @var string */
+ private $link = '';
+
+ /**
+ * Initializes a link to a URL.
+ *
+ * @param string $link
+ * @param Description $description
+ */
+ public function __construct($link, Description $description = null)
+ {
+ Assert::string($link);
+
+ $this->link = $link;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::string($body);
+ Assert::notNull($descriptionFactory);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+ $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null;
+
+ return new static($parts[0], $description);
+ }
+
+ /**
+ * Gets the link
+ *
+ * @return string
+ */
+ public function getLink()
+ {
+ return $this->link;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->link . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php
new file mode 100644
index 0000000..72dd1a0
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Method.php
@@ -0,0 +1,220 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\Types\Void_;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for an {@}method in a Docblock.
+ */
+final class Method extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'method';
+
+ /** @var string */
+ private $methodName = '';
+
+ /** @var string[] */
+ private $arguments = [];
+
+ /** @var bool */
+ private $isStatic = false;
+
+ /** @var Type */
+ private $returnType;
+
+ public function __construct(
+ $methodName,
+ array $arguments = [],
+ Type $returnType = null,
+ $static = false,
+ Description $description = null
+ ) {
+ Assert::stringNotEmpty($methodName);
+ Assert::boolean($static);
+
+ if ($returnType === null) {
+ $returnType = new Void_();
+ }
+
+ $this->methodName = $methodName;
+ $this->arguments = $this->filterArguments($arguments);
+ $this->returnType = $returnType;
+ $this->isStatic = $static;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([ $typeResolver, $descriptionFactory ]);
+
+ // 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
+ # Declares a static method ONLY if type is also present
+ (?:
+ (static)
+ \s+
+ )?
+ # Return type
+ (?:
+ (
+ (?:[\w\|_\\\\]+)
+ # array notation
+ (?:\[\])*
+ )?
+ \s+
+ )?
+ # Legacy method name (not captured)
+ (?:
+ [\w_]+\(\)\s+
+ )?
+ # Method name
+ ([\w\|_\\\\]+)
+ # Arguments
+ (?:
+ \(([^\)]*)\)
+ )?
+ \s*
+ # Description
+ (.*)
+ $/sux',
+ $body,
+ $matches
+ )) {
+ return null;
+ }
+
+ list(, $static, $returnType, $methodName, $arguments, $description) = $matches;
+
+ $static = $static === 'static';
+ $returnType = $typeResolver->resolve($returnType, $context);
+ $description = $descriptionFactory->create($description, $context);
+
+ if ('' !== $arguments) {
+ $arguments = explode(',', $arguments);
+ foreach($arguments as &$argument) {
+ $argument = explode(' ', trim($argument));
+ if ($argument[0][0] === '$') {
+ $argumentName = substr($argument[0], 1);
+ $argumentType = new Void_();
+ } else {
+ $argumentType = $typeResolver->resolve($argument[0], $context);
+ $argumentName = '';
+ if (isset($argument[1])) {
+ $argumentName = substr($argument[1], 1);
+ }
+ }
+
+ $argument = [ 'name' => $argumentName, 'type' => $argumentType];
+ }
+ } else {
+ $arguments = [];
+ }
+
+ return new static($methodName, $arguments, $returnType, $static, $description);
+ }
+
+ /**
+ * Retrieves the method name.
+ *
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getArguments()
+ {
+ return $this->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;
+ }
+
+ /**
+ * @return Type
+ */
+ public function getReturnType()
+ {
+ return $this->returnType;
+ }
+
+ public function __toString()
+ {
+ $arguments = [];
+ foreach ($this->arguments as $argument) {
+ $arguments[] = $argument['type'] . ' $' . $argument['name'];
+ }
+
+ return ($this->isStatic() ? 'static ' : '')
+ . (string)$this->returnType . ' '
+ . $this->methodName
+ . '(' . implode(', ', $arguments) . ')'
+ . ($this->description ? ' ' . $this->description->render() : '');
+ }
+
+ private function filterArguments($arguments)
+ {
+ foreach ($arguments as &$argument) {
+ if (is_string($argument)) {
+ $argument = [ 'name' => $argument ];
+ }
+ if (! isset($argument['type'])) {
+ $argument['type'] = new Void_();
+ }
+ $keys = array_keys($argument);
+ if ($keys !== [ 'name', 'type' ]) {
+ throw new \InvalidArgumentException(
+ 'Arguments can only have the "name" and "type" fields, found: ' . var_export($keys, true)
+ );
+ }
+ }
+
+ return $arguments;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php
new file mode 100644
index 0000000..1a51dc0
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Param.php
@@ -0,0 +1,141 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for the {@}param tag in a Docblock.
+ */
+final class Param extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'param';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ private $variableName = '';
+
+ /** @var bool determines whether this is a variadic argument */
+ private $isVariadic = false;
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param bool $isVariadic
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, $isVariadic = false, Description $description = null)
+ {
+ Assert::string($variableName);
+ Assert::boolean($isVariadic);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->isVariadic = $isVariadic;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+ $isVariadic = false;
+
+ // 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] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ 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) === '...$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 3) === '...') {
+ $isVariadic = true;
+ $variableName = substr($variableName, 3);
+ }
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $isVariadic, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns whether this tag is variadic.
+ *
+ * @return boolean
+ */
+ public function isVariadic()
+ {
+ return $this->isVariadic;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . ($this->isVariadic() ? '...' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php
new file mode 100644
index 0000000..3c59713
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Property.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}property tag in a Docblock.
+ */
+class Property extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'property';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // 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] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ 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] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php
new file mode 100644
index 0000000..bf2b805
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyRead.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}property-read tag in a Docblock.
+ */
+class PropertyRead extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'property-read';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // 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] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ 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] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php
new file mode 100644
index 0000000..db37e0f
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/PropertyWrite.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}property-write tag in a Docblock.
+ */
+class PropertyWrite extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'property-write';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // 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] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ 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] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php
new file mode 100644
index 0000000..09a5870
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Return_.php
@@ -0,0 +1,73 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}return tag in a Docblock.
+ */
+final class Return_ extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'return';
+
+ /** @var Type */
+ private $type;
+
+ public function __construct(Type $type, Description $description = null)
+ {
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ )
+ {
+ Assert::string($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context);
+ $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context);
+
+ return new static($type, $description);
+ }
+
+ /**
+ * Returns the type section of the variable.
+ *
+ * @return Type
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ public function __toString()
+ {
+ return $this->type . ' ' . $this->description;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php
new file mode 100644
index 0000000..64ee3d8
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/See.php
@@ -0,0 +1,81 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for an {@}see tag in a Docblock.
+ */
+class See extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'see';
+
+ /** @var Fqsen */
+ protected $refers = null;
+
+ /**
+ * Initializes this tag.
+ *
+ * @param Fqsen $refers
+ * @param Description $description
+ */
+ public function __construct(Fqsen $refers, Description $description = null)
+ {
+ $this->refers = $refers;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ FqsenResolver $resolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::allNotNull([$resolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+ $description = isset($parts[1]) ? $descriptionFactory->create($parts[1], $context) : null;
+
+ return new static($resolver->resolve($parts[0], $context), $description);
+ }
+
+ /**
+ * Returns the structural element this tag refers to.
+ *
+ * @return Fqsen
+ */
+ public function getReference()
+ {
+ return $this->refers;
+ }
+
+ /**
+ * Returns a string representation of this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->refers . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php
new file mode 100644
index 0000000..3d002ed
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Since.php
@@ -0,0 +1,94 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}since tag in a Docblock.
+ */
+final class Since extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'since';
+
+ /**
+ * 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. */
+ private $version = '';
+
+ public function __construct($version = null, Description $description = null)
+ {
+ Assert::nullOrStringNotEmpty($version);
+
+ $this->version = $version;
+ $this->description = $description;
+ }
+
+ /**
+ * @return static
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::nullOrString($body);
+ if (empty($body)) {
+ return new static();
+ }
+
+ $matches = [];
+ if (! preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) {
+ return null;
+ }
+
+ return new static(
+ $matches[1],
+ $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context)
+ );
+ }
+
+ /**
+ * Gets the version section of the tag.
+ *
+ * @return string
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->version . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php
new file mode 100644
index 0000000..b0646b9
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Source.php
@@ -0,0 +1,96 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}source tag in a Docblock.
+ */
+final class Source extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'source';
+
+ /** @var int The starting line, relative to the structural element's location. */
+ private $startingLine = 1;
+
+ /** @var int|null The number of lines, relative to the starting line. NULL means "to the end". */
+ private $lineCount = null;
+
+ public function __construct($startingLine, $lineCount = null, Description $description = null)
+ {
+ Assert::integerish($startingLine);
+ Assert::nullOrIntegerish($lineCount);
+
+ $this->startingLine = (int)$startingLine;
+ $this->lineCount = $lineCount !== null ? (int)$lineCount : null;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::stringNotEmpty($body);
+ Assert::notNull($descriptionFactory);
+
+ $startingLine = 1;
+ $lineCount = null;
+ $description = null;
+
+ // Starting line / Number of lines / Description
+ if (preg_match('/^([1-9]\d*)\s*(?:((?1))\s+)?(.*)$/sux', $body, $matches)) {
+ $startingLine = (int)$matches[1];
+ if (isset($matches[2]) && $matches[2] !== '') {
+ $lineCount = (int)$matches[2];
+ }
+ $description = $matches[3];
+ }
+
+ return new static($startingLine, $lineCount, $descriptionFactory->create($description, $context));
+ }
+
+ /**
+ * Gets the starting line.
+ *
+ * @return int The starting line, relative to the structural element's
+ * location.
+ */
+ public function getStartingLine()
+ {
+ return $this->startingLine;
+ }
+
+ /**
+ * 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;
+ }
+
+ public function __toString()
+ {
+ return $this->startingLine
+ . ($this->lineCount !== null ? ' ' . $this->lineCount : '')
+ . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php
new file mode 100644
index 0000000..349e773
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Throws.php
@@ -0,0 +1,72 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}throws tag in a Docblock.
+ */
+final class Throws extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'throws';
+
+ /** @var Type */
+ private $type;
+
+ public function __construct(Type $type, Description $description = null)
+ {
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ $type = $typeResolver->resolve(isset($parts[0]) ? $parts[0] : '', $context);
+ $description = $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context);
+
+ return new static($type, $description);
+ }
+
+ /**
+ * Returns the type section of the variable.
+ *
+ * @return Type
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ public function __toString()
+ {
+ return $this->type . ' ' . $this->description;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php
new file mode 100644
index 0000000..00dc3e3
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Uses.php
@@ -0,0 +1,83 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}uses tag in a Docblock.
+ */
+final class Uses extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'uses';
+
+ /** @var Fqsen */
+ protected $refers = null;
+
+ /**
+ * Initializes this tag.
+ *
+ * @param Fqsen $refers
+ * @param Description $description
+ */
+ public function __construct(Fqsen $refers, Description $description = null)
+ {
+ $this->refers = $refers;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ FqsenResolver $resolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::string($body);
+ Assert::allNotNull([$resolver, $descriptionFactory]);
+
+ $parts = preg_split('/\s+/Su', $body, 2);
+
+ return new static(
+ $resolver->resolve($parts[0], $context),
+ $descriptionFactory->create(isset($parts[1]) ? $parts[1] : '', $context)
+ );
+ }
+
+ /**
+ * Returns the structural element this tag refers to.
+ *
+ * @return Fqsen
+ */
+ public function getReference()
+ {
+ return $this->refers;
+ }
+
+ /**
+ * Returns a string representation of this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->refers . ' ' . $this->description->render();
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php
new file mode 100644
index 0000000..e23c694
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Var_.php
@@ -0,0 +1,118 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Type;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}var tag in a Docblock.
+ */
+class Var_ extends BaseTag implements Factory\StaticMethod
+{
+ /** @var string */
+ protected $name = 'var';
+
+ /** @var Type */
+ private $type;
+
+ /** @var string */
+ protected $variableName = '';
+
+ /**
+ * @param string $variableName
+ * @param Type $type
+ * @param Description $description
+ */
+ public function __construct($variableName, Type $type = null, Description $description = null)
+ {
+ Assert::string($variableName);
+
+ $this->variableName = $variableName;
+ $this->type = $type;
+ $this->description = $description;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public static function create(
+ $body,
+ TypeResolver $typeResolver = null,
+ DescriptionFactory $descriptionFactory = null,
+ TypeContext $context = null
+ ) {
+ Assert::stringNotEmpty($body);
+ Assert::allNotNull([$typeResolver, $descriptionFactory]);
+
+ $parts = preg_split('/(\s+)/Su', $body, 3, PREG_SPLIT_DELIM_CAPTURE);
+ $type = null;
+ $variableName = '';
+
+ // 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] !== '$')) {
+ $type = $typeResolver->resolve(array_shift($parts), $context);
+ 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] == '$')) {
+ $variableName = array_shift($parts);
+ array_shift($parts);
+
+ if (substr($variableName, 0, 1) === '$') {
+ $variableName = substr($variableName, 1);
+ }
+ }
+
+ $description = $descriptionFactory->create(implode('', $parts), $context);
+
+ return new static($variableName, $type, $description);
+ }
+
+ /**
+ * Returns the variable's name.
+ *
+ * @return string
+ */
+ public function getVariableName()
+ {
+ return $this->variableName;
+ }
+
+ /**
+ * Returns the variable's type or null if unknown.
+ *
+ * @return Type|null
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return ($this->type ? $this->type . ' ' : '')
+ . '$' . $this->variableName
+ . ($this->description ? ' ' . $this->description : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.php
new file mode 100644
index 0000000..3e0e5be
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlock/Tags/Version.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\Tags;
+
+use phpDocumentor\Reflection\Types\Context as TypeContext;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use Webmozart\Assert\Assert;
+
+/**
+ * Reflection class for a {@}version tag in a Docblock.
+ */
+final class Version extends BaseTag implements Factory\StaticMethod
+{
+ protected $name = 'version';
+
+ /**
+ * 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. */
+ private $version = '';
+
+ public function __construct($version = null, Description $description = null)
+ {
+ Assert::nullOrStringNotEmpty($version);
+
+ $this->version = $version;
+ $this->description = $description;
+ }
+
+ /**
+ * @return static
+ */
+ public static function create($body, DescriptionFactory $descriptionFactory = null, TypeContext $context = null)
+ {
+ Assert::nullOrString($body);
+ if (empty($body)) {
+ return new static();
+ }
+
+ $matches = [];
+ if (!preg_match('/^(' . self::REGEX_VECTOR . ')\s*(.+)?$/sux', $body, $matches)) {
+ return null;
+ }
+
+ return new static(
+ $matches[1],
+ $descriptionFactory->create(isset($matches[2]) ? $matches[2] : '', $context)
+ );
+ }
+
+ /**
+ * Gets the version section of the tag.
+ *
+ * @return string
+ */
+ public function getVersion()
+ {
+ return $this->version;
+ }
+
+ /**
+ * Returns a string representation for this tag.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->version . ($this->description ? ' ' . $this->description->render() : '');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php
new file mode 100644
index 0000000..9ec2455
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactory.php
@@ -0,0 +1,277 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\TagFactory;
+use Webmozart\Assert\Assert;
+
+final class DocBlockFactory implements DocBlockFactoryInterface
+{
+ /** @var DocBlock\DescriptionFactory */
+ private $descriptionFactory;
+
+ /** @var DocBlock\TagFactory */
+ private $tagFactory;
+
+ /**
+ * Initializes this factory with the required subcontractors.
+ *
+ * @param DescriptionFactory $descriptionFactory
+ * @param TagFactory $tagFactory
+ */
+ public function __construct(DescriptionFactory $descriptionFactory, TagFactory $tagFactory)
+ {
+ $this->descriptionFactory = $descriptionFactory;
+ $this->tagFactory = $tagFactory;
+ }
+
+ /**
+ * Factory method for easy instantiation.
+ *
+ * @param string[] $additionalTags
+ *
+ * @return DocBlockFactory
+ */
+ public static function createInstance(array $additionalTags = [])
+ {
+ $fqsenResolver = new FqsenResolver();
+ $tagFactory = new StandardTagFactory($fqsenResolver);
+ $descriptionFactory = new DescriptionFactory($tagFactory);
+
+ $tagFactory->addService($descriptionFactory);
+ $tagFactory->addService(new TypeResolver($fqsenResolver));
+
+ $docBlockFactory = new self($descriptionFactory, $tagFactory);
+ foreach ($additionalTags as $tagName => $tagHandler) {
+ $docBlockFactory->registerTagHandler($tagName, $tagHandler);
+ }
+
+ return $docBlockFactory;
+ }
+
+ /**
+ * @param object|string $docblock A string containing the DocBlock to parse or an object supporting the
+ * getDocComment method (such as a ReflectionClass object).
+ * @param Types\Context $context
+ * @param Location $location
+ *
+ * @return DocBlock
+ */
+ public function create($docblock, Types\Context $context = null, Location $location = null)
+ {
+ if (is_object($docblock)) {
+ if (!method_exists($docblock, 'getDocComment')) {
+ $exceptionMessage = 'Invalid object passed; the given object must support the getDocComment method';
+ throw new \InvalidArgumentException($exceptionMessage);
+ }
+
+ $docblock = $docblock->getDocComment();
+ }
+
+ Assert::stringNotEmpty($docblock);
+
+ if ($context === null) {
+ $context = new Types\Context('');
+ }
+
+ $parts = $this->splitDocBlock($this->stripDocComment($docblock));
+ list($templateMarker, $summary, $description, $tags) = $parts;
+
+ return new DocBlock(
+ $summary,
+ $description ? $this->descriptionFactory->create($description, $context) : null,
+ array_filter($this->parseTagBlock($tags, $context), function($tag) {
+ return $tag instanceof Tag;
+ }),
+ $context,
+ $location,
+ $templateMarker === '#@+',
+ $templateMarker === '#@-'
+ );
+ }
+
+ public function registerTagHandler($tagName, $handler)
+ {
+ $this->tagFactory->registerTagHandler($tagName, $handler);
+ }
+
+ /**
+ * Strips the asterisks from the DocBlock comment.
+ *
+ * @param string $comment String containing the comment text.
+ *
+ * @return string
+ */
+ private function stripDocComment($comment)
+ {
+ $comment = trim(preg_replace('#[ \t]*(?:\/\*\*|\*\/|\*)?[ \t]{0,1}(.*)?#u', '$1', $comment));
+
+ // reg ex above is not able to remove */ from a single line docblock
+ if (substr($comment, -2) == '*/') {
+ $comment = trim(substr($comment, 0, -2));
+ }
+
+ return str_replace(array("\r\n", "\r"), "\n", $comment);
+ }
+
+ /**
+ * Splits the DocBlock into a template marker, summary, description and block of tags.
+ *
+ * @param string $comment Comment to split into the sub-parts.
+ *
+ * @author Richard van Velzen (@_richardJ) Special thanks to Richard for the regex responsible for the split.
+ * @author Mike van Riel for extending the regex with template marker support.
+ *
+ * @return string[] containing the template marker (if any), summary, description and a string containing the tags.
+ */
+ private function splitDocBlock($comment)
+ {
+ // Performance improvement cheat: if the first character is an @ then only tags are in this DocBlock. This
+ // method does not split tags so we return this verbatim as the fourth result (tags). This saves us the
+ // performance impact of running a regular expression
+ if (strpos($comment, '@') === 0) {
+ return array('', '', '', $comment);
+ }
+
+ // clears all extra horizontal whitespace from the line endings to prevent parsing issues
+ $comment = preg_replace('/\h*$/Sum', '', $comment);
+
+ /*
+ * Splits the docblock into a template marker, summary, description and tags section.
+ *
+ * - The template marker is empty, #@+ or #@- if the DocBlock starts with either of those (a newline may
+ * occur after it and will be stripped).
+ * - The short description is started from the first character until a dot is encountered followed by a
+ * newline OR two consecutive newlines (horizontal whitespace is taken into account to consider spacing
+ * errors). This is optional.
+ * - The long description, any character until a new line is encountered followed by an @ and word
+ * characters (a tag). This is optional.
+ * - Tags; the remaining characters
+ *
+ * Big thanks to RichardJ for contributing this Regular Expression
+ */
+ preg_match(
+ '/
+ \A
+ # 1. Extract the template marker
+ (?:(\#\@\+|\#\@\-)\n?)?
+
+ # 2. Extract the summary
+ (?:
+ (?! @\pL ) # The summary may not start with an @
+ (
+ [^\n.]+
+ (?:
+ (?! \. \n | \n{2} ) # End summary upon a dot followed by newline or two newlines
+ [\n.] (?! [ \t]* @\pL ) # End summary when an @ is found as first character on a new line
+ [^\n.]+ # Include anything else
+ )*
+ \.?
+ )?
+ )
+
+ # 3. Extract the description
+ (?:
+ \s* # Some form of whitespace _must_ precede a description because a summary must be there
+ (?! @\pL ) # The description may not start with an @
+ (
+ [^\n]+
+ (?: \n+
+ (?! [ \t]* @\pL ) # End description when an @ is found as first character on a new line
+ [^\n]+ # Include anything else
+ )*
+ )
+ )?
+
+ # 4. Extract the tags (anything that follows)
+ (\s+ [\s\S]*)? # everything that follows
+ /ux',
+ $comment,
+ $matches
+ );
+ array_shift($matches);
+
+ while (count($matches) < 4) {
+ $matches[] = '';
+ }
+
+ return $matches;
+ }
+
+ /**
+ * Creates the tag objects.
+ *
+ * @param string $tags Tag block to parse.
+ * @param Types\Context $context Context of the parsed Tag
+ *
+ * @return DocBlock\Tag[]
+ */
+ private function parseTagBlock($tags, Types\Context $context)
+ {
+ $tags = $this->filterTagBlock($tags);
+ if (!$tags) {
+ return [];
+ }
+
+ $result = $this->splitTagBlockIntoTagLines($tags);
+ foreach ($result as $key => $tagLine) {
+ $result[$key] = $this->tagFactory->create(trim($tagLine), $context);
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param string $tags
+ *
+ * @return string[]
+ */
+ private function splitTagBlockIntoTagLines($tags)
+ {
+ $result = array();
+ foreach (explode("\n", $tags) as $tag_line) {
+ if (isset($tag_line[0]) && ($tag_line[0] === '@')) {
+ $result[] = $tag_line;
+ } else {
+ $result[count($result) - 1] .= "\n" . $tag_line;
+ }
+ }
+
+ return $result;
+ }
+
+ /**
+ * @param $tags
+ * @return string
+ */
+ private function filterTagBlock($tags)
+ {
+ $tags = trim($tags);
+ if (!$tags) {
+ return null;
+ }
+
+ if ('@' !== $tags[0]) {
+ // @codeCoverageIgnoreStart
+ // Can't simulate this; this only happens if there is an error with the parsing of the DocBlock that
+ // we didn't foresee.
+ throw new \LogicException('A tag block started with text instead of an at-sign(@): ' . $tags);
+ // @codeCoverageIgnoreEnd
+ }
+
+ return $tags;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php
new file mode 100644
index 0000000..b353342
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/src/DocBlockFactoryInterface.php
@@ -0,0 +1,23 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+
+/**
+ * @coversNothing
+ */
+class InterpretingDocBlocksTest extends \PHPUnit_Framework_TestCase
+{
+ public function testInterpretingASimpleDocBlock()
+ {
+ /**
+ * @var DocBlock $docblock
+ * @var string $summary
+ * @var Description $description
+ */
+ include(__DIR__ . '/../../examples/01-interpreting-a-simple-docblock.php');
+
+ $descriptionText = <<assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is an example of a summary.', $summary);
+ $this->assertInstanceOf(Description::class, $description);
+ $this->assertSame($descriptionText, $description->render());
+ $this->assertEmpty($docblock->getTags());
+ }
+
+ public function testInterpretingTags()
+ {
+ /**
+ * @var DocBlock $docblock
+ * @var boolean $hasSeeTag
+ * @var Tag[] $tags
+ * @var See[] $seeTags
+ */
+ include(__DIR__ . '/../../examples/02-interpreting-tags.php');
+
+ $this->assertTrue($hasSeeTag);
+ $this->assertCount(1, $tags);
+ $this->assertCount(1, $seeTags);
+
+ $this->assertInstanceOf(See::class, $tags[0]);
+ $this->assertInstanceOf(See::class, $seeTags[0]);
+
+ $seeTag = $seeTags[0];
+ $this->assertSame('\\' . StandardTagFactory::class, (string)$seeTag->getReference());
+ $this->assertSame('', (string)$seeTag->getDescription());
+ }
+
+ public function testDescriptionsCanEscapeAtSignsAndClosingBraces()
+ {
+ /**
+ * @var string $docComment
+ * @var DocBlock $docblock
+ * @var Description $description
+ * @var string $receivedDocComment
+ * @var string $foundDescription
+ */
+
+ include(__DIR__ . '/../../examples/playing-with-descriptions/02-escaping.php');
+ $this->assertSame(<<<'DESCRIPTION'
+You can escape the @-sign by surrounding it with braces, for example: @. And escape a closing brace within an
+inline tag by adding an opening brace in front of it like this: }.
+
+Here are example texts where you can see how they could be used in a real life situation:
+
+ This is a text with an {@internal inline tag where a closing brace (}) is shown}.
+ Or an {@internal inline tag with a literal {@link} in it}.
+
+Do note that an {@internal inline tag that has an opening brace ({) does not break out}.
+DESCRIPTION
+ ,
+ $foundDescription
+ )
+ ;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php
new file mode 100644
index 0000000..92ac22e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/integration/ReconstitutingADocBlockTest.php
@@ -0,0 +1,35 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+
+/**
+ * @coversNothing
+ */
+class ReconstitutingADocBlockTest extends \PHPUnit_Framework_TestCase
+{
+ public function testReconstituteADocBlock()
+ {
+ /**
+ * @var string $docComment
+ * @var string $reconstitutedDocComment
+ */
+ include(__DIR__ . '/../../examples/03-reconstituting-a-docblock.php');
+
+ $this->assertSame($docComment, $reconstitutedDocComment);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php
new file mode 100644
index 0000000..984811b
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/integration/UsingTagsTest.php
@@ -0,0 +1,39 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\StandardTagFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+
+/**
+ * @coversNothing
+ */
+class UsingTagsTest extends \PHPUnit_Framework_TestCase
+{
+ public function testAddingYourOwnTagUsingAStaticMethodAsFactory()
+ {
+ /**
+ * @var object[] $customTagObjects
+ * @var string $docComment
+ * @var string $reconstitutedDocComment
+ */
+ include(__DIR__ . '/../../examples/04-adding-your-own-tag.php');
+
+ $this->assertInstanceOf(\MyTag::class, $customTagObjects[0]);
+ $this->assertSame('my-tag', $customTagObjects[0]->getName());
+ $this->assertSame('I have a description', (string)$customTagObjects[0]->getDescription());
+ $this->assertSame($docComment, $reconstitutedDocComment);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php
new file mode 100644
index 0000000..d3043f9
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionFactoryTest.php
@@ -0,0 +1,174 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Tags\Link;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @covers ::
+ */
+class DescriptionFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @dataProvider provideSimpleExampleDescriptions
+ */
+ public function testDescriptionCanParseASimpleString($contents)
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->never();
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, new Context(''));
+
+ $this->assertSame($contents, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @dataProvider provideEscapeSequences
+ */
+ public function testEscapeSequences($contents, $expected)
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->never();
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, new Context(''));
+
+ $this->assertSame($expected, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Link
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testDescriptionCanParseAStringWithInlineTag()
+ {
+ $contents = 'This is text for a {@link http://phpdoc.org/ description} that uses an inline tag.';
+ $context = new Context('');
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')
+ ->once()
+ ->with('@link http://phpdoc.org/ description', $context)
+ ->andReturn(new Link('http://phpdoc.org/', new Description('description')))
+ ;
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, $context);
+
+ $this->assertSame($contents, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Link
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testDescriptionCanParseAStringStartingWithInlineTag()
+ {
+ $contents = '{@link http://phpdoc.org/ This} is text for a description that starts with an inline tag.';
+ $context = new Context('');
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')
+ ->once()
+ ->with('@link http://phpdoc.org/ This', $context)
+ ->andReturn(new Link('http://phpdoc.org/', new Description('This')))
+ ;
+
+ $factory = new DescriptionFactory($tagFactory);
+ $description = $factory->create($contents, $context);
+
+ $this->assertSame($contents, $description->render());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testIfSuperfluousStartingSpacesAreRemoved()
+ {
+ $factory = new DescriptionFactory(m::mock(TagFactory::class));
+ $descriptionText = <<create($descriptionText, new Context(''));
+
+ $this->assertSame($expectedDescription, $description->render());
+ }
+
+ /**
+ * Provides a series of example strings that the parser should correctly interpret and return.
+ *
+ * @return string[][]
+ */
+ public function provideSimpleExampleDescriptions()
+ {
+ return [
+ ['This is text for a description.'],
+ ['This is text for a description containing { that is literal.'],
+ ['This is text for a description containing } that is literal.'],
+ ['This is text for a description with {just a text} that is not a tag.'],
+ ];
+ }
+
+ public function provideEscapeSequences()
+ {
+ return [
+ ['This is text for a description with a {@}.', 'This is text for a description with a @.'],
+ ['This is text for a description with a {}.', 'This is text for a description with a }.'],
+ ];
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php
new file mode 100644
index 0000000..b5917a9
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/DescriptionTest.php
@@ -0,0 +1,75 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Description
+ */
+class DescriptionTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::render
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ */
+ public function testDescriptionCanRenderUsingABodyWithPlaceholdersAndTags()
+ {
+ $body = 'This is a %1$s body.';
+ $expected = 'This is a {@internal significant } body.';
+ $tags = [new Generic('internal', new Description('significant '))];
+
+ $fixture = new Description($body, $tags);
+
+ // without formatter (thus the PassthroughFormatter by default)
+ $this->assertSame($expected, $fixture->render());
+
+ // with a custom formatter
+ $formatter = m::mock(PassthroughFormatter::class);
+ $formatter->shouldReceive('format')->with($tags[0])->andReturn('@internal significant ');
+ $this->assertSame($expected, $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::render
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ */
+ public function testDescriptionCanBeCastToString()
+ {
+ $body = 'This is a %1$s body.';
+ $expected = 'This is a {@internal significant } body.';
+ $tags = [new Generic('internal', new Description('significant '))];
+
+ $fixture = new Description($body, $tags);
+
+ $this->assertSame($expected, (string)$fixture);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testBodyTemplateMustBeAString()
+ {
+ new Description([]);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php
new file mode 100644
index 0000000..cb2b400
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/SerializerTest.php
@@ -0,0 +1,201 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Serializer
+ * @covers ::
+ */
+class SerializerTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testReconstructsADocCommentFromADocBlock()
+ {
+ $expected = <<<'DOCCOMMENT'
+/**
+ * This is a summary
+ *
+ * This is a description
+ *
+ * @unknown-tag Test description for the unknown tag
+ */
+DOCCOMMENT;
+
+ $fixture = new Serializer();
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testAddPrefixToDocBlock()
+ {
+ $expected = <<<'DOCCOMMENT'
+aa/**
+aa * This is a summary
+aa *
+aa * This is a description
+aa *
+aa * @unknown-tag Test description for the unknown tag
+aa */
+DOCCOMMENT;
+
+ $fixture = new Serializer(2, 'a');
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testAddPrefixToDocBlockExceptFirstLine()
+ {
+ $expected = <<<'DOCCOMMENT'
+/**
+aa * This is a summary
+aa *
+aa * This is a description
+aa *
+aa * @unknown-tag Test description for the unknown tag
+aa */
+DOCCOMMENT;
+
+ $fixture = new Serializer(2, 'a', false);
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDocComment
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses phpDocumentor\Reflection\DocBlock
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testWordwrapsAroundTheGivenAmountOfCharacters()
+ {
+ $expected = <<<'DOCCOMMENT'
+/**
+ * This is a
+ * summary
+ *
+ * This is a
+ * description
+ *
+ * @unknown-tag
+ * Test
+ * description
+ * for the
+ * unknown tag
+ */
+DOCCOMMENT;
+
+ $fixture = new Serializer(0, '', true, 15);
+
+ $docBlock = new DocBlock(
+ 'This is a summary',
+ new Description('This is a description'),
+ [
+ new DocBlock\Tags\Generic('unknown-tag', new Description('Test description for the unknown tag'))
+ ]
+ );
+
+ $this->assertSame($expected, $fixture->getDocComment($docBlock));
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfIndentIsNotAnInteger()
+ {
+ new Serializer([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfIndentStringIsNotAString()
+ {
+ new Serializer(0, []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfIndentFirstLineIsNotABoolean()
+ {
+ new Serializer(0, '', []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfLineLengthIsNotNullNorAnInteger()
+ {
+ new Serializer(0, '', false, []);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php
new file mode 100644
index 0000000..0247da0
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/StandardTagFactoryTest.php
@@ -0,0 +1,361 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Tags\Author;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+use phpDocumentor\Reflection\DocBlock\Tags\Return_;
+use phpDocumentor\Reflection\DocBlock\Tags\See;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\DocBlock\StandardTagFactory
+ * @covers ::
+ */
+class StandardTagFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreatingAGenericTag()
+ {
+ $expectedTagName = 'unknown-tag';
+ $expectedDescriptionText = 'This is a description';
+ $expectedDescription = new Description($expectedDescriptionText);
+ $context = new Context('');
+
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory
+ ->shouldReceive('create')
+ ->once()
+ ->with($expectedDescriptionText, $context)
+ ->andReturn($expectedDescription)
+ ;
+
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+ $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
+
+ /** @var Generic $tag */
+ $tag = $tagFactory->create('@' . $expectedTagName . ' This is a description', $context);
+
+ $this->assertInstanceOf(Generic::class, $tag);
+ $this->assertSame($expectedTagName, $tag->getName());
+ $this->assertSame($expectedDescription, $tag->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ */
+ public function testCreatingASpecificTag()
+ {
+ $context = new Context('');
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+
+ /** @var Author $tag */
+ $tag = $tagFactory->create('@author Mike van Riel ', $context);
+
+ $this->assertInstanceOf(Author::class, $tag);
+ $this->assertSame('author', $tag->getName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\See
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ */
+ public function testAnEmptyContextIsCreatedIfNoneIsProvided()
+ {
+ $fqsen = '\Tag';
+ $resolver = m::mock(FqsenResolver::class)
+ ->shouldReceive('resolve')
+ ->with('Tag', m::type(Context::class))
+ ->andReturn(new Fqsen($fqsen))
+ ->getMock()
+ ;
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldIgnoreMissing();
+
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
+
+ /** @var See $tag */
+ $tag = $tagFactory->create('@see Tag');
+
+ $this->assertInstanceOf(See::class, $tag);
+ $this->assertSame($fqsen, (string)$tag->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ */
+ public function testPassingYourOwnSetOfTagHandlers()
+ {
+ $context = new Context('');
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class), ['user' => Author::class]);
+
+ /** @var Author $tag */
+ $tag = $tagFactory->create('@user Mike van Riel ', $context);
+
+ $this->assertInstanceOf(Author::class, $tag);
+ $this->assertSame('author', $tag->getName());
+ }
+
+ /**
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ * @expectedExceptionMessage The tag "@user/myuser" does not seem to be wellformed, please check it for errors
+ */
+ public function testExceptionIsThrownIfProvidedTagIsNotWellformed()
+ {
+ $this->markTestIncomplete(
+ 'For some reason this test fails; once I have access to a RegEx analyzer I will have to test the regex'
+ )
+ ;
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+ $tagFactory->create('@user[myuser');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addParameter
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ */
+ public function testAddParameterToServiceLocator()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addParameter('myParam', 'myValue');
+
+ $this->assertAttributeSame(
+ [FqsenResolver::class => $resolver, 'myParam' => 'myValue'],
+ 'serviceLocator',
+ $tagFactory
+ )
+ ;
+ }
+
+ /**
+ * @covers ::addService
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ */
+ public function testAddServiceToServiceLocator()
+ {
+ $service = new PassthroughFormatter();
+
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addService($service);
+
+ $this->assertAttributeSame(
+ [FqsenResolver::class => $resolver, PassthroughFormatter::class => $service],
+ 'serviceLocator',
+ $tagFactory
+ )
+ ;
+ }
+
+ /**
+ * @covers ::addService
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ */
+ public function testInjectConcreteServiceForInterfaceToServiceLocator()
+ {
+ $interfaceName = Formatter::class;
+ $service = new PassthroughFormatter();
+
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+ $tagFactory->addService($service, $interfaceName);
+
+ $this->assertAttributeSame(
+ [FqsenResolver::class => $resolver, $interfaceName => $service],
+ 'serviceLocator',
+ $tagFactory
+ )
+ ;
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::create
+ * @uses phpDocumentor\Reflection\DocBlock\Tags\Author
+ */
+ public function testRegisteringAHandlerForANewTag()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', Author::class);
+
+ // Assert by trying to create one
+ $tag = $tagFactory->create('@my-tag Mike van Riel ');
+ $this->assertInstanceOf(Author::class, $tag);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedTagNameIsNotAString()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler([], Author::class);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedTagNameIsEmpty()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('', Author::class);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedTagNameIsNamespaceButNotFullyQualified()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('Name\Spaced\Tag', Author::class);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAString()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', []);
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerIsEmpty()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', '');
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerIsNotAnExistingClassName()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', 'IDoNotExist');
+ }
+
+ /**
+ * @covers ::registerTagHandler
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @expectedException \InvalidArgumentException
+ */
+ public function testHandlerRegistrationFailsIfProvidedHandlerDoesNotImplementTheTagInterface()
+ {
+ $resolver = m::mock(FqsenResolver::class);
+ $tagFactory = new StandardTagFactory($resolver);
+
+ $tagFactory->registerTagHandler('my-tag', 'stdClass');
+ }
+
+ /**
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\StandardTagFactory::addService
+ * @uses phpDocumentor\Reflection\Docblock\Description
+ * @uses phpDocumentor\Reflection\Docblock\Tags\Return_
+ * @uses phpDocumentor\Reflection\Docblock\Tags\BaseTag
+ */
+ public function testReturntagIsMappedCorrectly()
+ {
+ $context = new Context('');
+
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory
+ ->shouldReceive('create')
+ ->once()
+ ->with('', $context)
+ ->andReturn(new Description(''))
+ ;
+
+ $typeResolver = new TypeResolver();
+
+ $tagFactory = new StandardTagFactory(m::mock(FqsenResolver::class));
+ $tagFactory->addService($descriptionFactory, DescriptionFactory::class);
+ $tagFactory->addService($typeResolver, TypeResolver::class);
+
+
+ /** @var Return_ $tag */
+ $tag = $tagFactory->create('@return mixed', $context);
+
+ $this->assertInstanceOf(Return_::class, $tag);
+ $this->assertSame('return', $tag->getName());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php
new file mode 100644
index 0000000..a54954f
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/AuthorTest.php
@@ -0,0 +1,148 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Author
+ * @covers ::
+ */
+class AuthorTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $this->assertSame('author', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $this->assertSame('@author Mike van Riel', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getAuthorName
+ */
+ public function testHasTheAuthorName()
+ {
+ $expected = 'Mike van Riel';
+
+ $fixture = new Author($expected, 'mike@phpdoc.org');
+
+ $this->assertSame($expected, $fixture->getAuthorName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getAuthorName
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfAuthorNameIsNotAString()
+ {
+ new Author([], 'mike@phpdoc.org');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getEmail
+ */
+ public function testHasTheAuthorMailAddress()
+ {
+ $expected = 'mike@phpdoc.org';
+
+ $fixture = new Author('Mike van Riel', $expected);
+
+ $this->assertSame($expected, $fixture->getEmail());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfEmailIsNotAString()
+ {
+ new Author('Mike van Riel', []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testInitializationFailsIfEmailIsNotValid()
+ {
+ new Author('Mike van Riel', 'mike');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Author('Mike van Riel', 'mike@phpdoc.org');
+
+ $this->assertSame('Mike van Riel', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::
+ */
+ public function testFactoryMethod()
+ {
+ $fixture = Author::create('Mike van Riel ');
+
+ $this->assertSame('Mike van Riel', (string)$fixture);
+ $this->assertSame('Mike van Riel', $fixture->getAuthorName());
+ $this->assertSame('mike@phpdoc.org', $fixture->getEmail());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Author::
+ */
+ public function testFactoryMethodReturnsNullIfItCouldNotReadBody()
+ {
+ $this->assertNull(Author::create('dfgr<'));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php
new file mode 100644
index 0000000..a2b5e4b
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/CoversTest.php
@@ -0,0 +1,155 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Covers
+ * @covers ::
+ */
+class CoversTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('covers', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('@covers \DateTime Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReference
+ */
+ public function testHasReferenceToFqsen()
+ {
+ $expected = new Fqsen('\DateTime');
+
+ $fixture = new Covers($expected);
+
+ $this->assertSame($expected, $fixture->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Covers(new Fqsen('\DateTime'), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Covers(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('\DateTime Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Covers::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\FqsenResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = m::mock(FqsenResolver::class);
+ $context = new Context('');
+
+ $fqsen = new Fqsen('\DateTime');
+ $description = new Description('My Description');
+
+ $descriptionFactory
+ ->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+ $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
+
+ $fixture = Covers::create('DateTime My Description', $descriptionFactory, $resolver, $context);
+
+ $this->assertSame('\DateTime My Description', (string)$fixture);
+ $this->assertSame($fqsen, $fixture->getReference());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Covers::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Covers::create(''));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php
new file mode 100644
index 0000000..eca9664
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/DeprecatedTest.php
@@ -0,0 +1,166 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Deprecated
+ * @covers ::
+ */
+class DeprecatedTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $this->assertSame('deprecated', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $this->assertSame('@deprecated 1.0 Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVersion
+ */
+ public function testHasVersionNumber()
+ {
+ $expected = '1.0';
+
+ $fixture = new Deprecated($expected);
+
+ $this->assertSame($expected, $fixture->getVersion());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Deprecated('1.0', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Deprecated('1.0', new Description('Description'));
+
+ $this->assertSame('1.0 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $version = '1.0';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Deprecated::create('1.0 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1.0 My Description', (string)$fixture);
+ $this->assertSame($version, $fixture->getVersion());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Deprecated::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptyDeprecatedTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Deprecated::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame(null, $fixture->getVersion());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfVersionIsNotString()
+ {
+ $this->assertNull(Deprecated::create([]));
+ }
+
+ /**
+ * @covers ::create
+ */
+ public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
+ {
+ $this->assertNull(Deprecated::create('dkhf<'));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php
new file mode 100644
index 0000000..045a197
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/Formatter/PassthroughFormatterTest.php
@@ -0,0 +1,41 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags\Formatter;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\Tags\Generic;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ */
+class PassthroughFormatterTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::format
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ */
+ public function testFormatterCallsToStringAndReturnsAStandardRepresentation()
+ {
+ $expected = '@unknown-tag This is a description';
+
+ $fixture = new PassthroughFormatter();
+
+ $this->assertSame(
+ $expected,
+ $fixture->format(new Generic('unknown-tag', new Description('This is a description')))
+ );
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php
new file mode 100644
index 0000000..02fa530
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/GenericTest.php
@@ -0,0 +1,146 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @generic http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Generic
+ * @covers ::
+ */
+class GenericTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $this->assertSame('generic', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $this->assertSame('@generic Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Generic('generic', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Generic('generic', new Description('Description'));
+
+ $this->assertSame('Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Generic::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $generics = 'generic';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Generic::create('My Description', 'generic', $descriptionFactory, $context);
+
+ $this->assertSame('My Description', (string)$fixture);
+ $this->assertSame($generics, $fixture->getName());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfNameIsNotString()
+ {
+ Generic::create('', []);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfNameIsNotEmpty()
+ {
+ Generic::create('', '');
+ }
+
+ /**
+ * @covers ::create
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfNameContainsIllegalCharacters()
+ {
+ Generic::create('', 'name/myname');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php
new file mode 100644
index 0000000..9940aec
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/LinkTest.php
@@ -0,0 +1,158 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Link
+ * @covers ::
+ */
+class LinkTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $this->assertSame('link', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $this->assertSame('@link http://this.is.my/link Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getLink
+ */
+ public function testHasLinkUrl()
+ {
+ $expected = 'http://this.is.my/link';
+
+ $fixture = new Link($expected);
+
+ $this->assertSame($expected, $fixture->getLink());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Link('http://this.is.my/link', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Link('http://this.is.my/link', new Description('Description'));
+
+ $this->assertSame('http://this.is.my/link Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $links = 'http://this.is.my/link';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Link::create('http://this.is.my/link My Description', $descriptionFactory, $context);
+
+ $this->assertSame('http://this.is.my/link My Description', (string)$fixture);
+ $this->assertSame($links, $fixture->getLink());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Link::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptyLinkTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Link::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame('', $fixture->getLink());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfVersionIsNotString()
+ {
+ $this->assertNull(Link::create([]));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php
new file mode 100644
index 0000000..aae6472
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/MethodTest.php
@@ -0,0 +1,410 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Compound;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\Integer;
+use phpDocumentor\Reflection\Types\Object_;
+use phpDocumentor\Reflection\Types\String_;
+use phpDocumentor\Reflection\Types\Void_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Method
+ * @covers ::
+ */
+class MethodTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Method('myMethod');
+
+ $this->assertSame('method', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $arguments = [
+ ['name' => 'argument1', 'type' => new String_()],
+ ['name' => 'argument2', 'type' => new Object_()]
+ ];
+ $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description'));
+
+ $this->assertSame(
+ '@method static void myMethod(string $argument1, object $argument2) My Description',
+ $fixture->render()
+ );
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Method('myMethod');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getMethodName
+ */
+ public function testHasMethodName()
+ {
+ $expected = 'myMethod';
+
+ $fixture = new Method($expected);
+
+ $this->assertSame($expected, $fixture->getMethodName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getArguments
+ */
+ public function testHasArguments()
+ {
+ $arguments = [
+ [ 'name' => 'argument1', 'type' => new String_() ]
+ ];
+
+ $fixture = new Method('myMethod', $arguments);
+
+ $this->assertSame($arguments, $fixture->getArguments());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getArguments
+ */
+ public function testArgumentsMayBePassedAsString()
+ {
+ $arguments = ['argument1'];
+ $expected = [
+ [ 'name' => $arguments[0], 'type' => new Void_() ]
+ ];
+
+ $fixture = new Method('myMethod', $arguments);
+
+ $this->assertEquals($expected, $fixture->getArguments());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getArguments
+ */
+ public function testArgumentTypeCanBeInferredAsVoid()
+ {
+ $arguments = [ [ 'name' => 'argument1' ] ];
+ $expected = [
+ [ 'name' => $arguments[0]['name'], 'type' => new Void_() ]
+ ];
+
+ $fixture = new Method('myMethod', $arguments);
+
+ $this->assertEquals($expected, $fixture->getArguments());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReturnType
+ */
+ public function testHasReturnType()
+ {
+ $expected = new String_();
+
+ $fixture = new Method('myMethod', [], $expected);
+
+ $this->assertSame($expected, $fixture->getReturnType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReturnType
+ */
+ public function testReturnTypeCanBeInferredAsVoid()
+ {
+ $fixture = new Method('myMethod', []);
+
+ $this->assertEquals(new Void_(), $fixture->getReturnType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isStatic
+ */
+ public function testMethodCanBeStatic()
+ {
+ $expected = false;
+ $fixture = new Method('myMethod', [], null, $expected);
+ $this->assertSame($expected, $fixture->isStatic());
+
+ $expected = true;
+ $fixture = new Method('myMethod', [], null, $expected);
+ $this->assertSame($expected, $fixture->isStatic());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Method('myMethod', [], null, false, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::isStatic
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $arguments = [
+ ['name' => 'argument1', 'type' => new String_()],
+ ['name' => 'argument2', 'type' => new Object_()]
+ ];
+ $fixture = new Method('myMethod', $arguments, new Void_(), true, new Description('My Description'));
+
+ $this->assertSame(
+ 'static void myMethod(string $argument1, object $argument2) My Description',
+ (string)$fixture
+ );
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $expectedArguments = [
+ [ 'name' => 'argument1', 'type' => new String_() ],
+ [ 'name' => 'argument2', 'type' => new Void_() ]
+ ];
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Method::create(
+ 'static void myMethod(string $argument1, $argument2) My Description',
+ $resolver,
+ $descriptionFactory,
+ $context
+ );
+
+ $this->assertSame('static void myMethod(string $argument1, void $argument2) My Description', (string)$fixture);
+ $this->assertSame('myMethod', $fixture->getMethodName());
+ $this->assertEquals($expectedArguments, $fixture->getArguments());
+ $this->assertInstanceOf(Void_::class, $fixture->getReturnType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ public function collectionReturnTypesProvider()
+ {
+ return [
+ ['int[]', Array_::class, Integer::class, Compound::class],
+ ['int[][]', Array_::class, Array_::class, Compound::class],
+ ['Object[]', Array_::class, Object_::class, Compound::class],
+ ['array[]', Array_::class, Array_::class, Compound::class],
+ ];
+ }
+
+ /**
+ * @dataProvider collectionReturnTypesProvider
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\Types\Array_
+ * @uses \phpDocumentor\Reflection\Types\Compound
+ * @uses \phpDocumentor\Reflection\Types\Integer
+ * @uses \phpDocumentor\Reflection\Types\Object_
+ * @param string $returnType
+ * @param string $expectedType
+ * @param string $expectedValueType
+ * @param string null $expectedKeyType
+ */
+ public function testCollectionReturnTypes(
+ $returnType,
+ $expectedType,
+ $expectedValueType = null,
+ $expectedKeyType = null
+ ) { $resolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->with('', null)->andReturn(new Description(''));
+
+ $fixture = Method::create("$returnType myMethod(\$arg)", $resolver, $descriptionFactory);
+ $returnType = $fixture->getReturnType();
+ $this->assertInstanceOf($expectedType, $returnType);
+
+ if ($returnType instanceof Array_) {
+ $this->assertInstanceOf($expectedValueType, $returnType->getValueType());
+ $this->assertInstanceOf($expectedKeyType, $returnType->getKeyType());
+ }
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Method::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsEmpty()
+ {
+ Method::create('');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodReturnsNullIfBodyIsIncorrect()
+ {
+ $this->assertNull(Method::create('body('));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Method::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Method::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfBodyIsNotString()
+ {
+ new Method([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfBodyIsEmpty()
+ {
+ new Method('');
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfStaticIsNotBoolean()
+ {
+ new Method('body', [], null, []);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testCreationFailsIfArgumentRecordContainsInvalidEntry()
+ {
+ new Method('body', [ [ 'name' => 'myName', 'unknown' => 'nah' ] ]);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Method::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testCreateMethodParenthesisMissing()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Method::create(
+ 'static void myMethod My Description',
+ $resolver,
+ $descriptionFactory,
+ $context
+ );
+
+ $this->assertSame('static void myMethod() My Description', (string)$fixture);
+ $this->assertSame('myMethod', $fixture->getMethodName());
+ $this->assertEquals([], $fixture->getArguments());
+ $this->assertInstanceOf(Void_::class, $fixture->getReturnType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php
new file mode 100644
index 0000000..0c718ab
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ParamTest.php
@@ -0,0 +1,228 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Param
+ * @covers ::
+ */
+class ParamTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Param('myParameter', null, false, new Description('Description'));
+
+ $this->assertSame('param', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::isVariadic
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Param('myParameter', new String_(), true, new Description('Description'));
+ $this->assertSame('@param string ...$myParameter Description', $fixture->render());
+
+ $fixture = new Param('myParameter', new String_(), false, new Description('Description'));
+ $this->assertSame('@param string $myParameter Description', $fixture->render());
+
+ $fixture = new Param('myParameter', null, false, new Description('Description'));
+ $this->assertSame('@param $myParameter Description', $fixture->render());
+
+ $fixture = new Param('myParameter');
+ $this->assertSame('@param $myParameter', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Param('myParameter');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myParameter';
+
+ $fixture = new Param($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Param('myParameter', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isVariadic
+ */
+ public function testIfParameterIsVariadic()
+ {
+ $fixture = new Param('myParameter', new String_(), false);
+ $this->assertFalse($fixture->isVariadic());
+
+ $fixture = new Param('myParameter', new String_(), true);
+ $this->assertTrue($fixture->isVariadic());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Param('1.0', null, false, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isVariadic
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Param('myParameter', new String_(), true, new Description('Description'));
+
+ $this->assertSame('string ...$myParameter Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Param::create('string ...$myParameter My Description', $typeResolver, $descriptionFactory, $context);
+
+ $this->assertSame('string ...$myParameter My Description', (string)$fixture);
+ $this->assertSame('myParameter', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertTrue($fixture->isVariadic());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Param::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Param::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Param::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Param::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Param::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new Param([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariadicIsNotBoolean()
+ {
+ new Param('', null, []);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php
new file mode 100644
index 0000000..c3fb770
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyReadTest.php
@@ -0,0 +1,201 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead
+ * @covers ::
+ */
+class PropertyReadTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new PropertyRead('myProperty', null, new Description('Description'));
+
+ $this->assertSame('property-read', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new PropertyRead('myProperty', new String_(), new Description('Description'));
+ $this->assertSame('@property-read string $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyRead('myProperty', null, new Description('Description'));
+ $this->assertSame('@property-read $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyRead('myProperty');
+ $this->assertSame('@property-read $myProperty', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new PropertyRead('myProperty');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myProperty';
+
+ $fixture = new PropertyRead($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new PropertyRead('myProperty', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new PropertyRead('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new PropertyRead('myProperty', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myProperty Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = PropertyRead::create('string $myProperty My Description', $typeResolver, $descriptionFactory,
+ $context);
+
+ $this->assertSame('string $myProperty My Description', (string)$fixture);
+ $this->assertSame('myProperty', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyRead::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ PropertyRead::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ PropertyRead::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ PropertyRead::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ PropertyRead::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new PropertyRead([]);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php
new file mode 100644
index 0000000..908dfb2
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyTest.php
@@ -0,0 +1,200 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Property
+ * @covers ::
+ */
+class PropertyTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Property('myProperty', null, new Description('Description'));
+
+ $this->assertSame('property', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Property('myProperty', new String_(), new Description('Description'));
+ $this->assertSame('@property string $myProperty Description', $fixture->render());
+
+ $fixture = new Property('myProperty', null, new Description('Description'));
+ $this->assertSame('@property $myProperty Description', $fixture->render());
+
+ $fixture = new Property('myProperty');
+ $this->assertSame('@property $myProperty', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Property('myProperty');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myProperty';
+
+ $fixture = new Property($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Property('myProperty', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Property('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Property('myProperty', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myProperty Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Property::create('string $myProperty My Description', $typeResolver, $descriptionFactory, $context);
+
+ $this->assertSame('string $myProperty My Description', (string)$fixture);
+ $this->assertSame('myProperty', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Property::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Property::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Property::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Property::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Property::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new Property([]);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php
new file mode 100644
index 0000000..5ea6524
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/PropertyWriteTest.php
@@ -0,0 +1,201 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite
+ * @covers ::
+ */
+class PropertyWriteTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new PropertyWrite('myProperty', null, new Description('Description'));
+
+ $this->assertSame('property-write', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description'));
+ $this->assertSame('@property-write string $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyWrite('myProperty', null, new Description('Description'));
+ $this->assertSame('@property-write $myProperty Description', $fixture->render());
+
+ $fixture = new PropertyWrite('myProperty');
+ $this->assertSame('@property-write $myProperty', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new PropertyWrite('myProperty');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myProperty';
+
+ $fixture = new PropertyWrite($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new PropertyWrite('myProperty', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new PropertyWrite('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new PropertyWrite('myProperty', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myProperty Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = PropertyWrite::create('string $myProperty My Description', $typeResolver, $descriptionFactory,
+ $context);
+
+ $this->assertSame('string $myProperty My Description', (string)$fixture);
+ $this->assertSame('myProperty', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\PropertyWrite::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ PropertyWrite::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ PropertyWrite::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ PropertyWrite::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ PropertyWrite::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new PropertyWrite([]);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php
new file mode 100644
index 0000000..2bc5439
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ReturnTest.php
@@ -0,0 +1,170 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Return_
+ * @covers ::
+ */
+class ReturnTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $this->assertSame('return', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $this->assertSame('@return string Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Return_($expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Return_(new String_(), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Return_(new String_(), new Description('Description'));
+
+ $this->assertSame('string Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Return_::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $type = new String_();
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Return_::create('string My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('string My Description', (string)$fixture);
+ $this->assertEquals($type, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Return_::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Return_::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Return_::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Return_::create('body', new TypeResolver());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php
new file mode 100644
index 0000000..8d3e3e8
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SeeTest.php
@@ -0,0 +1,173 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\See
+ * @covers ::
+ */
+class SeeTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('see', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('@see \DateTime Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReference
+ */
+ public function testHasReferenceToFqsen()
+ {
+ $expected = new Fqsen('\DateTime');
+
+ $fixture = new See($expected);
+
+ $this->assertSame($expected, $fixture->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new See(new Fqsen('\DateTime'), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new See(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('\DateTime Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\See::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\FqsenResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = m::mock(FqsenResolver::class);
+ $context = new Context('');
+
+ $fqsen = new Fqsen('\DateTime');
+ $description = new Description('My Description');
+
+ $descriptionFactory
+ ->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+ $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
+
+ $fixture = See::create('DateTime My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('\DateTime My Description', (string)$fixture);
+ $this->assertSame($fqsen, $fixture->getReference());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(See::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(See::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ See::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ See::create('body', new FqsenResolver());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php
new file mode 100644
index 0000000..3f42db5
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SinceTest.php
@@ -0,0 +1,166 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Since
+ * @covers ::
+ */
+class SinceTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $this->assertSame('since', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $this->assertSame('@since 1.0 Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVersion
+ */
+ public function testHasVersionNumber()
+ {
+ $expected = '1.0';
+
+ $fixture = new Since($expected);
+
+ $this->assertSame($expected, $fixture->getVersion());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Since('1.0', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Since('1.0', new Description('Description'));
+
+ $this->assertSame('1.0 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $version = '1.0';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Since::create('1.0 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1.0 My Description', (string)$fixture);
+ $this->assertSame($version, $fixture->getVersion());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Since::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptySinceTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Since::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame(null, $fixture->getVersion());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfSinceIsNotString()
+ {
+ $this->assertNull(Since::create([]));
+ }
+
+ /**
+ * @covers ::create
+ */
+ public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
+ {
+ $this->assertNull(Since::create('dkhf<'));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php
new file mode 100644
index 0000000..cbf01f6
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/SourceTest.php
@@ -0,0 +1,199 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Source
+ * @covers ::
+ */
+class SourceTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Source(1, null, new Description('Description'));
+
+ $this->assertSame('source', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Source(1, 10, new Description('Description'));
+ $this->assertSame('@source 1 10 Description', $fixture->render());
+
+ $fixture = new Source(1, null, new Description('Description'));
+ $this->assertSame('@source 1 Description', $fixture->render());
+
+ $fixture = new Source(1);
+ $this->assertSame('@source 1', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Source(1);
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getStartingLine
+ */
+ public function testHasStartingLine()
+ {
+ $expected = 1;
+
+ $fixture = new Source($expected);
+
+ $this->assertSame($expected, $fixture->getStartingLine());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getLineCount
+ */
+ public function testHasLineCount()
+ {
+ $expected = 2;
+
+ $fixture = new Source(1, $expected);
+
+ $this->assertSame($expected, $fixture->getLineCount());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Source('1', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Source(1, 10, new Description('Description'));
+
+ $this->assertSame('1 10 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Source::create('1 10 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1 10 My Description', (string)$fixture);
+ $this->assertSame(1, $fixture->getStartingLine());
+ $this->assertSame(10, $fixture->getLineCount());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Source::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Source::create('', $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Source::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Source::create('1');
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfStartingLineIsNotInteger()
+ {
+ new Source('blabla');
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfLineCountIsNotIntegerOrNull()
+ {
+ new Source('1', []);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php
new file mode 100644
index 0000000..657d6ca
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/ThrowsTest.php
@@ -0,0 +1,170 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Throws
+ * @covers ::
+ */
+class ThrowsTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $this->assertSame('throws', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $this->assertSame('@throws string Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Throws($expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Throws(new String_(), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Throws(new String_(), new Description('Description'));
+
+ $this->assertSame('string Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Throws::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = new TypeResolver();
+ $context = new Context('');
+
+ $type = new String_();
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Throws::create('string My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('string My Description', (string)$fixture);
+ $this->assertEquals($type, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Throws::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Throws::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Throws::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Throws::create('body', new TypeResolver());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php
new file mode 100644
index 0000000..419f7e3
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/UsesTest.php
@@ -0,0 +1,174 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\FqsenResolver;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Uses
+ * @covers ::
+ */
+class UsesTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('uses', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('@uses \DateTime Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getReference
+ */
+ public function testHasReferenceToFqsen()
+ {
+ $expected = new Fqsen('\DateTime');
+
+ $fixture = new Uses($expected);
+
+ $this->assertSame($expected, $fixture->getReference());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Uses(new Fqsen('\DateTime'), $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Uses(new Fqsen('\DateTime'), new Description('Description'));
+
+ $this->assertSame('\DateTime Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Uses::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\FqsenResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Fqsen
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $resolver = m::mock(FqsenResolver::class);
+ $context = new Context('');
+
+ $fqsen = new Fqsen('\DateTime');
+ $description = new Description('My Description');
+
+ $descriptionFactory
+ ->shouldReceive('create')->with('My Description', $context)->andReturn($description)
+ ;
+ $resolver->shouldReceive('resolve')->with('DateTime', $context)->andReturn($fqsen);
+
+ $fixture = Uses::create('DateTime My Description', $resolver, $descriptionFactory, $context);
+
+ $this->assertSame('\DateTime My Description', (string)$fixture);
+ $this->assertSame($fqsen, $fixture->getReference());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ $this->assertNull(Uses::create([]));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotEmpty()
+ {
+ $this->assertNull(Uses::create(''));
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Uses::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Uses::create('body', new FqsenResolver());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php
new file mode 100644
index 0000000..34f290a
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VarTest.php
@@ -0,0 +1,200 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\TypeResolver;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\String_;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Var_
+ * @covers ::
+ */
+class VarTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Var_('myVariable', null, new Description('Description'));
+
+ $this->assertSame('var', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Var_('myVariable', new String_(), new Description('Description'));
+ $this->assertSame('@var string $myVariable Description', $fixture->render());
+
+ $fixture = new Var_('myVariable', null, new Description('Description'));
+ $this->assertSame('@var $myVariable Description', $fixture->render());
+
+ $fixture = new Var_('myVariable');
+ $this->assertSame('@var $myVariable', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Var_('myVariable');
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVariableName
+ */
+ public function testHasVariableName()
+ {
+ $expected = 'myVariable';
+
+ $fixture = new Var_($expected);
+
+ $this->assertSame($expected, $fixture->getVariableName());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getType
+ */
+ public function testHasType()
+ {
+ $expected = new String_();
+
+ $fixture = new Var_('myVariable', $expected);
+
+ $this->assertSame($expected, $fixture->getType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Var_('1.0', null, $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\String_
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Var_('myVariable', new String_(), new Description('Description'));
+
+ $this->assertSame('string $myVariable Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $typeResolver = new TypeResolver();
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $description = new Description('My Description');
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Var_::create('string $myVariable My Description', $typeResolver, $descriptionFactory, $context);
+
+ $this->assertSame('string $myVariable My Description', (string)$fixture);
+ $this->assertSame('myVariable', $fixture->getVariableName());
+ $this->assertInstanceOf(String_::class, $fixture->getType());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Var_::
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfEmptyBodyIsGiven()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ Var_::create('', new TypeResolver(), $descriptionFactory);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfBodyIsNotString()
+ {
+ Var_::create([]);
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfResolverIsNull()
+ {
+ Var_::create('body');
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\TypeResolver
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfDescriptionFactoryIsNull()
+ {
+ Var_::create('body', new TypeResolver());
+ }
+
+ /**
+ * @covers ::__construct
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfVariableNameIsNotString()
+ {
+ new Var_([]);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php
new file mode 100644
index 0000000..5c487fd
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlock/Tags/VersionTest.php
@@ -0,0 +1,166 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\DocBlock\Tags;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\DocBlock\Tags\Version
+ * @covers ::
+ */
+class VersionTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfCorrectTagNameIsReturned()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $this->assertSame('version', $fixture->getName());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Formatter\PassthroughFormatter
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getName
+ */
+ public function testIfTagCanBeRenderedUsingDefaultFormatter()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $this->assertSame('@version 1.0 Description', $fixture->render());
+ }
+
+ /**
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::__construct
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::render
+ */
+ public function testIfTagCanBeRenderedUsingSpecificFormatter()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $formatter = m::mock(Formatter::class);
+ $formatter->shouldReceive('format')->with($fixture)->andReturn('Rendered output');
+
+ $this->assertSame('Rendered output', $fixture->render($formatter));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getVersion
+ */
+ public function testHasVersionNumber()
+ {
+ $expected = '1.0';
+
+ $fixture = new Version($expected);
+
+ $this->assertSame($expected, $fixture->getVersion());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers \phpDocumentor\Reflection\DocBlock\Tags\BaseTag::getDescription
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testHasDescription()
+ {
+ $expected = new Description('Description');
+
+ $fixture = new Version('1.0', $expected);
+
+ $this->assertSame($expected, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::__toString
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testStringRepresentationIsReturned()
+ {
+ $fixture = new Version('1.0', new Description('Description'));
+
+ $this->assertSame('1.0 Description', (string)$fixture);
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethod()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $context = new Context('');
+
+ $version = '1.0';
+ $description = new Description('My Description');
+
+ $descriptionFactory->shouldReceive('create')->with('My Description', $context)->andReturn($description);
+
+ $fixture = Version::create('1.0 My Description', $descriptionFactory, $context);
+
+ $this->assertSame('1.0 My Description', (string)$fixture);
+ $this->assertSame($version, $fixture->getVersion());
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @uses \phpDocumentor\Reflection\DocBlock\Tags\Version::
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testFactoryMethodCreatesEmptyVersionTag()
+ {
+ $descriptionFactory = m::mock(DescriptionFactory::class);
+ $descriptionFactory->shouldReceive('create')->never();
+
+ $fixture = Version::create('', $descriptionFactory, new Context(''));
+
+ $this->assertSame('', (string)$fixture);
+ $this->assertSame(null, $fixture->getVersion());
+ $this->assertSame(null, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::create
+ * @expectedException \InvalidArgumentException
+ */
+ public function testFactoryMethodFailsIfVersionIsNotString()
+ {
+ $this->assertNull(Version::create([]));
+ }
+
+ /**
+ * @covers ::create
+ */
+ public function testFactoryMethodReturnsNullIfBodyDoesNotMatchRegex()
+ {
+ $this->assertNull(Version::create('dkhf<'));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php
new file mode 100644
index 0000000..f1261b6
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockFactoryTest.php
@@ -0,0 +1,290 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use Mockery as m;
+use phpDocumentor\Reflection\DocBlock\Description;
+use phpDocumentor\Reflection\DocBlock\DescriptionFactory;
+use phpDocumentor\Reflection\DocBlock\Tag;
+use phpDocumentor\Reflection\DocBlock\TagFactory;
+use phpDocumentor\Reflection\DocBlock\Tags\Param;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\DocBlockFactory
+ * @covers ::
+ * @uses \Webmozart\Assert\Assert
+ * @uses phpDocumentor\Reflection\DocBlock
+ */
+class DocBlockFactoryTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::createInstance
+ * @uses \phpDocumentor\Reflection\DocBlock\StandardTagFactory
+ * @uses \phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ */
+ public function testCreateFactoryUsingFactoryMethod()
+ {
+ $fixture = DocBlockFactory::createInstance();
+
+ $this->assertInstanceOf(DocBlockFactory::class, $fixture);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreateDocBlockFromReflection()
+ {
+ $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
+
+ $docBlock = '/** This is a DocBlock */';
+ $classReflector = m::mock(\ReflectionClass::class);
+ $classReflector->shouldReceive('getDocComment')->andReturn($docBlock);
+ $docblock = $fixture->create($classReflector);
+
+ $this->assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is a DocBlock', $docblock->getSummary());
+ $this->assertEquals(new Description(''), $docblock->getDescription());
+ $this->assertSame([], $docblock->getTags());
+ $this->assertEquals(new Context(''), $docblock->getContext());
+ $this->assertNull($docblock->getLocation());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreateDocBlockFromStringWithDocComment()
+ {
+ $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
+
+ $docblock = $fixture->create('/** This is a DocBlock */');
+
+ $this->assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is a DocBlock', $docblock->getSummary());
+ $this->assertEquals(new Description(''), $docblock->getDescription());
+ $this->assertSame([], $docblock->getTags());
+ $this->assertEquals(new Context(''), $docblock->getContext());
+ $this->assertNull($docblock->getLocation());
+ }
+
+ /**
+ * @covers ::create
+ * @covers ::__construct
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testCreateDocBlockFromStringWithoutDocComment()
+ {
+ $fixture = new DocBlockFactory(m::mock(DescriptionFactory::class), m::mock(TagFactory::class));
+
+ $docblock = $fixture->create('This is a DocBlock');
+
+ $this->assertInstanceOf(DocBlock::class, $docblock);
+ $this->assertSame('This is a DocBlock', $docblock->getSummary());
+ $this->assertEquals(new Description(''), $docblock->getDescription());
+ $this->assertSame([], $docblock->getTags());
+ $this->assertEquals(new Context(''), $docblock->getContext());
+ $this->assertNull($docblock->getLocation());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ * @dataProvider provideSummaryAndDescriptions
+ */
+ public function testSummaryAndDescriptionAreSeparated($given, $summary, $description)
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $docblock = $fixture->create($given);
+
+ $this->assertSame($summary, $docblock->getSummary());
+ $this->assertEquals(new Description($description), $docblock->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDescriptionsRetainFormatting()
+ {
+ $tagFactory = m::mock(TagFactory::class);
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $given = <<create($given);
+
+ $this->assertEquals(new Description($description), $docblock->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testTagsAreInterpretedUsingFactory()
+ {
+ $tagString = << This is with
+ multiline description.
+TAG;
+
+ $tag = m::mock(Tag::class);
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->with($tagString, m::type(Context::class))->andReturn($tag);
+
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $given = << This is with
+ * multiline description.
+ */
+DOCBLOCK;
+
+ $docblock = $fixture->create($given, new Context(''));
+
+ $this->assertEquals([$tag], $docblock->getTags());
+ }
+
+ public function provideSummaryAndDescriptions()
+ {
+ return [
+ ['This is a DocBlock', 'This is a DocBlock', ''],
+ [
+ 'This is a DocBlock. This should still be summary.',
+ 'This is a DocBlock. This should still be summary.',
+ ''
+ ],
+ [
+ <<shouldReceive('create')->with(m::any(), $context)->andReturn(new Param('param'));
+ $docblock = $fixture->create('/** @param MyType $param */', $context);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::create
+ *
+ * @uses phpDocumentor\Reflection\DocBlock\DescriptionFactory
+ * @uses phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testTagsAreFilteredForNullValues()
+ {
+ $tagString = << This is with
+ multiline description.
+TAG;
+
+ $tagFactory = m::mock(TagFactory::class);
+ $tagFactory->shouldReceive('create')->with($tagString, m::any())->andReturn(null);
+
+ $fixture = new DocBlockFactory(new DescriptionFactory($tagFactory), $tagFactory);
+
+ $given = << This is with
+ * multiline description.
+ */
+DOCBLOCK;
+
+ $docblock = $fixture->create($given, new Context(''));
+
+ $this->assertEquals([], $docblock->getTags());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php
new file mode 100644
index 0000000..4a8d4de
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/reflection-docblock/tests/unit/DocBlockTest.php
@@ -0,0 +1,252 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use Mockery as m;
+use phpDocumentor\Reflection\Types\Context;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\DocBlock
+ * @covers ::
+ * @uses \Webmozart\Assert\Assert
+ */
+class DocBlockTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::getSummary
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockCanHaveASummary()
+ {
+ $summary = 'This is a summary';
+
+ $fixture = new DocBlock($summary);
+
+ $this->assertSame($summary, $fixture->getSummary());
+ }
+
+ /**
+ * @covers ::__construct
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfSummaryIsNotAString()
+ {
+ new DocBlock([]);
+ }
+
+ /**
+ * @covers ::__construct
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTemplateStartIsNotABoolean()
+ {
+ new DocBlock('', null, [], null, null, ['is not boolean']);
+ }
+
+ /**
+ * @covers ::__construct
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTemplateEndIsNotABoolean()
+ {
+ new DocBlock('', null, [], null, null, false, ['is not boolean']);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getDescription
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockCanHaveADescription()
+ {
+ $description = new DocBlock\Description('');
+
+ $fixture = new DocBlock('', $description);
+
+ $this->assertSame($description, $fixture->getDescription());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTags
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ */
+ public function testDocBlockCanHaveTags()
+ {
+ $tags = [
+ m::mock(DocBlock\Tag::class)
+ ];
+
+ $fixture = new DocBlock('', null, $tags);
+
+ $this->assertSame($tags, $fixture->getTags());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTags
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testDocBlockAllowsOnlyTags()
+ {
+ $tags = [
+ null
+ ];
+
+ $fixture = new DocBlock('', null, $tags);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTagsByName
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock::getTags
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ */
+ public function testFindTagsInDocBlockByName()
+ {
+ $tag1 = m::mock(DocBlock\Tag::class);
+ $tag2 = m::mock(DocBlock\Tag::class);
+ $tag3 = m::mock(DocBlock\Tag::class);
+ $tags = [$tag1, $tag2, $tag3];
+
+ $tag1->shouldReceive('getName')->andReturn('abc');
+ $tag2->shouldReceive('getName')->andReturn('abcd');
+ $tag3->shouldReceive('getName')->andReturn('ab');
+
+ $fixture = new DocBlock('', null, $tags);
+
+ $this->assertSame([$tag2], $fixture->getTagsByName('abcd'));
+ $this->assertSame([], $fixture->getTagsByName('Ebcd'));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getTagsByName
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfNameForTagsIsNotString()
+ {
+ $fixture = new DocBlock();
+ $fixture->getTagsByName([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::hasTag
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock::getTags
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\DocBlock\Tag
+ */
+ public function testCheckIfThereAreTagsWithAGivenName()
+ {
+ $tag1 = m::mock(DocBlock\Tag::class);
+ $tag2 = m::mock(DocBlock\Tag::class);
+ $tag3 = m::mock(DocBlock\Tag::class);
+ $tags = [$tag1, $tag2, $tag3];
+
+ $tag1->shouldReceive('getName')->twice()->andReturn('abc');
+ $tag2->shouldReceive('getName')->twice()->andReturn('abcd');
+ $tag3->shouldReceive('getName')->once();
+
+ $fixture = new DocBlock('', null, $tags);
+
+ $this->assertTrue($fixture->hasTag('abcd'));
+ $this->assertFalse($fixture->hasTag('Ebcd'));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::hasTag
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfNameForCheckingTagsIsNotString()
+ {
+ $fixture = new DocBlock();
+ $fixture->hasTag([]);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getContext
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Types\Context
+ */
+ public function testDocBlockKnowsInWhichNamespaceItIsAndWhichAliasesThereAre()
+ {
+ $context = new Context('');
+
+ $fixture = new DocBlock('', null, [], $context);
+
+ $this->assertSame($context, $fixture->getContext());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getLocation
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ * @uses \phpDocumentor\Reflection\Location
+ */
+ public function testDocBlockKnowsAtWhichLineItIs()
+ {
+ $location = new Location(10);
+
+ $fixture = new DocBlock('', null, [], null, $location);
+
+ $this->assertSame($location, $fixture->getLocation());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isTemplateStart
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockKnowsIfItIsTheStartOfADocBlockTemplate()
+ {
+ $fixture = new DocBlock('', null, [], null, null, true);
+
+ $this->assertTrue($fixture->isTemplateStart());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::isTemplateEnd
+ *
+ * @uses \phpDocumentor\Reflection\DocBlock\Description
+ */
+ public function testDocBlockKnowsIfItIsTheEndOfADocBlockTemplate()
+ {
+ $fixture = new DocBlock('', null, [], null, null, false, true);
+
+ $this->assertTrue($fixture->isTemplateEnd());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.gitignore b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.gitignore
new file mode 100644
index 0000000..82cfc4e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.gitignore
@@ -0,0 +1,3 @@
+.idea
+composer.lock
+vendor
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.scrutinizer.yml b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.scrutinizer.yml
new file mode 100644
index 0000000..7d7372a
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.scrutinizer.yml
@@ -0,0 +1,31 @@
+before_commands:
+ - "composer install --no-dev --prefer-source"
+
+tools:
+ external_code_coverage: true
+ php_code_sniffer:
+ config:
+ standard: PSR2
+ filter:
+ paths: ["src/*", "tests/*"]
+ php_cpd:
+ enabled: true
+ excluded_dirs: ["tests", "vendor"]
+ php_loc:
+ enabled: true
+ excluded_dirs: ["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: ["tests", "vendor"]
+ php_analyzer:
+ enabled: true
+ filter:
+ paths: ["src/*", "tests/*"]
+ sensiolabs_security_checker: true
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.travis.yml b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.travis.yml
new file mode 100644
index 0000000..c882b14
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/.travis.yml
@@ -0,0 +1,34 @@
+language: php
+php:
+ - 5.5
+ - 5.6
+ - 7.0
+ - hhvm
+ - nightly
+
+matrix:
+ allow_failures:
+ - php:
+ - hhvm
+ - nightly
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+script:
+ - vendor/bin/phpunit --coverage-clover=coverage.clover -v
+ - composer update --no-interaction --prefer-source
+ - vendor/bin/phpunit -v
+
+before_script:
+ - composer install --no-interaction
+
+after_script:
+ - if [ $TRAVIS_PHP_VERSION = '5.6' ]; then wget https://scrutinizer-ci.com/ocular.phar; php ocular.phar code-coverage:upload --format=php-clover coverage.clover; fi
+
+notifications:
+ irc: "irc.freenode.org#phpdocumentor"
+ email:
+ - me@mikevanriel.com
+ - ashnazg@php.net
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/LICENSE b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/LICENSE
new file mode 100644
index 0000000..792e404
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/LICENSE
@@ -0,0 +1,21 @@
+The MIT License (MIT)
+
+Copyright (c) 2010 Mike van Riel
+
+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/packages/jai/Contact/vendor/phpdocumentor/type-resolver/README.md b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/README.md
new file mode 100644
index 0000000..ca8147b
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/README.md
@@ -0,0 +1,169 @@
+TypeResolver and FqsenResolver
+==============================
+
+The specification on types in DocBlocks (PSR-5) describes various keywords and special constructs
+but also how to statically resolve the partial name of a Class into a Fully Qualified Class Name (FQCN).
+
+PSR-5 also introduces an additional way to describe deeper elements than Classes, Interfaces and Traits
+called the Fully Qualified Structural Element Name (FQSEN). Using this it is possible to refer to methods,
+properties and class constants but also functions and global constants.
+
+This package provides two Resolvers that are capable of
+
+1. Returning a series of Value Object for given expression while resolving any partial class names, and
+2. Returning an FQSEN object after resolving any partial Structural Element Names into Fully Qualified Structural
+ Element names.
+
+## Installing
+
+The easiest way to install this library is with [Composer](https://getcomposer.org) using the following command:
+
+ $ composer require phpdocumentor/type-resolver
+
+## Examples
+
+Ready to dive in and don't want to read through all that text below? Just consult the [examples](examples) folder and
+check which type of action that your want to accomplish.
+
+## On Types and Element Names
+
+This component can be used in one of two ways
+
+1. To resolve a Type or
+2. To resolve a Fully Qualified Structural Element Name
+
+The big difference between these two is in the number of things it can resolve.
+
+The TypeResolver can resolve:
+
+- a php primitive or pseudo-primitive such as a string or void (`@var string` or `@return void`).
+- a composite such as an array of string (`@var string[]`).
+- a compound such as a string or integer (`@var string|integer`).
+- an object or interface such as the TypeResolver class (`@var TypeResolver`
+ or `@var \phpDocumentor\Reflection\TypeResolver`)
+
+ > please note that if you want to pass partial class names that additional steps are necessary, see the
+ > chapter `Resolving partial classes and FQSENs` for more information.
+
+Where the FqsenResolver can resolve:
+
+- Constant expressions (i.e. `@see \MyNamespace\MY_CONSTANT`)
+- Function expressions (i.e. `@see \MyNamespace\myFunction()`)
+- Class expressions (i.e. `@see \MyNamespace\MyClass`)
+- Interface expressions (i.e. `@see \MyNamespace\MyInterface`)
+- Trait expressions (i.e. `@see \MyNamespace\MyTrait`)
+- Class constant expressions (i.e. `@see \MyNamespace\MyClass::MY_CONSTANT`)
+- Property expressions (i.e. `@see \MyNamespace\MyClass::$myProperty`)
+- Method expressions (i.e. `@see \MyNamespace\MyClass::myMethod()`)
+
+## Resolving a type
+
+In order to resolve a type you will have to instantiate the class `\phpDocumentor\Reflection\TypeResolver`
+and call its `resolve` method like this:
+
+ $typeResolver = new \phpDocumentor\Reflection\TypeResolver();
+ $type = $typeResolver->resolve('string|integer');
+
+In this example you will receive a Value Object of class `\phpDocumentor\Reflection\Types\Compound` that has two
+elements, one of type `\phpDocumentor\Reflection\Types\String_` and one of type
+`\phpDocumentor\Reflection\Types\Integer`.
+
+The real power of this resolver is in its capability to expand partial class names into fully qualified class names; but
+in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will inform the resolver
+in which namespace the given expression occurs and which namespace aliases (or imports) apply.
+
+## Resolving an FQSEN
+
+A Fully Qualified Structural Element Name is a reference to another element in your code bases and can be resolved using
+the `\phpDocumentor\Reflection\FqsenResolver` class' `resolve` method, like this:
+
+ $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver();
+ $fqsen = $fqsenResolver->resolve('\phpDocumentor\Reflection\FqsenResolver::resolve()');
+
+In this example we resolve a Fully Qualified Structural Element Name (meaning that it includes the full namespace, class
+name and element name) and receive a Value Object of type `\phpDocumentor\Reflection\Fqsen`.
+
+The real power of this resolver is in its capability to expand partial element names into Fully Qualified Structural
+Element Names; but in order to do that we need an additional `\phpDocumentor\Reflection\Types\Context` class that will
+inform the resolver in which namespace the given expression occurs and which namespace aliases (or imports) apply.
+
+## Resolving partial Classes and Structural Element Names
+
+Perhaps the best feature of this library is that it knows how to resolve partial class names into fully qualified class
+names.
+
+For example, you have this file:
+
+```php
+ '\phpDocumentor\Reflection\Types']
+ );
+
+Or by using the `\phpDocumentor\Reflection\Types\ContextFactory` to instantiate a new context based on a Reflector
+object or by providing the namespace that you'd like to extract and the source code of the file in which the given
+type expression occurs.
+
+ $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
+ $context = $contextFactory->createFromReflector(new ReflectionMethod('\My\Example\Classy', '__construct'));
+
+or
+
+ $contextFactory = new \phpDocumentor\Reflection\Types\ContextFactory();
+ $context = $contextFactory->createForNamespace('\My\Example', file_get_contents('My/Example/Classy.php'));
+
+### Using the Context
+
+After you have obtained a Context it is just a matter of passing it along with the `resolve` method of either Resolver
+class as second argument and the Resolvers will take this into account when resolving partial names.
+
+To obtain the resolved class name for the `@var` tag in the example above you can do:
+
+ $typeResolver = new \phpDocumentor\Reflection\TypeResolver();
+ $type = $typeResolver->resolve('Types\Context', $context);
+
+When you do this you will receive an object of class `\phpDocumentor\Reflection\Types\Object_` for which you can call
+the `getFqsen` method to receive a Value Object that represents the complete FQSEN. So that would be
+`phpDocumentor\Reflection\Types\Context`.
+
+> Why is the FQSEN wrapped in another object `Object_`?
+>
+> The resolve method of the TypeResolver only returns object with the interface `Type` and the FQSEN is a common
+> type that does not represent a Type. Also: in some cases a type can represent an "Untyped Object", meaning that it
+> is an object (signified by the `object` keyword) but does not refer to a specific element using an FQSEN.
+
+Another example is on how to resolve the FQSEN of a method as can be seen with the `@see` tag in the example above. To
+resolve that you can do the following:
+
+ $fqsenResolver = new \phpDocumentor\Reflection\FqsenResolver();
+ $type = $fqsenResolver->resolve('Classy::otherFunction()', $context);
+
+Because Classy is a Class in the current namespace its FQSEN will have the `My\Example` namespace and by calling the
+`resolve` method of the FQSEN Resolver you will receive an `Fqsen` object that refers to
+`\My\Example\Classy::otherFunction()`.
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/composer.json b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/composer.json
new file mode 100644
index 0000000..abaa965
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/composer.json
@@ -0,0 +1,27 @@
+{
+ "name": "phpdocumentor/type-resolver",
+ "type": "library",
+ "license": "MIT",
+ "authors": [
+ {"name": "Mike van Riel", "email": "me@mikevanriel.com"}
+ ],
+ "require": {
+ "php": ">=5.5",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "autoload": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["src/"]}
+ },
+ "autoload-dev": {
+ "psr-4": {"phpDocumentor\\Reflection\\": ["tests/unit"]}
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.2||^4.8.24",
+ "mockery/mockery": "^0.9.4"
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php
new file mode 100644
index 0000000..682b1d3
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/01-resolving-simple-types.php
@@ -0,0 +1,13 @@
+resolve('string|integer'));
+
+// Will return the string "string|int"
+var_dump((string)$typeResolver->resolve('string|integer'));
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php
new file mode 100644
index 0000000..70aa5e4
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/02-resolving-classes.php
@@ -0,0 +1,12 @@
+ 'Mockery' ]);
+var_dump((string)$typeResolver->resolve('Types\Resolver|m\MockInterface', $context));
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php
new file mode 100644
index 0000000..4f4282e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/03-resolving-all-elements.php
@@ -0,0 +1,17 @@
+resolve('Types\Resolver::resolveFqsen()', $context));
+
+// Property named: \phpDocumentor\Types\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php
new file mode 100644
index 0000000..957c97d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/04-discovering-the-context-using-class-reflection.php
@@ -0,0 +1,30 @@
+createFromReflector(new ReflectionClass('My\\Example\\Classy'));
+
+// Class named: \phpDocumentor\Reflection\Types\Resolver
+var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
+
+// String
+var_dump((string)$typeResolver->resolve('string', $context));
+
+// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
+
+// Class named: \My\Example\string
+// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume
+// that the given value is not a type but most definitely a reference to another element. This is
+// because conflicts between type keywords and class names can exist and if you know a reference
+// is not a type but an element you can force that keywords are resolved.
+var_dump((string)$fqsenResolver->resolve('string', $context));
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php
new file mode 100644
index 0000000..10c0c88
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/05-discovering-the-context-using-method-reflection.php
@@ -0,0 +1,30 @@
+createFromReflector(new ReflectionMethod('My\\Example\\Classy', '__construct'));
+
+// Class named: \phpDocumentor\Reflection\Types\Resolver
+var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
+
+// String
+var_dump((string)$typeResolver->resolve('string', $context));
+
+// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
+
+// Class named: \My\Example\string
+// - Shows the difference between the FqsenResolver and TypeResolver; the FqsenResolver will assume
+// that the given value is not a type but most definitely a reference to another element. This is
+// because conflicts between type keywords and class names can exist and if you know a reference
+// is not a type but an element you can force that keywords are resolved.
+var_dump((string)$fqsenResolver->resolve('string', $context));
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php
new file mode 100644
index 0000000..a93728c
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/06-discovering-the-context-using-file-contents.php
@@ -0,0 +1,22 @@
+createForNamespace('My\Example', file_get_contents('Classy.php'));
+
+// Class named: \phpDocumentor\Reflection\Types\Resolver
+var_dump((string)$typeResolver->resolve('Types\Resolver', $context));
+
+// String
+var_dump((string)$typeResolver->resolve('string', $context));
+
+// Property named: \phpDocumentor\Reflection\Types\Resolver::$keyWords
+var_dump((string)$fqsenResolver->resolve('Types\Resolver::$keyWords', $context));
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/Classy.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/Classy.php
new file mode 100644
index 0000000..0705266
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/examples/Classy.php
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 40
+
+
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/phpunit.xml.dist b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/phpunit.xml.dist
new file mode 100644
index 0000000..3246bef
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/phpunit.xml.dist
@@ -0,0 +1,31 @@
+
+
+
+
+
+ ./tests/unit
+
+
+
+
+ ./src/
+
+
+ ./examples/
+ ./vendor/
+
+
+
+
+
+
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php
new file mode 100644
index 0000000..a0e0041
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/FqsenResolver.php
@@ -0,0 +1,76 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\Types\Context;
+
+class FqsenResolver
+{
+ /** @var string Definition of the NAMESPACE operator in PHP */
+ const OPERATOR_NAMESPACE = '\\';
+
+ public function resolve($fqsen, Context $context = null)
+ {
+ if ($context === null) {
+ $context = new Context('');
+ }
+
+ if ($this->isFqsen($fqsen)) {
+ return new Fqsen($fqsen);
+ }
+
+ return $this->resolvePartialStructuralElementName($fqsen, $context);
+ }
+
+ /**
+ * Tests whether the given type is a Fully Qualified Structural Element Name.
+ *
+ * @param string $type
+ *
+ * @return bool
+ */
+ private function isFqsen($type)
+ {
+ return strpos($type, self::OPERATOR_NAMESPACE) === 0;
+ }
+
+ /**
+ * Resolves a partial Structural Element Name (i.e. `Reflection\DocBlock`) to its FQSEN representation
+ * (i.e. `\phpDocumentor\Reflection\DocBlock`) based on the Namespace and aliases mentioned in the Context.
+ *
+ * @param string $type
+ * @param Context $context
+ *
+ * @return Fqsen
+ */
+ private function resolvePartialStructuralElementName($type, Context $context)
+ {
+ $typeParts = explode(self::OPERATOR_NAMESPACE, $type, 2);
+
+ $namespaceAliases = $context->getNamespaceAliases();
+
+ // if the first segment is not an alias; prepend namespace name and return
+ if (!isset($namespaceAliases[$typeParts[0]])) {
+ $namespace = $context->getNamespace();
+ if ('' !== $namespace) {
+ $namespace .= self::OPERATOR_NAMESPACE;
+ }
+
+ return new Fqsen(self::OPERATOR_NAMESPACE . $namespace . $type);
+ }
+
+ $typeParts[0] = $namespaceAliases[$typeParts[0]];
+
+ return new Fqsen(self::OPERATOR_NAMESPACE . implode(self::OPERATOR_NAMESPACE, $typeParts));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Type.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Type.php
new file mode 100644
index 0000000..33ca559
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Type.php
@@ -0,0 +1,18 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+interface Type
+{
+ public function __toString();
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/TypeResolver.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
new file mode 100644
index 0000000..3a68a4d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/TypeResolver.php
@@ -0,0 +1,266 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Compound;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\Object_;
+
+final class TypeResolver
+{
+ /** @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 and unto which Value Object they map */
+ private $keywords = array(
+ 'string' => 'phpDocumentor\Reflection\Types\String_',
+ 'int' => 'phpDocumentor\Reflection\Types\Integer',
+ 'integer' => 'phpDocumentor\Reflection\Types\Integer',
+ 'bool' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'boolean' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'float' => 'phpDocumentor\Reflection\Types\Float_',
+ 'double' => 'phpDocumentor\Reflection\Types\Float_',
+ 'object' => 'phpDocumentor\Reflection\Types\Object_',
+ 'mixed' => 'phpDocumentor\Reflection\Types\Mixed',
+ 'array' => 'phpDocumentor\Reflection\Types\Array_',
+ 'resource' => 'phpDocumentor\Reflection\Types\Resource',
+ 'void' => 'phpDocumentor\Reflection\Types\Void_',
+ 'null' => 'phpDocumentor\Reflection\Types\Null_',
+ 'scalar' => 'phpDocumentor\Reflection\Types\Scalar',
+ 'callback' => 'phpDocumentor\Reflection\Types\Callable_',
+ 'callable' => 'phpDocumentor\Reflection\Types\Callable_',
+ 'false' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'true' => 'phpDocumentor\Reflection\Types\Boolean',
+ 'self' => 'phpDocumentor\Reflection\Types\Self_',
+ '$this' => 'phpDocumentor\Reflection\Types\This',
+ 'static' => 'phpDocumentor\Reflection\Types\Static_'
+ );
+
+ /** @var FqsenResolver */
+ private $fqsenResolver;
+
+ /**
+ * Initializes this TypeResolver with the means to create and resolve Fqsen objects.
+ *
+ * @param FqsenResolver $fqsenResolver
+ */
+ public function __construct(FqsenResolver $fqsenResolver = null)
+ {
+ $this->fqsenResolver = $fqsenResolver ?: new FqsenResolver();
+ }
+
+ /**
+ * 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.
+ * @param Context $context
+ *
+ * @uses Context::getNamespace() to determine with what to prefix the type name.
+ * @uses Context::getNamespaceAliases() to check whether the first part of the relative type name should not be
+ * replaced with another namespace.
+ *
+ * @return Type|null
+ */
+ public function resolve($type, Context $context = null)
+ {
+ if (!is_string($type)) {
+ throw new \InvalidArgumentException(
+ 'Attempted to resolve type but it appeared not to be a string, received: ' . var_export($type, true)
+ );
+ }
+
+ $type = trim($type);
+ if (!$type) {
+ throw new \InvalidArgumentException('Attempted to resolve "' . $type . '" but it appears to be empty');
+ }
+
+ if ($context === null) {
+ $context = new Context('');
+ }
+
+ switch (true) {
+ case $this->isKeyword($type):
+ return $this->resolveKeyword($type);
+ case ($this->isCompoundType($type)):
+ return $this->resolveCompoundType($type, $context);
+ case $this->isTypedArray($type):
+ return $this->resolveTypedArray($type, $context);
+ case $this->isFqsen($type):
+ return $this->resolveTypedObject($type);
+ case $this->isPartialStructuralElementName($type):
+ return $this->resolveTypedObject($type, $context);
+ // @codeCoverageIgnoreStart
+ default:
+ // I haven't got the foggiest how the logic would come here but added this as a defense.
+ throw new \RuntimeException(
+ 'Unable to resolve type "' . $type . '", there is no known method to resolve it'
+ );
+ }
+ // @codeCoverageIgnoreEnd
+ }
+
+ /**
+ * Adds a keyword to the list of Keywords and associates it with a specific Value Object.
+ *
+ * @param string $keyword
+ * @param string $typeClassName
+ *
+ * @return void
+ */
+ public function addKeyword($keyword, $typeClassName)
+ {
+ if (!class_exists($typeClassName)) {
+ throw new \InvalidArgumentException(
+ 'The Value Object that needs to be created with a keyword "' . $keyword . '" must be an existing class'
+ . ' but we could not find the class ' . $typeClassName
+ );
+ }
+
+ if (!in_array(Type::class, class_implements($typeClassName))) {
+ throw new \InvalidArgumentException(
+ 'The class "' . $typeClassName . '" must implement the interface "phpDocumentor\Reflection\Type"'
+ );
+ }
+
+ $this->keywords[$keyword] = $typeClassName;
+ }
+
+ /**
+ * Detects whether the given type represents an array.
+ *
+ * @param string $type A relative or absolute type as defined in the phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ private function isTypedArray($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
+ */
+ private function isKeyword($type)
+ {
+ return in_array(strtolower($type), array_keys($this->keywords), true);
+ }
+
+ /**
+ * Detects whether the given type represents a relative structural element name.
+ *
+ * @param string $type A relative or absolute type as defined in the phpDocumentor documentation.
+ *
+ * @return bool
+ */
+ private function isPartialStructuralElementName($type)
+ {
+ return ($type[0] !== self::OPERATOR_NAMESPACE) && !$this->isKeyword($type);
+ }
+
+ /**
+ * Tests whether the given type is a Fully Qualified Structural Element Name.
+ *
+ * @param string $type
+ *
+ * @return bool
+ */
+ private function isFqsen($type)
+ {
+ return strpos($type, self::OPERATOR_NAMESPACE) === 0;
+ }
+
+ /**
+ * Tests whether the given type is a compound type (i.e. `string|int`).
+ *
+ * @param string $type
+ *
+ * @return bool
+ */
+ private function isCompoundType($type)
+ {
+ return strpos($type, '|') !== false;
+ }
+
+ /**
+ * Resolves the given typed array string (i.e. `string[]`) into an Array object with the right types set.
+ *
+ * @param string $type
+ * @param Context $context
+ *
+ * @return Array_
+ */
+ private function resolveTypedArray($type, Context $context)
+ {
+ return new Array_($this->resolve(substr($type, 0, -2), $context));
+ }
+
+ /**
+ * Resolves the given keyword (such as `string`) into a Type object representing that keyword.
+ *
+ * @param string $type
+ *
+ * @return Type
+ */
+ private function resolveKeyword($type)
+ {
+ $className = $this->keywords[strtolower($type)];
+
+ return new $className();
+ }
+
+ /**
+ * Resolves the given FQSEN string into an FQSEN object.
+ *
+ * @param string $type
+ *
+ * @return Object_
+ */
+ private function resolveTypedObject($type, Context $context = null)
+ {
+ return new Object_($this->fqsenResolver->resolve($type, $context));
+ }
+
+ /**
+ * Resolves a compound type (i.e. `string|int`) into the appropriate Type objects or FQSEN.
+ *
+ * @param string $type
+ * @param Context $context
+ *
+ * @return Compound
+ */
+ private function resolveCompoundType($type, Context $context)
+ {
+ $types = [];
+
+ foreach (explode('|', $type) as $part) {
+ $types[] = $this->resolve($part, $context);
+ }
+
+ return new Compound($types);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Array_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Array_.php
new file mode 100644
index 0000000..45276c6
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Array_.php
@@ -0,0 +1,87 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Represents an array type as described in the PSR-5, the PHPDoc Standard.
+ *
+ * An array can be represented in two forms:
+ *
+ * 1. Untyped (`array`), where the key and value type is unknown and hence classified as 'Mixed'.
+ * 2. Types (`string[]`), where the value type is provided by preceding an opening and closing square bracket with a
+ * type name.
+ */
+final class Array_ implements Type
+{
+ /** @var Type */
+ private $valueType;
+
+ /** @var Type */
+ private $keyType;
+
+ /**
+ * Initializes this representation of an array with the given Type or Fqsen.
+ *
+ * @param Type $valueType
+ * @param Type $keyType
+ */
+ public function __construct(Type $valueType = null, Type $keyType = null)
+ {
+ if ($keyType === null) {
+ $keyType = new Compound([ new String_(), new Integer() ]);
+ }
+ if ($valueType === null) {
+ $valueType = new Mixed();
+ }
+
+ $this->valueType = $valueType;
+ $this->keyType = $keyType;
+ }
+
+ /**
+ * Returns the type for the keys of this array.
+ *
+ * @return Type
+ */
+ public function getKeyType()
+ {
+ return $this->keyType;
+ }
+
+ /**
+ * Returns the value for the keys of this array.
+ *
+ * @return Type
+ */
+ public function getValueType()
+ {
+ return $this->valueType;
+ }
+
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if ($this->valueType instanceof Mixed) {
+ return 'array';
+ }
+
+ return $this->valueType . '[]';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php
new file mode 100644
index 0000000..f82b19e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Boolean.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Boolean type.
+ */
+final class Boolean implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'bool';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php
new file mode 100644
index 0000000..68ebfbd
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Callable_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Callable type.
+ */
+final class Callable_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'callable';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Compound.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Compound.php
new file mode 100644
index 0000000..3e5ebb5
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Compound.php
@@ -0,0 +1,82 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Compound Type.
+ *
+ * A Compound Type is not so much a special keyword or object reference but is a series of Types that are separated
+ * using an OR operator (`|`). This combination of types signifies that whatever is associated with this compound type
+ * may contain a value with any of the given types.
+ */
+final class Compound implements Type
+{
+ /** @var Type[] */
+ private $types = [];
+
+ /**
+ * Initializes a compound type (i.e. `string|int`) and tests if the provided types all implement the Type interface.
+ *
+ * @param Type[] $types
+ */
+ public function __construct(array $types)
+ {
+ foreach ($types as $type) {
+ if (!$type instanceof Type) {
+ throw new \InvalidArgumentException('A compound type can only have other types as elements');
+ }
+ }
+
+ $this->types = $types;
+ }
+
+ /**
+ * Returns the type at the given index.
+ *
+ * @param integer $index
+ *
+ * @return Type|null
+ */
+ public function get($index)
+ {
+ if (!$this->has($index)) {
+ return null;
+ }
+
+ return $this->types[$index];
+ }
+
+ /**
+ * Tests if this compound type has a type with the given index.
+ *
+ * @param integer $index
+ *
+ * @return bool
+ */
+ public function has($index)
+ {
+ return isset($this->types[$index]);
+ }
+
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return implode('|', $this->types);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Context.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Context.php
new file mode 100644
index 0000000..b4aa8f2
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Context.php
@@ -0,0 +1,84 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+/**
+ * Provides information about the Context in which the DocBlock occurs that receives this context.
+ *
+ * A DocBlock does not know of its own accord in which namespace it occurs and which namespace aliases are applicable
+ * for the block of code in which it is in. This information is however necessary to resolve Class names in tags since
+ * you can provide a short form or make use of namespace aliases.
+ *
+ * The phpDocumentor Reflection component knows how to create this class but if you use the DocBlock parser from your
+ * own application it is possible to generate a Context class using the ContextFactory; this will analyze the file in
+ * which an associated class resides for its namespace and imports.
+ *
+ * @see ContextFactory::createFromClassReflector()
+ * @see ContextFactory::createForNamespace()
+ */
+final class Context
+{
+ /** @var string The current namespace. */
+ private $namespace = '';
+
+ /** @var array List of namespace aliases => Fully Qualified Namespace. */
+ private $namespaceAliases = [];
+
+ /**
+ * Initializes the new context and normalizes all passed namespaces to be in Qualified Namespace Name (QNN)
+ * format (without a preceding `\`).
+ *
+ * @param string $namespace The namespace where this DocBlock resides in.
+ * @param array $namespaceAliases List of namespace aliases => Fully Qualified Namespace.
+ */
+ public function __construct($namespace, array $namespaceAliases = [])
+ {
+ $this->namespace = ('global' !== $namespace && 'default' !== $namespace)
+ ? trim((string)$namespace, '\\')
+ : '';
+
+ foreach ($namespaceAliases as $alias => $fqnn) {
+ if ($fqnn[0] === '\\') {
+ $fqnn = substr($fqnn, 1);
+ }
+ if ($fqnn[count($fqnn)-1] === '\\') {
+ $fqnn = substr($fqnn, 0, -1);
+ }
+
+ $namespaceAliases[$alias] = $fqnn;
+ }
+
+ $this->namespaceAliases = $namespaceAliases;
+ }
+
+ /**
+ * Returns the Qualified Namespace Name (thus without `\` in front) where the associated element is in.
+ *
+ * @return string
+ */
+ public function getNamespace()
+ {
+ return $this->namespace;
+ }
+
+ /**
+ * Returns a list of Qualified Namespace Names (thus without `\` in front) that are imported, the keys represent
+ * the alias for the imported Namespace.
+ *
+ * @return string[]
+ */
+ public function getNamespaceAliases()
+ {
+ return $this->namespaceAliases;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php
new file mode 100644
index 0000000..147df69
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/ContextFactory.php
@@ -0,0 +1,210 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+/**
+ * Convenience class to create a Context for DocBlocks when not using the Reflection Component of phpDocumentor.
+ *
+ * For a DocBlock to be able to resolve types that use partial namespace names or rely on namespace imports we need to
+ * provide a bit of context so that the DocBlock can read that and based on it decide how to resolve the types to
+ * Fully Qualified names.
+ *
+ * @see Context for more information.
+ */
+final class ContextFactory
+{
+ /** The literal used at the end of a use statement. */
+ const T_LITERAL_END_OF_USE = ';';
+
+ /** The literal used between sets of use statements */
+ const T_LITERAL_USE_SEPARATOR = ',';
+
+ /**
+ * Build a Context given a Class Reflection.
+ *
+ * @param \ReflectionClass $reflector
+ *
+ * @see Context for more information on Contexts.
+ *
+ * @return Context
+ */
+ public function createFromReflector(\Reflector $reflector)
+ {
+ if (method_exists($reflector, 'getDeclaringClass')) {
+ $reflector = $reflector->getDeclaringClass();
+ }
+
+ $fileName = $reflector->getFileName();
+ $namespace = $reflector->getNamespaceName();
+
+ if (file_exists($fileName)) {
+ return $this->createForNamespace($namespace, file_get_contents($fileName));
+ }
+
+ return new Context($namespace, []);
+ }
+
+ /**
+ * Build a Context for a namespace in the provided file contents.
+ *
+ * @param string $namespace It does not matter if a `\` precedes the namespace name, this method first normalizes.
+ * @param string $fileContents the file's contents to retrieve the aliases from with the given namespace.
+ *
+ * @see Context for more information on Contexts.
+ *
+ * @return Context
+ */
+ public function createForNamespace($namespace, $fileContents)
+ {
+ $namespace = trim($namespace, '\\');
+ $useStatements = [];
+ $currentNamespace = '';
+ $tokens = new \ArrayIterator(token_get_all($fileContents));
+
+ while ($tokens->valid()) {
+ switch ($tokens->current()[0]) {
+ case T_NAMESPACE:
+ $currentNamespace = $this->parseNamespace($tokens);
+ break;
+ case T_CLASS:
+ // Fast-forward the iterator through the class so that any
+ // T_USE tokens found within are skipped - these are not
+ // valid namespace use statements so should be ignored.
+ $braceLevel = 0;
+ $firstBraceFound = false;
+ while ($tokens->valid() && ($braceLevel > 0 || !$firstBraceFound)) {
+ if ($tokens->current() === '{'
+ || $tokens->current()[0] === T_CURLY_OPEN
+ || $tokens->current()[0] === T_DOLLAR_OPEN_CURLY_BRACES) {
+ if (!$firstBraceFound) {
+ $firstBraceFound = true;
+ }
+ $braceLevel++;
+ }
+
+ if ($tokens->current() === '}') {
+ $braceLevel--;
+ }
+ $tokens->next();
+ }
+ break;
+ case T_USE:
+ if ($currentNamespace === $namespace) {
+ $useStatements = array_merge($useStatements, $this->parseUseStatement($tokens));
+ }
+ break;
+ }
+ $tokens->next();
+ }
+
+ return new Context($namespace, $useStatements);
+ }
+
+ /**
+ * Deduce the name from tokens when we are at the T_NAMESPACE token.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return string
+ */
+ private function parseNamespace(\ArrayIterator $tokens)
+ {
+ // skip to the first string or namespace separator
+ $this->skipToNextStringOrNamespaceSeparator($tokens);
+
+ $name = '';
+ while ($tokens->valid() && ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR)
+ ) {
+ $name .= $tokens->current()[1];
+ $tokens->next();
+ }
+
+ return $name;
+ }
+
+ /**
+ * Deduce the names of all imports when we are at the T_USE token.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return string[]
+ */
+ private function parseUseStatement(\ArrayIterator $tokens)
+ {
+ $uses = [];
+ $continue = true;
+
+ while ($continue) {
+ $this->skipToNextStringOrNamespaceSeparator($tokens);
+
+ list($alias, $fqnn) = $this->extractUseStatement($tokens);
+ $uses[$alias] = $fqnn;
+ if ($tokens->current()[0] === self::T_LITERAL_END_OF_USE) {
+ $continue = false;
+ }
+ }
+
+ return $uses;
+ }
+
+ /**
+ * Fast-forwards the iterator as longs as we don't encounter a T_STRING or T_NS_SEPARATOR token.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return void
+ */
+ private function skipToNextStringOrNamespaceSeparator(\ArrayIterator $tokens)
+ {
+ while ($tokens->valid() && ($tokens->current()[0] !== T_STRING) && ($tokens->current()[0] !== T_NS_SEPARATOR)) {
+ $tokens->next();
+ }
+ }
+
+ /**
+ * Deduce the namespace name and alias of an import when we are at the T_USE token or have not reached the end of
+ * a USE statement yet.
+ *
+ * @param \ArrayIterator $tokens
+ *
+ * @return string
+ */
+ private function extractUseStatement(\ArrayIterator $tokens)
+ {
+ $result = [''];
+ while ($tokens->valid()
+ && ($tokens->current()[0] !== self::T_LITERAL_USE_SEPARATOR)
+ && ($tokens->current()[0] !== self::T_LITERAL_END_OF_USE)
+ ) {
+ if ($tokens->current()[0] === T_AS) {
+ $result[] = '';
+ }
+ if ($tokens->current()[0] === T_STRING || $tokens->current()[0] === T_NS_SEPARATOR) {
+ $result[count($result) - 1] .= $tokens->current()[1];
+ }
+ $tokens->next();
+ }
+
+ if (count($result) == 1) {
+ $backslashPos = strrpos($result[0], '\\');
+
+ if (false !== $backslashPos) {
+ $result[] = substr($result[0], $backslashPos + 1);
+ } else {
+ $result[] = $result[0];
+ }
+ }
+
+ return array_reverse($result);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Float_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Float_.php
new file mode 100644
index 0000000..e58d896
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Float_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a Float.
+ */
+final class Float_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'float';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Integer.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Integer.php
new file mode 100644
index 0000000..be4555e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Integer.php
@@ -0,0 +1,28 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+final class Integer implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'int';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php
new file mode 100644
index 0000000..79695f4
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Mixed.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing an unknown, or mixed, type.
+ */
+final class Mixed implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'mixed';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Null_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Null_.php
new file mode 100644
index 0000000..203b422
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Null_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing a null value or type.
+ */
+final class Null_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'null';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Object_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Object_.php
new file mode 100644
index 0000000..b337c71
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Object_.php
@@ -0,0 +1,70 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Fqsen;
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing an object.
+ *
+ * An object can be either typed or untyped. When an object is typed it means that it has an identifier, the FQSEN,
+ * pointing to an element in PHP. Object types that are untyped do not refer to a specific class but represent objects
+ * in general.
+ */
+final class Object_ implements Type
+{
+ /** @var Fqsen|null */
+ private $fqsen;
+
+ /**
+ * Initializes this object with an optional FQSEN, if not provided this object is considered 'untyped'.
+ *
+ * @param Fqsen $fqsen
+ */
+ public function __construct(Fqsen $fqsen = null)
+ {
+ if (strpos((string)$fqsen, '::') !== false || strpos((string)$fqsen, '()') !== false) {
+ throw new \InvalidArgumentException(
+ 'Object types can only refer to a class, interface or trait but a method, function, constant or '
+ . 'property was received: ' . (string)$fqsen
+ );
+ }
+
+ $this->fqsen = $fqsen;
+ }
+
+ /**
+ * Returns the FQSEN associated with this object.
+ *
+ * @return Fqsen|null
+ */
+ public function getFqsen()
+ {
+ return $this->fqsen;
+ }
+
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ if ($this->fqsen) {
+ return (string)$this->fqsen;
+ }
+
+ return 'object';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Resource.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Resource.php
new file mode 100644
index 0000000..2c2526b
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Resource.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'resource' Type.
+ */
+final class Resource implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'resource';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php
new file mode 100644
index 0000000..1e2a660
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Scalar.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'scalar' pseudo-type, which is either a string, integer, float or boolean.
+ */
+final class Scalar implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'scalar';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Self_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Self_.php
new file mode 100644
index 0000000..1ba3fc5
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Self_.php
@@ -0,0 +1,33 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'self' type.
+ *
+ * Self, as a Type, represents the class in which the associated element was defined.
+ */
+final class Self_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'self';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Static_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Static_.php
new file mode 100644
index 0000000..9eb6729
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Static_.php
@@ -0,0 +1,38 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the 'static' type.
+ *
+ * Self, as a Type, represents the class in which the associated element was called. This differs from self as self does
+ * not take inheritance into account but static means that the return type is always that of the class of the called
+ * element.
+ *
+ * See the documentation on late static binding in the PHP Documentation for more information on the difference between
+ * static and self.
+ */
+final class Static_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'static';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/String_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/String_.php
new file mode 100644
index 0000000..8db5968
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/String_.php
@@ -0,0 +1,31 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the type 'string'.
+ */
+final class String_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'string';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/This.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/This.php
new file mode 100644
index 0000000..c098a93
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/This.php
@@ -0,0 +1,34 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the '$this' pseudo-type.
+ *
+ * $this, as a Type, represents the instance of the class associated with the element as it was called. $this is
+ * commonly used when documenting fluent interfaces since it represents that the same object is returned.
+ */
+final class This implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return '$this';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Void_.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Void_.php
new file mode 100644
index 0000000..3d1be27
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/src/Types/Void_.php
@@ -0,0 +1,34 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use phpDocumentor\Reflection\Type;
+
+/**
+ * Value Object representing the pseudo-type 'void'.
+ *
+ * Void is generally only used when working with return types as it signifies that the method intentionally does not
+ * return any value.
+ */
+final class Void_ implements Type
+{
+ /**
+ * Returns a rendered output of the Type as it would be used in a DocBlock.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return 'void';
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php
new file mode 100644
index 0000000..f226f8e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/TypeResolverTest.php
@@ -0,0 +1,395 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection;
+
+use Mockery as m;
+use phpDocumentor\Reflection\Types\Array_;
+use phpDocumentor\Reflection\Types\Compound;
+use phpDocumentor\Reflection\Types\Context;
+use phpDocumentor\Reflection\Types\Object_;
+
+/**
+ * @coversDefaultClass phpDocumentor\Reflection\TypeResolver
+ */
+class TypeResolverTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @param string $keyword
+ * @param string $expectedClass
+ *
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\Object_
+ *
+ * @dataProvider provideKeywords
+ */
+ public function testResolvingKeywords($keyword, $expectedClass)
+ {
+ $fixture = new TypeResolver();
+
+ $resolvedType = $fixture->resolve($keyword, new Context(''));
+
+ $this->assertInstanceOf($expectedClass, $resolvedType);
+ }
+
+ /**
+ * @param string $fqsen
+ *
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ *
+ * @dataProvider provideFqcn
+ */
+ public function testResolvingFQSENs($fqsen)
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Object_ $resolvedType */
+ $resolvedType = $fixture->resolve($fqsen, new Context(''));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
+ $this->assertSame($fqsen, (string)$resolvedType);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingRelativeQSENsBasedOnNamespace()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Object_ $resolvedType */
+ $resolvedType = $fixture->resolve('DocBlock', new Context('phpDocumentor\Reflection'));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
+ $this->assertSame('\phpDocumentor\Reflection\DocBlock', (string)$resolvedType);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingRelativeQSENsBasedOnNamespaceAlias()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Object_ $resolvedType */
+ $resolvedType = $fixture->resolve(
+ 'm\MockInterface',
+ new Context('phpDocumentor\Reflection', ['m' => '\Mockery'])
+ );
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $resolvedType->getFqsen());
+ $this->assertSame('\Mockery\MockInterface', (string)$resolvedType);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\String_
+ */
+ public function testResolvingTypedArrays()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Array_ $resolvedType */
+ $resolvedType = $fixture->resolve('string[]', new Context(''));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType);
+ $this->assertSame('string[]', (string)$resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $resolvedType->getValueType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\String_
+ */
+ public function testResolvingNestedTypedArrays()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Array_ $resolvedType */
+ $resolvedType = $fixture->resolve('string[][]', new Context(''));
+
+ /** @var Array_ $childValueType */
+ $childValueType = $resolvedType->getValueType();
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $resolvedType);
+
+ $this->assertSame('string[][]', (string)$resolvedType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType->getKeyType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $childValueType);
+
+ $this->assertSame('string[]', (string)$childValueType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $childValueType->getKeyType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $childValueType->getValueType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Compound
+ * @uses phpDocumentor\Reflection\Types\String_
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingCompoundTypes()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Compound $resolvedType */
+ $resolvedType = $fixture->resolve('string|Reflection\DocBlock', new Context('phpDocumentor'));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
+ $this->assertSame('string|\phpDocumentor\Reflection\DocBlock', (string)$resolvedType);
+
+ /** @var String $secondType */
+ $firstType = $resolvedType->get(0);
+
+ /** @var Object_ $secondType */
+ $secondType = $resolvedType->get(1);
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $firstType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Fqsen', $secondType->getFqsen());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Compound
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\Object_
+ * @uses phpDocumentor\Reflection\Fqsen
+ * @uses phpDocumentor\Reflection\FqsenResolver
+ */
+ public function testResolvingCompoundTypedArrayTypes()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Compound $resolvedType */
+ $resolvedType = $fixture->resolve('\stdClass[]|Reflection\DocBlock[]', new Context('phpDocumentor'));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
+ $this->assertSame('\stdClass[]|\phpDocumentor\Reflection\DocBlock[]', (string)$resolvedType);
+
+ /** @var Array_ $secondType */
+ $firstType = $resolvedType->get(0);
+
+ /** @var Array_ $secondType */
+ $secondType = $resolvedType->get(1);
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $firstType->getValueType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Object_', $secondType->getValueType());
+ }
+
+ /**
+ * This test asserts that the parameter order is correct.
+ *
+ * When you pass two arrays separated by the compound operator (i.e. 'integer[]|string[]') then we always split the
+ * expression in its compound parts and then we parse the types with the array operators. If we were to switch the
+ * order around then 'integer[]|string[]' would read as an array of string or integer array; which is something
+ * other than what we intend.
+ *
+ * @covers ::__construct
+ * @covers ::resolve
+ * @covers ::
+ *
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @uses phpDocumentor\Reflection\Types\Compound
+ * @uses phpDocumentor\Reflection\Types\Array_
+ * @uses phpDocumentor\Reflection\Types\Integer
+ * @uses phpDocumentor\Reflection\Types\String_
+ */
+ public function testResolvingCompoundTypesWithTwoArrays()
+ {
+ $fixture = new TypeResolver();
+
+ /** @var Compound $resolvedType */
+ $resolvedType = $fixture->resolve('integer[]|string[]', new Context(''));
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Compound', $resolvedType);
+ $this->assertSame('int[]|string[]', (string)$resolvedType);
+
+ /** @var Array_ $firstType */
+ $firstType = $resolvedType->get(0);
+
+ /** @var Array_ $secondType */
+ $secondType = $resolvedType->get(1);
+
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $firstType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Integer', $firstType->getValueType());
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\Array_', $secondType);
+ $this->assertInstanceOf('phpDocumentor\Reflection\Types\String_', $secondType->getValueType());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addKeyword
+ * @uses phpDocumentor\Reflection\TypeResolver::resolve
+ * @uses phpDocumentor\Reflection\TypeResolver::
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testAddingAKeyword()
+ {
+ // Assign
+ $typeMock = m::mock(Type::class);
+
+ // Act
+ $fixture = new TypeResolver();
+ $fixture->addKeyword('mock', get_class($typeMock));
+
+ // Assert
+ $result = $fixture->resolve('mock', new Context(''));
+ $this->assertInstanceOf(get_class($typeMock), $result);
+ $this->assertNotSame($typeMock, $result);
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addKeyword
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @expectedException \InvalidArgumentException
+ */
+ public function testAddingAKeywordFailsIfTypeClassDoesNotExist()
+ {
+ $fixture = new TypeResolver();
+ $fixture->addKeyword('mock', 'IDoNotExist');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::addKeyword
+ * @uses phpDocumentor\Reflection\Types\Context
+ * @expectedException \InvalidArgumentException
+ */
+ public function testAddingAKeywordFailsIfTypeClassDoesNotImplementTypeInterface()
+ {
+ $fixture = new TypeResolver();
+ $fixture->addKeyword('mock', 'stdClass');
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @uses phpDocumentor\Reflection\Types\Context
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTypeIsEmpty()
+ {
+ $fixture = new TypeResolver();
+ $fixture->resolve(' ', new Context(''));
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::resolve
+ * @uses phpDocumentor\Reflection\Types\Context
+ *
+ * @expectedException \InvalidArgumentException
+ */
+ public function testExceptionIsThrownIfTypeIsNotAString()
+ {
+ $fixture = new TypeResolver();
+ $fixture->resolve(['a'], new Context(''));
+ }
+
+ /**
+ * Returns a list of keywords and expected classes that are created from them.
+ *
+ * @return string[][]
+ */
+ public function provideKeywords()
+ {
+ return [
+ ['string', 'phpDocumentor\Reflection\Types\String_'],
+ ['int', 'phpDocumentor\Reflection\Types\Integer'],
+ ['integer', 'phpDocumentor\Reflection\Types\Integer'],
+ ['float', 'phpDocumentor\Reflection\Types\Float_'],
+ ['double', 'phpDocumentor\Reflection\Types\Float_'],
+ ['bool', 'phpDocumentor\Reflection\Types\Boolean'],
+ ['boolean', 'phpDocumentor\Reflection\Types\Boolean'],
+ ['resource', 'phpDocumentor\Reflection\Types\Resource'],
+ ['null', 'phpDocumentor\Reflection\Types\Null_'],
+ ['callable', 'phpDocumentor\Reflection\Types\Callable_'],
+ ['callback', 'phpDocumentor\Reflection\Types\Callable_'],
+ ['array', 'phpDocumentor\Reflection\Types\Array_'],
+ ['scalar', 'phpDocumentor\Reflection\Types\Scalar'],
+ ['object', 'phpDocumentor\Reflection\Types\Object_'],
+ ['mixed', 'phpDocumentor\Reflection\Types\Mixed'],
+ ['void', 'phpDocumentor\Reflection\Types\Void_'],
+ ['$this', 'phpDocumentor\Reflection\Types\This'],
+ ['static', 'phpDocumentor\Reflection\Types\Static_'],
+ ['self', 'phpDocumentor\Reflection\Types\Self_'],
+ ];
+ }
+
+ /**
+ * Provides a list of FQSENs to test the resolution patterns with.
+ *
+ * @return string[][]
+ */
+ public function provideFqcn()
+ {
+ return [
+ 'namespace' => ['\phpDocumentor\Reflection'],
+ 'class' => ['\phpDocumentor\Reflection\DocBlock'],
+ ];
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php
new file mode 100644
index 0000000..20d63c9
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextFactoryTest.php
@@ -0,0 +1,188 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types {
+
+// Added imports on purpose as mock for the unit tests, please do not remove.
+ use Mockery as m;
+ use phpDocumentor\Reflection\DocBlock,
+ phpDocumentor\Reflection\DocBlock\Tag;
+ use phpDocumentor;
+ use \ReflectionClass; // yes, the slash is part of the test
+
+ /**
+ * @coversDefaultClass \phpDocumentor\Reflection\Types\ContextFactory
+ * @covers ::
+ */
+ class ContextFactoryTest extends \PHPUnit_Framework_TestCase
+ {
+ /**
+ * @covers ::createFromReflector
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsNamespaceFromClassReflection()
+ {
+ $fixture = new ContextFactory();
+ $context = $fixture->createFromReflector(new ReflectionClass($this));
+
+ $this->assertSame(__NAMESPACE__, $context->getNamespace());
+ }
+
+ /**
+ * @covers ::createFromReflector
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsAliasesFromClassReflection()
+ {
+ $fixture = new ContextFactory();
+ $expected = [
+ 'm' => 'Mockery',
+ 'DocBlock' => 'phpDocumentor\Reflection\DocBlock',
+ 'Tag' => 'phpDocumentor\Reflection\DocBlock\Tag',
+ 'phpDocumentor' => 'phpDocumentor',
+ 'ReflectionClass' => 'ReflectionClass'
+ ];
+ $context = $fixture->createFromReflector(new ReflectionClass($this));
+
+ $this->assertSame($expected, $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsNamespaceFromProvidedNamespaceAndContent()
+ {
+ $fixture = new ContextFactory();
+ $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__));
+
+ $this->assertSame(__NAMESPACE__, $context->getNamespace());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testReadsAliasesFromProvidedNamespaceAndContent()
+ {
+ $fixture = new ContextFactory();
+ $expected = [
+ 'm' => 'Mockery',
+ 'DocBlock' => 'phpDocumentor\Reflection\DocBlock',
+ 'Tag' => 'phpDocumentor\Reflection\DocBlock\Tag',
+ 'phpDocumentor' => 'phpDocumentor',
+ 'ReflectionClass' => 'ReflectionClass'
+ ];
+ $context = $fixture->createForNamespace(__NAMESPACE__, file_get_contents(__FILE__));
+
+ $this->assertSame($expected, $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testTraitUseIsNotDetectedAsNamespaceUse()
+ {
+ $php = "createForNamespace('Foo', $php);
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createForNamespace
+ * @uses phpDocumentor\Reflection\Types\Context
+ */
+ public function testAllOpeningBracesAreCheckedWhenSearchingForEndOfClass()
+ {
+ $php = 'createForNamespace('Foo', $php);
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createFromReflector
+ */
+ public function testEmptyFileName()
+ {
+ $fixture = new ContextFactory();
+ $context = $fixture->createFromReflector(new \ReflectionClass('stdClass'));
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+
+ /**
+ * @covers ::createFromReflector
+ */
+ public function testEvalDClass()
+ {
+ eval(<<createFromReflector(new \ReflectionClass('Foo\Bar'));
+
+ $this->assertSame([], $context->getNamespaceAliases());
+ }
+ }
+}
+
+namespace phpDocumentor\Reflection\Types\Mock {
+ // the following import should not show in the tests above
+ use phpDocumentor\Reflection\DocBlock\Description;
+}
diff --git a/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php
new file mode 100644
index 0000000..165f415
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpdocumentor/type-resolver/tests/unit/Types/ContextTest.php
@@ -0,0 +1,61 @@
+
+ * @license http://www.opensource.org/licenses/mit-license.php MIT
+ * @link http://phpdoc.org
+ */
+
+namespace phpDocumentor\Reflection\Types;
+
+use Mockery as m;
+
+/**
+ * @coversDefaultClass \phpDocumentor\Reflection\Types\Context
+ */
+class ContextTest extends \PHPUnit_Framework_TestCase
+{
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespace
+ */
+ public function testProvidesANormalizedNamespace()
+ {
+ $fixture = new Context('\My\Space');
+ $this->assertSame('My\Space', $fixture->getNamespace());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespace
+ */
+ public function testInterpretsNamespaceNamedGlobalAsRootNamespace()
+ {
+ $fixture = new Context('global');
+ $this->assertSame('', $fixture->getNamespace());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespace
+ */
+ public function testInterpretsNamespaceNamedDefaultAsRootNamespace()
+ {
+ $fixture = new Context('default');
+ $this->assertSame('', $fixture->getNamespace());
+ }
+
+ /**
+ * @covers ::__construct
+ * @covers ::getNamespaceAliases
+ */
+ public function testProvidesNormalizedNamespaceAliases()
+ {
+ $fixture = new Context('', ['Space' => '\My\Space']);
+ $this->assertSame(['Space' => 'My\Space'], $fixture->getNamespaceAliases());
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/.gitignore b/packages/jai/Contact/vendor/phpspec/prophecy/.gitignore
new file mode 100644
index 0000000..0c93fcf
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/.gitignore
@@ -0,0 +1,4 @@
+*.tgz
+*.phar
+/composer.lock
+/vendor
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/.travis.yml b/packages/jai/Contact/vendor/phpspec/prophecy/.travis.yml
new file mode 100644
index 0000000..e75c39e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/.travis.yml
@@ -0,0 +1,29 @@
+language: php
+
+php: [5.3, 5.4, 5.5, 5.6, 7.0, hhvm]
+
+sudo: false
+
+cache:
+ directories:
+ - $HOME/.composer/cache
+
+branches:
+ except:
+ - /^bugfix\/.*$/
+ - /^feature\/.*$/
+ - /^optimization\/.*$/
+
+matrix:
+ fast_finish: true
+ include:
+ - php: '7.0'
+ env: PHPDOCUMENTOR_REFLECTION_DOCBLOCK="^2.0"
+
+before_script:
+ - if [ -n "$PHPDOCUMENTOR_REFLECTION_DOCBLOCK" ]; then
+ composer require "phpdocumentor/reflection-docblock:${PHPDOCUMENTOR_REFLECTION_DOCBLOCK}" --no-update;
+ fi;
+ - travis_retry composer update --no-interaction
+
+script: vendor/bin/phpspec run -fpretty -v
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/CHANGES.md b/packages/jai/Contact/vendor/phpspec/prophecy/CHANGES.md
new file mode 100644
index 0000000..444c1fa
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/CHANGES.md
@@ -0,0 +1,147 @@
+1.6.1 / 2016-06-07
+==================
+
+ * Ignored empty method names in invalid `@method` phpdoc
+ * Fixed the mocking of SplFileObject
+ * Added compatibility with phpdocumentor/reflection-docblock 3
+
+1.6.0 / 2016-02-15
+==================
+
+ * Add Variadics support (thanks @pamil)
+ * Add ProphecyComparator for comparing objects that need revealing (thanks @jon-acker)
+ * Add ApproximateValueToken (thanks @dantleech)
+ * Add support for 'self' and 'parent' return type (thanks @bendavies)
+ * Add __invoke to allowed reflectable methods list (thanks @ftrrtf)
+ * Updated ExportUtil to reflect the latest changes by Sebastian (thanks @jakari)
+ * Specify the required php version for composer (thanks @jakzal)
+ * Exclude 'args' in the generated backtrace (thanks @oradwell)
+ * Fix code generation for scalar parameters (thanks @trowski)
+ * Fix missing sprintf in InvalidArgumentException __construct call (thanks @emmanuelballery)
+ * Fix phpdoc for magic methods (thanks @Tobion)
+ * Fix PhpDoc for interfaces usage (thanks @ImmRanneft)
+ * Prevent final methods from being manually extended (thanks @kamioftea)
+ * Enhance exception for invalid argument to ThrowPromise (thanks @Tobion)
+
+1.5.0 / 2015-04-27
+==================
+
+ * Add support for PHP7 scalar type hints (thanks @trowski)
+ * Add support for PHP7 return types (thanks @trowski)
+ * Update internal test suite to support PHP7
+
+1.4.1 / 2015-04-27
+==================
+
+ * Fixed bug in closure-based argument tokens (#181)
+
+1.4.0 / 2015-03-27
+==================
+
+ * Fixed errors in return type phpdocs (thanks @sobit)
+ * Fixed stringifying of hash containing one value (thanks @avant1)
+ * Improved clarity of method call expectation exception (thanks @dantleech)
+ * Add ability to specify which argument is returned in willReturnArgument (thanks @coderbyheart)
+ * Add more information to MethodNotFound exceptions (thanks @ciaranmcnulty)
+ * Support for mocking classes with methods that return references (thanks @edsonmedina)
+ * Improved object comparison (thanks @whatthejeff)
+ * Adopted '^' in composer dependencies (thanks @GrahamCampbell)
+ * Fixed non-typehinted arguments being treated as optional (thanks @whatthejeff)
+ * Magic methods are now filtered for keywords (thanks @seagoj)
+ * More readable errors for failure when expecting single calls (thanks @dantleech)
+
+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/packages/jai/Contact/vendor/phpspec/prophecy/CONTRIBUTING.md b/packages/jai/Contact/vendor/phpspec/prophecy/CONTRIBUTING.md
new file mode 100644
index 0000000..72d8e93
--- /dev/null
+++ b/packages/jai/Contact/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 these 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 --prefer-dist
+$> vendor/bin/phpspec run
+```
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/LICENSE b/packages/jai/Contact/vendor/phpspec/prophecy/LICENSE
new file mode 100644
index 0000000..c8b3647
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/README.md b/packages/jai/Contact/vendor/phpspec/prophecy/README.md
new file mode 100644
index 0000000..65ec16c
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/README.md
@@ -0,0 +1,391 @@
+# Prophecy
+
+[![Stable release](https://poser.pugx.org/phpspec/prophecy/version.svg)](https://packagist.org/packages/phpspec/prophecy)
+[![Build Status](https://travis-ci.org/phpspec/prophecy.svg?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($index)` - returns the nth 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
+- `StringContainsToken` or `Argument::containingString($value)` - checks that the argument contains a specific string value
+
+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/packages/jai/Contact/vendor/phpspec/prophecy/composer.json b/packages/jai/Contact/vendor/phpspec/prophecy/composer.json
new file mode 100644
index 0000000..23131b2
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "phpspec/prophecy",
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "keywords": ["Mock", "Stub", "Dummy", "Double", "Fake", "Spy"],
+ "homepage": "https://github.com/phpspec/prophecy",
+ "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": {
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1",
+ "doctrine/instantiator": "^1.0.2",
+ "sebastian/recursion-context": "^1.0"
+ },
+
+ "require-dev": {
+ "phpspec/phpspec": "^2.0"
+ },
+
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
new file mode 100644
index 0000000..5d6a2da
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/ArgumentsWildcardSpec.php
@@ -0,0 +1,146 @@
+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');
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $token
+ */
+ function it_exposes_list_of_tokens($token)
+ {
+ $this->beConstructedWith(array($token));
+
+ $this->getTokens()->shouldReturn(array($token));
+ }
+
+ 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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValueTokenSpec.php
new file mode 100644
index 0000000..a43e923
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/AnyValuesTokenSpec.php
new file mode 100644
index 0000000..c29076f
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
new file mode 100644
index 0000000..8799d6d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ApproximateValueTokenSpec.php
@@ -0,0 +1,55 @@
+beConstructedWith(10.12345678, 4);
+ }
+
+ function it_is_initializable()
+ {
+ $this->shouldHaveType('Prophecy\Argument\Token\ApproximateValueToken');
+ }
+
+ function it_implements_TokenInterface()
+ {
+ $this->shouldBeAnInstanceOf('Prophecy\Argument\Token\TokenInterface');
+ }
+
+ function it_is_not_last()
+ {
+ $this->shouldNotBeLast();
+ }
+
+ function it_scores_10_if_rounded_argument_matches_rounded_value()
+ {
+ $this->scoreArgument(10.12345)->shouldReturn(10);
+ }
+
+ function it_does_not_score_if_rounded_argument_does_not_match_rounded_value()
+ {
+ $this->scoreArgument(10.1234)->shouldReturn(false);
+ }
+
+ function it_uses_a_default_precision_of_zero()
+ {
+ $this->beConstructedWith(10.7);
+ $this->scoreArgument(11.4)->shouldReturn(10);
+ }
+
+ function it_does_not_score_if_rounded_argument_is_not_numeric()
+ {
+ $this->scoreArgument('hello')->shouldReturn(false);
+ }
+
+ function it_has_simple_string_representation()
+ {
+ $this->__toString()->shouldBe('≅10.1235');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayCountTokenSpec.php
new file mode 100644
index 0000000..5d040d5
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEntryTokenSpec.php
new file mode 100644
index 0000000..8ff0f15
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ArrayEveryEntryTokenSpec.php
new file mode 100644
index 0000000..8662e7d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/CallbackTokenSpec.php
new file mode 100644
index 0000000..4395bf0
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
new file mode 100644
index 0000000..9e46e02
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ExactValueTokenSpec.php
@@ -0,0 +1,155 @@
+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 ExactValueTokenFixtureB('ABC');
+ $value2 = new ExactValueTokenFixtureB('CBA');
+
+ $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))");
+ }
+}
+
+class ExactValueTokenFixtureA
+{
+ public $errors;
+}
+
+class ExactValueTokenFixtureB extends ExactValueTokenFixtureA
+{
+ public $errors;
+ public $value = null;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/IdenticalValueTokenSpec.php
new file mode 100644
index 0000000..00c3a21
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalAndTokenSpec.php
new file mode 100644
index 0000000..bb5e384
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/LogicalNotTokenSpec.php
new file mode 100644
index 0000000..7ce7f3d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
new file mode 100644
index 0000000..a783a15
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/ObjectStateTokenSpec.php
@@ -0,0 +1,101 @@
+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);
+ }
+
+ function it_does_not_score_if_argument_method_state_does_not_match()
+ {
+ $value = new ObjectStateTokenFixtureB('ABC');
+ $value2 = new ObjectStateTokenFixtureB('CBA');
+
+ $this->beConstructedWith('getSelf', $value);
+ $this->scoreArgument($value2)->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\ObjectStateTokenFixtureA $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")');
+ }
+}
+
+class ObjectStateTokenFixtureA
+{
+ public $errors;
+}
+
+class ObjectStateTokenFixtureB extends ObjectStateTokenFixtureA
+{
+ public $errors;
+ public $value = null;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+
+ public function getSelf()
+ {
+ return $this;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/StringContainsTokenSpec.php
new file mode 100644
index 0000000..c7fd265
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
new file mode 100644
index 0000000..ae3e26e
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Argument/Token/TypeTokenSpec.php
@@ -0,0 +1,62 @@
+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)');
+ }
+
+ /**
+ * @param \Prophecy\Argument\Token\TokenInterface $interface
+ */
+ function it_scores_5_if_argument_is_an_instance_of_specified_interface($interface)
+ {
+ $this->beConstructedWith('Prophecy\Argument\Token\TokenInterface');
+
+ $this->scoreArgument($interface)->shouldReturn(5);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
new file mode 100644
index 0000000..64232a4
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/ArgumentSpec.php
@@ -0,0 +1,107 @@
+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');
+ }
+
+ function it_has_a_shortcut_for_approximate_token()
+ {
+ $token = $this->approximate(10);
+ $token->shouldBeAnInstanceOf('Prophecy\Argument\Token\ApproximateValueToken');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
new file mode 100644
index 0000000..acf8d78
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Call/CallCenterSpec.php
@@ -0,0 +1,195 @@
+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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Call/CallSpec.php
new file mode 100644
index 0000000..d1a8539
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
new file mode 100644
index 0000000..c174e73
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ClosureComparatorSpec.php
@@ -0,0 +1,39 @@
+shouldHaveType('SebastianBergmann\Comparator\Comparator');
+ }
+
+ function it_accepts_only_closures()
+ {
+ $this->accepts(123, 321)->shouldReturn(false);
+ $this->accepts('string', 'string')->shouldReturn(false);
+ $this->accepts(false, true)->shouldReturn(false);
+ $this->accepts(true, false)->shouldReturn(false);
+ $this->accepts((object)array(), (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, (object)array())->shouldReturn(false);
+
+ $this->accepts(function(){}, function(){})->shouldReturn(true);
+ }
+
+ function it_asserts_that_all_closures_are_different()
+ {
+ $this->shouldThrow()->duringAssertEquals(function(){}, function(){});
+ }
+
+ function it_asserts_that_all_closures_are_different_even_if_its_the_same_closure()
+ {
+ $closure = function(){};
+
+ $this->shouldThrow()->duringAssertEquals($closure, $closure);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
new file mode 100644
index 0000000..6b13336
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/FactorySpec.php
@@ -0,0 +1,20 @@
+shouldHaveType('SebastianBergmann\Comparator\Factory');
+ }
+
+ function it_should_have_ClosureComparator_registered()
+ {
+ $comparator = $this->getInstance()->getComparatorFor(function(){}, function(){});
+ $comparator->shouldHaveType('Prophecy\Comparator\ClosureComparator');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
new file mode 100644
index 0000000..06bf6f1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Comparator/ProphecyComparatorSpec.php
@@ -0,0 +1,39 @@
+shouldHaveType('SebastianBergmann\Comparator\ObjectComparator');
+ }
+
+ function it_accepts_only_prophecy_objects()
+ {
+ $this->accepts(123, 321)->shouldReturn(false);
+ $this->accepts('string', 'string')->shouldReturn(false);
+ $this->accepts(false, true)->shouldReturn(false);
+ $this->accepts(true, false)->shouldReturn(false);
+ $this->accepts((object)array(), (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, (object)array())->shouldReturn(false);
+ $this->accepts(function(){}, function(){})->shouldReturn(false);
+
+ $prophet = new Prophet();
+ $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
+
+ $this->accepts($prophecy, $prophecy)->shouldReturn(true);
+ }
+
+ function it_asserts_that_an_object_is_equal_to_its_revealed_prophecy()
+ {
+ $prophet = new Prophet();
+ $prophecy = $prophet->prophesize('Prophecy\Prophecy\ObjectProphecy');
+
+ $this->shouldNotThrow()->duringAssertEquals($prophecy->reveal(), $prophecy);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/DisableConstructorPatchSpec.php
new file mode 100644
index 0000000..2d7d934
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/HhvmExceptionPatchSpec.php
new file mode 100644
index 0000000..8c348b8
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
new file mode 100644
index 0000000..200d961
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/KeywordPatchSpec.php
@@ -0,0 +1,44 @@
+shouldBeAnInstanceOf('Prophecy\Doubler\ClassPatch\ClassPatchInterface');
+ }
+
+ function its_priority_is_49()
+ {
+ $this->getPriority()->shouldReturn(49);
+ }
+
+ /**
+ * @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);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
new file mode 100644
index 0000000..edd8b80
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/MagicCallPatchSpec.php
@@ -0,0 +1,125 @@
+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);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_ignores_empty_methods_from_phpdoc($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiInvalidMethodDefinition');
+
+ $node->addMethod(new MethodNode(''))->shouldNotBeCalled();
+
+ $this->apply($node);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ */
+ function it_discovers_api_using_phpdoc_from_interface($node)
+ {
+ $node->getParentClass()->willReturn('spec\Prophecy\Doubler\ClassPatch\MagicalApiImplemented');
+
+ $node->addMethod(new MethodNode('implementedMethod'))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+
+
+ function it_has_50_priority()
+ {
+ $this->getPriority()->shouldReturn(50);
+ }
+}
+
+/**
+ * @method void undefinedMethod()
+ */
+class MagicalApi
+{
+ /**
+ * @return void
+ */
+ public function definedMethod()
+ {
+
+ }
+}
+
+/**
+ * @method void invalidMethodDefinition
+ * @method void
+ * @method
+ */
+class MagicalApiInvalidMethodDefinition
+{
+}
+
+/**
+ * @method void undefinedMethod()
+ * @method void definedMethod()
+ */
+class MagicalApiExtended extends MagicalApi
+{
+
+}
+
+/**
+ */
+class MagicalApiImplemented implements MagicalApiInterface
+{
+
+}
+
+/**
+ * @method void implementedMethod()
+ */
+interface MagicalApiInterface
+{
+
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ProphecySubjectPatchSpec.php
new file mode 100644
index 0000000..c460814
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatchSpec.php
new file mode 100644
index 0000000..4116e4d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
new file mode 100644
index 0000000..42e854a
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/SplFileInfoPatchSpec.php
@@ -0,0 +1,107 @@
+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);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\ClassNode $node
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_should_supply_a_file_for_a_spl_file_object($node, $method)
+ {
+ $node->hasMethod('__construct')->willReturn(true);
+ $node->getMethod('__construct')->willReturn($method);
+ $node->getParentClass()->willReturn('SplFileObject');
+
+ $method->setCode(Argument::that(function($value) {
+ return strpos($value, '.php') !== false;
+ }))->shouldBeCalled();
+
+ $this->apply($node);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/ClassPatch/TraversablePatchSpec.php
new file mode 100644
index 0000000..2279b72
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/DoublerSpec.php
new file mode 100644
index 0000000..a39fa87
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
new file mode 100644
index 0000000..b083048
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCodeGeneratorSpec.php
@@ -0,0 +1,323 @@
+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, $method3));
+
+ $method1->getName()->willReturn('getName');
+ $method1->getVisibility()->willReturn('public');
+ $method1->returnsReference()->willReturn(false);
+ $method1->isStatic()->willReturn(true);
+ $method1->getArguments()->willReturn(array($argument11, $argument12));
+ $method1->hasReturnType()->willReturn(true);
+ $method1->getReturnType()->willReturn('string');
+ $method1->getCode()->willReturn('return $this->name;');
+
+ $method2->getName()->willReturn('getEmail');
+ $method2->getVisibility()->willReturn('protected');
+ $method2->returnsReference()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method2->getArguments()->willReturn(array($argument21));
+ $method2->hasReturnType()->willReturn(false);
+ $method2->getCode()->willReturn('return $this->email;');
+
+ $method3->getName()->willReturn('getRefValue');
+ $method3->getVisibility()->willReturn('public');
+ $method3->returnsReference()->willReturn(true);
+ $method3->isStatic()->willReturn(false);
+ $method3->getArguments()->willReturn(array($argument31));
+ $method3->hasReturnType()->willReturn(false);
+ $method3->getCode()->willReturn('return $this->refValue;');
+
+ $argument11->getName()->willReturn('fullname');
+ $argument11->getTypeHint()->willReturn('array');
+ $argument11->isOptional()->willReturn(true);
+ $argument11->getDefault()->willReturn(null);
+ $argument11->isPassedByReference()->willReturn(false);
+ $argument11->isVariadic()->willReturn(false);
+
+ $argument12->getName()->willReturn('class');
+ $argument12->getTypeHint()->willReturn('ReflectionClass');
+ $argument12->isOptional()->willReturn(false);
+ $argument12->isPassedByReference()->willReturn(false);
+ $argument12->isVariadic()->willReturn(false);
+
+ $argument21->getName()->willReturn('default');
+ $argument21->getTypeHint()->willReturn('string');
+ $argument21->isOptional()->willReturn(true);
+ $argument21->getDefault()->willReturn('ever.zet@gmail.com');
+ $argument21->isPassedByReference()->willReturn(false);
+ $argument21->isVariadic()->willReturn(false);
+
+ $argument31->getName()->willReturn('refValue');
+ $argument31->getTypeHint()->willReturn(null);
+ $argument31->isOptional()->willReturn(false);
+ $argument31->getDefault()->willReturn();
+ $argument31->isPassedByReference()->willReturn(false);
+ $argument31->isVariadic()->willReturn(false);
+
+ $code = $this->generate('CustomClass', $class);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $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): string {
+return $this->name;
+}
+protected function getEmail(string $default = 'ever.zet@gmail.com') {
+return $this->email;
+}
+public function &getRefValue( $refValue) {
+return $this->refValue;
+}
+
+}
+}
+PHP;
+ } else {
+ $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(\string $default = 'ever.zet@gmail.com') {
+return $this->email;
+}
+public function &getRefValue( $refValue) {
+return $this->refValue;
+}
+
+}
+}
+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 $method1
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method2
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method3
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method4
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument1
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument2
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument3
+ * @param \Prophecy\Doubler\Generator\Node\ArgumentNode $argument4
+ */
+ function it_generates_proper_php_code_for_variadics(
+ $class, $method1, $method2, $method3, $method4, $argument1, $argument2,
+ $argument3, $argument4
+ )
+ {
+ $class->getParentClass()->willReturn('stdClass');
+ $class->getInterfaces()->willReturn(array('Prophecy\Doubler\Generator\MirroredInterface'));
+ $class->getProperties()->willReturn(array());
+ $class->getMethods()->willReturn(array(
+ $method1, $method2, $method3, $method4
+ ));
+
+ $method1->getName()->willReturn('variadic');
+ $method1->getVisibility()->willReturn('public');
+ $method1->returnsReference()->willReturn(false);
+ $method1->isStatic()->willReturn(false);
+ $method1->getArguments()->willReturn(array($argument1));
+ $method1->hasReturnType()->willReturn(false);
+ $method1->getCode()->willReturn('');
+
+ $method2->getName()->willReturn('variadicByRef');
+ $method2->getVisibility()->willReturn('public');
+ $method2->returnsReference()->willReturn(false);
+ $method2->isStatic()->willReturn(false);
+ $method2->getArguments()->willReturn(array($argument2));
+ $method2->hasReturnType()->willReturn(false);
+ $method2->getCode()->willReturn('');
+
+ $method3->getName()->willReturn('variadicWithType');
+ $method3->getVisibility()->willReturn('public');
+ $method3->returnsReference()->willReturn(false);
+ $method3->isStatic()->willReturn(false);
+ $method3->getArguments()->willReturn(array($argument3));
+ $method3->hasReturnType()->willReturn(false);
+ $method3->getCode()->willReturn('');
+
+ $method4->getName()->willReturn('variadicWithTypeByRef');
+ $method4->getVisibility()->willReturn('public');
+ $method4->returnsReference()->willReturn(false);
+ $method4->isStatic()->willReturn(false);
+ $method4->getArguments()->willReturn(array($argument4));
+ $method4->hasReturnType()->willReturn(false);
+ $method4->getCode()->willReturn('');
+
+ $argument1->getName()->willReturn('args');
+ $argument1->getTypeHint()->willReturn(null);
+ $argument1->isOptional()->willReturn(false);
+ $argument1->isPassedByReference()->willReturn(false);
+ $argument1->isVariadic()->willReturn(true);
+
+ $argument2->getName()->willReturn('args');
+ $argument2->getTypeHint()->willReturn(null);
+ $argument2->isOptional()->willReturn(false);
+ $argument2->isPassedByReference()->willReturn(true);
+ $argument2->isVariadic()->willReturn(true);
+
+ $argument3->getName()->willReturn('args');
+ $argument3->getTypeHint()->willReturn('\ReflectionClass');
+ $argument3->isOptional()->willReturn(false);
+ $argument3->isPassedByReference()->willReturn(false);
+ $argument3->isVariadic()->willReturn(true);
+
+ $argument4->getName()->willReturn('args');
+ $argument4->getTypeHint()->willReturn('\ReflectionClass');
+ $argument4->isOptional()->willReturn(false);
+ $argument4->isPassedByReference()->willReturn(true);
+ $argument4->isVariadic()->willReturn(true);
+
+ $code = $this->generate('CustomClass', $class);
+ $expected = <<<'PHP'
+namespace {
+class CustomClass extends \stdClass implements \Prophecy\Doubler\Generator\MirroredInterface {
+
+public function variadic( ...$args) {
+
+}
+public function variadicByRef( &...$args) {
+
+}
+public function variadicWithType(\\ReflectionClass ...$args) {
+
+}
+public function variadicWithTypeByRef(\\ReflectionClass &...$args) {
+
+}
+
+}
+}
+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->hasReturnType()->willReturn(false);
+ $method->returnsReference()->willReturn(false);
+ $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);
+ $argument->isVariadic()->willReturn(false);
+
+ $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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassCreatorSpec.php
new file mode 100644
index 0000000..c7b5700
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php
new file mode 100644
index 0000000..de80448
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/ClassMirrorSpec.php
@@ -0,0 +1,784 @@
+getName()->willReturn('Custom\ClassName');
+ $class->getParentClass()->willReturn($parent);
+ $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
+ ));
+
+ $parent->getName()->willReturn('Custom\ParentClassName');
+
+ $method1->getDeclaringClass()->willReturn($class);
+ $method2->getDeclaringClass()->willReturn($class);
+ $method3->getDeclaringClass()->willReturn($class);
+
+ $method1->getName()->willReturn('getName');
+ $method2->getName()->willReturn('getSelf');
+ $method3->getName()->willReturn('getParent');
+
+ $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->returnsReference()->willReturn(false);
+ $method2->returnsReference()->willReturn(false);
+ $method3->returnsReference()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method1->hasReturnType()->willReturn(true);
+ $method1->getReturnType()->willReturn('string');
+ $method2->hasReturnType()->willReturn(true);
+ $method2->getReturnType()->willReturn('self');
+ $method3->hasReturnType()->willReturn(true);
+ $method3->getReturnType()->willReturn('parent');
+ }
+
+ $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('getSelf')->shouldReturn(true);
+ $classNode->hasMethod('getParent')->shouldReturn(true);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $classNode->getMethod('getName')->getReturnType()->shouldReturn('string');
+ $classNode->getMethod('getSelf')->getReturnType()->shouldReturn('\Custom\ClassName');
+ $classNode->getMethod('getParent')->getReturnType()->shouldReturn('\Custom\ParentClassName');
+ }
+ }
+
+ /**
+ * @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);
+ $method->returnsReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $parameter->getName()->willReturn('...');
+ $parameter->isDefaultValueAvailable()->willReturn(true);
+ $parameter->getDefaultValue()->willReturn(null);
+ $parameter->isPassedByReference()->willReturn(false);
+ $parameter->getClass()->willReturn($class);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $parameter->isVariadic()->willReturn(false);
+ }
+
+ $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');
+ $method->returnsReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $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');
+ $method->returnsReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $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 $constructMethod
+ * @param ReflectionMethod $destructMethod
+ * @param ReflectionMethod $sleepMethod
+ * @param ReflectionMethod $wakeupMethod
+ * @param ReflectionMethod $toStringMethod
+ * @param ReflectionMethod $callMethod
+ * @param ReflectionMethod $invokeMethod
+ */
+ function it_reflects_allowed_magic_methods($class, $constructMethod, $destructMethod, $sleepMethod, $wakeupMethod, $toStringMethod, $callMethod, $invokeMethod)
+ {
+ $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(
+ $constructMethod, $destructMethod, $sleepMethod, $wakeupMethod, $toStringMethod, $callMethod, $invokeMethod
+ ));
+
+ $constructMethod->getName()->willReturn('__construct');
+ $destructMethod->getName()->willReturn('__destruct');
+ $sleepMethod->getName()->willReturn('__sleep');
+ $wakeupMethod->getName()->willReturn('__wakeup');
+ $toStringMethod->getName()->willReturn('__toString');
+ $callMethod->getName()->willReturn('__call');
+ $invokeMethod->getName()->willReturn('__invoke');
+
+ $constructMethod->isFinal()->willReturn(false);
+ $destructMethod->isFinal()->willReturn(false);
+ $sleepMethod->isFinal()->willReturn(false);
+ $wakeupMethod->isFinal()->willReturn(false);
+ $toStringMethod->isFinal()->willReturn(false);
+ $callMethod->isFinal()->willReturn(false);
+ $invokeMethod->isFinal()->willReturn(false);
+
+ $constructMethod->isProtected()->willReturn(false);
+ $destructMethod->isProtected()->willReturn(false);
+ $sleepMethod->isProtected()->willReturn(false);
+ $wakeupMethod->isProtected()->willReturn(false);
+ $toStringMethod->isProtected()->willReturn(false);
+ $callMethod->isProtected()->willReturn(false);
+ $invokeMethod->isProtected()->willReturn(false);
+
+ $constructMethod->isStatic()->willReturn(false);
+ $destructMethod->isStatic()->willReturn(false);
+ $sleepMethod->isStatic()->willReturn(false);
+ $wakeupMethod->isStatic()->willReturn(false);
+ $toStringMethod->isStatic()->willReturn(false);
+ $callMethod->isStatic()->willReturn(false);
+ $invokeMethod->isStatic()->willReturn(false);
+
+ $constructMethod->returnsReference()->willReturn(false);
+ $destructMethod->returnsReference()->willReturn(false);
+ $sleepMethod->returnsReference()->willReturn(false);
+ $wakeupMethod->returnsReference()->willReturn(false);
+ $toStringMethod->returnsReference()->willReturn(false);
+ $callMethod->returnsReference()->willReturn(false);
+ $invokeMethod->returnsReference()->willReturn(false);
+
+ $constructMethod->getParameters()->willReturn(array());
+ $destructMethod->getParameters()->willReturn(array());
+ $sleepMethod->getParameters()->willReturn(array());
+ $wakeupMethod->getParameters()->willReturn(array());
+ $toStringMethod->getParameters()->willReturn(array());
+ $callMethod->getParameters()->willReturn(array());
+ $invokeMethod->getParameters()->willReturn(array());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $constructMethod->hasReturnType()->willReturn(false);
+ $destructMethod->hasReturnType()->willReturn(false);
+ $sleepMethod->hasReturnType()->willReturn(false);
+ $wakeupMethod->hasReturnType()->willReturn(false);
+ $toStringMethod->hasReturnType()->willReturn(false);
+ $callMethod->hasReturnType()->willReturn(false);
+ $invokeMethod->hasReturnType()->willReturn(false);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $classNode->shouldBeAnInstanceOf('Prophecy\Doubler\Generator\Node\ClassNode');
+ $classNode->getParentClass()->shouldReturn('Custom\ClassName');
+
+ $methodNodes = $classNode->getMethods();
+ $methodNodes->shouldHaveCount(7);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ * @param ReflectionParameter $param2
+ * @param ReflectionClass $typeHint
+ * @param ReflectionParameter $param3
+ * @param ReflectionParameter $param4
+ */
+ function it_properly_reads_methods_arguments_with_types(
+ $class, $method, $param1, $param2, $typeHint, $param3, $param4
+ )
+ {
+ $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->returnsReference()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1, $param2, $param3, $param4));
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $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);
+
+ $param4->getName()->willReturn('arg_4');
+ $param4->isArray()->willReturn(false);
+ $param4->getClass()->willReturn($typeHint);
+ $param4->isPassedByReference()->willReturn(false);
+ $param4->allowsNull()->willReturn(true);
+
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param1->isVariadic()->willReturn(false);
+ $param2->isVariadic()->willReturn(false);
+ $param3->isVariadic()->willReturn(false);
+ $param4->isVariadic()->willReturn(true);
+ } else {
+ $param4->isOptional()->willReturn(true);
+ $param4->isDefaultValueAvailable()->willReturn(false);
+ }
+
+ $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);
+ } else {
+ $argNodes[2]->isOptional()->shouldReturn(false);
+ }
+
+ $argNodes[3]->getName()->shouldReturn('arg_4');
+ $argNodes[3]->getTypeHint()->shouldReturn('ArrayAccess');
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $argNodes[3]->isVariadic()->shouldReturn(true);
+ } else {
+ $argNodes[3]->isOptional()->shouldReturn(true);
+ $argNodes[3]->getDefault()->shouldReturn(null);
+ }
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ */
+ function it_marks_required_args_without_types_as_not_optional(
+ $class, $method, $param1
+ )
+ {
+ $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->returnsReference()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1));
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $param1->getName()->willReturn('arg_1');
+ $param1->isArray()->willReturn(false);
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $param1->isCallable()->willReturn(false);
+ }
+ $param1->getClass()->willReturn(null);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $param1->hasType()->willReturn(false);
+ }
+
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param1->isVariadic()->willReturn(false);
+ }
+ $param1->isDefaultValueAvailable()->willReturn(false);
+ $param1->isOptional()->willReturn(false);
+ $param1->isPassedByReference()->willReturn(false);
+ $param1->allowsNull()->willReturn(true);
+ if (defined('HHVM_VERSION')) {
+ $param1->getTypehintText()->willReturn(null);
+ }
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $argNodes = $methodNodes['methodWithArgs']->getArguments();
+
+ $argNodes[0]->isOptional()->shouldReturn(false);
+ }
+
+ /**
+ * @param ReflectionClass $class
+ * @param ReflectionMethod $method
+ * @param ReflectionParameter $param1
+ * @param ReflectionParameter $param2
+ * @param ReflectionParameter $param3
+ * @param ReflectionClass $typeHint
+ */
+ function it_marks_passed_by_reference_args_as_passed_by_reference(
+ $class, $method, $param1, $param2, $param3, $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->returnsReference()->willReturn(false);
+ $method->getParameters()->willReturn(array($param1, $param2, $param3));
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method->hasReturnType()->willReturn(false);
+ }
+
+ $param1->getName()->willReturn('arg_1');
+ $param1->isArray()->willReturn(false);
+ if (version_compare(PHP_VERSION, '5.4', '>=')) {
+ $param1->isCallable()->willReturn(false);
+ }
+ $param1->getClass()->willReturn(null);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param1->isVariadic()->willReturn(false);
+ }
+ $param1->isDefaultValueAvailable()->willReturn(false);
+ $param1->isOptional()->willReturn(true);
+ $param1->isPassedByReference()->willReturn(true);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $param1->hasType()->willReturn(false);
+ }
+
+ $param1->allowsNull()->willReturn(false);
+ if (defined('HHVM_VERSION')) {
+ $param1->getTypehintText()->willReturn(null);
+ }
+
+ $param2->getName()->willReturn('arg2');
+ $param2->isArray()->willReturn(false);
+ $param2->getClass()->willReturn($typeHint);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param2->isVariadic()->willReturn(false);
+ }
+ $param2->isDefaultValueAvailable()->willReturn(false);
+ $param2->isOptional()->willReturn(false);
+ $param2->isPassedByReference()->willReturn(false);
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $param2->hasType()->willReturn(false);
+ }
+
+ $param2->allowsNull()->willReturn(false);
+ $typeHint->getName()->willReturn('ArrayAccess');
+
+ $param3->getName()->willReturn('arg2');
+ $param3->isArray()->willReturn(false);
+ $param3->getClass()->willReturn($typeHint);
+ if (version_compare(PHP_VERSION, '5.6', '>=')) {
+ $param3->isVariadic()->willReturn(true);
+ } else {
+ $param3->isOptional()->willReturn(true);
+ $param3->isDefaultValueAvailable()->willReturn(false);
+ }
+ $param3->isPassedByReference()->willReturn(true);
+ $param3->allowsNull()->willReturn(true);
+
+ $classNode = $this->reflect($class, array());
+ $methodNodes = $classNode->getMethods();
+ $argNodes = $methodNodes['methodWithArgs']->getArguments();
+
+ $argNodes[0]->isPassedByReference()->shouldReturn(true);
+ $argNodes[1]->isPassedByReference()->shouldReturn(false);
+ $argNodes[2]->isPassedByReference()->shouldReturn(true);
+ }
+
+ /**
+ * @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 $class
+ * @param ReflectionMethod $method
+ */
+ function it_marks_final_methods_as_unextendable($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->getUnextendableMethods()->shouldHaveCount(1);
+ $classNode->isExtendable('finalImplementation')->shouldReturn(false);
+ }
+
+ /**
+ * @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->returnsReference()->willReturn(false);
+ $method2->returnsReference()->willReturn(false);
+ $method3->returnsReference()->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());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method1->hasReturnType()->willReturn(false);
+ $method2->hasReturnType()->willReturn(false);
+ $method3->hasReturnType()->willReturn(false);
+ }
+
+ $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->returnsReference()->willReturn(false);
+ $method2->returnsReference()->willReturn(false);
+ $method3->returnsReference()->willReturn(false);
+
+ $method1->getParameters()->willReturn(array());
+ $method2->getParameters()->willReturn(array());
+ $method3->getParameters()->willReturn(array());
+
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $method1->hasReturnType()->willReturn(false);
+ $method2->hasReturnType()->willReturn(false);
+ $method3->hasReturnType()->willReturn(false);
+ }
+
+ $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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
new file mode 100644
index 0000000..2c8d188
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ArgumentNodeSpec.php
@@ -0,0 +1,92 @@
+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_is_not_variadic_by_default()
+ {
+ $this->shouldNotBeVariadic();
+ }
+
+ function it_is_variadic_if_marked()
+ {
+ $this->setAsVariadic();
+ $this->shouldBeVariadic();
+ }
+
+ function it_does_not_have_default_by_default()
+ {
+ $this->shouldNotHaveDefault();
+ }
+
+ function it_does_not_have_default_if_variadic()
+ {
+ $this->setDefault(null);
+ $this->setAsVariadic();
+ $this->shouldNotHaveDefault();
+ }
+
+ function it_does_have_default_if_not_variadic()
+ {
+ $this->setDefault(null);
+ $this->setAsVariadic(false);
+ $this->hasDefault()->shouldReturn(true);
+ }
+
+ 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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
new file mode 100644
index 0000000..be7e102
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/ClassNodeSpec.php
@@ -0,0 +1,200 @@
+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'));
+ }
+
+ function its_has_no_unextendable_methods_by_default()
+ {
+ $this->getUnextendableMethods()->shouldHaveCount(0);
+ }
+
+ function its_addUnextendableMethods_adds_an_unextendable_method()
+ {
+ $this->addUnextendableMethod('testMethod');
+ $this->getUnextendableMethods()->shouldHaveCount(1);
+ }
+
+ function its_methods_are_extendable_by_default()
+ {
+ $this->isExtendable('testMethod')->shouldReturn(true);
+ }
+
+ function its_unextendable_methods_are_not_extendable()
+ {
+ $this->addUnextendableMethod('testMethod');
+ $this->isExtendable('testMethod')->shouldReturn(false);
+ }
+
+ function its_addUnextendableMethods_doesnt_create_duplicates()
+ {
+ $this->addUnextendableMethod('testMethod');
+ $this->addUnextendableMethod('testMethod');
+ $this->getUnextendableMethods()->shouldHaveCount(1);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Generator\Node\MethodNode $method
+ */
+ function it_throws_an_exception_when_adding_a_method_that_isnt_extendable($method)
+ {
+ $this->addUnextendableMethod('testMethod');
+ $method->getName()->willReturn('testMethod');
+
+ $expectedException = new MethodNotExtendableException(
+ "Method `testMethod` is not extendable, so can not be added.",
+ "stdClass",
+ "testMethod"
+ );
+ $this->shouldThrow($expectedException)->duringAddMethod($method);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
new file mode 100644
index 0000000..49bd9f5
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/Generator/Node/MethodNodeSpec.php
@@ -0,0 +1,141 @@
+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_does_not_return_a_reference_by_default()
+ {
+ $this->returnsReference()->shouldReturn(false);
+ }
+
+ function it_should_be_settable_as_returning_a_reference_through_setter()
+ {
+ $this->setReturnsReference();
+ $this->returnsReference()->shouldReturn(true);
+ }
+
+ 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');
+
+ $argument1->isVariadic()->willReturn(false);
+ $argument2->isVariadic()->willReturn(true);
+
+ $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_reference_returning_methods_will_generate_exceptions()
+ {
+ $this->setCode('echo "code";');
+ $this->setReturnsReference();
+ $this->getCode()->shouldReturn("throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), 'getTitle');");
+ }
+
+ 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));
+ }
+
+ function it_does_not_have_return_type_by_default()
+ {
+ $this->hasReturnType()->shouldReturn(false);
+ }
+
+ function it_setReturnType_sets_return_type()
+ {
+ $returnType = 'string';
+
+ $this->setReturnType($returnType);
+
+ $this->hasReturnType()->shouldReturn(true);
+ $this->getReturnType()->shouldReturn($returnType);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/LazyDoubleSpec.php
new file mode 100644
index 0000000..7026126
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Doubler/NameGeneratorSpec.php
new file mode 100644
index 0000000..a3e7491
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Call/UnexpectedCallExceptionSpec.php
new file mode 100644
index 0000000..6fd1a5c
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassCreatorExceptionSpec.php
new file mode 100644
index 0000000..5824138
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassMirrorExceptionSpec.php
new file mode 100644
index 0000000..21e31a3
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/ClassNotFoundExceptionSpec.php
new file mode 100644
index 0000000..251512b
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
new file mode 100644
index 0000000..6fe5a19
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/DoubleExceptionSpec.php
@@ -0,0 +1,14 @@
+shouldBeAnInstanceOf('RuntimeException');
+ $this->shouldBeAnInstanceOf('Prophecy\Exception\Doubler\DoublerException');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/InterfaceNotFoundExceptionSpec.php
new file mode 100644
index 0000000..ad1a439
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.php
new file mode 100644
index 0000000..5028b02
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotExtendableExceptionSpec.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_classname()
+ {
+ $this->getClassName()->shouldReturn('User');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
new file mode 100644
index 0000000..a889dd7
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Doubler/MethodNotFoundExceptionSpec.php
@@ -0,0 +1,40 @@
+beConstructedWith('', 'User', 'getName', array(1, 2, 3));
+ }
+
+ 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');
+ }
+
+ function it_has_an_arguments_list()
+ {
+ $this->getArguments()->shouldReturn(array(1, 2, 3));
+ }
+
+ function it_has_a_default_null_argument_list()
+ {
+ $this->beConstructedWith('', 'User', 'getName');
+ $this->getArguments()->shouldReturn(null);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/AggregateExceptionSpec.php
new file mode 100644
index 0000000..22a5ebd
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/NoCallsExceptionSpec.php
new file mode 100644
index 0000000..473f1a2
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsCountExceptionSpec.php
new file mode 100644
index 0000000..adad975
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prediction/UnexpectedCallsExceptionSpec.php
new file mode 100644
index 0000000..c0fe24d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/MethodProphecyExceptionSpec.php
new file mode 100644
index 0000000..97cf9e1
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Exception/Prophecy/ObjectProphecyExceptionSpec.php
new file mode 100644
index 0000000..bcacfed
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallPredictionSpec.php
new file mode 100644
index 0000000..3da8c59
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallTimesPredictionSpec.php
new file mode 100644
index 0000000..c670892
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/CallbackPredictionSpec.php
new file mode 100644
index 0000000..7fe475e
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prediction/NoCallsPredictionSpec.php
new file mode 100644
index 0000000..a3ef9bc
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/CallbackPromiseSpec.php
new file mode 100644
index 0000000..5d99b1b
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
new file mode 100644
index 0000000..4acb7bb
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnArgumentPromiseSpec.php
@@ -0,0 +1,41 @@
+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);
+ }
+
+ /**
+ * @param \Prophecy\Prophecy\ObjectProphecy $object
+ * @param \Prophecy\Prophecy\MethodProphecy $method
+ */
+ function it_should_return_nth_argument_if_provided($object, $method)
+ {
+ $this->beConstructedWith(1);
+ $this->execute(array('one', 'two'), $object, $method)->shouldReturn('two');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/ReturnPromiseSpec.php
new file mode 100644
index 0000000..18bfd87
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Promise/ThrowPromiseSpec.php
new file mode 100644
index 0000000..5f44897
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
new file mode 100644
index 0000000..41ee8cd
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/MethodProphecySpec.php
@@ -0,0 +1,384 @@
+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)
+ );
+ }
+
+ /**
+ * @param ClassWithFinalMethod $subject
+ */
+ function its_constructor_throws_MethodProphecyException_for_final_methods($objectProphecy, $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_ReturnArgumentPromise_during_willReturnArgument_call_with_index_argument($objectProphecy)
+ {
+ $objectProphecy->addMethodProphecy($this)->willReturn(null);
+
+ $this->willReturnArgument(1);
+ $promise = $this->getPromise();
+ $promise->shouldBeAnInstanceOf('Prophecy\Promise\ReturnArgumentPromise');
+ $promise->execute(array('one', 'two'), $objectProphecy, $this)->shouldReturn('two');
+ }
+
+ 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);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
new file mode 100644
index 0000000..7e249d9
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/ObjectProphecySpec.php
@@ -0,0 +1,319 @@
+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);
+
+ $value = new ObjectProphecySpecFixtureB('ABC');
+ $value2 = new ObjectProphecySpecFixtureB('CBA');
+
+ $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(1, 2, 3, $value));
+ $methodProphecy2 = $this->getProphecy(1, 2, 3, $value2);
+
+ $methodProphecy2->shouldNotBe($methodProphecy1);
+ }
+
+ /**
+ * @param \Prophecy\Doubler\Doubler $doubler
+ * @param \Prophecy\Prophecy\ProphecySubjectInterface $reflection
+ */
+ function it_returns_new_MethodProphecy_for_all_callback_signatures($doubler, $reflection)
+ {
+ $doubler->double(Argument::any())->willReturn($reflection);
+
+ $this->addMethodProphecy($methodProphecy1 = $this->getProphecy(function(){}));
+ $methodProphecy2 = $this->getProphecy(function(){});
+
+ $methodProphecy2->shouldNotBe($methodProphecy1);
+ }
+}
+
+class ObjectProphecySpecFixtureA
+{
+ public $errors;
+}
+
+class ObjectProphecySpecFixtureB extends ObjectProphecySpecFixtureA
+{
+ public $errors;
+ public $value = null;
+
+ public function __construct($value)
+ {
+ $this->value = $value;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Prophecy/RevealerSpec.php
new file mode 100644
index 0000000..4d83d73
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/ProphetSpec.php
new file mode 100644
index 0000000..74d5976
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
new file mode 100644
index 0000000..a4eef59
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/spec/Prophecy/Util/StringUtilSpec.php
@@ -0,0 +1,97 @@
+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_containing_one_value()
+ {
+ $this->stringify(array('ever' => 'zet'))->shouldReturn('["ever" => "zet"]');
+ }
+
+ 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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument.php
new file mode 100644
index 0000000..fde6aa9
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument.php
@@ -0,0 +1,212 @@
+
+ * 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);
+ }
+
+ /**
+ * Check that argument is same value when rounding to the
+ * given precision.
+ *
+ * @param float $value
+ * @param float $precision
+ *
+ * @return Token\ApproximateValueToken
+ */
+ public static function approximate($value, $precision = 0)
+ {
+ return new Token\ApproximateValueToken($value, $precision);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
new file mode 100644
index 0000000..a088f21
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/ArgumentsWildcard.php
@@ -0,0 +1,101 @@
+
+ * 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;
+ }
+
+ /**
+ * @return array
+ */
+ public function getTokens()
+ {
+ return $this->tokens;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValueToken.php
new file mode 100644
index 0000000..5098811
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/AnyValuesToken.php
new file mode 100644
index 0000000..f76b17b
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.php
new file mode 100644
index 0000000..d4918b1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ApproximateValueToken.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\Argument\Token;
+
+/**
+ * Approximate value token
+ *
+ * @author Daniel Leech
+ */
+class ApproximateValueToken implements TokenInterface
+{
+ private $value;
+ private $precision;
+
+ public function __construct($value, $precision = 0)
+ {
+ $this->value = $value;
+ $this->precision = $precision;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function scoreArgument($argument)
+ {
+ return round($argument, $this->precision) === round($this->value, $this->precision) ? 10 : false;
+ }
+
+ /**
+ * {@inheritdoc}
+ */
+ public function isLast()
+ {
+ return false;
+ }
+
+ /**
+ * Returns string representation for token.
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return sprintf('≅%s', round($this->value, $this->precision));
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayCountToken.php
new file mode 100644
index 0000000..96b4bef
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEntryToken.php
new file mode 100644
index 0000000..0305fc7
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ArrayEveryEntryToken.php
new file mode 100644
index 0000000..5d41fa4
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/CallbackToken.php
new file mode 100644
index 0000000..f45ba20
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
new file mode 100644
index 0000000..aa960f3
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ExactValueToken.php
@@ -0,0 +1,116 @@
+
+ * 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 SebastianBergmann\Comparator\ComparisonFailure;
+use Prophecy\Comparator\Factory as ComparatorFactory;
+use Prophecy\Util\StringUtil;
+
+/**
+ * Exact value token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ExactValueToken implements TokenInterface
+{
+ private $value;
+ private $string;
+ private $util;
+ private $comparatorFactory;
+
+ /**
+ * Initializes token.
+ *
+ * @param mixed $value
+ * @param StringUtil $util
+ * @param ComparatorFactory $comparatorFactory
+ */
+ public function __construct($value, StringUtil $util = null, ComparatorFactory $comparatorFactory = null)
+ {
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil();
+
+ $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
+ }
+
+ /**
+ * Scores 10 if argument matches preset value.
+ *
+ * @param $argument
+ *
+ * @return bool|int
+ */
+ public function scoreArgument($argument)
+ {
+ if (is_object($argument) && is_object($this->value)) {
+ $comparator = $this->comparatorFactory->getComparatorFor(
+ $argument, $this->value
+ );
+
+ try {
+ $comparator->assertEquals($argument, $this->value);
+ return 10;
+ } catch (ComparisonFailure $failure) {}
+ }
+
+ // If either one is an object it should be 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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/IdenticalValueToken.php
new file mode 100644
index 0000000..0b6d23a
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalAndToken.php
new file mode 100644
index 0000000..4ee1b25
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/LogicalNotToken.php
new file mode 100644
index 0000000..623efa5
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
new file mode 100644
index 0000000..8d93bfd
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/ObjectStateToken.php
@@ -0,0 +1,104 @@
+
+ * 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 SebastianBergmann\Comparator\ComparisonFailure;
+use Prophecy\Comparator\Factory as ComparatorFactory;
+use Prophecy\Util\StringUtil;
+
+/**
+ * Object state-checker token.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ObjectStateToken implements TokenInterface
+{
+ private $name;
+ private $value;
+ private $util;
+ private $comparatorFactory;
+
+ /**
+ * Initializes token.
+ *
+ * @param string $methodName
+ * @param mixed $value Expected return value
+ * @param null|StringUtil $util
+ * @param ComparatorFactory $comparatorFactory
+ */
+ public function __construct(
+ $methodName,
+ $value,
+ StringUtil $util = null,
+ ComparatorFactory $comparatorFactory = null
+ ) {
+ $this->name = $methodName;
+ $this->value = $value;
+ $this->util = $util ?: new StringUtil;
+
+ $this->comparatorFactory = $comparatorFactory ?: ComparatorFactory::getInstance();
+ }
+
+ /**
+ * 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));
+
+ $comparator = $this->comparatorFactory->getComparatorFor(
+ $actual, $this->value
+ );
+
+ try {
+ $comparator->assertEquals($actual, $this->value);
+ return 8;
+ } catch (ComparisonFailure $failure) {
+ return 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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/StringContainsToken.php
new file mode 100644
index 0000000..24ff8c2
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TokenInterface.php
new file mode 100644
index 0000000..625d3ba
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Argument/Token/TypeToken.php
new file mode 100644
index 0000000..cb65132
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Call/Call.php
new file mode 100644
index 0000000..2f3fbad
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
new file mode 100644
index 0000000..a1f8c61
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Call/CallCenter.php
@@ -0,0 +1,162 @@
+
+ * 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)
+ {
+ // For efficiency exclude 'args' from the generated backtrace
+ if (PHP_VERSION_ID >= 50400) {
+ // Limit backtrace to last 3 calls as we don't use the rest
+ // Limit argument was introduced in PHP 5.4.0
+ $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 3);
+ } elseif (defined('DEBUG_BACKTRACE_IGNORE_ARGS')) {
+ // DEBUG_BACKTRACE_IGNORE_ARGS was introduced in PHP 5.3.6
+ $backtrace = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS);
+ } else {
+ $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)\n".
+ "on %s was not expected, expected calls were:\n%s",
+
+ $methodName, $argstring, $classname, $expected
+ ),
+ $prophecy, $methodName, $arguments
+ );
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php
new file mode 100644
index 0000000..874e474
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/ClosureComparator.php
@@ -0,0 +1,42 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Comparator;
+
+use SebastianBergmann\Comparator\Comparator;
+use SebastianBergmann\Comparator\ComparisonFailure;
+
+/**
+ * Closure comparator.
+ *
+ * @author Konstantin Kudryashov
+ */
+final class ClosureComparator extends Comparator
+{
+ public function accepts($expected, $actual)
+ {
+ return is_object($expected) && $expected instanceof \Closure
+ && is_object($actual) && $actual instanceof \Closure;
+ }
+
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false)
+ {
+ throw new ComparisonFailure(
+ $expected,
+ $actual,
+ // we don't need a diff
+ '',
+ '',
+ false,
+ 'all closures are born different'
+ );
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php
new file mode 100644
index 0000000..2070db1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/Factory.php
@@ -0,0 +1,47 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Comparator;
+
+use SebastianBergmann\Comparator\Factory as BaseFactory;
+
+/**
+ * Prophecy comparator factory.
+ *
+ * @author Konstantin Kudryashov
+ */
+final class Factory extends BaseFactory
+{
+ /**
+ * @var Factory
+ */
+ private static $instance;
+
+ public function __construct()
+ {
+ parent::__construct();
+
+ $this->register(new ClosureComparator());
+ $this->register(new ProphecyComparator());
+ }
+
+ /**
+ * @return Factory
+ */
+ public static function getInstance()
+ {
+ if (self::$instance === null) {
+ self::$instance = new Factory;
+ }
+
+ return self::$instance;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php
new file mode 100644
index 0000000..298a8e3
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Comparator/ProphecyComparator.php
@@ -0,0 +1,28 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\Comparator;
+
+use Prophecy\Prophecy\ProphecyInterface;
+use SebastianBergmann\Comparator\ObjectComparator;
+
+class ProphecyComparator extends ObjectComparator
+{
+ public function accepts($expected, $actual)
+ {
+ return is_object($expected) && is_object($actual) && $actual instanceof ProphecyInterface;
+ }
+
+ public function assertEquals($expected, $actual, $delta = 0.0, $canonicalize = false, $ignoreCase = false, array &$processed = array())
+ {
+ parent::assertEquals($expected, $actual->reveal(), $delta, $canonicalize, $ignoreCase, $processed);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/CachedDoubler.php
new file mode 100644
index 0000000..d6b6b1a
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ClassPatchInterface.php
new file mode 100644
index 0000000..d6d1968
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/DisableConstructorPatch.php
new file mode 100644
index 0000000..61998fc
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/KeywordPatch.php
new file mode 100644
index 0000000..b0d9793
--- /dev/null
+++ b/packages/jai/Contact/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 49;
+ }
+
+ /**
+ * 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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.php
new file mode 100644
index 0000000..23891c0
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/MagicCallPatch.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;
+use Prophecy\PhpDocumentor\ClassAndInterfaceTagRetriever;
+use Prophecy\PhpDocumentor\MethodTagRetrieverInterface;
+
+/**
+ * Discover Magical API using "@method" PHPDoc format.
+ *
+ * @author Thomas Tourlourat
+ * @author Kévin Dunglas
+ * @author Théo FIDRY
+ */
+class MagicCallPatch implements ClassPatchInterface
+{
+ private $tagRetriever;
+
+ public function __construct(MethodTagRetrieverInterface $tagRetriever = null)
+ {
+ $this->tagRetriever = null === $tagRetriever ? new ClassAndInterfaceTagRetriever() : $tagRetriever;
+ }
+
+ /**
+ * 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);
+
+ $tagList = $this->tagRetriever->getTagList($reflectionClass);
+
+ foreach($tagList as $tag) {
+ $methodName = $tag->getMethodName();
+
+ if (empty($methodName)) {
+ continue;
+ }
+
+ if (!$reflectionClass->hasMethod($methodName)) {
+ $methodNode = new MethodNode($methodName);
+ $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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ProphecySubjectPatch.php
new file mode 100644
index 0000000..ab0bb7c
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/ReflectionClassNewInstancePatch.php
new file mode 100644
index 0000000..9166aee
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
new file mode 100644
index 0000000..eba8298
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/SplFileInfoPatch.php
@@ -0,0 +1,105 @@
+
+ * 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;
+ }
+
+ if ($this->nodeIsSplFileObject($node)) {
+ $constructor->setCode('return parent::__construct("' . __FILE__ .'");');
+
+ 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');
+ }
+
+ /**
+ * @param ClassNode $node
+ * @return boolean
+ */
+ private function nodeIsSplFileObject(ClassNode $node)
+ {
+ $parent = $node->getParentClass();
+
+ return 'SplFileObject' === $parent
+ || is_subclass_of($parent, 'SplFileObject');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/ClassPatch/TraversablePatch.php
new file mode 100644
index 0000000..eea0202
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/DoubleInterface.php
new file mode 100644
index 0000000..699be3a
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Doubler.php
new file mode 100644
index 0000000..a378ae2
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
new file mode 100644
index 0000000..dc03f42
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCodeGenerator.php
@@ -0,0 +1,112 @@
+
+ * 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(%s)%s {\n",
+ $method->getVisibility(),
+ $method->isStatic() ? 'static' : '',
+ $method->returnsReference() ? '&':'',
+ $method->getName(),
+ implode(', ', $this->generateArguments($method->getArguments())),
+ version_compare(PHP_VERSION, '7.0', '>=') && $method->hasReturnType()
+ ? sprintf(': %s', $method->getReturnType())
+ : ''
+ );
+ $php .= $method->getCode()."\n";
+
+ return $php.'}';
+ }
+
+ private function generateArguments(array $arguments)
+ {
+ return array_map(function (Node\ArgumentNode $argument) {
+ $php = '';
+
+ if ($hint = $argument->getTypeHint()) {
+ switch ($hint) {
+ case 'array':
+ case 'callable':
+ $php .= $hint;
+ break;
+
+ case 'string':
+ case 'int':
+ case 'float':
+ case 'bool':
+ if (version_compare(PHP_VERSION, '7.0', '>=')) {
+ $php .= $hint;
+ break;
+ }
+ // Fall-through to default case for PHP 5.x
+
+ default:
+ $php .= '\\'.$hint;
+ }
+ }
+
+ $php .= ' '.($argument->isPassedByReference() ? '&' : '');
+
+ $php .= $argument->isVariadic() ? '...' : '';
+
+ $php .= '$'.$argument->getName();
+
+ if ($argument->isOptional() && !$argument->isVariadic()) {
+ $php .= ' = '.var_export($argument->getDefault(), true);
+ }
+
+ return $php;
+ }, $arguments);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassCreator.php
new file mode 100644
index 0000000..882a4a4
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
new file mode 100644
index 0000000..acdb2c1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ClassMirror.php
@@ -0,0 +1,254 @@
+
+ * 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',
+ '__invoke'
+ );
+
+ /**
+ * 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()) {
+ $node->addUnextendableMethod($method->getName());
+ 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 (true === $method->returnsReference()) {
+ $node->setReturnsReference();
+ }
+
+ if (version_compare(PHP_VERSION, '7.0', '>=') && true === $method->hasReturnType()) {
+ $returnType = (string) $method->getReturnType();
+ $returnTypeLower = strtolower($returnType);
+
+ if ('self' === $returnTypeLower) {
+ $returnType = $method->getDeclaringClass()->getName();
+ }
+ if ('parent' === $returnTypeLower) {
+ $returnType = $method->getDeclaringClass()->getParentClass()->getName();
+ }
+
+ $node->setReturnType($returnType);
+ }
+
+ 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 ($this->isVariadic($parameter)) {
+ $node->setAsVariadic();
+ }
+
+ if ($this->hasDefaultValue($parameter)) {
+ $node->setDefault($this->getDefaultValue($parameter));
+ }
+
+ if ($parameter->isPassedByReference()) {
+ $node->setAsPassedByReference();
+ }
+
+ $methodNode->addArgument($node);
+ }
+
+ private function hasDefaultValue(ReflectionParameter $parameter)
+ {
+ if ($this->isVariadic($parameter)) {
+ return false;
+ }
+
+ if ($parameter->isDefaultValueAvailable()) {
+ return true;
+ }
+
+ return $parameter->isOptional() || $this->isNullable($parameter);
+ }
+
+ private function getDefaultValue(ReflectionParameter $parameter)
+ {
+ if (!$parameter->isDefaultValueAvailable()) {
+ return null;
+ }
+
+ return $parameter->getDefaultValue();
+ }
+
+ 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';
+ }
+
+ if (version_compare(PHP_VERSION, '7.0', '>=') && true === $parameter->hasType()) {
+ return (string) $parameter->getType();
+ }
+
+ return null;
+ }
+
+ private function isVariadic(ReflectionParameter $parameter)
+ {
+ return PHP_VERSION_ID >= 50600 && $parameter->isVariadic();
+ }
+
+ private function isNullable(ReflectionParameter $parameter)
+ {
+ return $parameter->allowsNull() && null !== $this->getTypeHint($parameter);
+ }
+
+ 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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.php
new file mode 100644
index 0000000..cf6fd73
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ArgumentNode.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\Doubler\Generator\Node;
+
+/**
+ * Argument node.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ArgumentNode
+{
+ private $name;
+ private $typeHint;
+ private $default;
+ private $optional = false;
+ private $byReference = false;
+ private $isVariadic = 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 hasDefault()
+ {
+ return $this->isOptional() && !$this->isVariadic();
+ }
+
+ 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;
+ }
+
+ public function setAsVariadic($isVariadic = true)
+ {
+ $this->isVariadic = $isVariadic;
+ }
+
+ public function isVariadic()
+ {
+ return $this->isVariadic;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
new file mode 100644
index 0000000..1499a1d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/ClassNode.php
@@ -0,0 +1,166 @@
+
+ * 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\Doubler\MethodNotExtendableException;
+use Prophecy\Exception\InvalidArgumentException;
+
+/**
+ * Class node.
+ *
+ * @author Konstantin Kudryashov
+ */
+class ClassNode
+{
+ private $parentClass = 'stdClass';
+ private $interfaces = array();
+ private $properties = array();
+ private $unextendableMethods = 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)
+ {
+ if (!$this->isExtendable($method->getName())){
+ $message = sprintf(
+ 'Method `%s` is not extendable, so can not be added.', $method->getName()
+ );
+ throw new MethodNotExtendableException($message, $this->getParentClass(), $method->getName());
+ }
+ $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]);
+ }
+
+ /**
+ * @return string[]
+ */
+ public function getUnextendableMethods()
+ {
+ return $this->unextendableMethods;
+ }
+
+ /**
+ * @param string $unextendableMethod
+ */
+ public function addUnextendableMethod($unextendableMethod)
+ {
+ if (!$this->isExtendable($unextendableMethod)){
+ return;
+ }
+ $this->unextendableMethods[] = $unextendableMethod;
+ }
+
+ /**
+ * @param string $method
+ * @return bool
+ */
+ public function isExtendable($method)
+ {
+ return !in_array($method, $this->unextendableMethods);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
new file mode 100644
index 0000000..8402ab8
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/Node/MethodNode.php
@@ -0,0 +1,188 @@
+
+ * 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;
+ private $returnsReference = false;
+ private $returnType;
+
+ /**
+ * @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 returnsReference()
+ {
+ return $this->returnsReference;
+ }
+
+ public function setReturnsReference()
+ {
+ $this->returnsReference = true;
+ }
+
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ public function addArgument(ArgumentNode $argument)
+ {
+ $this->arguments[] = $argument;
+ }
+
+ /**
+ * @return ArgumentNode[]
+ */
+ public function getArguments()
+ {
+ return $this->arguments;
+ }
+
+ public function hasReturnType()
+ {
+ return null !== $this->returnType;
+ }
+
+ /**
+ * @param string $type
+ */
+ public function setReturnType($type = null)
+ {
+ switch ($type) {
+ case '':
+ $this->returnType = null;
+ break;
+
+ case 'string';
+ case 'float':
+ case 'int':
+ case 'bool':
+ case 'array':
+ case 'callable':
+ $this->returnType = $type;
+ break;
+
+ case 'double':
+ case 'real':
+ $this->returnType = 'float';
+ break;
+
+ case 'boolean':
+ $this->returnType = 'bool';
+ break;
+
+ case 'integer':
+ $this->returnType = 'int';
+ break;
+
+ default:
+ $this->returnType = '\\' . ltrim($type, '\\');
+ }
+ }
+
+ public function getReturnType()
+ {
+ return $this->returnType;
+ }
+
+ /**
+ * @param string $code
+ */
+ public function setCode($code)
+ {
+ $this->code = $code;
+ }
+
+ public function getCode()
+ {
+ if ($this->returnsReference)
+ {
+ return "throw new \Prophecy\Exception\Doubler\ReturnByReferenceException('Returning by reference not supported', get_class(\$this), '{$this->name}');";
+ }
+
+ return (string) $this->code;
+ }
+
+ public function useParentCode()
+ {
+ $this->code = sprintf(
+ 'return parent::%s(%s);', $this->getName(), implode(', ',
+ array_map(array($this, 'generateArgument'), $this->arguments)
+ )
+ );
+ }
+
+ private function generateArgument(ArgumentNode $arg)
+ {
+ $argument = '$'.$arg->getName();
+
+ if ($arg->isVariadic()) {
+ $argument = '...'.$argument;
+ }
+
+ return $argument;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/Generator/ReflectionInterface.php
new file mode 100644
index 0000000..d720b15
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/LazyDouble.php
new file mode 100644
index 0000000..8a99c4c
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Doubler/NameGenerator.php
new file mode 100644
index 0000000..d67ec6a
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Call/UnexpectedCallException.php
new file mode 100644
index 0000000..48ed225
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassCreatorException.php
new file mode 100644
index 0000000..822918a
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassMirrorException.php
new file mode 100644
index 0000000..8fc53b8
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ClassNotFoundException.php
new file mode 100644
index 0000000..5bc826d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoubleException.php
new file mode 100644
index 0000000..6642a58
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/DoublerException.php
new file mode 100644
index 0000000..9d6be17
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/InterfaceNotFoundException.php
new file mode 100644
index 0000000..e344dea
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php
new file mode 100644
index 0000000..56f47b1
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotExtendableException.php
@@ -0,0 +1,41 @@
+methodName = $methodName;
+ $this->className = $className;
+ }
+
+
+ /**
+ * @return string
+ */
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ /**
+ * @return string
+ */
+ public function getClassName()
+ {
+ return $this->className;
+ }
+
+ }
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
new file mode 100644
index 0000000..b113941
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/MethodNotFoundException.php
@@ -0,0 +1,60 @@
+
+ * 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
+{
+ /**
+ * @var string
+ */
+ private $classname;
+
+ /**
+ * @var string
+ */
+ private $methodName;
+
+ /**
+ * @var array
+ */
+ private $arguments;
+
+ /**
+ * @param string $message
+ * @param string $classname
+ * @param string $methodName
+ * @param null|Argument\ArgumentsWildcard|array $arguments
+ */
+ public function __construct($message, $classname, $methodName, $arguments = null)
+ {
+ parent::__construct($message);
+
+ $this->classname = $classname;
+ $this->methodName = $methodName;
+ $this->arguments = $arguments;
+ }
+
+ public function getClassname()
+ {
+ return $this->classname;
+ }
+
+ public function getMethodName()
+ {
+ return $this->methodName;
+ }
+
+ public function getArguments()
+ {
+ return $this->arguments;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.php
new file mode 100644
index 0000000..6303049
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Doubler/ReturnByReferenceException.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 ReturnByReferenceException 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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Exception.php
new file mode 100644
index 0000000..ac9fe4d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/InvalidArgumentException.php
new file mode 100644
index 0000000..bc91c69
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/AggregateException.php
new file mode 100644
index 0000000..44b598a
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/FailedPredictionException.php
new file mode 100644
index 0000000..bbbbc3d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/NoCallsException.php
new file mode 100644
index 0000000..05ea4aa
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/PredictionException.php
new file mode 100644
index 0000000..2596b1e
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsCountException.php
new file mode 100644
index 0000000..9d90543
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prediction/UnexpectedCallsException.php
new file mode 100644
index 0000000..7a99c2d
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/MethodProphecyException.php
new file mode 100644
index 0000000..1b03eaf
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ObjectProphecyException.php
new file mode 100644
index 0000000..e345402
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Exception/Prophecy/ProphecyException.php
new file mode 100644
index 0000000..9157332
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php
new file mode 100644
index 0000000..209821c
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassAndInterfaceTagRetriever.php
@@ -0,0 +1,69 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\PhpDocumentor;
+
+use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag;
+use phpDocumentor\Reflection\DocBlock\Tags\Method;
+
+/**
+ * @author Théo FIDRY
+ *
+ * @internal
+ */
+final class ClassAndInterfaceTagRetriever implements MethodTagRetrieverInterface
+{
+ private $classRetriever;
+
+ public function __construct(MethodTagRetrieverInterface $classRetriever = null)
+ {
+ if (null !== $classRetriever) {
+ $this->classRetriever = $classRetriever;
+
+ return;
+ }
+
+ $this->classRetriever = class_exists('phpDocumentor\Reflection\DocBlockFactory') && class_exists('phpDocumentor\Reflection\Types\ContextFactory')
+ ? new ClassTagRetriever()
+ : new LegacyClassTagRetriever()
+ ;
+ }
+
+ /**
+ * @param \ReflectionClass $reflectionClass
+ *
+ * @return LegacyMethodTag[]|Method[]
+ */
+ public function getTagList(\ReflectionClass $reflectionClass)
+ {
+ return array_merge(
+ $this->classRetriever->getTagList($reflectionClass),
+ $this->getInterfacesTagList($reflectionClass)
+ );
+ }
+
+ /**
+ * @param \ReflectionClass $reflectionClass
+ *
+ * @return LegacyMethodTag[]|Method[]
+ */
+ private function getInterfacesTagList(\ReflectionClass $reflectionClass)
+ {
+ $interfaces = $reflectionClass->getInterfaces();
+ $tagList = array();
+
+ foreach($interfaces as $interface) {
+ $tagList = array_merge($tagList, $this->classRetriever->getTagList($interface));
+ }
+
+ return $tagList;
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.php
new file mode 100644
index 0000000..1d2da8f
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/ClassTagRetriever.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\PhpDocumentor;
+
+use phpDocumentor\Reflection\DocBlock\Tags\Method;
+use phpDocumentor\Reflection\DocBlockFactory;
+use phpDocumentor\Reflection\Types\ContextFactory;
+
+/**
+ * @author Théo FIDRY
+ *
+ * @internal
+ */
+final class ClassTagRetriever implements MethodTagRetrieverInterface
+{
+ private $docBlockFactory;
+ private $contextFactory;
+
+ public function __construct()
+ {
+ $this->docBlockFactory = DocBlockFactory::createInstance();
+ $this->contextFactory = new ContextFactory();
+ }
+
+ /**
+ * @param \ReflectionClass $reflectionClass
+ *
+ * @return Method[]
+ */
+ public function getTagList(\ReflectionClass $reflectionClass)
+ {
+ try {
+ $phpdoc = $this->docBlockFactory->create(
+ $reflectionClass,
+ $this->contextFactory->createFromReflector($reflectionClass)
+ );
+
+ return $phpdoc->getTagsByName('method');
+ } catch (\InvalidArgumentException $e) {
+ return array();
+ }
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.php
new file mode 100644
index 0000000..c0dec3d
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/LegacyClassTagRetriever.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\PhpDocumentor;
+
+use phpDocumentor\Reflection\DocBlock;
+use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag;
+
+/**
+ * @author Théo FIDRY
+ *
+ * @internal
+ */
+final class LegacyClassTagRetriever implements MethodTagRetrieverInterface
+{
+ /**
+ * @param \ReflectionClass $reflectionClass
+ *
+ * @return LegacyMethodTag[]
+ */
+ public function getTagList(\ReflectionClass $reflectionClass)
+ {
+ $phpdoc = new DocBlock($reflectionClass->getDocComment());
+
+ return $phpdoc->getTagsByName('method');
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php
new file mode 100644
index 0000000..d3989da
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/PhpDocumentor/MethodTagRetrieverInterface.php
@@ -0,0 +1,30 @@
+
+ * Marcello Duarte
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Prophecy\PhpDocumentor;
+
+use phpDocumentor\Reflection\DocBlock\Tag\MethodTag as LegacyMethodTag;
+use phpDocumentor\Reflection\DocBlock\Tags\Method;
+
+/**
+ * @author Théo FIDRY
+ *
+ * @internal
+ */
+interface MethodTagRetrieverInterface
+{
+ /**
+ * @param \ReflectionClass $reflectionClass
+ *
+ * @return LegacyMethodTag[]|Method[]
+ */
+ public function getTagList(\ReflectionClass $reflectionClass);
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallPrediction.php
new file mode 100644
index 0000000..b478736
--- /dev/null
+++ b/packages/jai/Contact/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 have 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 have 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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallTimesPrediction.php
new file mode 100644
index 0000000..31c6c57
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/CallbackPrediction.php
new file mode 100644
index 0000000..44bc782
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.php
new file mode 100644
index 0000000..46ac5bf
--- /dev/null
+++ b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/NoCallsPrediction.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\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;
+ }
+
+ $verb = count($calls) === 1 ? 'was' : 'were';
+
+ throw new UnexpectedCallsException(sprintf(
+ "No calls expected that match:\n".
+ " %s->%s(%s)\n".
+ "but %d %s made:\n%s",
+ get_class($object->reveal()),
+ $method->getMethodName(),
+ $method->getArgumentsWildcard(),
+ count($calls),
+ $verb,
+ $this->util->stringifyCalls($calls)
+ ), $method, $calls);
+ }
+}
diff --git a/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Prediction/PredictionInterface.php
new file mode 100644
index 0000000..f7fb06a
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Promise/CallbackPromise.php
new file mode 100644
index 0000000..5f406bf
--- /dev/null
+++ b/packages/jai/Contact/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/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php b/packages/jai/Contact/vendor/phpspec/prophecy/src/Prophecy/Promise/PromiseInterface.php
new file mode 100644
index 0000000..382537b
--- /dev/null
+++ b/packages/jai/Contact/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