View source
<?php
namespace Drupal\xautoload\Tests;
use Drupal\xautoload\ClassFinder\ClassFinder;
use Drupal\xautoload\ClassFinder\InjectedApi\CollectFilesInjectedApi;
use Drupal\xautoload\ClassLoader\ClassLoaderInterface;
use Drupal\xautoload\Util;
class XAutoloadUnitTestCase extends \DrupalUnitTestCase {
static function getInfo() {
return array(
'name' => 'X Autoload unit test',
'description' => 'Test the xautoload class finder.',
'group' => 'X Autoload',
);
}
function setUp() {
require_once __DIR__ . '/../../../../xautoload.early.inc';
foreach (spl_autoload_functions() as $callback) {
if (is_array($callback) && ($loader = $callback[0]) && $loader instanceof ClassLoaderInterface) {
$loader
->unregister();
}
}
xautoload()->finder
->register(TRUE);
parent::setUp();
}
function testAutoloadStackOrder() {
$expected = array(
'Drupal\\xautoload\\ClassFinder\\ClassFinder->loadClass()',
'drupal_autoload_class',
'drupal_autoload_interface',
'_simpletest_autoload_psr4_psr0',
);
$actual = array();
foreach (spl_autoload_functions() as $callback) {
$actual[] = Util::callbackToString($callback);
}
$this
->assertEqualBlock($expected, $actual, "SPL autoload stack:");
}
function testNamespaces() {
$finder = new ClassFinder();
$finder
->add('Drupal\\ex_ample', 'sites/all/modules/contrib/ex_ample/lib-psr0');
$finder
->addPsr4('Drupal\\ex_ample', 'sites/all/modules/contrib/ex_ample/lib-psr4');
$this
->assertFinderSuggestions($finder, 'Drupal\\ex_ample\\Abc_Def', array(
array(
'suggestFile',
'sites/all/modules/contrib/ex_ample/lib-psr0/Drupal/ex_ample/Abc/Def.php',
),
array(
'suggestFile',
'sites/all/modules/contrib/ex_ample/lib-psr4/Abc_Def.php',
),
));
}
function testPrefixes() {
$finder = new ClassFinder();
$finder
->registerPrefixDeep('ex_ample', 'sites/all/modules/contrib/ex_ample/lib');
$finder
->registerPrefixRoot('ex_ample', 'sites/all/modules/contrib/ex_ample/vendor');
$this
->assertFinderSuggestions($finder, 'ex_ample_Abc_Def', array(
array(
'suggestFile',
'sites/all/modules/contrib/ex_ample/lib/Abc/Def.php',
),
array(
'suggestFile',
'sites/all/modules/contrib/ex_ample/vendor/ex/ample/Abc/Def.php',
),
));
}
protected function assertFinderSuggestions($finder, $class, array $expectedSuggestions) {
$success = TRUE;
for ($iAccept = 0; $iAccept < count($expectedSuggestions); ++$iAccept) {
list($method_name, $file) = $expectedSuggestions[$iAccept];
$api = new CollectFilesInjectedApi($class, $method_name, $file);
$finder
->apiFindFile($api, $class);
$suggestions = $api
->getSuggestions();
$expected = array_slice($expectedSuggestions, 0, $iAccept + 1);
$success = $success && $this
->assertEqualBlock($expected, $suggestions, "Finder suggestions for class <code>{$class}</code>:");
}
return $success;
}
protected function assertEqualBlock($expected, $actual, $label) {
$label .= '<br/>' . 'Expected: <pre>' . var_export($expected, TRUE) . '</pre>' . 'Actual: <pre>' . var_export($actual, TRUE) . '</pre>';
return $this
->assertEqual($expected, $actual, $label);
}
}