Add statis resources for release

Yannick Warnier 10 years ago
parent cf574fcba8
commit b98243d193
  1. 56
      composer.lock
  2. 1
      vendor/bin/doctrine-dbal
  3. 1
      vendor/composer/autoload_namespaces.php
  4. 1
      vendor/composer/autoload_psr4.php
  5. 464
      vendor/composer/installed.json
  6. 10
      vendor/doctrine/common/.gitignore
  7. 3
      vendor/doctrine/common/.gitmodules
  8. 26
      vendor/doctrine/common/.travis.yml
  9. 2
      vendor/doctrine/common/LICENSE
  10. 3
      vendor/doctrine/common/build.properties
  11. 101
      vendor/doctrine/common/build.xml
  12. 14
      vendor/doctrine/common/composer.json
  13. 6
      vendor/doctrine/common/lib/Doctrine/Common/ClassLoader.php
  14. 2
      vendor/doctrine/common/lib/Doctrine/Common/EventManager.php
  15. 4
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php
  16. 10
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/AbstractClassMetadataFactory.php
  17. 10
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/AnnotationDriver.php
  18. 4
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/DefaultFileLocator.php
  19. 13
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/FileDriver.php
  20. 8
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/MappingDriverChain.php
  21. 6
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/PHPDriver.php
  22. 6
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/StaticPHPDriver.php
  23. 6
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/Driver/SymfonyFileLocator.php
  24. 2
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/Mapping/StaticReflectionService.php
  25. 2
      vendor/doctrine/common/lib/Doctrine/Common/Persistence/PersistentObject.php
  26. 2
      vendor/doctrine/common/lib/Doctrine/Common/Proxy/AbstractProxyFactory.php
  27. 105
      vendor/doctrine/common/lib/Doctrine/Common/Proxy/ProxyGenerator.php
  28. 2
      vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionClass.php
  29. 10
      vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionParser.php
  30. 6
      vendor/doctrine/common/lib/Doctrine/Common/Reflection/StaticReflectionProperty.php
  31. 5
      vendor/doctrine/common/lib/Doctrine/Common/Util/Debug.php
  32. 2
      vendor/doctrine/common/lib/Doctrine/Common/Version.php
  33. 25
      vendor/doctrine/common/phpunit.xml.dist
  34. 3
      vendor/doctrine/common/tests/.gitignore
  35. 133
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest.php
  36. 6
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassA.class.php
  37. 6
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassB.class.php
  38. 6
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassC.class.php
  39. 5
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassD.php
  40. 5
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ClassE.php
  41. 0
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/EmptyFile.class.php
  42. 38
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/ExternalLoader.php
  43. 5
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/InterfaceA.class.php
  44. 5
      vendor/doctrine/common/tests/Doctrine/Tests/Common/ClassLoaderTest/TraitA.class.php
  45. 0
      vendor/doctrine/common/tests/Doctrine/Tests/Common/DoctrineExceptionTest.php
  46. 88
      vendor/doctrine/common/tests/Doctrine/Tests/Common/EventManagerTest.php
  47. 102
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/ManagerRegistryTest.php
  48. 29
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/AnnotationDriverTest.php
  49. 152
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ChainDriverTest.php
  50. 209
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/ClassMetadataFactoryTest.php
  51. 98
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/DefaultFileLocatorTest.php
  52. 142
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/FileDriverTest.php
  53. 18
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/PHPDriverTest.php
  54. 84
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/RuntimeReflectionServiceTest.php
  55. 35
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticPHPDriverTest.php
  56. 70
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/StaticReflectionServiceTest.php
  57. 181
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/SymfonyFileLocatorTest.php
  58. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_custom_ns/dir/stdClass.yml
  59. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_custom_ns/dir/sub/subClass.yml
  60. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_custom_ns/dir/sub/subsub/subSubClass.yml
  61. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_custom_ns/dot/stdClass.yml
  62. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_custom_ns/dot/sub.subClass.yml
  63. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_custom_ns/dot/sub.subsub.subSubClass.yml
  64. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/Bar/subDirClass.yml
  65. 3
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/TestEntity.php
  66. 17
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/annotation/TestClass.php
  67. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/global.yml
  68. 1
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/Mapping/_files/stdClass.yml
  69. 60
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/ObjectManagerDecoratorTest.php
  70. 247
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Persistence/PersistentObjectTest.php
  71. 146
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/AbstractProxyFactoryTest.php
  72. 72
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/AutoloaderTest.php
  73. 16
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/CallableTypeHintClass.php
  74. 16
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/InvalidTypeHintClass.php
  75. 115
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/LazyLoadableObject.php
  76. 195
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/LazyLoadableObjectClassMetadata.php
  77. 37
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/MagicCloneClass.php
  78. 51
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/MagicGetByRefClass.php
  79. 38
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/MagicGetClass.php
  80. 38
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/MagicIssetClass.php
  81. 43
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/MagicSetClass.php
  82. 37
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/MagicSleepClass.php
  83. 32
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/MagicWakeupClass.php
  84. 249
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/ProxyClassGeneratorTest.php
  85. 752
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/ProxyLogicTest.php
  86. 327
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/ProxyMagicMethodsTest.php
  87. 72
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/SerializedClass.php
  88. 19
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/SleepClass.php
  89. 11
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/StaticPropertyClass.php
  90. 29
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Proxy/VariadicTypeHintClass.php
  91. 7
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/DeeperNamespaceParent.php
  92. 8
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/Dummies/NoParent.php
  93. 14
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/ExampleAnnotationClass.php
  94. 7
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/FullyClassifiedParent.php
  95. 8
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/NoParent.php
  96. 192
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/RuntimePublicReflectionPropertyTest.php
  97. 7
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/SameNamespaceParent.php
  98. 93
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/StaticReflectionParserTest.php
  99. 9
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Reflection/UseParent.php
  100. 100
      vendor/doctrine/common/tests/Doctrine/Tests/Common/Util/ClassUtilsTest.php
  101. Some files were not shown because too many files have changed in this diff Show More

56
composer.lock generated

@ -1289,16 +1289,16 @@
},
{
"name": "doctrine/common",
"version": "v2.6.0",
"version": "v2.5.2",
"source": {
"type": "git",
"url": "https://github.com/doctrine/common.git",
"reference": "3cb33d19beb3c62f76c55e7e9683fff12e242bc8"
"reference": "311001fd9865a4d0d59efff4eac6d7dcb3f5270c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/common/zipball/3cb33d19beb3c62f76c55e7e9683fff12e242bc8",
"reference": "3cb33d19beb3c62f76c55e7e9683fff12e242bc8",
"url": "https://api.github.com/repos/doctrine/common/zipball/311001fd9865a4d0d59efff4eac6d7dcb3f5270c",
"reference": "311001fd9865a4d0d59efff4eac6d7dcb3f5270c",
"shasum": ""
},
"require": {
@ -1307,20 +1307,20 @@
"doctrine/collections": "1.*",
"doctrine/inflector": "1.*",
"doctrine/lexer": "1.*",
"php": "~5.5|~7.0"
"php": ">=5.3.2"
},
"require-dev": {
"phpunit/phpunit": "~4.8|~5.0"
"phpunit/phpunit": "~3.7"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.7.x-dev"
"dev-master": "2.5.x-dev"
}
},
"autoload": {
"psr-4": {
"Doctrine\\Common\\": "lib/Doctrine/Common"
"psr-0": {
"Doctrine\\Common\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
@ -1358,34 +1358,42 @@
"persistence",
"spl"
],
"time": "2015-12-04 13:06:46"
"time": "2015-12-04 12:49:42"
},
{
"name": "doctrine/dbal",
"version": "v2.4.4",
"version": "v2.5.2",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
"reference": "a370e5b95e509a7809d11f3d280acfc9310d464b"
"reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/a370e5b95e509a7809d11f3d280acfc9310d464b",
"reference": "a370e5b95e509a7809d11f3d280acfc9310d464b",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/01dbcbc5cd0a913d751418e635434a18a2f2a75c",
"reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c",
"shasum": ""
},
"require": {
"doctrine/common": "~2.4",
"doctrine/common": ">=2.4,<2.6-dev",
"php": ">=5.3.2"
},
"require-dev": {
"phpunit/phpunit": "3.7.*",
"symfony/console": "~2.0"
"phpunit/phpunit": "4.*",
"symfony/console": "2.*"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
},
"bin": [
"bin/doctrine-dbal"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.5.x-dev"
}
},
"autoload": {
"psr-0": {
"Doctrine\\DBAL\\": "lib/"
@ -1421,7 +1429,7 @@
"persistence",
"queryobject"
],
"time": "2015-01-12 21:57:01"
"time": "2015-09-16 16:29:33"
},
{
"name": "doctrine/inflector",
@ -1857,17 +1865,17 @@
},
{
"name": "friendsofsymfony/rest-bundle",
"version": "1.7.4",
"version": "1.7.6",
"target-dir": "FOS/RestBundle",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
"reference": "64ba918b1eb47acb5aa7fef1ce95623235b53775"
"reference": "f95b2f141748e9a5e2ddae833f60c38417aee8c3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/64ba918b1eb47acb5aa7fef1ce95623235b53775",
"reference": "64ba918b1eb47acb5aa7fef1ce95623235b53775",
"url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/f95b2f141748e9a5e2ddae833f60c38417aee8c3",
"reference": "f95b2f141748e9a5e2ddae833f60c38417aee8c3",
"shasum": ""
},
"require": {
@ -1934,12 +1942,12 @@
"email": "ever.zet@gmail.com"
}
],
"description": "This Bundle provides various tools to rapidly develop RESTful API's with Symfony2",
"description": "This Bundle provides various tools to rapidly develop RESTful API's with Symfony",
"homepage": "http://friendsofsymfony.github.com",
"keywords": [
"rest"
],
"time": "2015-12-05 14:55:07"
"time": "2015-12-20 13:45:30"
},
{
"name": "friendsofsymfony/user-bundle",

@ -0,0 +1 @@
../doctrine/dbal/bin/doctrine-dbal

@ -53,6 +53,7 @@ return array(
'Doctrine\\Common\\Inflector\\' => array($vendorDir . '/doctrine/inflector/lib'),
'Doctrine\\Common\\Collections\\' => array($vendorDir . '/doctrine/collections/lib'),
'Doctrine\\Common\\Annotations\\' => array($vendorDir . '/doctrine/annotations/lib'),
'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib'),
'DigitalOcean' => array($vendorDir . '/toin0u/digitalocean/src'),
'Ddeboer\\DataImport' => array($vendorDir . '/ddeboer/data-import/src'),
'Behat\\Transliterator' => array($vendorDir . '/behat/transliterator/src'),

@ -71,7 +71,6 @@ return array(
'Fhaculty\\Graph\\' => array($vendorDir . '/clue/graph/src'),
'Emojione\\' => array($vendorDir . '/emojione/emojione/lib/php/src'),
'Doctrine\\Common\\Cache\\' => array($vendorDir . '/doctrine/cache/lib/Doctrine/Common/Cache'),
'Doctrine\\Common\\' => array($vendorDir . '/doctrine/common/lib/Doctrine/Common'),
'CpChart\\' => array($vendorDir . '/szymach/c-pchart/src'),
'Cocur\\Slugify\\' => array($vendorDir . '/cocur/slugify/src'),
'Chamilo\\' => array($baseDir . '/src/Chamilo'),

@ -801,81 +801,6 @@
"string"
]
},
{
"name": "doctrine/common",
"version": "v2.6.0",
"version_normalized": "2.6.0.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/common.git",
"reference": "3cb33d19beb3c62f76c55e7e9683fff12e242bc8"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/common/zipball/3cb33d19beb3c62f76c55e7e9683fff12e242bc8",
"reference": "3cb33d19beb3c62f76c55e7e9683fff12e242bc8",
"shasum": ""
},
"require": {
"doctrine/annotations": "1.*",
"doctrine/cache": "1.*",
"doctrine/collections": "1.*",
"doctrine/inflector": "1.*",
"doctrine/lexer": "1.*",
"php": "~5.5|~7.0"
},
"require-dev": {
"phpunit/phpunit": "~4.8|~5.0"
},
"time": "2015-12-04 13:06:46",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.7.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Doctrine\\Common\\": "lib/Doctrine/Common"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
{
"name": "Guilherme Blanco",
"email": "guilhermeblanco@gmail.com"
},
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
},
{
"name": "Johannes Schmitt",
"email": "schmittjoh@gmail.com"
}
],
"description": "Common Library for Doctrine projects",
"homepage": "http://www.doctrine-project.org",
"keywords": [
"annotations",
"collections",
"eventmanager",
"persistence",
"spl"
]
},
{
"name": "symfony/doctrine-bridge",
"version": "v2.6.4",
@ -1423,71 +1348,6 @@
"description": "Symfony Console Component",
"homepage": "https://symfony.com"
},
{
"name": "doctrine/dbal",
"version": "v2.4.4",
"version_normalized": "2.4.4.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
"reference": "a370e5b95e509a7809d11f3d280acfc9310d464b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/a370e5b95e509a7809d11f3d280acfc9310d464b",
"reference": "a370e5b95e509a7809d11f3d280acfc9310d464b",
"shasum": ""
},
"require": {
"doctrine/common": "~2.4",
"php": ">=5.3.2"
},
"require-dev": {
"phpunit/phpunit": "3.7.*",
"symfony/console": "~2.0"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
},
"time": "2015-01-12 21:57:01",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-0": {
"Doctrine\\DBAL\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
{
"name": "Guilherme Blanco",
"email": "guilhermeblanco@gmail.com"
},
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
}
],
"description": "Database Abstraction Layer",
"homepage": "http://www.doctrine-project.org",
"keywords": [
"database",
"dbal",
"persistence",
"queryobject"
]
},
{
"name": "doctrine/orm",
"version": "v2.4.8",
@ -5356,94 +5216,6 @@
],
"description": "JSONP callback validator."
},
{
"name": "friendsofsymfony/rest-bundle",
"version": "1.7.4",
"version_normalized": "1.7.4.0",
"target-dir": "FOS/RestBundle",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
"reference": "64ba918b1eb47acb5aa7fef1ce95623235b53775"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/64ba918b1eb47acb5aa7fef1ce95623235b53775",
"reference": "64ba918b1eb47acb5aa7fef1ce95623235b53775",
"shasum": ""
},
"require": {
"doctrine/inflector": "~1.0",
"php": "^5.3.9|~7.0",
"psr/log": "~1.0",
"symfony/framework-bundle": "~2.3|~3.0",
"symfony/http-kernel": "^2.3.24|~3.0",
"willdurand/jsonp-callback-validator": "~1.0",
"willdurand/negotiation": "~1.2"
},
"conflict": {
"jms/serializer": "<0.12",
"jms/serializer-bundle": "<0.11",
"symfony/validator": ">=2.5.0,<2.5.5"
},
"require-dev": {
"jms/serializer": "~0.13|~1.0",
"jms/serializer-bundle": "~0.12|~1.0",
"phpoption/phpoption": "~1.1.0",
"sensio/framework-extra-bundle": "~2.0|~3.0",
"sllh/php-cs-fixer-styleci-bridge": "^1.3",
"symfony/browser-kit": "~2.3|~3.0",
"symfony/dependency-injection": "~2.3|~3.0",
"symfony/form": "~2.3|~3.0",
"symfony/phpunit-bridge": "~2.7|~3.0",
"symfony/security": "~2.3|~3.0",
"symfony/serializer": "~2.3|~3.0",
"symfony/validator": "~2.3|~3.0",
"symfony/yaml": "~2.3|~3.0"
},
"suggest": {
"jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended, requires ~0.12||~1.0",
"sensio/framework-extra-bundle": "Add support for route annotations and the view response listener, requires ~3.0",
"symfony/serializer": "Add support for basic serialization capabilities and xml decoding, requires ~2.3",
"symfony/validator": "Add support for validation capabilities in the ParamFetcher, requires ~2.3"
},
"time": "2015-12-05 14:55:07",
"type": "symfony-bundle",
"extra": {
"branch-alias": {
"dev-master": "1.7-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-0": {
"FOS\\RestBundle": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Lukas Kahwe Smith",
"email": "smith@pooteeweet.org"
},
{
"name": "FriendsOfSymfony Community",
"homepage": "https://github.com/friendsofsymfony/FOSRestBundle/contributors"
},
{
"name": "Konstantin Kudryashov",
"email": "ever.zet@gmail.com"
}
],
"description": "This Bundle provides various tools to rapidly develop RESTful API's with Symfony2",
"homepage": "http://friendsofsymfony.github.com",
"keywords": [
"rest"
]
},
{
"name": "sonata-project/google-authenticator",
"version": "1.0.2",
@ -8485,5 +8257,241 @@
"testing",
"webdriver"
]
},
{
"name": "doctrine/common",
"version": "v2.5.2",
"version_normalized": "2.5.2.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/common.git",
"reference": "311001fd9865a4d0d59efff4eac6d7dcb3f5270c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/common/zipball/311001fd9865a4d0d59efff4eac6d7dcb3f5270c",
"reference": "311001fd9865a4d0d59efff4eac6d7dcb3f5270c",
"shasum": ""
},
"require": {
"doctrine/annotations": "1.*",
"doctrine/cache": "1.*",
"doctrine/collections": "1.*",
"doctrine/inflector": "1.*",
"doctrine/lexer": "1.*",
"php": ">=5.3.2"
},
"require-dev": {
"phpunit/phpunit": "~3.7"
},
"time": "2015-12-04 12:49:42",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.5.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-0": {
"Doctrine\\Common\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
{
"name": "Guilherme Blanco",
"email": "guilhermeblanco@gmail.com"
},
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
},
{
"name": "Johannes Schmitt",
"email": "schmittjoh@gmail.com"
}
],
"description": "Common Library for Doctrine projects",
"homepage": "http://www.doctrine-project.org",
"keywords": [
"annotations",
"collections",
"eventmanager",
"persistence",
"spl"
]
},
{
"name": "doctrine/dbal",
"version": "v2.5.2",
"version_normalized": "2.5.2.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/dbal.git",
"reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/dbal/zipball/01dbcbc5cd0a913d751418e635434a18a2f2a75c",
"reference": "01dbcbc5cd0a913d751418e635434a18a2f2a75c",
"shasum": ""
},
"require": {
"doctrine/common": ">=2.4,<2.6-dev",
"php": ">=5.3.2"
},
"require-dev": {
"phpunit/phpunit": "4.*",
"symfony/console": "2.*"
},
"suggest": {
"symfony/console": "For helpful console commands such as SQL execution and import of files."
},
"time": "2015-09-16 16:29:33",
"bin": [
"bin/doctrine-dbal"
],
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "2.5.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-0": {
"Doctrine\\DBAL\\": "lib/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Roman Borschel",
"email": "roman@code-factory.org"
},
{
"name": "Benjamin Eberlei",
"email": "kontakt@beberlei.de"
},
{
"name": "Guilherme Blanco",
"email": "guilhermeblanco@gmail.com"
},
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
}
],
"description": "Database Abstraction Layer",
"homepage": "http://www.doctrine-project.org",
"keywords": [
"database",
"dbal",
"persistence",
"queryobject"
]
},
{
"name": "friendsofsymfony/rest-bundle",
"version": "1.7.6",
"version_normalized": "1.7.6.0",
"target-dir": "FOS/RestBundle",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
"reference": "f95b2f141748e9a5e2ddae833f60c38417aee8c3"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/f95b2f141748e9a5e2ddae833f60c38417aee8c3",
"reference": "f95b2f141748e9a5e2ddae833f60c38417aee8c3",
"shasum": ""
},
"require": {
"doctrine/inflector": "~1.0",
"php": "^5.3.9|~7.0",
"psr/log": "~1.0",
"symfony/framework-bundle": "~2.3|~3.0",
"symfony/http-kernel": "^2.3.24|~3.0",
"willdurand/jsonp-callback-validator": "~1.0",
"willdurand/negotiation": "~1.2"
},
"conflict": {
"jms/serializer": "<0.12",
"jms/serializer-bundle": "<0.11",
"symfony/validator": ">=2.5.0,<2.5.5"
},
"require-dev": {
"jms/serializer": "~0.13|~1.0",
"jms/serializer-bundle": "~0.12|~1.0",
"phpoption/phpoption": "~1.1.0",
"sensio/framework-extra-bundle": "~2.0|~3.0",
"sllh/php-cs-fixer-styleci-bridge": "^1.3",
"symfony/browser-kit": "~2.3|~3.0",
"symfony/dependency-injection": "~2.3|~3.0",
"symfony/form": "~2.3|~3.0",
"symfony/phpunit-bridge": "~2.7|~3.0",
"symfony/security": "~2.3|~3.0",
"symfony/serializer": "~2.3|~3.0",
"symfony/validator": "~2.3|~3.0",
"symfony/yaml": "~2.3|~3.0"
},
"suggest": {
"jms/serializer-bundle": "Add support for advanced serialization capabilities, recommended, requires ~0.12||~1.0",
"sensio/framework-extra-bundle": "Add support for route annotations and the view response listener, requires ~3.0",
"symfony/serializer": "Add support for basic serialization capabilities and xml decoding, requires ~2.3",
"symfony/validator": "Add support for validation capabilities in the ParamFetcher, requires ~2.3"
},
"time": "2015-12-20 13:45:30",
"type": "symfony-bundle",
"extra": {
"branch-alias": {
"dev-master": "1.7-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-0": {
"FOS\\RestBundle": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Lukas Kahwe Smith",
"email": "smith@pooteeweet.org"
},
{
"name": "FriendsOfSymfony Community",
"homepage": "https://github.com/friendsofsymfony/FOSRestBundle/contributors"
},
{
"name": "Konstantin Kudryashov",
"email": "ever.zet@gmail.com"
}
],
"description": "This Bundle provides various tools to rapidly develop RESTful API's with Symfony",
"homepage": "http://friendsofsymfony.github.com",
"keywords": [
"rest"
]
}
]

