Skip to content

Commit

Permalink
[Debug] enhance non-PSR-0 compatibility for case mismatch test
Browse files Browse the repository at this point in the history
  • Loading branch information
nicolas-grekas committed Feb 24, 2014
1 parent 872647a commit 120e197
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 8 deletions.
28 changes: 20 additions & 8 deletions src/Symfony/Component/Debug/DebugClassLoader.php
Expand Up @@ -176,18 +176,30 @@ public function loadClass($class)
$class = substr($class, 1);
}

$i = -1;
$tail = str_replace('\\', DIRECTORY_SEPARATOR, $class).'.php';
$i = 0;
$tail = DIRECTORY_SEPARATOR . str_replace('\\', DIRECTORY_SEPARATOR, $class).'.php';
$len = strlen($tail);

do {
$tail = substr($tail, $i+1);
$len -= $i+1;

if (! substr_compare($file, $tail, -$len, $len, true) && substr_compare($file, $tail, -$len, $len, false)) {
throw new \RuntimeException(sprintf('Case mismatch between class and source file names: %s vs %s', $class, $file));
$tail = substr($tail, $i);
$len -= $i;

if (0 === substr_compare($file, $tail, -$len, $len, true)) {
if (0 !== substr_compare($file, $tail, -$len, $len, false)) {
if (method_exists($this->classLoader[0], 'getClassMap')) {
$map = $this->classLoader[0]->getClassMap();
} else {
$map = array();
}

if (! isset($map[$class])) {
throw new \RuntimeException(sprintf('Case mismatch between class and source file names: %s vs %s', $class, $file));
}
}

break;
}
} while (false !== $i = strpos($tail, '\\'));
} while (false !== $i = strpos($tail, DIRECTORY_SEPARATOR, 1));

if (! $exists) {
if (false !== strpos($class, '/')) {
Expand Down
29 changes: 29 additions & 0 deletions src/Symfony/Component/Debug/Tests/DebugClassLoaderTest.php
Expand Up @@ -140,6 +140,24 @@ public function testFileCaseMismatch()
{
class_exists(__NAMESPACE__.'\Fixtures\CaseMismatch', true);
}

/**
* @expectedException \RuntimeException
*/
public function testPsr4CaseMismatch()
{
class_exists(__NAMESPACE__.'\Fixtures\Psr4CaseMismatch', true);
}

public function testNotPsr0()
{
$this->assertTrue(class_exists(__NAMESPACE__.'\Fixtures\NotPSR0', true));
}

public function testNotPsr0Bis()
{
$this->assertTrue(class_exists(__NAMESPACE__.'\Fixtures\NotPSR0bis', true));
}
}

class ClassLoader
Expand All @@ -148,6 +166,11 @@ public function loadClass($class)
{
}

public function getClassMap()
{
return array(__NAMESPACE__.'\Fixtures\NotPSR0bis' => __DIR__ . '/Fixtures/notPsr0Bis.php');
}

public function findFile($class)
{
if (__NAMESPACE__.'\TestingUnsilencing' === $class) {
Expand All @@ -158,6 +181,12 @@ public function findFile($class)
eval('namespace '.__NAMESPACE__.'; class TestingCaseMisMatch {}');
} elseif (__NAMESPACE__.'\Fixtures\CaseMismatch' === $class) {
return __DIR__ . '/Fixtures/casemismatch.php';
} elseif (__NAMESPACE__.'\Fixtures\Psr4CaseMismatch' === $class) {
return __DIR__ . '/Fixtures/psr4/Psr4CaseMismatch.php';
} elseif (__NAMESPACE__.'\Fixtures\NotPSR0' === $class) {
return __DIR__ . '/Fixtures/reallyNotPsr0.php';
} elseif (__NAMESPACE__.'\Fixtures\NotPSR0bis' === $class) {
return __DIR__ . '/Fixtures/notPsr0Bis.php';
}
}
}
7 changes: 7 additions & 0 deletions src/Symfony/Component/Debug/Tests/Fixtures/notPsr0Bis.php
@@ -0,0 +1,7 @@
<?php

namespace Symfony\Component\Debug\Tests\Fixtures;

class NotPSR0bis
{
}
@@ -0,0 +1,7 @@
<?php

namespace Symfony\Component\Debug\Tests\Fixtures;

class PSR4CaseMismatch
{
}
7 changes: 7 additions & 0 deletions src/Symfony/Component/Debug/Tests/Fixtures/reallyNotPsr0.php
@@ -0,0 +1,7 @@
<?php

namespace Symfony\Component\Debug\Tests\Fixtures;

class NotPSR0
{
}

0 comments on commit 120e197

Please sign in to comment.