Просмотр исходного кода

Add tests for ClassMapGenerator

Benjamin Eberlei 13 лет назад
Родитель
Сommit
671cd5ee08
21 измененных файлов с 238 добавлено и 5 удалено
  1. 5 3
      src/Composer/Autoload/AutoloadGenerator.php
  2. 1 2
      src/Composer/Autoload/ClassMapGenerator.php
  3. 34 0
      tests/Composer/Test/Autoload/AutoloadGeneratorTest.php
  4. 83 0
      tests/Composer/Test/Autoload/ClassMapGeneratorTest.php
  5. 8 0
      tests/Composer/Test/Autoload/Fixtures/Namespaced/Bar.php
  6. 8 0
      tests/Composer/Test/Autoload/Fixtures/Namespaced/Baz.php
  7. 8 0
      tests/Composer/Test/Autoload/Fixtures/Namespaced/Foo.php
  8. 6 0
      tests/Composer/Test/Autoload/Fixtures/Pearlike/Bar.php
  9. 6 0
      tests/Composer/Test/Autoload/Fixtures/Pearlike/Baz.php
  10. 6 0
      tests/Composer/Test/Autoload/Fixtures/Pearlike/Foo.php
  11. 8 0
      tests/Composer/Test/Autoload/Fixtures/beta/NamespaceCollision/A/B/Bar.php
  12. 8 0
      tests/Composer/Test/Autoload/Fixtures/beta/NamespaceCollision/A/B/Foo.php
  13. 6 0
      tests/Composer/Test/Autoload/Fixtures/beta/PrefixCollision/A/B/Bar.php
  14. 6 0
      tests/Composer/Test/Autoload/Fixtures/beta/PrefixCollision/A/B/Foo.php
  15. 8 0
      tests/Composer/Test/Autoload/Fixtures/classmap/SomeClass.php
  16. 8 0
      tests/Composer/Test/Autoload/Fixtures/classmap/SomeInterface.php
  17. 8 0
      tests/Composer/Test/Autoload/Fixtures/classmap/SomeParent.php
  18. 11 0
      tests/Composer/Test/Autoload/Fixtures/classmap/multipleNs.php
  19. 3 0
      tests/Composer/Test/Autoload/Fixtures/classmap/notAClass.php
  20. 1 0
      tests/Composer/Test/Autoload/Fixtures/classmap/notPhpFile.md
  21. 6 0
      tests/Composer/Test/Autoload/Fixtures/classmap/sameNsMultipleClasses.php

+ 5 - 3
src/Composer/Autoload/AutoloadGenerator.php

@@ -115,12 +115,14 @@ EOF;
         $namespacesFile .= ");\n";
 
         if (isset($autoloads['classmap'])) {
-            $it = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($autoloads['classmap']));
-            ClassMapGenerator::dump(iterator_to_array($it), $targetDir.'/autoload_classmap.php');
+            // flatten array
+            $autoloads['classmap'] = new \RecursiveIteratorIterator(new \RecursiveArrayIterator($autoloads['classmap']));
         } else {
-            file_put_contents($targetDir.'/autoload_classmap.php', '<?php return array();');
+            $autoloads['classmap'] = array();
         }
 
+        ClassMapGenerator::dump($autoloads['classmap'], $targetDir.'/autoload_classmap.php');
+
         file_put_contents($targetDir.'/autoload.php', $autoloadFile);
         file_put_contents($targetDir.'/autoload_namespaces.php', $namespacesFile);
         copy(__DIR__.'/ClassLoader.php', $targetDir.'/ClassLoader.php');

+ 1 - 2
src/Composer/Autoload/ClassMapGenerator.php