@ -0,0 +1,10 @@
build/
logs/
reports/
dist/
tests/Doctrine/Tests/Common/Proxy/generated/
vendor/
.idea
composer.lock
doctrine-common-*.tar
doctrine-common-*.tar.gz

@ -0,0 +1,3 @@
[submodule "lib/vendor/doctrine-build-common"]
path = lib/vendor/doctrine-build-common
url = git://github.com/doctrine/doctrine-build-common.git

@ -0,0 +1,26 @@
language: php
sudo: false
cache:
directory:
- $HOME/.composer/cache
php:
- 5.3.3
- 5.3
- 5.4
- 5.5
- 5.6
- 7.0
- hhvm
before_script:
- composer --prefer-source install
script:
- ./vendor/bin/phpunit
matrix:
allow_failures:
- php: 7.0

@ -1,4 +1,4 @@
Copyright (c) 2006-2015 Doctrine Project
Copyright (c) 2006-2012 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

@ -0,0 +1,3 @@
# Version class and file
project.version_class = Doctrine\\Common\\Version
project.version_file = lib/Doctrine/Common/Version.php

@ -0,0 +1,101 @@
<?xml version="1.0"?>
<project name="DoctrineCommon" default="build" basedir=".">
<property file="build.properties" />
<target name="php">
<exec executable="which" outputproperty="php_executable">
<arg value="php" />
</exec>
</target>
<target name="prepare">
<mkdir dir="build" />
</target>
<target name="build" depends="check-git-checkout-clean,prepare,php,composer">
<exec executable="${php_executable}">
<arg value="build/composer.phar" />
<arg value="archive" />
<arg value="--dir=build" />
</exec>
</target>
<target name="composer" depends="php,composer-check,composer-download">
<exec executable="${php_executable}">
<arg value="build/composer.phar" />
<arg value="install" />
</exec>
</target>
<target name="composer-check" depends="prepare">
<available file="build/composer.phar" property="composer.present"/>
</target>
<target name="composer-download" unless="composer.present">
<exec executable="wget">
<arg value="-Obuild/composer.phar" />
<arg value="http://getcomposer.org/composer.phar" />
</exec>
</target>
<target name="make-release" depends="check-git-checkout-clean,prepare,php">
<replace file="${project.version_file}" token="-DEV" value="" failOnNoReplacements="true" />
<exec executable="${php_executable}" outputproperty="doctrine.current_version" failonerror="true">
<arg value="-r" />
<arg value="require_once '${project.version_file}';echo ${project.version_class}::VERSION;" />
</exec>
<exec executable="${php_executable}" outputproperty="doctrine.next_version" failonerror="true">
<arg value="-r" />
<arg value="$parts = explode('.', str_ireplace(array('-DEV', '-ALPHA', '-BETA'), '', '${doctrine.current_version}'));
if (count($parts) != 3) {
throw new \InvalidArgumentException('Version is assumed in format x.y.z, ${doctrine.current_version} given');
}
$parts[2]++;
echo implode('.', $parts);
" />
</exec>
<git-commit file="${project.version_file}" message="Release ${doctrine.current_version}" />
<git-tag version="${doctrine.current_version}" />
<replace file="${project.version_file}" token="${doctrine.current_version}" value="${doctrine.next_version}-DEV" />
<git-commit file="${project.version_file}" message="Bump version to ${doctrine.next_version}" />
</target>
<target name="check-git-checkout-clean">
<exec executable="git" failonerror="true">
<arg value="diff-index" />
<arg value="--quiet" />
<arg value="HEAD" />
</exec>
</target>
<macrodef name="git-commit">
<attribute name="file" default="NOT SET"/>
<attribute name="message" default="NOT SET"/>
<sequential>
<exec executable="git">
<arg value="add" />
<arg value="@{file}" />
</exec>
<exec executable="git">
<arg value="commit" />
<arg value="-m" />
<arg value="@{message}" />
</exec>
</sequential>
</macrodef>
<macrodef name="git-tag">
<attribute name="version" default="NOT SET" />
<sequential>
<exec executable="git">
<arg value="tag" />
<arg value="-m" />
<arg value="v@{version}" />
<arg value="v@{version}" />
</exec>
</sequential>
</macrodef>
</project>

@ -13,24 +13,26 @@
{"name": "Johannes Schmitt", "email": "schmittjoh@gmail.com"}
],
"require": {
"php": "~5.5|~7.0",
"php": ">=5.3.2",
"doctrine/inflector": "1.*",
"doctrine/cache": "1.*",
"doctrine/collections": "1.*",
"doctrine/lexer": "1.*",
"doctrine/annotations": "1.*"
},
"minimum-stability": "dev",
"require-dev": {
"phpunit/phpunit": "~4.8|~5.0"
"phpunit/phpunit": "~3.7"
},
"autoload": {
"psr-4": {
"Doctrine\\Common\\": "lib/Doctrine/Common"
}
"psr-0": { "Doctrine\\Common\\": "lib/" }
},
"extra": {
"branch-alias": {
"dev-master": "2.7.x-dev"
"dev-master": "2.5.x-dev"
}
},
"archive": {
"exclude": ["!vendor", "tests", "*phpunit.xml", ".travis.yml", "build.xml", "build.properties", "composer.phar"]
}
}

