mirror of
https://github.com/danog/class-finder.git
synced 2024-11-30 04:29:03 +01:00
Merge branch 'undefined-property-autoload' into 'master'
Undefined property autoload Closes #8 See merge request hpierce1102/ClassFinder!9
This commit is contained in:
commit
cd422f26e1
@ -1,4 +1,6 @@
|
|||||||
composer install --working-dir=$1/test/app1 --quiet || exit 1
|
composer install --working-dir=$1/test/app1 --quiet || exit 1
|
||||||
|
composer install --working-dir=$1/test/app2 --quiet || exit 1
|
||||||
composer install --working-dir=$1 --quiet || exit 1
|
composer install --working-dir=$1 --quiet || exit 1
|
||||||
php --version
|
php --version
|
||||||
php $1/vendor/bin/phpunit --testsuite all
|
php $1/vendor/bin/phpunit --testsuite all
|
||||||
|
php $1/vendor/bin/phpunit --testsuite noAutoload
|
@ -1,4 +1,6 @@
|
|||||||
composer install --working-dir=$1/test/app1 --quiet || exit 1
|
composer install --working-dir=$1/test/app1 --quiet || exit 1
|
||||||
|
composer install --working-dir=$1/test/app2 --quiet || exit 1
|
||||||
composer install --working-dir=$1 --quiet || exit 1
|
composer install --working-dir=$1 --quiet || exit 1
|
||||||
php --version
|
php --version
|
||||||
php $1/vendor/bin/phpunit --testsuite all
|
php $1/vendor/bin/phpunit --testsuite all
|
||||||
|
php $1/vendor/bin/phpunit --testsuite noAutoload
|
@ -25,5 +25,9 @@
|
|||||||
<file>test/app1/src/FilesTest.php</file>
|
<file>test/app1/src/FilesTest.php</file>
|
||||||
<directory>test/unit/Files</directory>
|
<directory>test/unit/Files</directory>
|
||||||
</testsuite>
|
</testsuite>
|
||||||
|
<testsuite name="noAutoload">
|
||||||
|
<file>test/app2/PSR4NoAutoloadTest.php</file>
|
||||||
|
<file>test/app2/ClassmapNoAutoloadTest.php</file>
|
||||||
|
</testsuite>
|
||||||
</testsuites>
|
</testsuites>
|
||||||
</phpunit>
|
</phpunit>
|
@ -45,6 +45,10 @@ class PSR4NamespaceFactory
|
|||||||
$composerJsonPath = $appRoot . 'composer.json';
|
$composerJsonPath = $appRoot . 'composer.json';
|
||||||
$composerConfig = json_decode(file_get_contents($composerJsonPath));
|
$composerConfig = json_decode(file_get_contents($composerJsonPath));
|
||||||
|
|
||||||
|
if (!isset($composerConfig->autoload)) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
//Apparently PHP doesn't like hyphens, so we use variable variables instead.
|
//Apparently PHP doesn't like hyphens, so we use variable variables instead.
|
||||||
$psr4 = "psr-4";
|
$psr4 = "psr-4";
|
||||||
return (array)$composerConfig->autoload->$psr4;
|
return (array)$composerConfig->autoload->$psr4;
|
||||||
|
95
test/app2/ClassmapNoAutoloadTest.php
Normal file
95
test/app2/ClassmapNoAutoloadTest.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace TestApp2;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
use HaydenPierce\ClassFinder\ClassFinder;
|
||||||
|
|
||||||
|
class ClassmapNoAutoloadTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public function setup()
|
||||||
|
{
|
||||||
|
// Reset ClassFinder back to normal.
|
||||||
|
ClassFinder::setAppRoot(null);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* @dataProvider classFinderDataProvider
|
||||||
|
*/
|
||||||
|
public function testClassFinder($namespace, $expected, $message)
|
||||||
|
{
|
||||||
|
try {
|
||||||
|
$classes = ClassFinder::getClassesInNamespace($namespace);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->assertFalse(true, 'An exception occurred: ' . $e->getMessage());
|
||||||
|
$classes = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $classes, $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function classFinderDataProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'HaydenPierce\Classmap',
|
||||||
|
array(
|
||||||
|
'HaydenPierce\Classmap\Classmap2ClassmapINC',
|
||||||
|
'HaydenPierce\Classmap\Classmap2ClassmapPHP',
|
||||||
|
'HaydenPierce\Classmap\Classmap3ClassesPHP',
|
||||||
|
'HaydenPierce\Classmap\ClassmapClassmap2PHP'
|
||||||
|
),
|
||||||
|
'Classfinder should be able to load classes based on a classmap from 3rd party packages.'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'HaydenPierce\Classmap2',
|
||||||
|
array(
|
||||||
|
'HaydenPierce\Classmap2\Classmap2ClassmapINC',
|
||||||
|
'HaydenPierce\Classmap2\Classmap2ClassmapPHP',
|
||||||
|
'HaydenPierce\Classmap2\Classmap3ClassesPHP',
|
||||||
|
'HaydenPierce\Classmap2\ClassmapClassmap2PHP'
|
||||||
|
),
|
||||||
|
'Classfinder should be able to handle multiple namespaces in a single file for a classmap.'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider classesInNamespaceRecursivelyDataProvider
|
||||||
|
*/
|
||||||
|
public function testClassesInNamespaceRecursively($namespace, $expected, $message)
|
||||||
|
{
|
||||||
|
ClassFinder::disablePSR4Support();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$classes = ClassFinder::getClassesInNamespace($namespace, ClassFinder::RECURSIVE_MODE);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->assertFalse(true, 'An exception occurred: ' . $e->getMessage());
|
||||||
|
$classes = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
ClassFinder::enablePSR4Support();
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $classes, $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function classesInNamespaceRecursivelyDataProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'HaydenPierce',
|
||||||
|
array(
|
||||||
|
'HaydenPierce\Classmap2\Classmap2ClassmapINC',
|
||||||
|
'HaydenPierce\Classmap2\Classmap2ClassmapPHP',
|
||||||
|
'HaydenPierce\Classmap2\Classmap3ClassesPHP',
|
||||||
|
'HaydenPierce\Classmap2\ClassmapClassmap2PHP',
|
||||||
|
'HaydenPierce\Classmap\Classmap2ClassmapINC',
|
||||||
|
'HaydenPierce\Classmap\Classmap2ClassmapPHP',
|
||||||
|
'HaydenPierce\Classmap\Classmap3ClassesPHP',
|
||||||
|
'HaydenPierce\Classmap\ClassmapClassmap2PHP',
|
||||||
|
),
|
||||||
|
'Classfinder should be able to load third party classes recursively based on a classmap.'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
101
test/app2/PSR4NoAutoloadTest.php
Normal file
101
test/app2/PSR4NoAutoloadTest.php
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace TestApp2;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/vendor/autoload.php';
|
||||||
|
|
||||||
|
use HaydenPierce\ClassFinder\ClassFinder;
|
||||||
|
|
||||||
|
class PSR4NoAutoloadTest extends \PHPUnit_Framework_TestCase
|
||||||
|
{
|
||||||
|
public function setup()
|
||||||
|
{
|
||||||
|
// Reset ClassFinder back to normal.
|
||||||
|
ClassFinder::setAppRoot(null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @dataProvider getClassesInNamespaceDataProvider
|
||||||
|
*/
|
||||||
|
public function testGetClassesInNamespace($namespace, $expected, $message)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
try {
|
||||||
|
$classes = ClassFinder::getClassesInNamespace($namespace);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->assertFalse(true, 'An exception occurred: ' . $e->getMessage());
|
||||||
|
$classes = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $classes, $message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getClassesInNamespaceDataProvider()
|
||||||
|
{
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'HaydenPierce\SandboxApp',
|
||||||
|
array(
|
||||||
|
'HaydenPierce\SandboxApp\Foy'
|
||||||
|
),
|
||||||
|
'ClassFinder should be able to find 3rd party classes'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'HaydenPierce\SandboxApp\Foo\Bar',
|
||||||
|
array(
|
||||||
|
'HaydenPierce\SandboxApp\Foo\Bar\Barc',
|
||||||
|
'HaydenPierce\SandboxApp\Foo\Bar\Barp'
|
||||||
|
),
|
||||||
|
'ClassFinder should be able to find 3rd party classes multiple namespaces deep.'
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'HaydenPierce\SandboxAppMulti',
|
||||||
|
array(
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zip',
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zop',
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zap',
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zit'
|
||||||
|
),
|
||||||
|
'ClassFinder should be able to find 3rd party classes when a provided namespace root maps to multiple directories (Example: "HaydenPierce\\SandboxAppMulti\\": ["multi/Bop", "multi/Bot"] )'
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testGetClassesInNamespaceRecursively()
|
||||||
|
{
|
||||||
|
$namespace = 'HaydenPierce';
|
||||||
|
$expected = array(
|
||||||
|
'HaydenPierce\SandboxApp\Foy',
|
||||||
|
'HaydenPierce\SandboxApp\Fob\Soz',
|
||||||
|
'HaydenPierce\SandboxApp\Foo\Larc',
|
||||||
|
'HaydenPierce\SandboxApp\Foo\Bar\Barc',
|
||||||
|
'HaydenPierce\SandboxApp\Foo\Bar\Barp',
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zip',
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zop',
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zap',
|
||||||
|
'HaydenPierce\SandboxAppMulti\Zit'
|
||||||
|
);
|
||||||
|
$message = 'ClassFinder should be able to find 3rd party classes';
|
||||||
|
|
||||||
|
ClassFinder::disableClassmapSupport();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$classes = ClassFinder::getClassesInNamespace($namespace, ClassFinder::RECURSIVE_MODE);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
$this->assertFalse(true, 'An exception occurred: ' . $e->getMessage());
|
||||||
|
$classes = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
// ClassFinder has the ability to find itself. This ability, while intended, is incontinent for tests
|
||||||
|
// because of the 'HaydenPierce' test case. Whenever ClassFinder would be updated, we would need to update the
|
||||||
|
// test. To prevent the flakiness, we just remove ClassFinder's classes.
|
||||||
|
$classes = array_filter($classes, function($class) {
|
||||||
|
return strpos($class, 'HaydenPierce\ClassFinder') !== 0;
|
||||||
|
});
|
||||||
|
|
||||||
|
ClassFinder::enableClassmapSupport();
|
||||||
|
|
||||||
|
$this->assertEquals($expected, $classes, $message);
|
||||||
|
}
|
||||||
|
}
|
3
test/app2/README.md
Normal file
3
test/app2/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
This test app tests that ClassFinder is working in applications that do't specify their own autoload configs in composer.json.
|
||||||
|
|
||||||
|
This can occur when ClassFinder is used only to retrieve 3rd party dependencies.
|
16
test/app2/composer.json
Normal file
16
test/app2/composer.json
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
{
|
||||||
|
"name": "HaydenPierce/testApp",
|
||||||
|
"type": "project",
|
||||||
|
"license": "MIT",
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Hayden Pierce",
|
||||||
|
"email": "hayden@haydenpierce.com"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"require-dev": {
|
||||||
|
"phpunit/phpunit": "4.8.36",
|
||||||
|
"haydenpierce/class-finder": "0.0.1",
|
||||||
|
"haydenpierce/sandbox-app":"0.3.0"
|
||||||
|
}
|
||||||
|
}
|
1123
test/app2/composer.lock
generated
Normal file
1123
test/app2/composer.lock
generated
Normal file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user