@@ -23,12 +23,11 @@ class ClassMapGenerator
     /**
      * Generate a class map file
      *
-     * @param array|string $dirs Directories or a single path to search in
+     * @param Traversable $dirs Directories or a single path to search in
      * @param string $file The name of the class map file
      */
     static public function dump($dirs, $file)
     {
-        $dirs = (array) $dirs;
         $maps = array();
 
         foreach ($dirs as $dir) {

+ 34 - 0
tests/Composer/Test/Autoload/AutoloadGeneratorTest.php

@@ -134,6 +134,40 @@ class AutoloadGeneratorTest extends TestCase
         mkdir($this->vendorDir.'/.composer', 0777, true);
         $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/.composer');
         $this->assertAutoloadFiles('vendors', $this->vendorDir.'/.composer');
+        $this->assertTrue(file_exists($this->vendorDir.'/.composer/autoload_classmap.php'), "ClassMap file needs to be generated, even if empty.");
+    }
+
+    public function testVendorsClassMapAutoloading()
+    {
+        $package = new MemoryPackage('a', '1.0', '1.0');
+
+        $packages = array();
+        $packages[] = $a = new MemoryPackage('a/a', '1.0', '1.0');
+        $packages[] = $b = new MemoryPackage('b/b', '1.0', '1.0');
+        $a->setAutoload(array('classmap' => array('src/')));
+        $b->setAutoload(array('classmap' => array('src/', 'lib/')));
+
+        $this->repository->expects($this->once())
+            ->method('getPackages')
+            ->will($this->returnValue($packages));
+
+        @mkdir($this->vendorDir.'/.composer', 0777, true);
+        mkdir($this->vendorDir.'/a/a/src', 0777, true);
+        mkdir($this->vendorDir.'/b/b/src', 0777, true);
+        mkdir($this->vendorDir.'/b/b/lib', 0777, true);
+        file_put_contents($this->vendorDir.'/a/a/src/a.php', '<?php class ClassMapFoo {}');
+        file_put_contents($this->vendorDir.'/b/b/src/b.php', '<?php class ClassMapBar {}');
+        file_put_contents($this->vendorDir.'/b/b/lib/c.php', '<?php class ClassMapBaz {}');
+
+        $this->generator->dump($this->repository, $package, $this->im, $this->vendorDir.'/.composer');
+        $this->assertTrue(file_exists($this->vendorDir.'/.composer/autoload_classmap.php'), "ClassMap file needs to be generated, even if empty.");
+        $this->assertEquals(array(
+                'ClassMapFoo' => $this->vendorDir.'/a/a/src/a.php',
+                'ClassMapBar' => $this->vendorDir.'/b/b/src/b.php',
+                'ClassMapBaz' => $this->vendorDir.'/b/b/lib/c.php',
+            ),
+            include ($this->vendorDir.'/.composer/autoload_classmap.php')
+        );
     }
 
     public function testOverrideVendorsAutoloading()

+ 83 - 0
tests/Composer/Test/Autoload/ClassMapGeneratorTest.php

@@ -0,0 +1,83 @@
+<?php
+
+/*
+ * This file was copied from the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Composer\Test\Autoload;
+
+use Composer\Autoload\ClassMapGenerator;
+
+class ClassMapGeneratorTest extends \PHPUnit_Framework_TestCase
+{
+    /**
+     * @dataProvider getTestCreateMapTests
+     */
+    public function testCreateMap($directory, $expected)
+    {
+        $this->assertEqualsNormalized($expected, ClassMapGenerator::createMap($directory));
+    }
+
+    public function getTestCreateMapTests()
+    {
+        return array(
+            array(__DIR__.'/Fixtures/Namespaced', array(
+                'Namespaced\\Bar' => realpath(__DIR__).'/Fixtures/Namespaced/Bar.php',
+                'Namespaced\\Foo' => realpath(__DIR__).'/Fixtures/Namespaced/Foo.php',
+                'Namespaced\\Baz' => realpath(__DIR__).'/Fixtures/Namespaced/Baz.php',
+                )
+            ),
+            array(__DIR__.'/Fixtures/beta/NamespaceCollision', array(
+                'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php',
+                'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Foo.php',
+            )),
+            array(__DIR__.'/Fixtures/Pearlike', array(
+                'Pearlike_Foo' => realpath(__DIR__).'/Fixtures/Pearlike/Foo.php',
+                'Pearlike_Bar' => realpath(__DIR__).'/Fixtures/Pearlike/Bar.php',
+                'Pearlike_Baz' => realpath(__DIR__).'/Fixtures/Pearlike/Baz.php',
+            )),
+            array(__DIR__.'/Fixtures/classmap', array(
+                'Foo\\Bar\\A'             => realpath(__DIR__).'/Fixtures/classmap/sameNsMultipleClasses.php',
+                'Foo\\Bar\\B'             => realpath(__DIR__).'/Fixtures/classmap/sameNsMultipleClasses.php',
+                'Alpha\\A'                => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
+                'Alpha\\B'                => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
+                'Beta\\A'                 => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
+                'Beta\\B'                 => realpath(__DIR__).'/Fixtures/classmap/multipleNs.php',
+                'ClassMap\\SomeInterface' => realpath(__DIR__).'/Fixtures/classmap/SomeInterface.php',
+                'ClassMap\\SomeParent'    => realpath(__DIR__).'/Fixtures/classmap/SomeParent.php',
+                'ClassMap\\SomeClass'     => realpath(__DIR__).'/Fixtures/classmap/SomeClass.php',
+            )),
+        );
+    }
+
+    public function testCreateMapFinderSupport()
+    {
+        if (!class_exists('Symfony\\Component\\Finder\\Finder')) {
+            $this->markTestSkipped('Finder component is not available');
+        }
+
+        $finder = new \Symfony\Component\Finder\Finder();
+        $finder->files()->in(__DIR__ . '/Fixtures/beta/NamespaceCollision');
+
+        $this->assertEqualsNormalized(array(
+            'NamespaceCollision\\A\\B\\Bar' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Bar.php',
+            'NamespaceCollision\\A\\B\\Foo' => realpath(__DIR__).'/Fixtures/beta/NamespaceCollision/A/B/Foo.php',
+        ), ClassMapGenerator::createMap($finder));
+    }
+
+    protected function assertEqualsNormalized($expected, $actual, $message = null)
+    {
+        foreach ($expected as $ns => $path) {
+            $expected[$ns] = strtr($path, '\\', '/');
+        }
+        foreach ($actual as $ns => $path) {
+            $actual[$ns] = strtr($path, '\\', '/');
+        }
+        $this->assertEquals($expected, $actual, $message);
+    }
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/Namespaced/Bar.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace Namespaced;
+
+class Bar
+{
+    public static $loaded = true;
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/Namespaced/Baz.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace Namespaced;
+
+class Baz
+{
+    public static $loaded = true;
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/Namespaced/Foo.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace Namespaced;
+
+class Foo
+{
+    public static $loaded = true;
+}

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/Pearlike/Bar.php

@@ -0,0 +1,6 @@
+<?php
+
+class Pearlike_Bar
+{
+    public static $loaded = true;
+}

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/Pearlike/Baz.php

@@ -0,0 +1,6 @@
+<?php
+
+class Pearlike_Baz
+{
+    public static $loaded = true;
+}

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/Pearlike/Foo.php

@@ -0,0 +1,6 @@
+<?php
+
+class Pearlike_Foo
+{
+    public static $loaded = true;
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/beta/NamespaceCollision/A/B/Bar.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace NamespaceCollision\A\B;
+
+class Bar
+{
+    public static $loaded = true;
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/beta/NamespaceCollision/A/B/Foo.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace NamespaceCollision\A\B;
+
+class Foo
+{
+    public static $loaded = true;
+}

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/beta/PrefixCollision/A/B/Bar.php

@@ -0,0 +1,6 @@
+<?php
+
+class PrefixCollision_A_B_Bar
+{
+    public static $loaded = true;
+}

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/beta/PrefixCollision/A/B/Foo.php

@@ -0,0 +1,6 @@
+<?php
+
+class PrefixCollision_A_B_Foo
+{
+    public static $loaded = true;
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/classmap/SomeClass.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace ClassMap;
+
+class SomeClass extends SomeParent implements SomeInterface
+{
+
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/classmap/SomeInterface.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace ClassMap;
+
+interface SomeInterface
+{
+
+}

+ 8 - 0
tests/Composer/Test/Autoload/Fixtures/classmap/SomeParent.php

@@ -0,0 +1,8 @@
+<?php
+
+namespace ClassMap;
+
+abstract class SomeParent
+{
+
+}

+ 11 - 0
tests/Composer/Test/Autoload/Fixtures/classmap/multipleNs.php

@@ -0,0 +1,11 @@
+<?php
+
+namespace Alpha {
+    class A {}
+    class B {}
+}
+
+namespace Beta {
+    class A {}
+    class B {}
+}

+ 3 - 0
tests/Composer/Test/Autoload/Fixtures/classmap/notAClass.php

@@ -0,0 +1,3 @@
+<?php
+
+$a = new stdClass();

+ 1 - 0
tests/Composer/Test/Autoload/Fixtures/classmap/notPhpFile.md

@@ -0,0 +1 @@
+This file should be skipped.

+ 6 - 0
tests/Composer/Test/Autoload/Fixtures/classmap/sameNsMultipleClasses.php

@@ -0,0 +1,6 @@
+<?php
+
+namespace Foo\Bar;
+
+class A {}
+class B {}