@ -153,7 +153,7 @@ class ClassLoader
*/
public function register()
{
spl_autoload_register([$this, 'loadClass']);
spl_autoload_register(array($this, 'loadClass'));
}
/**
@ -163,7 +163,7 @@ class ClassLoader
*/
public function unregister()
{
spl_autoload_unregister([$this, 'loadClass']);
spl_autoload_unregister(array($this, 'loadClass'));
}
/**
@ -275,6 +275,6 @@ class ClassLoader
{
return class_exists($type, $autoload)
|| interface_exists($type, $autoload)
|| trait_exists($type, $autoload);
|| (function_exists('trait_exists') && trait_exists($type, $autoload));
}
}

@ -38,7 +38,7 @@ class EventManager
*
* @var array
*/
private $_listeners = [];
private $_listeners = array();
/**
* Dispatches an event to all registered listeners.

@ -141,7 +141,7 @@ abstract class AbstractManagerRegistry implements ManagerRegistry
*/
public function getConnections()
{
$connections = [];
$connections = array();
foreach ($this->connections as $name => $id) {
$connections[$name] = $this->getService($id);
}
@ -226,7 +226,7 @@ abstract class AbstractManagerRegistry implements ManagerRegistry
*/
public function getManagers()
{
$dms = [];
$dms = array();
foreach ($this->managers as $name => $id) {
$dms[$name] = $this->getService($id);
}

@ -53,7 +53,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
/**
* @var ClassMetadata[]
*/
private $loadedMetadata = [];
private $loadedMetadata = array();
/**
* @var bool
@ -110,7 +110,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
}
$driver = $this->getDriver();
$metadata = [];
$metadata = array();
foreach ($driver->getAllClassNames() as $className) {
$metadata[] = $this->getMetadataFor($className);
}
@ -277,7 +277,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
protected function getParentClasses($name)
{
// Collect parent classes, ignoring transient (not-mapped) classes.
$parentClasses = [];
$parentClasses = array();
foreach (array_reverse($this->getReflectionService()->getParentClasses($name)) as $parentClass) {
if ( ! $this->getDriver()->isTransient($parentClass)) {
$parentClasses[] = $parentClass;
@ -306,7 +306,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
$this->initialize();
}
$loaded = [];
$loaded = array();
$parentClasses = $this->getParentClasses($name);
$parentClasses[] = $name;
@ -314,7 +314,7 @@ abstract class AbstractClassMetadataFactory implements ClassMetadataFactory
// Move down the hierarchy of parent classes, starting from the topmost class
$parent = null;
$rootEntityFound = false;
$visited = [];
$visited = array();
$reflService = $this->getReflectionService();
foreach ($parentClasses as $className) {
if (isset($this->loadedMetadata[$className])) {

@ -45,14 +45,14 @@ abstract class AnnotationDriver implements MappingDriver
*
* @var array
*/
protected $paths = [];
protected $paths = array();
/**
* The paths excluded from path where to look for mapping files.
*
* @var array
*/
protected $excludePaths = [];
protected $excludePaths = array();
/**
* The file extension of mapping documents.
@ -73,7 +73,7 @@ abstract class AnnotationDriver implements MappingDriver
*
* @var array
*/
protected $entityAnnotationClasses = [];
protected $entityAnnotationClasses = array();
/**
* Initializes a new AnnotationDriver that uses the given AnnotationReader for reading
@ -200,8 +200,8 @@ abstract class AnnotationDriver implements MappingDriver
throw MappingException::pathRequired();
}
$classes = [];
$includedFiles = [];
$classes = array();
$includedFiles = array();
foreach ($this->paths as $path) {
if ( ! is_dir($path)) {

@ -37,7 +37,7 @@ class DefaultFileLocator implements FileLocator
*
* @var array
*/
protected $paths = [];
protected $paths = array();
/**
* The file extension of mapping documents.
@ -125,7 +125,7 @@ class DefaultFileLocator implements FileLocator
*/
public function getAllClassNames($globalBasename)
{
$classes = [];
$classes = array();
if ($this->paths) {
foreach ($this->paths as $path) {

@ -145,14 +145,11 @@ abstract class FileDriver implements MappingDriver
$this->initialize();
}
if (! $this->classCache) {
return (array) $this->locator->getAllClassNames($this->globalBasename);
$classNames = (array)$this->locator->getAllClassNames($this->globalBasename);
if ($this->classCache) {
$classNames = array_merge(array_keys($this->classCache), $classNames);
}
return array_merge(
array_keys($this->classCache),
(array) $this->locator->getAllClassNames($this->globalBasename)
);
return $classNames;
}
/**
@ -178,7 +175,7 @@ abstract class FileDriver implements MappingDriver
*/
protected function initialize()
{
$this->classCache = [];
$this->classCache = array();
if (null !== $this->globalBasename) {
foreach ($this->locator->getPaths() as $path) {
$file = $path.'/'.$this->globalBasename.$this->locator->getFileExtension();

@ -39,12 +39,12 @@ class MappingDriverChain implements MappingDriver
*
* @var MappingDriver|null
*/
private $defaultDriver;
private $defaultDriver = null;
/**
* @var array
*/
private $drivers = [];
private $drivers = array();
/**
* Gets the default driver.
@ -117,8 +117,8 @@ class MappingDriverChain implements MappingDriver
*/
public function getAllClassNames()
{
$classNames = [];
$driverClasses = [];
$classNames = array();
$driverClasses = array();
/* @var $driver MappingDriver */
foreach ($this->drivers AS $namespace => $driver) {

@ -44,7 +44,8 @@ class PHPDriver extends FileDriver
*/
public function __construct($locator, $fileExtension = null)
{
parent::__construct($locator, '.php');
$fileExtension = ".php";
parent::__construct($locator, $fileExtension);
}
/**
@ -53,7 +54,6 @@ class PHPDriver extends FileDriver
public function loadMetadataForClass($className, ClassMetadata $metadata)
{
$this->metadata = $metadata;
$this->loadMappingFile($this->locator->findMappingFile($className));
}
@ -65,6 +65,6 @@ class PHPDriver extends FileDriver
$metadata = $this->metadata;
include $file;
return [$metadata->getName() => $metadata];
return array($metadata->getName() => $metadata);
}
}

@ -40,7 +40,7 @@ class StaticPHPDriver implements MappingDriver
*
* @var array
*/
private $paths = [];
private $paths = array();
/**
* Map of all class names.
@ -93,8 +93,8 @@ class StaticPHPDriver implements MappingDriver
throw MappingException::pathRequired();
}
$classes = [];
$includedFiles = [];
$classes = array();
$includedFiles = array();
foreach ($this->paths as $path) {
if (!is_dir($path)) {

@ -37,14 +37,14 @@ class SymfonyFileLocator implements FileLocator
*
* @var array
*/
protected $paths = [];
protected $paths = array();
/**
* A map of mapping directory path to namespace prefix used to expand class shortnames.
*
* @var array
*/
protected $prefixes = [];
protected $prefixes = array();
/**
* File extension that is searched for.
@ -164,7 +164,7 @@ class SymfonyFileLocator implements FileLocator
*/
public function getAllClassNames($globalBasename = null)
{
$classes = [];
$classes = array();
if ($this->paths) {
foreach ((array) $this->paths as $path) {

@ -31,7 +31,7 @@ class StaticReflectionService implements ReflectionService
*/
public function getParentClasses($class)
{
return [];
return array();
}
/**

@ -198,7 +198,7 @@ abstract class PersistentObject implements ObjectManagerAware
throw new \InvalidArgumentException("Expected persistent object of type '".$targetClass."'");
}
if (!($this->$field instanceof Collection)) {
$this->$field = new ArrayCollection($this->$field ?: []);
$this->$field = new ArrayCollection($this->$field ?: array());
}
$this->$field->add($args[0]);
$this->completeOwningSide($field, $targetClass, $args[0]);

@ -87,7 +87,7 @@ abstract class AbstractProxyFactory
/**
* @var \Doctrine\Common\Proxy\ProxyDefinition[]
*/
private $definitions = [];
private $definitions = array();
/**
* @param \Doctrine\Common\Proxy\ProxyGenerator $proxyGenerator

@ -58,10 +58,10 @@ class ProxyGenerator
*
* @var string[]|callable[]
*/
protected $placeholders = [
'baseProxyInterface' => Proxy::class,
protected $placeholders = array(
'baseProxyInterface' => 'Doctrine\Common\Proxy\Proxy',
'additionalProperties' => '',
];
);
/**
* Template used as a blueprint to generate proxies.
@ -106,7 +106,7 @@ class <proxyShortClassName> extends \<className> implements \<baseProxyInterface
*
* @see \Doctrine\Common\Persistence\Proxy::__getLazyProperties
*/
public static $lazyPropertiesDefaults = [<lazyPropertiesDefaults>];
public static $lazyPropertiesDefaults = array(<lazyPropertiesDefaults>);
<additionalProperties>
@ -129,7 +129,7 @@ class <proxyShortClassName> extends \<className> implements \<baseProxyInterface
*/
public function __load()
{
$this->__initializer__ && $this->__initializer__->__invoke($this, \'__load\', []);
$this->__initializer__ && $this->__initializer__->__invoke($this, \'__load\', array());
}
/**
@ -263,12 +263,12 @@ class <proxyShortClassName> extends \<className> implements \<baseProxyInterface
preg_match_all('(<([a-zA-Z]+)>)', $this->proxyClassTemplate, $placeholderMatches);
$placeholderMatches = array_combine($placeholderMatches[0], $placeholderMatches[1]);
$placeholders = [];
$placeholders = array();
foreach ($placeholderMatches as $placeholder => $name) {
$placeholders[$placeholder] = isset($this->placeholders[$name])
? $this->placeholders[$name]
: [$this, 'generate' . $name];
: array($this, 'generate' . $name);
}
foreach ($placeholders as & $placeholder) {
@ -358,7 +358,7 @@ class <proxyShortClassName> extends \<className> implements \<baseProxyInterface
private function generateLazyPropertiesDefaults(ClassMetadata $class)
{
$lazyPublicProperties = $this->getLazyLoadedPublicProperties($class);
$values = [];
$values = array();
foreach ($lazyPublicProperties as $key => $value) {
$values[] = var_export($key, true) . ' => ' . var_export($value, true);
@ -385,7 +385,7 @@ class <proxyShortClassName> extends \<className> implements \<baseProxyInterface
{
EOT;
$toUnset = [];
$toUnset = array();
foreach ($this->getLazyLoadedPublicProperties($class) as $lazyPublicProperty => $unused) {
$toUnset[] = '$this->' . $lazyPublicProperty;
@ -443,7 +443,7 @@ EOT;
if ( ! empty($lazyPublicProperties)) {
$magicGet .= <<<'EOT'
if (array_key_exists($name, $this->__getLazyProperties())) {
$this->__initializer__ && $this->__initializer__->__invoke($this, '__get', [$name]);
$this->__initializer__ && $this->__initializer__->__invoke($this, '__get', array($name));
return $this->$name;
}
@ -454,7 +454,7 @@ EOT;
if ($hasParentGet) {
$magicGet .= <<<'EOT'
$this->__initializer__ && $this->__initializer__->__invoke($this, '__get', [$name]);
$this->__initializer__ && $this->__initializer__->__invoke($this, '__get', array($name));
return parent::__get($name);
@ -502,7 +502,7 @@ EOT;
if ( ! empty($lazyPublicProperties)) {
$magicSet .= <<<'EOT'
if (array_key_exists($name, $this->__getLazyProperties())) {
$this->__initializer__ && $this->__initializer__->__invoke($this, '__set', [$name, $value]);
$this->__initializer__ && $this->__initializer__->__invoke($this, '__set', array($name, $value));
$this->$name = $value;
@ -515,7 +515,7 @@ EOT;
if ($hasParentSet) {
$magicSet .= <<<'EOT'
$this->__initializer__ && $this->__initializer__->__invoke($this, '__set', [$name, $value]);
$this->__initializer__ && $this->__initializer__->__invoke($this, '__set', array($name, $value));
return parent::__set($name, $value);
EOT;
@ -559,7 +559,7 @@ EOT;
if ( ! empty($lazyPublicProperties)) {
$magicIsset .= <<<'EOT'
if (array_key_exists($name, $this->__getLazyProperties())) {
$this->__initializer__ && $this->__initializer__->__invoke($this, '__isset', [$name]);
$this->__initializer__ && $this->__initializer__->__invoke($this, '__isset', array($name));
return isset($this->$name);
}
@ -570,7 +570,7 @@ EOT;
if ($hasParentIsset) {
$magicIsset .= <<<'EOT'
$this->__initializer__ && $this->__initializer__->__invoke($this, '__isset', [$name]);
$this->__initializer__ && $this->__initializer__->__invoke($this, '__isset', array($name));
return parent::__isset($name);
@ -605,7 +605,7 @@ EOT;
if ($hasParentSleep) {
return $sleepImpl . <<<'EOT'
$properties = array_merge(['__isInitialized__'], parent::__sleep());
$properties = array_merge(array('__isInitialized__'), parent::__sleep());
if ($this->__isInitialized__) {
$properties = array_diff($properties, array_keys($this->__getLazyProperties()));
@ -616,7 +616,7 @@ EOT;
EOT;
}
$allProperties = ['__isInitialized__'];
$allProperties = array('__isInitialized__');
/* @var $prop \ReflectionProperty */
foreach ($class->getReflectionClass()->getProperties() as $prop) {
@ -645,10 +645,10 @@ EOT;
return $sleepImpl . <<<EOT
if (\$this->__isInitialized__) {
return [$allProperties];
return array($allProperties);
}
return [$protectedProperties];
return array($protectedProperties);
}
EOT;
}
@ -662,7 +662,7 @@ EOT;
*/
private function generateWakeupImpl(ClassMetadata $class)
{
$unsetPublicProperties = [];
$unsetPublicProperties = array();
$hasWakeup = $class->getReflectionClass()->hasMethod('__wakeup');
foreach (array_keys($this->getLazyLoadedPublicProperties($class)) as $lazyPublicProperty) {
@ -727,7 +727,7 @@ EOT;
*/
public function __clone()
{
\$this->__cloner__ && \$this->__cloner__->__invoke(\$this, '__clone', []);
\$this->__cloner__ && \$this->__cloner__->__invoke(\$this, '__clone', array());
$callParentClone }
EOT;
}
@ -742,16 +742,16 @@ EOT;
private function generateMethods(ClassMetadata $class)
{
$methods = '';
$methodNames = [];
$methodNames = array();
$reflectionMethods = $class->getReflectionClass()->getMethods(\ReflectionMethod::IS_PUBLIC);
$skippedMethods = [
$skippedMethods = array(
'__sleep' => true,
'__clone' => true,
'__wakeup' => true,
'__get' => true,
'__set' => true,
'__isset' => true,
];
);
foreach ($reflectionMethods as $method) {
$name = $method->getName();
@ -778,13 +778,12 @@ EOT;
}
$methods .= $name . '(' . $this->buildParametersString($class, $method, $method->getParameters()) . ')';
$methods .= $this->getMethodReturnType($method);
$methods .= "\n" . ' {' . "\n";
if ($this->isShortIdentifierGetter($method, $class)) {
$identifier = lcfirst(substr($name, 3));
$fieldType = $class->getTypeOfField($identifier);
$cast = in_array($fieldType, ['integer', 'smallint']) ? '(int) ' : '';
$cast = in_array($fieldType, array('integer', 'smallint')) ? '(int) ' : '';
$methods .= ' if ($this->__isInitialized__ === false) {' . "\n";
$methods .= ' return ' . $cast . ' parent::' . $method->getName() . "();\n";
@ -796,7 +795,7 @@ EOT;
$methods .= "\n \$this->__initializer__ "
. "&& \$this->__initializer__->__invoke(\$this, " . var_export($name, true)
. ", [" . $invokeParamsString . "]);"
. ", array(" . $invokeParamsString . "));"
. "\n\n return parent::" . $name . '(' . $callParamsString . ');'
. "\n" . ' }' . "\n";
}
@ -873,7 +872,7 @@ EOT;
private function getLazyLoadedPublicProperties(ClassMetadata $class)
{
$defaultProperties = $class->getReflectionClass()->getDefaultProperties();
$properties = [];
$properties = array();
foreach ($class->getReflectionClass()->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
$name = $property->getName();
@ -895,7 +894,7 @@ EOT;
*/
private function buildParametersString(ClassMetadata $class, \ReflectionMethod $method, array $parameters)
{
$parameterDefinitions = [];
$parameterDefinitions = array();
/* @var $param \ReflectionParameter */
foreach ($parameters as $param) {
@ -909,8 +908,10 @@ EOT;
$parameterDefinition .= '&';
}
if (method_exists($param, 'isVariadic') && $param->isVariadic()) {
$parameterDefinition .= '...';
if (method_exists($param, 'isVariadic')) {
if ($param->isVariadic()) {
$parameterDefinition .= '...';
}
}
$parameters[] = '$' . $param->getName();
@ -941,14 +942,10 @@ EOT;
return 'array';
}
if ($parameter->isCallable()) {
if (method_exists($parameter, 'isCallable') && $parameter->isCallable()) {
return 'callable';
}
if (method_exists($parameter, 'hasType') && $parameter->hasType() && $parameter->getType()->isBuiltin()) {
return (string) $parameter->getType();
}
try {
$parameterClass = $parameter->getClass();
@ -993,8 +990,10 @@ EOT;
function (\ReflectionParameter $parameter) {
$name = '';
if (method_exists($parameter, 'isVariadic') && $parameter->isVariadic()) {
$name .= '...';
if (method_exists($parameter, 'isVariadic')) {
if ($parameter->isVariadic()) {
$name .= '...';
}
}
$name .= '$' . $parameter->getName();
@ -1004,34 +1003,4 @@ EOT;
$parameters
);
}
/**
* @Param \ReflectionMethod $method
*
* @return string
*/
private function getMethodReturnType(\ReflectionMethod $method)
{
if (! (method_exists($method, 'hasReturnType') && $method->hasReturnType())) {
return '';
}
$returnType = $method->getReturnType();
if ($returnType->isBuiltin()) {
return ': ' . $returnType;
}
$nameLower = strtolower((string) $returnType);
if ('self' === $nameLower) {
return ': \\' . $method->getDeclaringClass()->getName();
}
if ('parent' === $nameLower) {
return ': \\' . $method->getDeclaringClass()->getParentClass()->getName();
}
return ': \\' . (string) $returnType;
}
}

@ -402,7 +402,7 @@ class StaticReflectionClass extends ReflectionClass
/**
* {@inheritDoc}
*/
public function newInstanceArgs(array $args = [])
public function newInstanceArgs(array $args = array())
{
throw new ReflectionException('Method not implemented');
}

@ -69,18 +69,18 @@ class StaticReflectionParser implements ReflectionProviderInterface
*
* @var array
*/
protected $useStatements = [];
protected $useStatements = array();
/**
* The docComment of the class.
*
* @var string
*/
protected $docComment = [
protected $docComment = array(
'class' => '',
'property' => [],
'method' => []
];
'property' => array(),
'method' => array()
);
/**
* The name of the class this class extends, if any.

@ -91,7 +91,7 @@ class StaticReflectionProperty extends ReflectionProperty
/**
* {@inheritDoc}
*/
public static function export($class, $name, $return = false)
public static function export ($class, $name, $return = false)
{
throw new ReflectionException('Method not implemented');
}
@ -155,7 +155,7 @@ class StaticReflectionProperty extends ReflectionProperty
/**
* {@inheritDoc}
*/
public function setAccessible($accessible)
public function setAccessible ($accessible)
{
throw new ReflectionException('Method not implemented');
}
@ -163,7 +163,7 @@ class StaticReflectionProperty extends ReflectionProperty
/**
* {@inheritDoc}
*/
public function setValue($object, $value = null)
public function setValue ($object, $value = null)
{
throw new ReflectionException('Method not implemented');
}

@ -19,7 +19,6 @@
namespace Doctrine\Common\Util;
use Doctrine\Common\Collections\Collection;
use Doctrine\Common\Persistence\Proxy;
/**
@ -96,13 +95,13 @@ final class Debug
$return = null;
$isObj = is_object($var);
if ($var instanceof Collection) {
if ($isObj && in_array('Doctrine\Common\Collections\Collection', class_implements($var))) {
$var = $var->toArray();
}
if ($maxDepth) {
if (is_array($var)) {
$return = [];
$return = array();
foreach ($var as $k => $v) {
$return[$k] = self::export($v, $maxDepth - 1);

@ -34,7 +34,7 @@ class Version
/**
* Current Doctrine Version.
*/
const VERSION = '2.6.0';
const VERSION = '2.5.2';
/**
* Compares a Doctrine version with the current one.

@ -0,0 +1,25 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
bootstrap="./tests/Doctrine/Tests/TestInit.php"
>
<testsuites>
<testsuite name="Doctrine Common Test Suite">
<directory>./tests/Doctrine/</directory>
</testsuite>
</testsuites>
<filter>
<whitelist>
<directory>./lib/Doctrine/</directory>
</whitelist>
</filter>
</phpunit>

@ -0,0 +1,3 @@
Doctrine/Tests/Proxies/
Doctrine/Tests/ORM/Proxy/generated/
Doctrine/Tests/ORM/Tools/Export/export

@ -0,0 +1,133 @@
<?php
namespace Doctrine\Tests\Common;
use Doctrine\Common\ClassLoader;
class ClassLoaderTest extends \Doctrine\Tests\DoctrineTestCase
{
public function testClassLoader()
{
$classLoader = new ClassLoader('ClassLoaderTest');
$classLoader->setIncludePath(__DIR__);
$classLoader->setFileExtension('.class.php');
$classLoader->setNamespaceSeparator('_');
$this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassA'));
$this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassB'));
$this->assertTrue($classLoader->canLoadClass('ClassLoaderTest_ClassC'));
$this->assertFalse($classLoader->canLoadClass('OtherClass'));
$this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassA'), true);
$this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassB'), true);
$this->assertEquals($classLoader->loadClass('ClassLoaderTest_ClassC'), true);
}
public function testClassExists()
{
$this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassD'));
$badLoader = function($className) {
require __DIR__ . '/ClassLoaderTest/ClassD.php';
return true;
};
spl_autoload_register($badLoader);
$this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassD'));
spl_autoload_unregister($badLoader);
}
public function testGetClassLoader()
{
$cl = new ClassLoader('ClassLoaderTest', __DIR__);
$cl->register();
$this->assertTrue(ClassLoader::getClassLoader('ClassLoaderTest\ClassD') instanceof \Doctrine\Common\ClassLoader);
$this->assertNull(ClassLoader::getClassLoader('This\Class\Does\Not\Exist'));
$cl->unregister();
}
public function testClassExistsWithSilentAutoloader()
{
$test = $this;
$silentLoader = function ($className) use ($test) {
$test->assertSame('ClassLoaderTest\ClassE', $className);
require __DIR__ . '/ClassLoaderTest/ClassE.php';
};
$additionalLoader = function () use ($test) {
$test->fail('Should not call this loader, class was already loaded');
};
$this->assertFalse(ClassLoader::classExists('ClassLoaderTest\ClassE'));
spl_autoload_register($silentLoader);
spl_autoload_register($additionalLoader);
$this->assertTrue(ClassLoader::classExists('ClassLoaderTest\ClassE'));
spl_autoload_unregister($additionalLoader);
spl_autoload_unregister($silentLoader);
}
public function testClassExistsWhenLoaderIsProtected()
{
require_once __DIR__ . '/ClassLoaderTest/ExternalLoader.php';
// Test static call
\ClassLoaderTest\ExternalLoader::registerStatic();
$this->assertFalse(ClassLoader::classExists('ClassLoaderTest\Class\That\Does\Not\Exist'));
\ClassLoaderTest\ExternalLoader::unregisterStatic();
// Test object
$loader = new \ClassLoaderTest\ExternalLoader();
$loader->register();
$this->assertFalse(ClassLoader::classExists('ClassLoaderTest\Class\That\Does\Not\Exist'));
$loader->unregister();
}
public function testLoadNonExistingClass()
{
$classLoader = new ClassLoader('ClassLoaderTest', __DIR__);
$this->assertFalse($classLoader->loadClass('ClassLoaderTest\Non\Existing\ClassName'));
}
public function testLoadFileNotContainingClassClass()
{
$classLoader = new ClassLoader('ClassLoaderTest', __DIR__);
$classLoader->setFileExtension('.class.php');
$this->assertFalse($classLoader->loadClass('ClassLoaderTest\EmptyFile'));
}
public function testSupportsInterfaceAutoloading()
{
$classLoader = new ClassLoader();
$classLoader->setIncludePath(__DIR__);
$classLoader->setFileExtension('.class.php');
$classLoader->setNamespaceSeparator('_');
$this->assertTrue($classLoader->loadClass('ClassLoaderTest_InterfaceA'));
$this->assertTrue(interface_exists('ClassLoaderTest_InterfaceA', false));
}
public function testSupportsTraitAutoloading()
{
if (! function_exists('trait_exists')) {
$this->markTestSkipped('You need a PHP version that supports traits in order to run this test');
}
$classLoader = new ClassLoader();
$classLoader->setIncludePath(__DIR__);
$classLoader->setFileExtension('.class.php');
$classLoader->setNamespaceSeparator('_');
$this->assertTrue($classLoader->loadClass('ClassLoaderTest_TraitA'));
$this->assertTrue(trait_exists('ClassLoaderTest_TraitA', false));
}
public function testMultipleAutoloadRequestsWillProduceSameResult()
{
$classLoader = new ClassLoader();
$classLoader->setIncludePath(__DIR__);
$classLoader->setFileExtension('.class.php');
$classLoader->setNamespaceSeparator('_');
$this->assertTrue($classLoader->loadClass('ClassLoaderTest_ClassA'));
$this->assertTrue($classLoader->loadClass('ClassLoaderTest_ClassA'));
}
}

@ -0,0 +1,5 @@
<?php
namespace ClassLoaderTest;
class ClassD {}

@ -0,0 +1,5 @@
<?php
namespace ClassLoaderTest;
class ClassE {}

@ -0,0 +1,38 @@
<?php
namespace ClassLoaderTest;
class ExternalLoader
{
public static function registerStatic() {
spl_autoload_register(array('ClassLoaderTest\ExternalLoader', 'load1'));
spl_autoload_register(array('ClassLoaderTest\ExternalLoader', 'load2'));
spl_autoload_register('ClassLoaderTest\ExternalLoader::load3');
}
public static function unregisterStatic() {
spl_autoload_unregister(array('ClassLoaderTest\ExternalLoader', 'load1'));
spl_autoload_unregister(array('ClassLoaderTest\ExternalLoader', 'load2'));
spl_autoload_unregister('ClassLoaderTest\ExternalLoader::load3');
}
public static function load1() {}
protected static function load2() {}
protected static function load3() {}
public function register() {
spl_autoload_register(array($this, 'load4'));
spl_autoload_register(array($this, 'load5'));
}
public function unregister() {
spl_autoload_unregister(array($this, 'load4'));
spl_autoload_unregister(array($this, 'load5'));
}
public function load4() {}
protected function load5() {}
}

@ -0,0 +1,5 @@
<?php
interface ClassLoaderTest_InterfaceA
{
}

@ -0,0 +1,88 @@
<?php
namespace Doctrine\Tests\Common;
use Doctrine\Common\EventManager;
use Doctrine\Common\EventArgs;
class EventManagerTest extends \Doctrine\Tests\DoctrineTestCase
{
/* Some pseudo events */
const preFoo = 'preFoo';
const postFoo = 'postFoo';
const preBar = 'preBar';
const postBar = 'postBar';
private $_preFooInvoked = false;
private $_postFooInvoked = false;
private $_eventManager;
protected function setUp()
{
$this->_eventManager = new EventManager;
$this->_preFooInvoked = false;
$this->_postFooInvoked = false;
}
public function testInitialState()
{
$this->assertEquals(array(), $this->_eventManager->getListeners());
$this->assertFalse($this->_eventManager->hasListeners(self::preFoo));
$this->assertFalse($this->_eventManager->hasListeners(self::postFoo));
}
public function testAddEventListener()
{
$this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this);
$this->assertTrue($this->_eventManager->hasListeners(self::preFoo));
$this->assertTrue($this->_eventManager->hasListeners(self::postFoo));
$this->assertEquals(1, count($this->_eventManager->getListeners(self::preFoo)));
$this->assertEquals(1, count($this->_eventManager->getListeners(self::postFoo)));
$this->assertEquals(2, count($this->_eventManager->getListeners()));
}
public function testDispatchEvent()
{
$this->_eventManager->addEventListener(array('preFoo', 'postFoo'), $this);
$this->_eventManager->dispatchEvent(self::preFoo);
$this->assertTrue($this->_preFooInvoked);
$this->assertFalse($this->_postFooInvoked);
}
public function testRemoveEventListener()
{
$this->_eventManager->addEventListener(array('preBar'), $this);
$this->assertTrue($this->_eventManager->hasListeners(self::preBar));
$this->_eventManager->removeEventListener(array('preBar'), $this);
$this->assertFalse($this->_eventManager->hasListeners(self::preBar));
}
public function testAddEventSubscriber()
{
$eventSubscriber = new TestEventSubscriber();
$this->_eventManager->addEventSubscriber($eventSubscriber);
$this->assertTrue($this->_eventManager->hasListeners(self::preFoo));
$this->assertTrue($this->_eventManager->hasListeners(self::postFoo));
}
/* Listener methods */
public function preFoo(EventArgs $e)
{
$this->_preFooInvoked = true;
}
public function postFoo(EventArgs $e)
{
$this->_postFooInvoked = true;
}
}
class TestEventSubscriber implements \Doctrine\Common\EventSubscriber
{
public function getSubscribedEvents()
{
return array('preFoo', 'postFoo');
}
}

@ -0,0 +1,102 @@
<?php
namespace Doctrine\Tests\Common\Persistence;
use Doctrine\Common\Persistence\AbstractManagerRegistry;
use Doctrine\Tests\Common\Persistence\Mapping\TestClassMetadataFactory;
use Doctrine\Tests\DoctrineTestCase;
use PHPUnit_Framework_TestCase;
/**
* @groups DCOM-270
* @uses Doctrine\Tests\Common\Persistence\TestObject
*/
class ManagerRegistryTest extends DoctrineTestCase
{
/**
* @var TestManagerRegistry
*/
private $mr;
/**
* {@inheritdoc}
*/
public function setUp()
{
$this->mr = new TestManagerRegistry(
'ORM',
array('default_connection'),
array('default_manager'),
'default',
'default',
'Doctrine\Common\Persistence\ObjectManagerAware'
);
}
public function testGetManagerForClass()
{
$this->mr->getManagerForClass('Doctrine\Tests\Common\Persistence\TestObject');
}
public function testGetManagerForProxyInterface()
{
$this->assertNull($this->mr->getManagerForClass('Doctrine\Common\Persistence\ObjectManagerAware'));
}
public function testGetManagerForInvalidClass()
{
$this->setExpectedException(
'ReflectionException',
'Class Doctrine\Tests\Common\Persistence\TestObjectInexistent does not exist'
);
$this->mr->getManagerForClass('prefix:TestObjectInexistent');
}
public function testGetManagerForAliasedClass()
{
$this->mr->getManagerForClass('prefix:TestObject');
}
public function testGetManagerForInvalidAliasedClass()
{
$this->setExpectedException(
'ReflectionException',
'Class Doctrine\Tests\Common\Persistence\TestObject:Foo does not exist'
);
$this->mr->getManagerForClass('prefix:TestObject:Foo');
}
}
class TestManager extends PHPUnit_Framework_TestCase
{
public function getMetadataFactory()
{
$driver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
return new TestClassMetadataFactory($driver, $metadata);
}
}
class TestManagerRegistry extends AbstractManagerRegistry
{
protected function getService($name)
{
return new TestManager();
}
/**
* {@inheritdoc}
*/
protected function resetService($name)
{
}
public function getAliasNamespace($alias)
{
return __NAMESPACE__;
}
}

@ -0,0 +1,29 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Common\Annotations\AnnotationReader;
use Doctrine\Common\Persistence\Mapping\Driver\AnnotationDriver;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
class AnnotationDriverTest extends \PHPUnit_Framework_TestCase
{
public function testGetAllClassNames()
{
$reader = new AnnotationReader();
$driver = new SimpleAnnotationDriver($reader, array(__DIR__ . '/_files/annotation'));
$classes = $driver->getAllClassNames();
$this->assertEquals(array('Doctrine\TestClass'), $classes);
}
}
class SimpleAnnotationDriver extends AnnotationDriver
{
protected $entityAnnotationClasses = array('Doctrine\Entity' => true);
public function loadMetadataForClass($className, ClassMetadata $metadata)
{
}
}

@ -0,0 +1,152 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Common\Persistence\Mapping\Driver\MappingDriverChain;
use Doctrine\Tests\DoctrineTestCase;
class DriverChainTest extends DoctrineTestCase
{
public function testDelegateToMatchingNamespaceDriver()
{
$className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity';
$classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$chain = new MappingDriverChain();
$driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$driver1->expects($this->never())
->method('loadMetadataForClass');
$driver1->expectS($this->never())
->method('isTransient');
$driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$driver2->expects($this->at(0))
->method('loadMetadataForClass')
->with($this->equalTo($className), $this->equalTo($classMetadata));
$driver2->expects($this->at(1))
->method('isTransient')
->with($this->equalTo($className))
->will($this->returnValue( true ));
$chain->addDriver($driver1, 'Doctrine\Tests\Models\Company');
$chain->addDriver($driver2, 'Doctrine\Tests\Common\Persistence\Mapping');
$chain->loadMetadataForClass($className, $classMetadata);
$this->assertTrue( $chain->isTransient($className) );
}
public function testLoadMetadata_NoDelegatorFound_ThrowsMappingException()
{
$className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity';
$classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$chain = new MappingDriverChain();
$this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException');
$chain->loadMetadataForClass($className, $classMetadata);
}
public function testGatherAllClassNames()
{
$className = 'Doctrine\Tests\Common\Persistence\Mapping\DriverChainEntity';
$classMetadata = $this->getMock('Doctrine\Common\Persistence\ClassMetadata');
$chain = new MappingDriverChain();
$driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$driver1->expects($this->once())
->method('getAllClassNames')
->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo')));
$driver2 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$driver2->expects($this->once())
->method('getAllClassNames')
->will($this->returnValue(array('Doctrine\Tests\ORM\Mapping\Bar', 'Doctrine\Tests\ORM\Mapping\Baz', 'FooBarBaz')));
$chain->addDriver($driver1, 'Doctrine\Tests\Models\Company');
$chain->addDriver($driver2, 'Doctrine\Tests\ORM\Mapping');
$this->assertEquals(array(
'Doctrine\Tests\Models\Company\Foo',
'Doctrine\Tests\ORM\Mapping\Bar',
'Doctrine\Tests\ORM\Mapping\Baz'
), $chain->getAllClassNames());
}
/**
* @group DDC-706
*/
public function testIsTransient()
{
$driver1 = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$chain = new MappingDriverChain();
$chain->addDriver($driver1, 'Doctrine\Tests\Models\CMS');
$this->assertTrue($chain->isTransient('stdClass'), "stdClass isTransient");
}
/**
* @group DDC-1412
*/
public function testDefaultDriver()
{
$companyDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$defaultDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$entityClassName = 'Doctrine\Tests\ORM\Mapping\DriverChainEntity';
$managerClassName = 'Doctrine\Tests\Models\Company\CompanyManager';
$chain = new MappingDriverChain();
$companyDriver->expects($this->never())
->method('loadMetadataForClass');
$companyDriver->expects($this->once())
->method('isTransient')
->with($this->equalTo($managerClassName))
->will($this->returnValue(false));
$defaultDriver->expects($this->never())
->method('loadMetadataForClass');
$defaultDriver->expects($this->once())
->method('isTransient')
->with($this->equalTo($entityClassName))
->will($this->returnValue(true));
$this->assertNull($chain->getDefaultDriver());
$chain->setDefaultDriver($defaultDriver);
$chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company');
$this->assertSame($defaultDriver, $chain->getDefaultDriver());
$this->assertTrue($chain->isTransient($entityClassName));
$this->assertFalse($chain->isTransient($managerClassName));
}
public function testDefaultDriverGetAllClassNames()
{
$companyDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$defaultDriver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$chain = new MappingDriverChain();
$companyDriver->expects($this->once())
->method('getAllClassNames')
->will($this->returnValue(array('Doctrine\Tests\Models\Company\Foo')));
$defaultDriver->expects($this->once())
->method('getAllClassNames')
->will($this->returnValue(array('Other\Class')));
$chain->setDefaultDriver($defaultDriver);
$chain->addDriver($companyDriver, 'Doctrine\Tests\Models\Company');
$classNames = $chain->getAllClassNames();
$this->assertEquals(array('Doctrine\Tests\Models\Company\Foo', 'Other\Class'), $classNames);
}
}
class DriverChainEntity
{
}

@ -0,0 +1,209 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Persistence\Mapping\Driver\DefaultFileLocator;
use Doctrine\Common\Persistence\Mapping\ReflectionService;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
use Doctrine\Common\Persistence\Mapping\AbstractClassMetadataFactory;
use Doctrine\Common\Cache\ArrayCache;
class ClassMetadataFactoryTest extends DoctrineTestCase
{
/**
* @var TestClassMetadataFactory
*/
private $cmf;
public function setUp()
{
$driver = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\MappingDriver');
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$this->cmf = new TestClassMetadataFactory($driver, $metadata);
}
public function testGetCacheDriver()
{
$this->assertNull($this->cmf->getCacheDriver());
$cache = new ArrayCache();
$this->cmf->setCacheDriver($cache);
$this->assertSame($cache, $this->cmf->getCacheDriver());
}
public function testGetMetadataFor()
{
$metadata = $this->cmf->getMetadataFor('stdClass');
$this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata);
$this->assertTrue($this->cmf->hasMetadataFor('stdClass'));
}
public function testGetMetadataForAbsentClass()
{
$this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException');
$this->cmf->getMetadataFor(__NAMESPACE__ . '\AbsentClass');
}
public function testGetParentMetadata()
{
$metadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity');
$this->assertInstanceOf('Doctrine\Common\Persistence\Mapping\ClassMetadata', $metadata);
$this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity'));
$this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\RootEntity'));
}
public function testGetCachedMetadata()
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$cache = new ArrayCache();
$cache->save(__NAMESPACE__. '\ChildEntity$CLASSMETADATA', $metadata);
$this->cmf->setCacheDriver($cache);
$loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity');
$this->assertSame($loadedMetadata, $metadata);
}
public function testCacheGetMetadataFor()
{
$cache = new ArrayCache();
$this->cmf->setCacheDriver($cache);
$loadedMetadata = $this->cmf->getMetadataFor(__NAMESPACE__ . '\ChildEntity');
$this->assertSame($loadedMetadata, $cache->fetch(__NAMESPACE__. '\ChildEntity$CLASSMETADATA'));
}
public function testGetAliasedMetadata()
{
$this->cmf->getMetadataFor('prefix:ChildEntity');
$this->assertTrue($this->cmf->hasMetadataFor(__NAMESPACE__ . '\ChildEntity'));
$this->assertTrue($this->cmf->hasMetadataFor('prefix:ChildEntity'));
}
/**
* @group DCOM-270
*/
public function testGetInvalidAliasedMetadata()
{
$this->setExpectedException(
'Doctrine\Common\Persistence\Mapping\MappingException',
'Class \'Doctrine\Tests\Common\Persistence\Mapping\ChildEntity:Foo\' does not exist'
);
$this->cmf->getMetadataFor('prefix:ChildEntity:Foo');
}
/**
* @group DCOM-270
*/
public function testClassIsTransient()
{
$this->assertTrue($this->cmf->isTransient('prefix:ChildEntity:Foo'));
}
public function testWillFallbackOnNotLoadedMetadata()
{
$classMetadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$this->cmf->fallbackCallback = function () use ($classMetadata) {
return $classMetadata;
};
$this->cmf->metadata = null;
$this->assertSame($classMetadata, $this->cmf->getMetadataFor('Foo'));
}
public function testWillFailOnFallbackFailureWithNotLoadedMetadata()
{
$this->cmf->fallbackCallback = function () {
return null;
};
$this->cmf->metadata = null;
$this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException');
$this->cmf->getMetadataFor('Foo');
}
}
class TestClassMetadataFactory extends AbstractClassMetadataFactory
{
public $driver;
public $metadata;
/** @var callable|null */
public $fallbackCallback;
public function __construct($driver, $metadata)
{
$this->driver = $driver;
$this->metadata = $metadata;
}
protected function doLoadMetadata($class, $parent, $rootEntityFound, array $nonSuperclassParents)
{
}
protected function getFqcnFromAlias($namespaceAlias, $simpleClassName)
{
return __NAMESPACE__ . '\\' . $simpleClassName;
}
protected function initialize()
{
}
protected function newClassMetadataInstance($className)
{
return $this->metadata;
}
protected function getDriver()
{
return $this->driver;
}
protected function wakeupReflection(ClassMetadata $class, ReflectionService $reflService)
{
}
protected function initializeReflection(ClassMetadata $class, ReflectionService $reflService)
{
}
protected function isEntity(ClassMetadata $class)
{
return true;
}
protected function onNotFoundMetadata($className)
{
if (! $fallback = $this->fallbackCallback) {
return null;
}
return $fallback();
}
public function isTransient($class)
{
return true;
}
}
class RootEntity
{
}
class ChildEntity extends RootEntity
{
}

@ -0,0 +1,98 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Persistence\Mapping\Driver\DefaultFileLocator;
class DefaultFileLocatorTest extends DoctrineTestCase
{
public function testGetPaths()
{
$path = __DIR__ . "/_files";
$locator = new DefaultFileLocator(array($path));
$this->assertEquals(array($path), $locator->getPaths());
$locator = new DefaultFileLocator($path);
$this->assertEquals(array($path), $locator->getPaths());
}
public function testGetFileExtension()
{
$locator = new DefaultFileLocator(array(), ".yml");
$this->assertEquals(".yml", $locator->getFileExtension());
$locator->setFileExtension(".xml");
$this->assertEquals(".xml", $locator->getFileExtension());
}
public function testUniquePaths()
{
$path = __DIR__ . "/_files";
$locator = new DefaultFileLocator(array($path, $path));
$this->assertEquals(array($path), $locator->getPaths());
}
public function testFindMappingFile()
{
$path = __DIR__ . "/_files";
$locator = new DefaultFileLocator(array($path), ".yml");
$this->assertEquals(__DIR__ . '/_files' . DIRECTORY_SEPARATOR . 'stdClass.yml', $locator->findMappingFile('stdClass'));
}
public function testFindMappingFileNotFound()
{
$path = __DIR__ . "/_files";
$locator = new DefaultFileLocator(array($path), ".yml");
$this->setExpectedException(
'Doctrine\Common\Persistence\Mapping\MappingException',
"No mapping file found named 'stdClass2.yml' for class 'stdClass2'"
);
$locator->findMappingFile('stdClass2');
}
public function testGetAllClassNames()
{
$path = __DIR__ . "/_files";
$locator = new DefaultFileLocator(array($path), ".yml");
$allClasses = $locator->getAllClassNames(null);
$globalClasses = $locator->getAllClassNames("global");
$expectedAllClasses = array('global', 'stdClass', 'subDirClass');
$expectedGlobalClasses = array('subDirClass', 'stdClass');
sort($allClasses);
sort($globalClasses);
sort($expectedAllClasses);
sort($expectedGlobalClasses);
$this->assertEquals($expectedAllClasses, $allClasses);
$this->assertEquals($expectedGlobalClasses, $globalClasses);
}
public function testGetAllClassNamesNonMatchingFileExtension()
{
$path = __DIR__ . "/_files";
$locator = new DefaultFileLocator(array($path), ".xml");
$this->assertEquals(array(), $locator->getAllClassNames("global"));
}
public function testFileExists()
{
$path = __DIR__ . "/_files";
$locator = new DefaultFileLocator(array($path), ".yml");
$this->assertTrue($locator->fileExists("stdClass"));
$this->assertFalse($locator->fileExists("stdClass2"));
$this->assertTrue($locator->fileExists("global"));
$this->assertFalse($locator->fileExists("global2"));
}
}

@ -0,0 +1,142 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Persistence\Mapping\Driver\FileDriver;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
class FileDriverTest extends DoctrineTestCase
{
public function testGlobalBasename()
{
$driver = new TestFileDriver(array());
$this->assertNull($driver->getGlobalBasename());
$driver->setGlobalBasename("global");
$this->assertEquals("global", $driver->getGlobalBasename());
}
public function testGetElementFromGlobalFile()
{
$driver = new TestFileDriver($this->newLocator());
$driver->setGlobalBasename("global");
$element = $driver->getElement('stdGlobal');
$this->assertEquals('stdGlobal', $element);
}
public function testGetElementFromFile()
{
$locator = $this->newLocator();
$locator->expects($this->once())
->method('findMappingFile')
->with($this->equalTo('stdClass'))
->will($this->returnValue(__DIR__ . '/_files/stdClass.yml'));
$driver = new TestFileDriver($locator);
$this->assertEquals('stdClass', $driver->getElement('stdClass'));
}
public function testGetAllClassNamesGlobalBasename()
{
$driver = new TestFileDriver($this->newLocator());
$driver->setGlobalBasename("global");
$classNames = $driver->getAllClassNames();
$this->assertEquals(array('stdGlobal', 'stdGlobal2'), $classNames);
}
public function testGetAllClassNamesFromMappingFile()
{
$locator = $this->newLocator();
$locator->expects($this->any())
->method('getAllClassNames')
->with($this->equalTo(null))
->will($this->returnValue(array('stdClass')));
$driver = new TestFileDriver($locator);
$classNames = $driver->getAllClassNames();
$this->assertEquals(array('stdClass'), $classNames);
}
public function testGetAllClassNamesBothSources()
{
$locator = $this->newLocator();
$locator->expects($this->any())
->method('getAllClassNames')
->with($this->equalTo('global'))
->will($this->returnValue(array('stdClass')));
$driver = new TestFileDriver($locator);
$driver->setGlobalBasename("global");
$classNames = $driver->getAllClassNames();
$this->assertEquals(array('stdGlobal', 'stdGlobal2', 'stdClass'), $classNames);
}
public function testIsNotTransient()
{
$locator = $this->newLocator();
$locator->expects($this->once())
->method('fileExists')
->with($this->equalTo('stdClass'))
->will($this->returnValue( true ));
$driver = new TestFileDriver($locator);
$driver->setGlobalBasename("global");
$this->assertFalse($driver->isTransient('stdClass'));
$this->assertFalse($driver->isTransient('stdGlobal'));
$this->assertFalse($driver->isTransient('stdGlobal2'));
}
public function testIsTransient()
{
$locator = $this->newLocator();
$locator->expects($this->once())
->method('fileExists')
->with($this->equalTo('stdClass2'))
->will($this->returnValue( false ));
$driver = new TestFileDriver($locator);
$this->assertTrue($driver->isTransient('stdClass2'));
}
public function testNonLocatorFallback()
{
$driver = new TestFileDriver(__DIR__ . '/_files', '.yml');
$this->assertTrue($driver->isTransient('stdClass2'));
$this->assertFalse($driver->isTransient('stdClass'));
}
private function newLocator()
{
$locator = $this->getMock('Doctrine\Common\Persistence\Mapping\Driver\FileLocator');
$locator->expects($this->any())->method('getFileExtension')->will($this->returnValue('.yml'));
$locator->expects($this->any())->method('getPaths')->will($this->returnValue(array(__DIR__ . "/_files")));
return $locator;
}
}
class TestFileDriver extends FileDriver
{
protected function loadMappingFile($file)
{
if (strpos($file, "global.yml") !== false) {
return array('stdGlobal' => 'stdGlobal', 'stdGlobal2' => 'stdGlobal2');
}
return array('stdClass' => 'stdClass');
}
public function loadMetadataForClass($className, ClassMetadata $metadata)
{
}
}

@ -0,0 +1,18 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Persistence\Mapping\Driver\PHPDriver;
class PHPDriverTest extends DoctrineTestCase
{
public function testLoadMetadata()
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$metadata->expects($this->once())->method('getFieldNames');
$driver = new PHPDriver(array(__DIR__ . "/_files"));
$driver->loadMetadataForClass('TestEntity', $metadata);
}
}

@ -0,0 +1,84 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Common\Persistence\Mapping\RuntimeReflectionService;
/**
* @group DCOM-93
*/
class RuntimeReflectionServiceTest extends \PHPUnit_Framework_TestCase
{
/**
* @var RuntimeReflectionService
*/
private $reflectionService;
public $unusedPublicProperty;
public function setUp()
{
$this->reflectionService = new RuntimeReflectionService();
}
public function testShortname()
{
$this->assertEquals("RuntimeReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__));
}
public function testClassNamespaceName()
{
$this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__));
}
public function testGetParentClasses()
{
$classes = $this->reflectionService->getParentClasses(__CLASS__);
$this->assertTrue(count($classes) >= 1, "The test class ".__CLASS__." should have at least one parent.");
}
public function testGetParentClassesForAbsentClass()
{
$this->setExpectedException('Doctrine\Common\Persistence\Mapping\MappingException');
$this->reflectionService->getParentClasses(__NAMESPACE__ . '\AbsentClass');
}
public function testGetReflectionClass()
{
$class = $this->reflectionService->getClass(__CLASS__);
$this->assertInstanceOf("ReflectionClass", $class);
}
public function testGetMethods()
{
$this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods"));
$this->assertFalse($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2"));
}
public function testGetAccessibleProperty()
{
$reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService");
$this->assertInstanceOf("ReflectionProperty", $reflProp);
$reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "unusedPublicProperty");
$this->assertInstanceOf("Doctrine\Common\Reflection\RuntimePublicReflectionProperty", $reflProp);
}
}

@ -0,0 +1,35 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Persistence\Mapping\Driver\StaticPHPDriver;
class StaticPHPDriverTest extends DoctrineTestCase
{
public function testLoadMetadata()
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$metadata->expects($this->once())->method('getFieldNames');
$driver = new StaticPHPDriver(array(__DIR__));
$driver->loadMetadataForClass(__NAMESPACE__ . '\\TestEntity', $metadata);
}
public function testGetAllClassNames()
{
$driver = new StaticPHPDriver(array(__DIR__));
$classNames = $driver->getAllClassNames();
$this->assertContains(
'Doctrine\Tests\Common\Persistence\Mapping\TestEntity', $classNames);
}
}
class TestEntity
{
static public function loadMetadata($metadata)
{
$metadata->getFieldNames();
}
}

@ -0,0 +1,70 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Common\Persistence\Mapping\StaticReflectionService;
/**
* @group DCOM-93
*/
class StaticReflectionServiceTest extends \PHPUnit_Framework_TestCase
{
private $reflectionService;
public function setUp()
{
$this->reflectionService = new StaticReflectionService();
}
public function testShortname()
{
$this->assertEquals("StaticReflectionServiceTest", $this->reflectionService->getClassShortName(__CLASS__));
}
public function testClassNamespaceName()
{
$this->assertEquals("Doctrine\Tests\Common\Persistence\Mapping", $this->reflectionService->getClassNamespace(__CLASS__));
}
public function testGetParentClasses()
{
$classes = $this->reflectionService->getParentClasses(__CLASS__);
$this->assertTrue(count($classes) == 0, "The test class ".__CLASS__." should have no parents according to static reflection.");
}
public function testGetReflectionClass()
{
$class = $this->reflectionService->getClass(__CLASS__);
$this->assertNull($class);
}
public function testGetMethods()
{
$this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods"));
$this->assertTrue($this->reflectionService->hasPublicMethod(__CLASS__, "testGetMethods2"));
}
public function testGetAccessibleProperty()
{
$reflProp = $this->reflectionService->getAccessibleProperty(__CLASS__, "reflectionService");
$this->assertNull($reflProp);
}
}

@ -0,0 +1,181 @@
<?php
namespace Doctrine\Tests\Common\Persistence\Mapping;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Persistence\Mapping\Driver\SymfonyFileLocator;
class SymfonyFileLocatorTest extends DoctrineTestCase
{
public function testGetPaths()
{
$path = __DIR__ . "/_files";
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix));
$this->assertEquals(array($path), $locator->getPaths());
$locator = new SymfonyFileLocator(array($path => $prefix));
$this->assertEquals(array($path), $locator->getPaths());
}
public function testGetPrefixes()
{
$path = __DIR__ . "/_files";
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix));
$this->assertEquals(array($path => $prefix), $locator->getNamespacePrefixes());
}
public function testGetFileExtension()
{
$locator = new SymfonyFileLocator(array(), ".yml");
$this->assertEquals(".yml", $locator->getFileExtension());
$locator->setFileExtension(".xml");
$this->assertEquals(".xml", $locator->getFileExtension());
}
public function testFileExists()
{
$path = __DIR__ . "/_files";
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix), ".yml");
$this->assertTrue($locator->fileExists("Foo\stdClass"));
$this->assertTrue($locator->fileExists("Foo\global"));
$this->assertFalse($locator->fileExists("Foo\stdClass2"));
$this->assertFalse($locator->fileExists("Foo\global2"));
}
public function testGetAllClassNames()
{
$path = __DIR__ . "/_files";
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix), ".yml");
$allClasses = $locator->getAllClassNames(null);
$globalClasses = $locator->getAllClassNames("global");
$expectedAllClasses = array("Foo\\Bar\\subDirClass", "Foo\\global", "Foo\\stdClass");
$expectedGlobalClasses = array("Foo\\Bar\\subDirClass", "Foo\\stdClass");
sort($allClasses);
sort($globalClasses);
sort($expectedAllClasses);
sort($expectedGlobalClasses);
$this->assertEquals($expectedAllClasses, $allClasses);
$this->assertEquals($expectedGlobalClasses, $globalClasses);
}
/**
* @expectedException \InvalidArgumentException
* @expectedExceptionMessage Namespace separator should not be empty
*/
public function testInvalidCustomNamespaceSeparator()
{
$path = __DIR__ . "/_files";
$prefix = "Foo";
new SymfonyFileLocator(array($path => $prefix), ".yml", null);
}
public function customNamespaceSeparatorProvider()
{
return array(
'directory separator' => array(DIRECTORY_SEPARATOR, "/_custom_ns/dir"),
'default dot separator' => array('.', "/_custom_ns/dot"),
);
}
/**
* @dataProvider customNamespaceSeparatorProvider
*
* @param $separator string Directory separator to test against
* @param $dir string Path to load mapping data from
*
* @throws \Doctrine\Common\Persistence\Mapping\MappingException
*/
public function testGetClassNamesWithCustomNsSeparator($separator, $dir)
{
$path = __DIR__ . $dir;
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix), ".yml", $separator);
$classes = $locator->getAllClassNames(null);
sort($classes);
$this->assertEquals(array("Foo\\stdClass", "Foo\\sub\\subClass", "Foo\\sub\\subsub\\subSubClass"), $classes);
}
public function customNamespaceLookupQueryProvider()
{
return array(
'directory separator' => array(
DIRECTORY_SEPARATOR,
"/_custom_ns/dir",
array(
"stdClass.yml" => "Foo\\stdClass",
"sub/subClass.yml" => "Foo\\sub\\subClass",
"sub/subsub/subSubClass.yml" => "Foo\\sub\\subsub\\subSubClass",
)
),
'default dot separator' => array(
'.',
"/_custom_ns/dot",
array(
"stdClass.yml" => "Foo\\stdClass",
"sub.subClass.yml" => "Foo\\sub\\subClass",
"sub.subsub.subSubClass.yml" => "Foo\\sub\\subsub\\subSubClass",
)
),
);
}
/** @dataProvider customNamespaceLookupQueryProvider
* @param $separator string Directory separator to test against
* @param $dir string Path to load mapping data from
* @param $files array Files to lookup classnames
*
* @throws \Doctrine\Common\Persistence\Mapping\MappingException
*/
public function testFindMappingFileWithCustomNsSeparator($separator, $dir, $files)
{
$path = __DIR__ . $dir;
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix), ".yml", $separator);
foreach ($files as $filePath => $className) {
$this->assertEquals(realpath($path .'/'. $filePath), realpath($locator->findMappingFile($className)));
}
}
public function testFindMappingFile()
{
$path = __DIR__ . "/_files";
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix), ".yml");
$this->assertEquals(__DIR__ . "/_files/stdClass.yml", $locator->findMappingFile("Foo\\stdClass"));
}
public function testFindMappingFileNotFound()
{
$path = __DIR__ . "/_files";
$prefix = "Foo";
$locator = new SymfonyFileLocator(array($path => $prefix), ".yml");
$this->setExpectedException(
"Doctrine\Common\Persistence\Mapping\MappingException",
"No mapping file found named '".__DIR__."/_files/stdClass2.yml' for class 'Foo\stdClass2'."
);
$locator->findMappingFile("Foo\\stdClass2");
}
}

@ -0,0 +1,17 @@
<?php
namespace Doctrine;
/**
* @Doctrine\Entity
*/
class TestClass
{
}
/**
* @Annotation
*/
class Entity
{
}

@ -0,0 +1,60 @@
<?php
namespace Doctrine\Tests\Common\Persistence;
use Doctrine\Common\Persistence\ObjectManagerDecorator;
use Doctrine\Common\Persistence\ObjectManager;
class NullObjectManagerDecorator extends ObjectManagerDecorator
{
public function __construct(ObjectManager $wrapped)
{
$this->wrapped = $wrapped;
}
}
class ObjectManagerDecoratorTest extends \PHPUnit_Framework_TestCase
{
private $wrapped;
private $decorated;
public function setUp()
{
$this->wrapped = $this->getMock('Doctrine\Common\Persistence\ObjectManager');
$this->decorated = new NullObjectManagerDecorator($this->wrapped);
}
public function getMethodParameters()
{
$class = new \ReflectionClass('Doctrine\Common\Persistence\ObjectManager');
$methods = array();
foreach ($class->getMethods() as $method) {
if ($method->getNumberOfRequiredParameters() === 0) {
$methods[] = array($method->getName(), array());
} elseif ($method->getNumberOfRequiredParameters() > 0) {
$methods[] = array($method->getName(), array_fill(0, $method->getNumberOfRequiredParameters(), 'req') ?: array());
}
if ($method->getNumberOfParameters() != $method->getNumberOfRequiredParameters()) {
$methods[] = array($method->getName(), array_fill(0, $method->getNumberOfParameters(), 'all') ?: array());
}
}
return $methods;
}
/**
* @dataProvider getMethodParameters
*/
public function testAllMethodCallsAreDelegatedToTheWrappedInstance($method, array $parameters)
{
$stub = $this->wrapped
->expects($this->once())
->method($method)
->will($this->returnValue('INNER VALUE FROM ' . $method));
call_user_func_array(array($stub, 'with'), $parameters);
$this->assertSame('INNER VALUE FROM ' . $method, call_user_func_array(array($this->decorated, $method), $parameters));
}
}

@ -0,0 +1,247 @@
<?php
namespace Doctrine\Tests\Common\Persistence;
use Doctrine\Common\Persistence\PersistentObject;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
use Doctrine\Common\Persistence\Mapping\ReflectionService;
/**
* @group DDC-1448
*/
class PersistentObjectTest extends \Doctrine\Tests\DoctrineTestCase
{
private $cm;
private $om;
private $object;
public function setUp()
{
$this->cm = new TestObjectMetadata;
$this->om = $this->getMock('Doctrine\Common\Persistence\ObjectManager');
$this->om->expects($this->any())->method('getClassMetadata')
->will($this->returnValue($this->cm));
$this->object = new TestObject;
PersistentObject::setObjectManager($this->om);
$this->object->injectObjectManager($this->om, $this->cm);
}
public function testGetObjectManager()
{
$this->assertSame($this->om, PersistentObject::getObjectManager());
}
public function testNonMatchingObjectManager()
{
$this->setExpectedException('RuntimeException');
$om = $this->getMock('Doctrine\Common\Persistence\ObjectManager');
$this->object->injectObjectManager($om, $this->cm);
}
public function testGetField()
{
$this->assertEquals('beberlei', $this->object->getName());
}
public function testSetField()
{
$this->object->setName("test");
$this->assertEquals("test", $this->object->getName());
}
public function testGetIdentifier()
{
$this->assertEquals(1, $this->object->getId());
}
public function testSetIdentifier()
{
$this->setExpectedException('BadMethodCallException');
$this->object->setId(2);
}
public function testSetUnknownField()
{
$this->setExpectedException('BadMethodCallException');
$this->object->setUnknown("test");
}
public function testGetUnknownField()
{
$this->setExpectedException('BadMethodCallException');
$this->object->getUnknown();
}
public function testGetToOneAssociation()
{
$this->assertNull($this->object->getParent());
}
public function testSetToOneAssociation()
{
$parent = new TestObject();
$this->object->setParent($parent);
$this->assertSame($parent, $this->object->getParent($parent));
}
public function testSetInvalidToOneAssociation()
{
$parent = new \stdClass();
$this->setExpectedException('InvalidArgumentException');
$this->object->setParent($parent);
}
public function testSetToOneAssociationNull()
{
$parent = new TestObject();
$this->object->setParent($parent);
$this->object->setParent(null);
$this->assertNull($this->object->getParent());
}
public function testAddToManyAssociation()
{
$child = new TestObject();
$this->object->addChildren($child);
$this->assertSame($this->object, $child->getParent());
$this->assertEquals(1, count($this->object->getChildren()));
$child = new TestObject();
$this->object->addChildren($child);
$this->assertEquals(2, count($this->object->getChildren()));
}
public function testAddInvalidToManyAssociation()
{
$this->setExpectedException('InvalidArgumentException');
$this->object->addChildren(new \stdClass());
}
public function testNoObjectManagerSet()
{
PersistentObject::setObjectManager(null);
$child = new TestObject();
$this->setExpectedException('RuntimeException');
$child->setName("test");
}
public function testInvalidMethod()
{
$this->setExpectedException('BadMethodCallException');
$this->object->asdf();
}
public function testAddInvalidCollection()
{
$this->setExpectedException('BadMethodCallException');
$this->object->addAsdf(new \stdClass());
}
}
class TestObject extends PersistentObject
{
protected $id = 1;
protected $name = 'beberlei';
protected $parent;
protected $children;
}
class TestObjectMetadata implements ClassMetadata
{
public function getAssociationMappedByTargetField($assocName)
{
$assoc = array('children' => 'parent');
return $assoc[$assocName];
}
public function getAssociationNames()
{
return array('parent', 'children');
}
public function getAssociationTargetClass($assocName)
{
return __NAMESPACE__ . '\TestObject';
}
public function getFieldNames()
{
return array('id', 'name');
}
public function getIdentifier()
{
return array('id');
}
public function getName()
{
return __NAMESPACE__ . '\TestObject';
}
public function getReflectionClass()
{
return new \ReflectionClass($this->getName());
}
public function getTypeOfField($fieldName)
{
$types = array('id' => 'integer', 'name' => 'string');
return $types[$fieldName];
}
public function hasAssociation($fieldName)
{
return in_array($fieldName, array('parent', 'children'));
}
public function hasField($fieldName)
{
return in_array($fieldName, array('id', 'name'));
}
public function isAssociationInverseSide($assocName)
{
return ($assocName === 'children');
}
public function isCollectionValuedAssociation($fieldName)
{
return ($fieldName === 'children');
}
public function isIdentifier($fieldName)
{
return $fieldName === 'id';
}
public function isSingleValuedAssociation($fieldName)
{
return $fieldName === 'parent';
}
public function getIdentifierValues($entity)
{
}
public function getIdentifierFieldNames()
{
}
public function initializeReflection(ReflectionService $reflService)
{
}
public function wakeupReflection(ReflectionService $reflService)
{
}
}

@ -0,0 +1,146 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Proxy\ProxyDefinition;
class AbstractProxyFactoryTest extends DoctrineTestCase
{
public function testGenerateProxyClasses()
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$proxyGenerator = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false);
$proxyGenerator
->expects($this->once())
->method('getProxyFileName');
$proxyGenerator
->expects($this->once())
->method('generateProxyClass');
$metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory');
$proxyFactory = $this->getMockForAbstractClass(
'Doctrine\Common\Proxy\AbstractProxyFactory',
array($proxyGenerator, $metadataFactory, true)
);
$proxyFactory
->expects($this->any())
->method('skipClass')
->will($this->returnValue(false));
$generated = $proxyFactory->generateProxyClasses(array($metadata), sys_get_temp_dir());
$this->assertEquals(1, $generated, 'One proxy was generated');
}
public function testGetProxy()
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$proxy = $this->getMock('Doctrine\Common\Proxy\Proxy');
$definition = new ProxyDefinition(get_class($proxy), array(), array(), null, null);
$proxyGenerator = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false);
$metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory');
$metadataFactory
->expects($this->once())
->method('getMetadataFor')
->will($this->returnValue($metadata));
$proxyFactory = $this->getMockForAbstractClass(
'Doctrine\Common\Proxy\AbstractProxyFactory',
array($proxyGenerator, $metadataFactory, true)
);
$proxyFactory
->expects($this->any())
->method('createProxyDefinition')
->will($this->returnValue($definition));
$generatedProxy = $proxyFactory->getProxy('Class', array('id' => 1));
$this->assertInstanceOf(get_class($proxy), $generatedProxy);
}
public function testResetUnitializedProxy()
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$proxy = $this->getMock('Doctrine\Common\Proxy\Proxy');
$definition = new ProxyDefinition(get_class($proxy), array(), array(), null, null);
$proxyGenerator = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false);
$metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory');
$metadataFactory
->expects($this->once())
->method('getMetadataFor')
->will($this->returnValue($metadata));
$proxyFactory = $this->getMockForAbstractClass(
'Doctrine\Common\Proxy\AbstractProxyFactory',
array($proxyGenerator, $metadataFactory, true)
);
$proxyFactory
->expects($this->any())
->method('createProxyDefinition')
->will($this->returnValue($definition));
$proxy
->expects($this->once())
->method('__isInitialized')
->will($this->returnValue(false));
$proxy
->expects($this->once())
->method('__setInitializer');
$proxy
->expects($this->once())
->method('__setCloner');
$proxyFactory->resetUninitializedProxy($proxy);
}
public function testDisallowsResettingInitializedProxy()
{
$proxyFactory = $this->getMockForAbstractClass('Doctrine\Common\Proxy\AbstractProxyFactory', array(), '', false);
$proxy = $this->getMock('Doctrine\Common\Proxy\Proxy');
$proxy
->expects($this->any())
->method('__isInitialized')
->will($this->returnValue(true));
$this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException');
$proxyFactory->resetUninitializedProxy($proxy);
}
public function testMissingPrimaryKeyValue()
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$proxy = $this->getMock('Doctrine\Common\Proxy\Proxy');
$definition = new ProxyDefinition(get_class($proxy), array('missingKey'), array(), null, null);
$proxyGenerator = $this->getMock('Doctrine\Common\Proxy\ProxyGenerator', array(), array(), '', false);
$metadataFactory = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadataFactory');
$metadataFactory
->expects($this->once())
->method('getMetadataFor')
->will($this->returnValue($metadata));
$proxyFactory = $this->getMockForAbstractClass(
'Doctrine\Common\Proxy\AbstractProxyFactory',
array($proxyGenerator, $metadataFactory, true)
);
$proxyFactory
->expects($this->any())
->method('createProxyDefinition')
->will($this->returnValue($definition));
$this->setExpectedException('\OutOfBoundsException');
$generatedProxy = $proxyFactory->getProxy('Class', array());
}
}

@ -0,0 +1,72 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Proxy;
use PHPUnit_Framework_TestCase;
use Doctrine\Common\Proxy\Autoloader;
/**
* @group DDC-1698
*/
class AutoloaderTest extends PHPUnit_Framework_TestCase
{
public static function dataResolveFile()
{
return array(
array('/tmp', 'MyProxy', 'MyProxy\__CG__\RealClass', '/tmp' . DIRECTORY_SEPARATOR . '__CG__RealClass.php'),
array('/tmp', 'MyProxy\Subdir', 'MyProxy\Subdir\__CG__\RealClass', '/tmp' . DIRECTORY_SEPARATOR . '__CG__RealClass.php'),
array('/tmp', 'MyProxy', 'MyProxy\__CG__\Other\RealClass', '/tmp' . DIRECTORY_SEPARATOR . '__CG__OtherRealClass.php'),
);
}
/**
* @dataProvider dataResolveFile
*/
public function testResolveFile($proxyDir, $proxyNamespace, $className, $expectedProxyFile)
{
$actualProxyFile = Autoloader::resolveFile($proxyDir, $proxyNamespace, $className);
$this->assertEquals($expectedProxyFile, $actualProxyFile);
}
public function testAutoload()
{
if (file_exists(sys_get_temp_dir() ."/AutoloaderTestClass.php")) {
unlink(sys_get_temp_dir() ."/AutoloaderTestClass.php");
}
$autoloader = Autoloader::register(sys_get_temp_dir(), 'ProxyAutoloaderTest', function($proxyDir, $proxyNamespace, $className) {
file_put_contents(sys_get_temp_dir() . "/AutoloaderTestClass.php", "<?php namespace ProxyAutoloaderTest; class AutoloaderTestClass {} ");
});
$this->assertTrue(class_exists('ProxyAutoloaderTest\AutoloaderTestClass', true));
unlink(sys_get_temp_dir() ."/AutoloaderTestClass.php");
}
public function testRegisterWithInvalidCallback()
{
$this->setExpectedException(
'Doctrine\Common\Proxy\Exception\InvalidArgumentException',
'Invalid \$notFoundCallback given: must be a callable, "stdClass" given'
);
Autoloader::register('', '', new \stdClass());
}
}

@ -0,0 +1,16 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class CallableTypeHintClass
{
/**
* @param callable $foo
*/
public function call(callable $foo)
{
}
}

@ -0,0 +1,16 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class InvalidTypeHintClass
{
/**
* @param InvalidHint (non existing class type hint)
*/
public function invalidTypeHintMethod(InvalidHint $foo)
{
}
}

@ -0,0 +1,115 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset representing a lazy loadable object
*
* @author Marco Pivetta <ocramius@gmail.com>
* @since 2.4
*/
class LazyLoadableObject
{
/**
* @var string
*/
public $publicIdentifierField;
/**
* @var string
*/
protected $protectedIdentifierField;
/**
* @var string
*/
public $publicTransientField = 'publicTransientFieldValue';
/**
* @var string
*/
protected $protectedTransientField = 'protectedTransientFieldValue';
/**
* @var string
*/
public $publicPersistentField = 'publicPersistentFieldValue';
/**
* @var string
*/
protected $protectedPersistentField = 'protectedPersistentFieldValue';
/**
* @var string
*/
public $publicAssociation = 'publicAssociationValue';
/**
* @var string
*/
protected $protectedAssociation = 'protectedAssociationValue';
/**
* @return string
*/
public function getProtectedIdentifierField()
{
return $this->protectedIdentifierField;
}
/**
* @return string
*/
public function testInitializationTriggeringMethod()
{
return 'testInitializationTriggeringMethod';
}
/**
* @return string
*/
public function getProtectedAssociation()
{
return $this->protectedAssociation;
}
/**
* @param \stdClass $param
*/
public function publicTypeHintedMethod(\stdClass $param)
{
}
/**
*
*/
public function &byRefMethod()
{
}
/**
* @param mixed $thisIsNotByRef
* @param &mixed $thisIsByRef
*/
public function byRefParamMethod($thisIsNotByRef, &$thisIsByRef)
{
}
}

@ -0,0 +1,195 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Proxy;
use ReflectionClass;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
/**
* Class metadata test asset for @see LazyLoadableObject
*
* @author Marco Pivetta <ocramius@gmail.com>
* @since 2.4
*/
class LazyLoadableObjectClassMetadata implements ClassMetadata
{
/**
* @var ReflectionClass
*/
protected $reflectionClass;
/**
* @var array
*/
protected $identifier = array(
'publicIdentifierField' => true,
'protectedIdentifierField' => true,
);
/**
* @var array
*/
protected $fields = array(
'publicIdentifierField' => true,
'protectedIdentifierField' => true,
'publicPersistentField' => true,
'protectedPersistentField' => true,
);
/**
* @var array
*/
protected $associations = array(
'publicAssociation' => true,
'protectedAssociation' => true,
);
/**
* {@inheritDoc}
*/
public function getName()
{
return $this->getReflectionClass()->getName();
}
/**
* {@inheritDoc}
*/
public function getIdentifier()
{
return array_keys($this->identifier);
}
/**
* {@inheritDoc}
*/
public function getReflectionClass()
{
if (null === $this->reflectionClass) {
$this->reflectionClass = new \ReflectionClass(__NAMESPACE__ . '\LazyLoadableObject');
}
return $this->reflectionClass;
}
/**
* {@inheritDoc}
*/
public function isIdentifier($fieldName)
{
return isset($this->identifier[$fieldName]);
}
/**
* {@inheritDoc}
*/
public function hasField($fieldName)
{
return isset($this->fields[$fieldName]);
}
/**
* {@inheritDoc}
*/
public function hasAssociation($fieldName)
{
return isset($this->associations[$fieldName]);
}
/**
* {@inheritDoc}
*/
public function isSingleValuedAssociation($fieldName)
{
throw new \BadMethodCallException('not implemented');
}
/**
* {@inheritDoc}
*/
public function isCollectionValuedAssociation($fieldName)
{
throw new \BadMethodCallException('not implemented');
}
/**
* {@inheritDoc}
*/
public function getFieldNames()
{
return array_keys($this->fields);
}
/**
* {@inheritDoc}
*/
public function getIdentifierFieldNames()
{
return $this->getIdentifier();
}
/**
* {@inheritDoc}
*/
public function getAssociationNames()
{
return array_keys($this->associations);
}
/**
* {@inheritDoc}
*/
public function getTypeOfField($fieldName)
{
return 'string';
}
/**
* {@inheritDoc}
*/
public function getAssociationTargetClass($assocName)
{
throw new \BadMethodCallException('not implemented');
}
/**
* {@inheritDoc}
*/
public function isAssociationInverseSide($assocName)
{
throw new \BadMethodCallException('not implemented');
}
/**
* {@inheritDoc}
*/
public function getAssociationMappedByTargetField($assocName)
{
throw new \BadMethodCallException('not implemented');
}
/**
* {@inheritDoc}
*/
public function getIdentifierValues($object)
{
throw new \BadMethodCallException('not implemented');
}
}

@ -0,0 +1,37 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class MagicCloneClass
{
/**
* @var string
*/
public $id = 'id';
/**
* @var string
*/
public $publicField = 'publicField';
/**
* @var boolean
*/
public $cloned = false;
/**
* @var string
*/
public $clonedValue = 'defaultValue';
/**
* @return void
*/
public function __clone()
{
$this->clonedValue = 'newClonedValue';
}
}

@ -0,0 +1,51 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Proxy;
use InvalidArgumentException;
/**
* Test asset class
*
* @since 2.4
*/
class MagicGetByRefClass
{
/**
* @var mixed
*/
public $valueField;
/**
* @param string $name
*
* @return mixed
*
* @throws \InvalidArgumentException
*/
public function & __get($name)
{
if ($name === 'value') {
return $this->valueField;
}
throw new InvalidArgumentException();
}
}

@ -0,0 +1,38 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class MagicGetClass
{
/**
* @var string
*/
public $id = 'id';
/**
* @var string
*/
public $publicField = 'publicField';
/**
* @param $name
*
* @return string
* @throws \BadMethodCallException
*/
public function __get($name)
{
if ($name === 'test') {
return 'test';
}
if ($name === 'publicField' || $name === 'id') {
throw new \BadMethodCallException('Should never be called for "publicField" or "id"');
}
return 'not defined';
}
}

@ -0,0 +1,38 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class MagicIssetClass
{
/**
* @var string
*/
public $id = 'id';
/**
* @var string
*/
public $publicField = 'publicField';
/**
* @param string $name
*
* @return bool
* @throws \BadMethodCallException
*/
public function __isset($name)
{
if ('test' === $name) {
return true;
}
if ('publicField' === $name || 'id' === $name) {
throw new \BadMethodCallException('Should never be called for "publicField" or "id"');
}
return false;
}
}

@ -0,0 +1,43 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class MagicSetClass
{
/**
* @var string
*/
public $id = 'id';
/**
* @var string
*/
public $publicField = 'publicField';
/**
* @var string|null
*/
public $testAttribute;
/**
* @param string $name
* @param mixed $value
*
* @throws \BadMethodCallException
*/
public function __set($name, $value)
{
if ($name === 'test') {
$this->testAttribute = $value;
}
if ($name === 'publicField' || $name === 'id') {
throw new \BadMethodCallException('Should never be called for "publicField" or "id"');
}
$this->testAttribute = $value;
}
}

@ -0,0 +1,37 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class MagicSleepClass
{
/**
* @var string
*/
public $id = 'id';
/**
* @var string
*/
public $publicField = 'publicField';
/**
* @var string
*/
public $serializedField = 'defaultValue';
/**
* @var string
*/
public $nonSerializedField = 'defaultValue';
/**
* @return array
*/
public function __sleep()
{
return array('serializedField');
}
}

@ -0,0 +1,32 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class MagicWakeupClass
{
/**
* @var string
*/
public $id = 'id';
/**
* @var string
*/
public $publicField = 'publicField';
/**
* @var string
*/
public $wakeupValue = 'defaultValue';
/**
* @return void
*/
public function __wakeup()
{
$this->wakeupValue = 'newWakeupValue';
}
}

@ -0,0 +1,249 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Proxy;
use Doctrine\Common\Proxy\ProxyGenerator;
use ReflectionClass;
use ReflectionMethod;
use PHPUnit_Framework_TestCase;
/**
* Test the proxy generator. Its work is generating on-the-fly subclasses of a given model, which implement the Proxy
* pattern.
*
* @author Giorgio Sironi <piccoloprincipeazzurro@gmail.com>
* @author Marco Pivetta <ocramius@gmail.com>
*/
class ProxyClassGeneratorTest extends PHPUnit_Framework_TestCase
{
/**
* @var string
*/
protected $proxyClass = 'Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\LazyLoadableObject';
/**
* @var LazyLoadableObjectClassMetadata
*/
protected $metadata;
/**
* @var ProxyGenerator
*/
protected $proxyGenerator;
/**
* {@inheritDoc}
*/
protected function setUp()
{
$this->metadata = new LazyLoadableObjectClassMetadata();
$this->proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
if (class_exists($this->proxyClass, false)) {
return;
}
$this->generateAndRequire($this->proxyGenerator, $this->metadata);
}
public function testReferenceProxyRespectsMethodsParametersTypeHinting()
{
$method = new ReflectionMethod($this->proxyClass, 'publicTypeHintedMethod');
$params = $method->getParameters();
$this->assertEquals(1, count($params));
$this->assertEquals('stdClass', $params[0]->getClass()->getName());
}
public function testProxyRespectsMethodsWhichReturnValuesByReference()
{
$method = new ReflectionMethod($this->proxyClass, 'byRefMethod');
$this->assertTrue($method->returnsReference());
}
public function testProxyRespectsByRefMethodParameters()
{
$method = new ReflectionMethod($this->proxyClass, 'byRefParamMethod');
$parameters = $method->getParameters();
$this->assertSame('thisIsNotByRef', $parameters[0]->getName());
$this->assertFalse($parameters[0]->isPassedByReference());
$this->assertSame('thisIsByRef', $parameters[1]->getName());
$this->assertTrue($parameters[1]->isPassedByReference());
}
public function testCreatesAssociationProxyAsSubclassOfTheOriginalOne()
{
$this->assertTrue(is_subclass_of($this->proxyClass, $this->metadata->getName()));
}
public function testNonNamespacedProxyGeneration()
{
$classCode = file_get_contents($this->proxyGenerator->getProxyFileName($this->metadata->getName()));
$this->assertNotContains("class LazyLoadableObject extends \\\\" . $this->metadata->getName(), $classCode);
$this->assertContains("class LazyLoadableObject extends \\" . $this->metadata->getName(), $classCode);
}
public function testClassWithSleepProxyGeneration()
{
if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\SleepClass', false)) {
$className = 'Doctrine\Tests\Common\Proxy\SleepClass';
$metadata = $this->createClassMetadata($className, array('id'));
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$this->generateAndRequire($proxyGenerator, $metadata);
}
$classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxySleepClass.php');
$this->assertEquals(1, substr_count($classCode, 'function __sleep'));
$this->assertEquals(1, substr_count($classCode, 'parent::__sleep()'));
}
/**
* Check that the proxy doesn't serialize static properties (in __sleep() method)
* @group DCOM-212
*/
public function testClassWithStaticPropertyProxyGeneration()
{
if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\StaticPropertyClass', false)) {
$className = 'Doctrine\Tests\Common\Proxy\StaticPropertyClass';
$metadata = $this->createClassMetadata($className, array());
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$this->generateAndRequire($proxyGenerator, $metadata);
}
$classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyStaticPropertyClass.php');
$this->assertEquals(1, substr_count($classCode, 'function __sleep'));
$this->assertNotContains('protectedStaticProperty', $classCode);
}
private function generateAndRequire($proxyGenerator, $metadata)
{
$proxyGenerator->generateProxyClass($metadata, $proxyGenerator->getProxyFileName($metadata->getName()));
require_once $proxyGenerator->getProxyFileName($metadata->getName());
}
public function testClassWithCallableTypeHintOnProxiedMethod()
{
if (PHP_VERSION_ID < 50400) {
$this->markTestSkipped('`callable` is only supported in PHP >=5.4.0');
}
if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\CallableTypeHintClass', false)) {
$className = 'Doctrine\Tests\Common\Proxy\CallableTypeHintClass';
$metadata = $this->createClassMetadata($className, array('id'));
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$this->generateAndRequire($proxyGenerator, $metadata);
}
$classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyCallableTypeHintClass.php');
$this->assertEquals(1, substr_count($classCode, 'call(callable $foo)'));
}
public function testClassWithVariadicArgumentOnProxiedMethod()
{
if (PHP_VERSION_ID < 50600) {
$this->markTestSkipped('`...` is only supported in PHP >=5.6.0');
}
if (!class_exists('Doctrine\Tests\Common\ProxyProxy\__CG__\VariadicTypeHintClass', false)) {
$className = 'Doctrine\Tests\Common\Proxy\VariadicTypeHintClass';
$metadata = $this->createClassMetadata($className, array('id'));
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$this->generateAndRequire($proxyGenerator, $metadata);
}
$classCode = file_get_contents(__DIR__ . '/generated/__CG__DoctrineTestsCommonProxyVariadicTypeHintClass.php');
$this->assertEquals(1, substr_count($classCode, 'function addType(...$types)'));
$this->assertEquals(1, substr_count($classCode, '__invoke($this, \'addType\', array($types))'));
$this->assertEquals(1, substr_count($classCode, 'parent::addType(...$types)'));
}
public function testClassWithInvalidTypeHintOnProxiedMethod()
{
$className = 'Doctrine\Tests\Common\Proxy\InvalidTypeHintClass';
$metadata = $this->createClassMetadata($className, array('id'));
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$this->setExpectedException(
'Doctrine\Common\Proxy\Exception\UnexpectedValueException',
'The type hint of parameter "foo" in method "invalidTypeHintMethod"'
.' in class "' . $className . '" is invalid.'
);
$proxyGenerator->generateProxyClass($metadata);
}
public function testNoConfigDirThrowsException()
{
$this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException');
new ProxyGenerator(null, null);
}
public function testNoNamespaceThrowsException()
{
$this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException');
new ProxyGenerator(__DIR__ . '/generated', null);
}
public function testInvalidPlaceholderThrowsException()
{
$this->setExpectedException('Doctrine\Common\Proxy\Exception\InvalidArgumentException');
$generator = new ProxyGenerator(__DIR__ . '/generated', 'SomeNamespace');
$generator->setPlaceholder('<somePlaceholder>', array());
}
public function testUseEvalIfNoFilenameIsGiven()
{
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$className = __NAMESPACE__ . '\\EvalBase';
$metadata = $this->createClassMetadata($className, array('id'));
$proxyGenerator->generateProxyClass($metadata);
$reflClass = new ReflectionClass('Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\EvalBase');
$this->assertContains("eval()'d code", $reflClass->getFileName());
}
private function createClassMetadata($className, array $ids)
{
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$reflClass = new ReflectionClass($className);
$metadata->expects($this->any())->method('getReflectionClass')->will($this->returnValue($reflClass));
$metadata->expects($this->any())->method('getIdentifierFieldNames')->will($this->returnValue($ids));
$metadata->expects($this->any())->method('getName')->will($this->returnValue($className));
return $metadata;
}
}
class EvalBase
{
}

@ -0,0 +1,752 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Proxy;
use Doctrine\Common\Proxy\ProxyGenerator;
use Doctrine\Common\Proxy\Proxy;
use Doctrine\Common\Proxy\Exception\UnexpectedValueException;
use Doctrine\Common\Persistence\Mapping\ClassMetadata;
use PHPUnit_Framework_TestCase;
/**
* Test the generated proxies behavior. These tests make assumptions about the structure of LazyLoadableObject
*
* @author Marco Pivetta <ocramius@gmail.com>
*/
class ProxyLogicTest extends PHPUnit_Framework_TestCase
{
/**
* @var \PHPUnit_Framework_MockObject_MockObject
*/
protected $proxyLoader;
/**
* @var ClassMetadata
*/
protected $lazyLoadableObjectMetadata;
/**
* @var LazyLoadableObject|Proxy
*/
protected $lazyObject;
protected $identifier = array(
'publicIdentifierField' => 'publicIdentifierFieldValue',
'protectedIdentifierField' => 'protectedIdentifierFieldValue',
);
/**
* @var \PHPUnit_Framework_MockObject_MockObject|Callable
*/
protected $initializerCallbackMock;
/**
* {@inheritDoc}
*/
public function setUp()
{
$this->proxyLoader = $loader = $this->getMock('stdClass', array('load'), array(), '', false);
$this->initializerCallbackMock = $this->getMock('stdClass', array('__invoke'));
$identifier = $this->identifier;
$this->lazyLoadableObjectMetadata = $metadata = new LazyLoadableObjectClassMetadata();
// emulating what should happen in a proxy factory
$cloner = function (LazyLoadableObject $proxy) use ($loader, $identifier, $metadata) {
/* @var $proxy LazyLoadableObject|Proxy */
if ($proxy->__isInitialized()) {
return;
}
$proxy->__setInitialized(true);
$proxy->__setInitializer(null);
$original = $loader->load($identifier);
if (null === $original) {
throw new UnexpectedValueException();
}
foreach ($metadata->getReflectionClass()->getProperties() as $reflProperty) {
$propertyName = $reflProperty->getName();
if ($metadata->hasField($propertyName) || $metadata->hasAssociation($propertyName)) {
$reflProperty->setAccessible(true);
$reflProperty->setValue($proxy, $reflProperty->getValue($original));
}
}
};
$proxyClassName = 'Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\LazyLoadableObject';
// creating the proxy class
if (!class_exists($proxyClassName, false)) {
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$proxyGenerator->generateProxyClass($metadata);
require_once $proxyGenerator->getProxyFileName($metadata->getName());
}
$this->lazyObject = new $proxyClassName($this->getClosure($this->initializerCallbackMock), $cloner);
// setting identifiers in the proxy via reflection
foreach ($metadata->getIdentifierFieldNames() as $idField) {
$prop = $metadata->getReflectionClass()->getProperty($idField);
$prop->setAccessible(true);
$prop->setValue($this->lazyObject, $identifier[$idField]);
}
$this->assertFalse($this->lazyObject->__isInitialized());
}
public function testFetchingPublicIdentifierDoesNotCauseLazyLoading()
{
$this->configureInitializerMock(0);
$this->assertSame('publicIdentifierFieldValue', $this->lazyObject->publicIdentifierField);
}
public function testFetchingIdentifiersViaPublicGetterDoesNotCauseLazyLoading()
{
$this->configureInitializerMock(0);
$this->assertSame('protectedIdentifierFieldValue', $this->lazyObject->getProtectedIdentifierField());
}
public function testCallingMethodCausesLazyLoading()
{
$this->configureInitializerMock(
1,
array($this->lazyObject, 'testInitializationTriggeringMethod', array()),
function (Proxy $proxy) {
$proxy->__setInitializer(null);
}
);
$this->lazyObject->testInitializationTriggeringMethod();
$this->lazyObject->testInitializationTriggeringMethod();
}
public function testFetchingPublicFieldsCausesLazyLoading()
{
$test = $this;
$this->configureInitializerMock(
1,
array($this->lazyObject, '__get', array('publicPersistentField')),
function () use ($test) {
$test->setProxyValue('publicPersistentField', 'loadedValue');
}
);
$this->assertSame('loadedValue', $this->lazyObject->publicPersistentField);
$this->assertSame('loadedValue', $this->lazyObject->publicPersistentField);
}
public function testFetchingPublicAssociationCausesLazyLoading()
{
$test = $this;
$this->configureInitializerMock(
1,
array($this->lazyObject, '__get', array('publicAssociation')),
function () use ($test) {
$test->setProxyValue('publicAssociation', 'loadedAssociation');
}
);
$this->assertSame('loadedAssociation', $this->lazyObject->publicAssociation);
$this->assertSame('loadedAssociation', $this->lazyObject->publicAssociation);
}
public function testFetchingProtectedAssociationViaPublicGetterCausesLazyLoading()
{
$this->configureInitializerMock(
1,
array($this->lazyObject, 'getProtectedAssociation', array()),
function (Proxy $proxy) {
$proxy->__setInitializer(null);
}
);
$this->assertSame('protectedAssociationValue', $this->lazyObject->getProtectedAssociation());
$this->assertSame('protectedAssociationValue', $this->lazyObject->getProtectedAssociation());
}
public function testLazyLoadingTriggeredOnlyAtFirstPublicPropertyRead()
{
$test = $this;
$this->configureInitializerMock(
1,
array($this->lazyObject, '__get', array('publicPersistentField')),
function () use ($test) {
$test->setProxyValue('publicPersistentField', 'loadedValue');
$test->setProxyValue('publicAssociation', 'publicAssociationValue');
}
);
$this->assertSame('loadedValue', $this->lazyObject->publicPersistentField);
$this->assertSame('publicAssociationValue', $this->lazyObject->publicAssociation);
}
public function testNoticeWhenReadingNonExistentPublicProperties()
{
$this->configureInitializerMock(0);
$class = get_class($this->lazyObject);
$this->setExpectedException(
'PHPUnit_Framework_Error_Notice',
'Undefined property: ' . $class . '::$non_existing_property'
);
$this->lazyObject->non_existing_property;
}
public function testFalseWhenCheckingNonExistentProperty()
{
$this->configureInitializerMock(0);
$this->assertFalse(isset($this->lazyObject->non_existing_property));
}
public function testNoErrorWhenSettingNonExistentProperty()
{
$this->configureInitializerMock(0);
$this->lazyObject->non_existing_property = 'now has a value';
$this->assertSame('now has a value', $this->lazyObject->non_existing_property);
}
public function testCloningCallsClonerWithClonedObject()
{
$lazyObject = $this->lazyObject;
$test = $this;
$cb = $this->getMock('stdClass', array('cb'));
$cb
->expects($this->once())
->method('cb')
->will($this->returnCallback(function (LazyLoadableObject $proxy) use ($lazyObject, $test) {
/* @var $proxy LazyLoadableObject|Proxy */
$test->assertNotSame($proxy, $lazyObject);
$proxy->__setInitializer(null);
$proxy->publicAssociation = 'clonedAssociation';
}));
$this->lazyObject->__setCloner($this->getClosure(array($cb, 'cb')));
$cloned = clone $this->lazyObject;
$this->assertSame('clonedAssociation', $cloned->publicAssociation);
$this->assertNotSame($cloned, $lazyObject, 'a clone of the lazy object is retrieved');
}
public function testFetchingTransientPropertiesWillNotTriggerLazyLoading()
{
$this->configureInitializerMock(0);
$this->assertSame(
'publicTransientFieldValue',
$this->lazyObject->publicTransientField,
'fetching public transient field won\'t trigger lazy loading'
);
$property = $this
->lazyLoadableObjectMetadata
->getReflectionClass()
->getProperty('protectedTransientField');
$property->setAccessible(true);
$this->assertSame(
'protectedTransientFieldValue',
$property->getValue($this->lazyObject),
'fetching protected transient field via reflection won\'t trigger lazy loading'
);
}
/**
* Provided to guarantee backwards compatibility
*/
public function testLoadProxyMethod()
{
$this->configureInitializerMock(2, array($this->lazyObject, '__load', array()));
$this->lazyObject->__load();
$this->lazyObject->__load();
}
public function testLoadingWithPersisterWillBeTriggeredOnlyOnce()
{
$this
->proxyLoader
->expects($this->once())
->method('load')
->with(
array(
'publicIdentifierField' => 'publicIdentifierFieldValue',
'protectedIdentifierField' => 'protectedIdentifierFieldValue',
),
$this->lazyObject
)
->will($this->returnCallback(function ($id, LazyLoadableObject $lazyObject) {
// setting a value to verify that the persister can actually set something in the object
$lazyObject->publicAssociation = $id['publicIdentifierField'] . '-test';
return true;
}));
$this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation());
$this->lazyObject->__load();
$this->lazyObject->__load();
$this->assertSame('publicIdentifierFieldValue-test', $this->lazyObject->publicAssociation);
}
public function testFailedLoadingWillThrowException()
{
$this->proxyLoader->expects($this->any())->method('load')->will($this->returnValue(null));
$this->setExpectedException('UnexpectedValueException');
$this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation());
$this->lazyObject->__load();
}
public function testCloningWithPersister()
{
$this->lazyObject->publicTransientField = 'should-not-change';
$this
->proxyLoader
->expects($this->exactly(2))
->method('load')
->with(array(
'publicIdentifierField' => 'publicIdentifierFieldValue',
'protectedIdentifierField' => 'protectedIdentifierFieldValue',
))
->will($this->returnCallback(function () {
$blueprint = new LazyLoadableObject();
$blueprint->publicPersistentField = 'checked-persistent-field';
$blueprint->publicAssociation = 'checked-association-field';
$blueprint->publicTransientField = 'checked-transient-field';
return $blueprint;
}));
$firstClone = clone $this->lazyObject;
$this->assertSame(
'checked-persistent-field',
$firstClone->publicPersistentField,
'Persistent fields are cloned correctly'
);
$this->assertSame(
'checked-association-field',
$firstClone->publicAssociation,
'Associations are cloned correctly'
);
$this->assertSame(
'should-not-change',
$firstClone->publicTransientField,
'Transient fields are not overwritten'
);
$secondClone = clone $this->lazyObject;
$this->assertSame(
'checked-persistent-field',
$secondClone->publicPersistentField,
'Persistent fields are cloned correctly'
);
$this->assertSame(
'checked-association-field',
$secondClone->publicAssociation,
'Associations are cloned correctly'
);
$this->assertSame(
'should-not-change',
$secondClone->publicTransientField,
'Transient fields are not overwritten'
);
// those should not trigger lazy loading
$firstClone->__load();
$secondClone->__load();
}
public function testNotInitializedProxyUnserialization()
{
$this->configureInitializerMock();
$serialized = serialize($this->lazyObject);
/* @var $unserialized LazyLoadableObject|Proxy */
$unserialized = unserialize($serialized);
$reflClass = $this->lazyLoadableObjectMetadata->getReflectionClass();
$this->assertFalse($unserialized->__isInitialized(), 'serialization didn\'t cause intialization');
// Checking identifiers
$this->assertSame('publicIdentifierFieldValue', $unserialized->publicIdentifierField, 'identifiers are kept');
$protectedIdentifierField = $reflClass->getProperty('protectedIdentifierField');
$protectedIdentifierField->setAccessible(true);
$this->assertSame(
'protectedIdentifierFieldValue',
$protectedIdentifierField->getValue($unserialized),
'identifiers are kept'
);
// Checking transient fields
$this->assertSame(
'publicTransientFieldValue',
$unserialized->publicTransientField,
'transient fields are kept'
);
$protectedTransientField = $reflClass->getProperty('protectedTransientField');
$protectedTransientField->setAccessible(true);
$this->assertSame(
'protectedTransientFieldValue',
$protectedTransientField->getValue($unserialized),
'transient fields are kept'
);
// Checking persistent fields
$this->assertSame(
'publicPersistentFieldValue',
$unserialized->publicPersistentField,
'persistent fields are kept'
);
$protectedPersistentField = $reflClass->getProperty('protectedPersistentField');
$protectedPersistentField->setAccessible(true);
$this->assertSame(
'protectedPersistentFieldValue',
$protectedPersistentField->getValue($unserialized),
'persistent fields are kept'
);
// Checking associations
$this->assertSame('publicAssociationValue', $unserialized->publicAssociation, 'associations are kept');
$protectedAssociationField = $reflClass->getProperty('protectedAssociation');
$protectedAssociationField->setAccessible(true);
$this->assertSame(
'protectedAssociationValue',
$protectedAssociationField->getValue($unserialized),
'associations are kept'
);
}
public function testInitializedProxyUnserialization()
{
// persister will retrieve the lazy object itself, so that we don't have to re-define all field values
$this->proxyLoader->expects($this->once())->method('load')->will($this->returnValue($this->lazyObject));
$this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation());
$this->lazyObject->__load();
$serialized = serialize($this->lazyObject);
$reflClass = $this->lazyLoadableObjectMetadata->getReflectionClass();
/* @var $unserialized LazyLoadableObject|Proxy */
$unserialized = unserialize($serialized);
$this->assertTrue($unserialized->__isInitialized(), 'serialization didn\'t cause intialization');
// Checking transient fields
$this->assertSame(
'publicTransientFieldValue',
$unserialized->publicTransientField,
'transient fields are kept'
);
$protectedTransientField = $reflClass->getProperty('protectedTransientField');
$protectedTransientField->setAccessible(true);
$this->assertSame(
'protectedTransientFieldValue',
$protectedTransientField->getValue($unserialized),
'transient fields are kept'
);
// Checking persistent fields
$this->assertSame(
'publicPersistentFieldValue',
$unserialized->publicPersistentField,
'persistent fields are kept'
);
$protectedPersistentField = $reflClass->getProperty('protectedPersistentField');
$protectedPersistentField->setAccessible(true);
$this->assertSame(
'protectedPersistentFieldValue',
$protectedPersistentField->getValue($unserialized),
'persistent fields are kept'
);
// Checking identifiers
$this->assertSame(
'publicIdentifierFieldValue',
$unserialized->publicIdentifierField,
'identifiers are kept'
);
$protectedIdentifierField = $reflClass->getProperty('protectedIdentifierField');
$protectedIdentifierField->setAccessible(true);
$this->assertSame(
'protectedIdentifierFieldValue',
$protectedIdentifierField->getValue($unserialized),
'identifiers are kept'
);
// Checking associations
$this->assertSame('publicAssociationValue', $unserialized->publicAssociation, 'associations are kept');
$protectedAssociationField = $reflClass->getProperty('protectedAssociation');
$protectedAssociationField->setAccessible(true);
$this->assertSame(
'protectedAssociationValue',
$protectedAssociationField->getValue($unserialized),
'associations are kept'
);
}
public function testInitializationRestoresDefaultPublicLazyLoadedFieldValues()
{
// setting noop persister
$this->proxyLoader->expects($this->once())->method('load')->will($this->returnValue($this->lazyObject));
$this->lazyObject->__setInitializer($this->getSuggestedInitializerImplementation());
$this->assertSame(
'publicPersistentFieldValue',
$this->lazyObject->publicPersistentField,
'Persistent field is restored to default value'
);
$this->assertSame(
'publicAssociationValue',
$this->lazyObject->publicAssociation,
'Association is restored to default value'
);
}
public function testSettingPublicFieldsCausesLazyLoading()
{
$test = $this;
$this->configureInitializerMock(
1,
array($this->lazyObject, '__set', array('publicPersistentField', 'newPublicPersistentFieldValue')),
function () use ($test) {
$test->setProxyValue('publicPersistentField', 'overrideValue');
$test->setProxyValue('publicAssociation', 'newAssociationValue');
}
);
$this->lazyObject->publicPersistentField = 'newPublicPersistentFieldValue';
$this->assertSame('newPublicPersistentFieldValue', $this->lazyObject->publicPersistentField);
$this->assertSame('newAssociationValue', $this->lazyObject->publicAssociation);
}
public function testSettingPublicAssociationCausesLazyLoading()
{
$test = $this;
$this->configureInitializerMock(
1,
array($this->lazyObject, '__set', array('publicAssociation', 'newPublicAssociationValue')),
function () use ($test) {
$test->setProxyValue('publicPersistentField', 'newPublicPersistentFieldValue');
$test->setProxyValue('publicAssociation', 'overrideValue');
}
);
$this->lazyObject->publicAssociation = 'newPublicAssociationValue';
$this->assertSame('newPublicAssociationValue', $this->lazyObject->publicAssociation);
$this->assertSame('newPublicPersistentFieldValue', $this->lazyObject->publicPersistentField);
}
public function testCheckingPublicFieldsCausesLazyLoading()
{
$test = $this;
$this->configureInitializerMock(
1,
array($this->lazyObject, '__isset', array('publicPersistentField')),
function () use ($test) {
$test->setProxyValue('publicPersistentField', null);
$test->setProxyValue('publicAssociation', 'setPublicAssociation');
}
);
$this->assertFalse(isset($this->lazyObject->publicPersistentField));
$this->assertNull($this->lazyObject->publicPersistentField);
$this->assertTrue(isset($this->lazyObject->publicAssociation));
$this->assertSame('setPublicAssociation', $this->lazyObject->publicAssociation);
}
public function testCheckingPublicAssociationCausesLazyLoading()
{
$test = $this;
$this->configureInitializerMock(
1,
array($this->lazyObject, '__isset', array('publicAssociation')),
function () use ($test) {
$test->setProxyValue('publicPersistentField', 'newPersistentFieldValue');
$test->setProxyValue('publicAssociation', 'setPublicAssociation');
}
);
$this->assertTrue(isset($this->lazyObject->publicAssociation));
$this->assertSame('setPublicAssociation', $this->lazyObject->publicAssociation);
$this->assertTrue(isset($this->lazyObject->publicPersistentField));
$this->assertSame('newPersistentFieldValue', $this->lazyObject->publicPersistentField);
}
public function testCallingVariadicMethodCausesLazyLoading()
{
if (PHP_VERSION_ID < 50600) {
$this->markTestSkipped('Test applies only to PHP 5.6+');
}
$proxyClassName = 'Doctrine\Tests\Common\ProxyProxy\__CG__\Doctrine\Tests\Common\Proxy\VariadicTypeHintClass';
/* @var $metadata \Doctrine\Common\Persistence\Mapping\ClassMetadata|\PHPUnit_Framework_MockObject_MockObject */
$metadata = $this->getMock('Doctrine\Common\Persistence\Mapping\ClassMetadata');
$metadata
->expects($this->any())
->method('getName')
->will($this->returnValue('Doctrine\Tests\Common\Proxy\VariadicTypeHintClass'));
$metadata
->expects($this->any())
->method('getReflectionClass')
->will($this->returnValue(new \ReflectionClass('Doctrine\Tests\Common\Proxy\VariadicTypeHintClass')));
// creating the proxy class
if (!class_exists($proxyClassName, false)) {
$proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . 'Proxy', true);
$proxyGenerator->generateProxyClass($metadata);
require_once $proxyGenerator->getProxyFileName($metadata->getName());
}
/* @var $invocationMock callable|\PHPUnit_Framework_MockObject_MockObject */
$invocationMock = $this->getMock('stdClass', array('__invoke'));
/* @var $lazyObject \Doctrine\Tests\Common\Proxy\VariadicTypeHintClass */
$lazyObject = new $proxyClassName(
function ($proxy, $method, $parameters) use ($invocationMock) {
$invocationMock($proxy, $method, $parameters);
},
function () {}
);
$invocationMock
->expects($this->at(0))
->method('__invoke')
->with($lazyObject, 'addType', array(array('type1', 'type2')));
$invocationMock
->expects($this->at(1))
->method('__invoke')
->with($lazyObject, 'addTypeWithMultipleParameters', array('foo', 'bar', array('baz1', 'baz2')));
$lazyObject->addType('type1', 'type2');
$this->assertSame(array('type1', 'type2'), $lazyObject->types);
$lazyObject->addTypeWithMultipleParameters('foo', 'bar', 'baz1', 'baz2');
$this->assertSame('foo', $lazyObject->foo);
$this->assertSame('bar', $lazyObject->bar);
$this->assertSame(array('baz1', 'baz2'), $lazyObject->baz);
}
/**
* Converts a given callable into a closure
*
* @param callable $callable
* @return \Closure
*/
public function getClosure($callable) {
return function () use ($callable) {
call_user_func_array($callable, func_get_args());
};
}
/**
* Configures the current initializer callback mock with provided matcher params
*
* @param int $expectedCallCount the number of invocations to be expected. If a value< 0 is provided, `any` is used
* @param array $callParamsMatch an ordered array of parameters to be expected
* @param callable $callbackClosure a return callback closure
*
* @return \PHPUnit_Framework_MockObject_MockObject|
*/
protected function configureInitializerMock(
$expectedCallCount = 0,
array $callParamsMatch = null,
\Closure $callbackClosure = null
) {
if (!$expectedCallCount) {
$invocationCountMatcher = $this->exactly((int) $expectedCallCount);
} else {
$invocationCountMatcher = $expectedCallCount < 0 ? $this->any() : $this->exactly($expectedCallCount);
}
$invocationMocker = $this->initializerCallbackMock->expects($invocationCountMatcher)->method('__invoke');
if (null !== $callParamsMatch) {
call_user_func_array(array($invocationMocker, 'with'), $callParamsMatch);
}
if ($callbackClosure) {
$invocationMocker->will($this->returnCallback($callbackClosure));
}
}
/**
* Sets a value in the current proxy object without triggering lazy loading through `__set`
*
* @link https://bugs.php.net/bug.php?id=63463
*
* @param string $property
* @param mixed $value
*/
public function setProxyValue($property, $value)
{
$reflectionProperty = new \ReflectionProperty($this->lazyObject, $property);
$initializer = $this->lazyObject->__getInitializer();
// disabling initializer since setting `publicPersistentField` triggers `__set`/`__get`
$this->lazyObject->__setInitializer(null);
$reflectionProperty->setValue($this->lazyObject, $value);
$this->lazyObject->__setInitializer($initializer);
}
/**
* Retrieves the suggested implementation of an initializer that proxy factories in O*M
* are currently following, and that should be used to initialize the current proxy object
*
* @return \Closure
*/
protected function getSuggestedInitializerImplementation()
{
$loader = $this->proxyLoader;
$identifier = $this->identifier;
return function (LazyLoadableObject $proxy) use ($loader, $identifier) {
/* @var $proxy LazyLoadableObject|Proxy */
$proxy->__setInitializer(null);
$proxy->__setCloner(null);
if ($proxy->__isInitialized()) {
return;
}
$properties = $proxy->__getLazyProperties();
foreach ($properties as $propertyName => $property) {
if (!isset($proxy->$propertyName)) {
$proxy->$propertyName = $properties[$propertyName];
}
}
$proxy->__setInitialized(true);
if (method_exists($proxy, '__wakeup')) {
$proxy->__wakeup();
}
if (null === $loader->load($identifier, $proxy)) {
throw new \UnexpectedValueException('Couldn\'t load');
}
};
}
}

@ -0,0 +1,327 @@
<?php
/*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* This software consists of voluntary contributions made by many individuals
* and is licensed under the MIT license. For more information, see
* <http://www.doctrine-project.org>.
*/
namespace Doctrine\Tests\Common\Proxy;
use Doctrine\Common\Proxy\ProxyGenerator;
use Doctrine\Common\Proxy\Proxy;
use Doctrine\Common\Proxy\Exception\UnexpectedValueException;
use PHPUnit_Framework_TestCase;
use ReflectionClass;
/**
* Test for behavior of proxies with inherited magic methods
*
* @author Marco Pivetta <ocramius@gmail.com>
*/
class ProxyMagicMethodsTest extends PHPUnit_Framework_TestCase
{
/**
* @var \Doctrine\Common\Proxy\ProxyGenerator
*/
protected $proxyGenerator;
/**
* @var LazyLoadableObject|Proxy
*/
protected $lazyObject;
protected $identifier = array(
'publicIdentifierField' => 'publicIdentifierFieldValue',
'protectedIdentifierField' => 'protectedIdentifierFieldValue',
);
/**
* @var \PHPUnit_Framework_MockObject_MockObject|Callable
*/
protected $initializerCallbackMock;
/**
* {@inheritDoc}
*/
public function setUp()
{
$this->proxyGenerator = new ProxyGenerator(__DIR__ . '/generated', __NAMESPACE__ . '\\MagicMethodProxy');
}
public static function tearDownAfterClass()
{
}
public function testInheritedMagicGet()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicGetClass');
$proxy = new $proxyClassName(
function (Proxy $proxy, $method, $params) use (&$counter) {
if ( ! in_array($params[0], array('publicField', 'test', 'notDefined'))) {
throw new \InvalidArgumentException('Unexpected access to field "' . $params[0] . '"');
}
$initializer = $proxy->__getInitializer();
$proxy->__setInitializer(null);
$proxy->publicField = 'modifiedPublicField';
$counter += 1;
$proxy->__setInitializer($initializer);
}
);
$this->assertSame('id', $proxy->id);
$this->assertSame('modifiedPublicField', $proxy->publicField);
$this->assertSame('test', $proxy->test);
$this->assertSame('not defined', $proxy->notDefined);
$this->assertSame(3, $counter);
}
/**
* @group DCOM-194
*/
public function testInheritedMagicGetByRef()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicGetByRefClass');
/* @var $proxy \Doctrine\Tests\Common\Proxy\MagicGetByRefClass */
$proxy = new $proxyClassName();
$proxy->valueField = 123;
$value = & $proxy->__get('value');
$this->assertSame(123, $value);
$value = 456;
$this->assertSame(456, $proxy->__get('value'), 'Value was fetched by reference');
$this->setExpectedException('InvalidArgumentException');
$undefined = $proxy->nonExisting;
}
public function testInheritedMagicSet()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicSetClass');
$proxy = new $proxyClassName(
function (Proxy $proxy, $method, $params) use (&$counter) {
if ( ! in_array($params[0], array('publicField', 'test', 'notDefined'))) {
throw new \InvalidArgumentException('Unexpected access to field "' . $params[0] . '"');
}
$counter += 1;
}
);
$this->assertSame('id', $proxy->id);
$proxy->publicField = 'publicFieldValue';
$this->assertSame('publicFieldValue', $proxy->publicField);
$proxy->test = 'testValue';
$this->assertSame('testValue', $proxy->testAttribute);
$proxy->notDefined = 'not defined';
$this->assertSame('not defined', $proxy->testAttribute);
$this->assertSame(3, $counter);
}
public function testInheritedMagicSleep()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicSleepClass');
$proxy = new $proxyClassName();
$this->assertSame('defaultValue', $proxy->serializedField);
$this->assertSame('defaultValue', $proxy->nonSerializedField);
$proxy->serializedField = 'changedValue';
$proxy->nonSerializedField = 'changedValue';
$unserialized = unserialize(serialize($proxy));
$this->assertSame('changedValue', $unserialized->serializedField);
$this->assertSame('defaultValue', $unserialized->nonSerializedField, 'Field was not returned by "__sleep"');
}
public function testInheritedMagicWakeup()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicWakeupClass');
$proxy = new $proxyClassName();
$this->assertSame('defaultValue', $proxy->wakeupValue);
$proxy->wakeupValue = 'changedValue';
$unserialized = unserialize(serialize($proxy));
$this->assertSame('newWakeupValue', $unserialized->wakeupValue, '"__wakeup" was called');
$unserialized->__setInitializer(function (Proxy $proxy) {
$proxy->__setInitializer(null);
$proxy->publicField = 'newPublicFieldValue';
});
$this->assertSame('newPublicFieldValue', $unserialized->publicField, 'Proxy can still be initialized');
}
public function testInheritedMagicIsset()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicIssetClass');
$proxy = new $proxyClassName(function (Proxy $proxy, $method, $params) use (&$counter) {
if (in_array($params[0], array('publicField', 'test', 'nonExisting'))) {
$initializer = $proxy->__getInitializer();
$proxy->__setInitializer(null);
$proxy->publicField = 'modifiedPublicField';
$counter += 1;
$proxy->__setInitializer($initializer);
return;
}
throw new \InvalidArgumentException(
sprintf('Should not be initialized when checking isset("%s")', $params[0])
);
});
$this->assertTrue(isset($proxy->id));
$this->assertTrue(isset($proxy->publicField));
$this->assertTrue(isset($proxy->test));
$this->assertFalse(isset($proxy->nonExisting));
$this->assertSame(3, $counter);
}
public function testInheritedMagicClone()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\MagicCloneClass');
$proxy = new $proxyClassName(
null,
function ($proxy) {
$proxy->cloned = true;
}
);
$cloned = clone $proxy;
$this->assertSame('newClonedValue', $cloned->clonedValue);
$this->assertFalse($proxy->cloned);
$this->assertTrue($cloned->cloned);
}
/**
* @group DCOM-175
*/
public function testClonesPrivateProperties()
{
$proxyClassName = $this->generateProxyClass(__NAMESPACE__ . '\\SerializedClass');
/* @var $proxy SerializedClass */
$proxy = new $proxyClassName();
$proxy->setFoo(1);
$proxy->setBar(2);
$proxy->setBaz(3);
$unserialized = unserialize(serialize($proxy));
$this->assertSame(1, $unserialized->getFoo());
$this->assertSame(2, $unserialized->getBar());
$this->assertSame(3, $unserialized->getBaz());
}
/**
* @param $className
*
* @return string
*/
private function generateProxyClass($className)
{
$proxyClassName = 'Doctrine\\Tests\\Common\\Proxy\\MagicMethodProxy\\__CG__\\' . $className;
if (class_exists($proxyClassName, false)) {
return $proxyClassName;
}
$metadata = $this->getMock('Doctrine\\Common\\Persistence\\Mapping\\ClassMetadata');
$metadata
->expects($this->any())
->method('getName')
->will($this->returnValue($className));
$metadata
->expects($this->any())
->method('getIdentifier')
->will($this->returnValue(array('id')));
$metadata
->expects($this->any())
->method('getReflectionClass')
->will($this->returnValue(new ReflectionClass($className)));
$metadata
->expects($this->any())
->method('isIdentifier')
->will($this->returnCallback(function ($fieldName) {
return 'id' === $fieldName;
}));
$metadata
->expects($this->any())
->method('hasField')
->will($this->returnCallback(function ($fieldName) {
return in_array($fieldName, array('id', 'publicField'));
}));
$metadata
->expects($this->any())
->method('hasAssociation')
->will($this->returnValue(false));
$metadata
->expects($this->any())
->method('getFieldNames')
->will($this->returnValue(array('id', 'publicField')));
$metadata
->expects($this->any())
->method('getIdentifierFieldNames')
->will($this->returnValue(array('id')));
$metadata
->expects($this->any())
->method('getAssociationNames')
->will($this->returnValue(array()));
$metadata
->expects($this->any())
->method('getTypeOfField')
->will($this->returnValue('string'));
$this->proxyGenerator->generateProxyClass($metadata, $this->proxyGenerator->getProxyFileName($className));
require_once $this->proxyGenerator->getProxyFileName($className);
return $proxyClassName;
}
}

@ -0,0 +1,72 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class SerializedClass
{
/**
* @var mixed
*/
private $foo = 'foo';
/**
* @var mixed
*/
protected $bar = 'bar';
/**
* @var mixed
*/
public $baz = 'baz';
/**
* @param mixed $foo
*/
public function setFoo($foo)
{
$this->foo = $foo;
}
/**
* @return mixed|string
*/
public function getFoo()
{
return $this->foo;
}
/**
* @param $bar
*/
public function setBar($bar)
{
$this->bar = $bar;
}
/**
* @return mixed|string
*/
public function getBar()
{
return $this->bar;
}
/**
* @param $baz
*/
public function setBaz($baz)
{
$this->baz = $baz;
}
/**
* @return mixed|string
*/
public function getBaz()
{
return $this->baz;
}
}

@ -0,0 +1,19 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class SleepClass
{
public $id;
/**
* @return array
*/
public function __sleep()
{
return array('id');
}
}

@ -0,0 +1,11 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class StaticPropertyClass
{
protected static $protectedStaticProperty;
}

@ -0,0 +1,29 @@
<?php
namespace Doctrine\Tests\Common\Proxy;
/**
* Test asset class
*/
class VariadicTypeHintClass
{
public $types;
public $foo;
public $bar;
public $baz;
/**
* @param ...$types
*/
public function addType(...$types)
{
$this->types = $types;
}
public function addTypeWithMultipleParameters($foo, $bar, ...$baz)
{
$this->foo = $foo;
$this->bar = $bar;
$this->baz = $baz;
}
}

@ -0,0 +1,7 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
class DeeperNamespaceParent extends Dummies\NoParent
{
}

@ -0,0 +1,8 @@
<?php
namespace Doctrine\Tests\Common\Reflection\Dummies;
class NoParent
{
public $test;
}

@ -0,0 +1,14 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
use Doctrine\Common\Annotations\Annotation;
/**
* @Annotation(
* key = "value"
* )
*/
class ExampleAnnotationClass {
}

@ -0,0 +1,7 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
class FullyClassifiedParent extends \Doctrine\Tests\Common\Reflection\NoParent
{
}

@ -0,0 +1,8 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
class NoParent
{
public $test;
}

@ -0,0 +1,192 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
use PHPUnit_Framework_TestCase;
use Doctrine\Common\Reflection\RuntimePublicReflectionProperty;
use Doctrine\Common\Proxy\Proxy;
class RuntimePublicReflectionPropertyTest extends PHPUnit_Framework_TestCase
{
public function testGetValueOnProxyPublicProperty()
{
$getCheckMock = $this->getMock('stdClass', array('callGet'));
$getCheckMock->expects($this->never())->method('callGet');
$initializer = function () use ($getCheckMock) {
call_user_func($getCheckMock);
};
$mockProxy = new RuntimePublicReflectionPropertyTestProxyMock();
$mockProxy->__setInitializer($initializer);
$reflProperty = new RuntimePublicReflectionProperty(
__NAMESPACE__ . '\RuntimePublicReflectionPropertyTestProxyMock',
'checkedProperty'
);
$this->assertSame('testValue', $reflProperty->getValue($mockProxy));
unset($mockProxy->checkedProperty);
$this->assertNull($reflProperty->getValue($mockProxy));
}
public function testSetValueOnProxyPublicProperty()
{
$setCheckMock = $this->getMock('stdClass', array('neverCallSet'));
$setCheckMock->expects($this->never())->method('neverCallSet');
$initializer = function () use ($setCheckMock) {
call_user_func(array($setCheckMock, 'neverCallSet'));
};
$mockProxy = new RuntimePublicReflectionPropertyTestProxyMock();
$mockProxy->__setInitializer($initializer);
$reflProperty = new RuntimePublicReflectionProperty(
__NAMESPACE__ . '\RuntimePublicReflectionPropertyTestProxyMock',
'checkedProperty'
);
$reflProperty->setValue($mockProxy, 'newValue');
$this->assertSame('newValue', $mockProxy->checkedProperty);
unset($mockProxy->checkedProperty);
$reflProperty->setValue($mockProxy, 'otherNewValue');
$this->assertSame('otherNewValue', $mockProxy->checkedProperty);
$setCheckMock = $this->getMock('stdClass', array('callSet'));
$setCheckMock->expects($this->once())->method('callSet');
$initializer = function () use ($setCheckMock) {
call_user_func(array($setCheckMock, 'callSet'));
};
$mockProxy->__setInitializer($initializer);
$mockProxy->__setInitialized(true);
unset($mockProxy->checkedProperty);
$reflProperty->setValue($mockProxy, 'againNewValue');
$this->assertSame('againNewValue', $mockProxy->checkedProperty);
}
}
/**
* Mock that simulates proxy public property lazy loading
*/
class RuntimePublicReflectionPropertyTestProxyMock implements Proxy
{
/**
* @var \Closure|null
*/
private $initializer = null;
/**
* @var \Closure|null
*/
private $initialized = false;
/**
* @var string
*/
public $checkedProperty = 'testValue';
/**
* {@inheritDoc}
*/
public function __getInitializer()
{
return $this->initializer;
}
/**
* {@inheritDoc}
*/
public function __setInitializer(\Closure $initializer = null)
{
$this->initializer = $initializer;
}
/**
* {@inheritDoc}
*/
public function __getLazyProperties()
{
}
/**
* {@inheritDoc}
*/
public function __load()
{
}
/**
* {@inheritDoc}
*/
public function __isInitialized()
{
return $this->initialized;
}
/**
* {@inheritDoc}
*/
public function __setInitialized($initialized)
{
$this->initialized = (bool) $initialized;
}
/**
* @param string $name
*/
public function __get($name)
{
if ($this->initializer) {
$cb = $this->initializer;
$cb();
}
return $this->checkedProperty;
}
/**
* @param string $name
* @param mixed $value
*/
public function __set($name, $value)
{
if ($this->initializer) {
$cb = $this->initializer;
$cb();
}
// triggers notices if `$name` is used: see https://bugs.php.net/bug.php?id=63463
$this->checkedProperty = $value;
}
/**
* @param string $name
*
* @return integer
*/
public function __isset($name)
{
if ($this->initializer) {
$cb = $this->initializer;
$cb();
}
return isset($this->checkedProperty);
}
/**
* {@inheritDoc}
*/
public function __setCloner(\Closure $cloner = null)
{
}
/**
* {@inheritDoc}
*/
public function __getCloner()
{
}
}

@ -0,0 +1,7 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
class SameNamespaceParent extends NoParent
{
}

@ -0,0 +1,93 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Reflection\StaticReflectionParser;
use Doctrine\Common\Reflection\Psr0FindFile;
class StaticReflectionParserTest extends DoctrineTestCase
{
/**
* @dataProvider parentClassData
*
* @param bool $classAnnotationOptimize
* @param string $parsedClassName
* @param string $expectedClassName
*
* @return void
*/
public function testParentClass($classAnnotationOptimize, $parsedClassName, $expectedClassName)
{
// If classed annotation optimization is enabled the properties tested
// below cannot be found.
if ($classAnnotationOptimize) {
$this->setExpectedException('ReflectionException');
}
$testsRoot = substr(__DIR__, 0, -strlen(__NAMESPACE__) - 1);
$paths = array(
'Doctrine\\Tests' => array($testsRoot),
);
$staticReflectionParser = new StaticReflectionParser($parsedClassName, new Psr0FindFile($paths), $classAnnotationOptimize);
$declaringClassName = $staticReflectionParser->getStaticReflectionParserForDeclaringClass('property', 'test')->getClassName();
$this->assertEquals($expectedClassName, $declaringClassName);
}
/**
* @return array
*/
public function parentClassData()
{
$data = array();
$noParentClassName = 'Doctrine\\Tests\\Common\\Reflection\\NoParent';
$dummyParentClassName = 'Doctrine\\Tests\\Common\\Reflection\\Dummies\\NoParent';
foreach (array(false, true) as $classAnnotationOptimize) {
$data[] = array(
$classAnnotationOptimize, $noParentClassName, $noParentClassName,
);
$data[] = array(
$classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\FullyClassifiedParent', $noParentClassName,
);
$data[] = array(
$classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\SameNamespaceParent', $noParentClassName,
);
$data[] = array(
$classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\DeeperNamespaceParent', $dummyParentClassName,
);
$data[] = array(
$classAnnotationOptimize, 'Doctrine\\Tests\\Common\\Reflection\\UseParent', $dummyParentClassName,
);
}
return $data;
}
/**
* @dataProvider classAnnotationOptimize
*/
public function testClassAnnotationOptimizedParsing($classAnnotationOptimize) {
$testsRoot = substr(__DIR__, 0, -strlen(__NAMESPACE__) - 1);
$paths = array(
'Doctrine\\Tests' => array($testsRoot),
);
$staticReflectionParser = new StaticReflectionParser('Doctrine\\Tests\\Common\\Reflection\\ExampleAnnotationClass', new Psr0FindFile($paths), $classAnnotationOptimize);
$expectedDocComment = '/**
* @Annotation(
* key = "value"
* )
*/';
$this->assertEquals($expectedDocComment, $staticReflectionParser->getDocComment('class'));
}
/**
* @return array
*/
public function classAnnotationOptimize()
{
return array(
array(false),
array(true)
);
}
}

@ -0,0 +1,9 @@
<?php
namespace Doctrine\Tests\Common\Reflection;
use Doctrine\Tests\Common\Reflection\Dummies\NoParent as Test;
class UseParent extends Test
{
}

@ -0,0 +1,100 @@
<?php
namespace Doctrine\Tests\Common\Util
{
use Doctrine\Tests\DoctrineTestCase;
use Doctrine\Common\Util\ClassUtils;
class ClassUtilsTest extends DoctrineTestCase
{
static public function dataGetClass()
{
return array(
array('stdClass', 'stdClass'),
array('Doctrine\Common\Util\ClassUtils', 'Doctrine\Common\Util\ClassUtils'),
array( 'MyProject\Proxies\__CG__\stdClass', 'stdClass' ),
array( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\stdClass', 'stdClass' ),
array( 'MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject','Doctrine\Tests\Common\Util\ChildObject' )
);
}
/**
* @dataProvider dataGetClass
*/
public function testGetRealClass($className, $expectedClassName)
{
$this->assertEquals($expectedClassName, ClassUtils::getRealClass($className));
}
/**
* @dataProvider dataGetClass
*/
public function testGetClass( $className, $expectedClassName )
{
$object = new $className();
$this->assertEquals($expectedClassName, ClassUtils::getClass($object));
}
public function testGetParentClass()
{
$parentClass = ClassUtils::getParentClass( 'MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject' );
$this->assertEquals('stdClass', $parentClass);
}
public function testGenerateProxyClassName()
{
$this->assertEquals( 'Proxies\__CG__\stdClass', ClassUtils::generateProxyClassName( 'stdClass', 'Proxies' ) );
}
/**
* @dataProvider dataGetClass
*/
public function testNewReflectionClass( $className, $expectedClassName )
{
$reflClass = ClassUtils::newReflectionClass( $className );
$this->assertEquals( $expectedClassName, $reflClass->getName() );
}
/**
* @dataProvider dataGetClass
*/
public function testNewReflectionObject( $className, $expectedClassName )
{
$object = new $className;
$reflClass = ClassUtils::newReflectionObject( $object );
$this->assertEquals( $expectedClassName, $reflClass->getName() );
}
}
class ChildObject extends \stdClass
{
}
}
namespace MyProject\Proxies\__CG__
{
class stdClass extends \stdClass
{
}
}
namespace MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util
{
class ChildObject extends \Doctrine\Tests\Common\Util\ChildObject
{
}
}
namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__
{
class stdClass extends \MyProject\Proxies\__CG__\stdClass
{
}
}
namespace MyProject\Proxies\__CG__\OtherProject\Proxies\__CG__\Doctrine\Tests\Common\Util
{
class ChildObject extends \MyProject\Proxies\__CG__\Doctrine\Tests\Common\Util\ChildObject
{
}
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save