From 5fb493c5d17437059a0cea21a8bf53bf6104e570 Mon Sep 17 00:00:00 2001 From: jwage Date: Mon, 5 Oct 2009 22:09:29 +0000 Subject: [PATCH] [2.0] Adding test coverage for ClassMetadataExporter --- build.properties.dev | 2 +- .../Tools/Export/ClassMetadataExporter.php | 42 +++-- .../Tools/Export/Driver/AbstractExporter.php | 5 + .../Export/Driver/AnnotationExporter.php | 15 +- .../ORM/Tools/Export/Driver/PhpExporter.php | 12 +- .../Tools/Export/Driver/annotation.tpl.php | 3 + tests/Doctrine/Tests/ORM/AllTests.php | 1 + tests/Doctrine/Tests/ORM/Tools/AllTests.php | 31 ++++ .../Export/ClassMetadataExporterTest.php | 151 ++++++++++++++++++ .../Export/annotation/AnnotationTest.php | 52 ++++++ .../Tests/ORM/Tools/Export/php/PhpTest.php | 23 +++ .../ORM/Tools/Export/xml/XmlTest.dcm.xml | 2 + .../ORM/Tools/Export/yml/YmlTest.dcm.yml | 12 ++ 13 files changed, 326 insertions(+), 25 deletions(-) create mode 100644 tests/Doctrine/Tests/ORM/Tools/AllTests.php create mode 100644 tests/Doctrine/Tests/ORM/Tools/Export/ClassMetadataExporterTest.php create mode 100644 tests/Doctrine/Tests/ORM/Tools/Export/annotation/AnnotationTest.php create mode 100644 tests/Doctrine/Tests/ORM/Tools/Export/php/PhpTest.php create mode 100644 tests/Doctrine/Tests/ORM/Tools/Export/xml/XmlTest.dcm.xml create mode 100644 tests/Doctrine/Tests/ORM/Tools/Export/yml/YmlTest.dcm.yml diff --git a/build.properties.dev b/build.properties.dev index e5c1a4902..6ac374b96 100644 --- a/build.properties.dev +++ b/build.properties.dev @@ -1,4 +1,4 @@ -version_name=2.0.0-ALPHA1 +version_name=2.0.0-ALPHA2 version=2.0.0 stability=alpha build.dir=build diff --git a/lib/Doctrine/ORM/Tools/Export/ClassMetadataExporter.php b/lib/Doctrine/ORM/Tools/Export/ClassMetadataExporter.php index a6cf38602..29ae5d5f0 100644 --- a/lib/Doctrine/ORM/Tools/Export/ClassMetadataExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/ClassMetadataExporter.php @@ -77,19 +77,33 @@ class ClassMetadataExporter throw DoctrineException::invalidMappingDriverType($type); } - $class = $this->_mappingDrivers[$type]; - if (is_subclass_of($class, 'Doctrine\ORM\Mapping\Driver\AbstractFileDriver')) { - $driver = new $class($dir, constant($class . '::PRELOAD')); - } else { - $reader = new \Doctrine\Common\Annotations\AnnotationReader(new \Doctrine\Common\Cache\ArrayCache); - $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); - $driver = new $class($reader); - } + $driver = $this->getMappingDriver($type, $dir); $this->_mappingDirectories[] = array($dir, $driver); } } - private function _getMetadataInstances() + public function getMappingDriver($type, $dir) + { + if ( ! isset($this->_mappingDrivers[$type])) { + return false; + } + $class = $this->_mappingDrivers[$type]; + if (is_subclass_of($class, 'Doctrine\ORM\Mapping\Driver\AbstractFileDriver')) { + $driver = new $class($dir, constant($class . '::PRELOAD')); + } else { + $reader = new \Doctrine\Common\Annotations\AnnotationReader(new \Doctrine\Common\Cache\ArrayCache); + $reader->setDefaultAnnotationNamespace('Doctrine\ORM\Mapping\\'); + $driver = new $class($reader); + } + return $driver; + } + + public function getMappingDirectories() + { + return $this->_mappingDirectories; + } + + public function getMetadataInstances() { $classes = array(); @@ -108,12 +122,10 @@ class ClassMetadataExporter $vars = get_defined_vars(); foreach ($vars as $var) { if ($var instanceof \Doctrine\ORM\Mapping\ClassMetadataInfo) { - $classes[] = $var; + $classes[$var->name] = $var; } } } - $classes = array_unique($classes); - $classes = array_values($classes); } else { if ($driver instanceof \Doctrine\ORM\Mapping\Driver\AnnotationDriver) { $iter = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir), @@ -133,7 +145,7 @@ class ClassMetadataExporter if ( ! $driver->isTransient($className)) { $metadata = new ClassMetadata($className); $driver->loadMetadataForClass($className, $metadata); - $classes[] = $metadata; + $classes[$metadata->name] = $metadata; } } } else { @@ -141,7 +153,7 @@ class ClassMetadataExporter foreach ($preloadedClasses as $className) { $metadata = new ClassMetadataInfo($className); $driver->loadMetadataForClass($className, $metadata); - $classes[] = $metadata; + $classes[$metadata->name] = $metadata; } } } @@ -163,6 +175,6 @@ class ClassMetadataExporter } $class = $this->_exporterDrivers[$type]; - return new $class($this->_getMetadataInstances()); + return new $class($this->getMetadataInstances(), $dir); } } \ No newline at end of file diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php index 669ea01f0..498fc7078 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/AbstractExporter.php @@ -46,6 +46,11 @@ abstract class AbstractExporter $this->_outputDir = $dir; } + public function getExtension() + { + return $this->_extension; + } + /** * Set the directory to output the mapping files to * diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/AnnotationExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/AnnotationExporter.php index 5dac6e9a2..df16940dc 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/AnnotationExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/AnnotationExporter.php @@ -116,6 +116,11 @@ class AnnotationExporter extends AbstractExporter $this->_numSpaces = $numSpaces; } + public function hasNamespace($metadata) + { + return strpos($metadata->name, '\\') ? true : false; + } + public function extendsClass() { return $this->_classToExtend ? true : false; @@ -145,7 +150,11 @@ class AnnotationExporter extends AbstractExporter public function getClassName($metadata) { - return substr($metadata->name, strpos($metadata->name, '\\') + 1, strlen($metadata->name)); + if ($pos = strpos($metadata->name, '\\')) { + return substr($metadata->name, $pos + 1, strlen($metadata->name)); + } else { + return $metadata->name; + } } public function getNamespace($metadata) @@ -227,9 +236,9 @@ class AnnotationExporter extends AbstractExporter public function getTableAnnotation($metadata) { $table = array(); - $table[] = 'name=' . $metadata->primaryTable['name']; + $table[] = 'name="' . $metadata->primaryTable['name'] . '"'; if (isset($metadata->primaryTable['schema'])) { - $table[] = 'schema=' . $metadata->primaryTable['schema']; + $table[] = 'schema="' . $metadata->primaryTable['schema'] . '"'; } return '@Table(' . implode(', ', $table) . ')'; } diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php index 28687e789..bcd7f7e97 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/PhpExporter.php @@ -22,7 +22,7 @@ namespace Doctrine\ORM\Tools\Export\Driver; -use Doctrine\ORM\Mapping\ClassMetadata; +use Doctrine\ORM\Mapping\ClassMetadataInfo; /** * ClassMetadata exporter for PHP code @@ -49,16 +49,16 @@ class PhpExporter extends AbstractExporter $lines = array(); $lines[] = 'name . "');"; + $lines[] = "\$metadata = new ClassMetadataInfo('" . $metadata->name . "');"; if ($metadata->isMappedSuperclass) { $lines[] = '$metadata->isMappedSuperclass = true;'; } if ($metadata->inheritanceType) { - $lines[] = '$metadata->setInheritanceType(ClassMetadata::INHERITANCE_TYPE_' . $this->_getInheritanceTypeString($metadata->inheritanceType) . ');'; + $lines[] = '$metadata->setInheritanceType(ClassMetadataInfo::INHERITANCE_TYPE_' . $this->_getInheritanceTypeString($metadata->inheritanceType) . ');'; } if ($metadata->customRepositoryClassName) { @@ -78,7 +78,7 @@ class PhpExporter extends AbstractExporter } if ($metadata->changeTrackingPolicy) { - $lines[] = '$metadata->setChangeTrackingPolicy(ClassMetadata::CHANGETRACKING_' . $this->_getChangeTrackingPolicyString($metadata->changeTrackingPolicy) . ');'; + $lines[] = '$metadata->setChangeTrackingPolicy(ClassMetadataInfo::CHANGETRACKING_' . $this->_getChangeTrackingPolicyString($metadata->changeTrackingPolicy) . ');'; } foreach ($metadata->fieldMappings as $fieldMapping) { @@ -86,7 +86,7 @@ class PhpExporter extends AbstractExporter } if ($generatorType = $this->_getIdGeneratorTypeString($metadata->generatorType)) { - $lines[] = '$metadata->setIdGeneratorType(ClassMetadata::GENERATOR_TYPE_' . $generatorType . ');'; + $lines[] = '$metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_' . $generatorType . ');'; } foreach ($metadata->associationMappings as $associationMapping) { diff --git a/lib/Doctrine/ORM/Tools/Export/Driver/annotation.tpl.php b/lib/Doctrine/ORM/Tools/Export/Driver/annotation.tpl.php index 0a028dbb9..1bac1c96f 100644 --- a/lib/Doctrine/ORM/Tools/Export/Driver/annotation.tpl.php +++ b/lib/Doctrine/ORM/Tools/Export/Driver/annotation.tpl.php @@ -1,6 +1,9 @@ [?php +hasNamespace($metadata)): ?> + namespace getNamespace($metadata) ?>; + extendsClass()): ?> use getClassToExtendNamespace() ?>; diff --git a/tests/Doctrine/Tests/ORM/AllTests.php b/tests/Doctrine/Tests/ORM/AllTests.php index 2deb14bb4..9b8e06dd6 100644 --- a/tests/Doctrine/Tests/ORM/AllTests.php +++ b/tests/Doctrine/Tests/ORM/AllTests.php @@ -31,6 +31,7 @@ class AllTests $suite->addTest(Functional\AllTests::suite()); $suite->addTest(Id\AllTests::suite()); $suite->addTest(Proxy\AllTests::suite()); + $suite->addTest(Tools\AllTests::suite()); return $suite; } diff --git a/tests/Doctrine/Tests/ORM/Tools/AllTests.php b/tests/Doctrine/Tests/ORM/Tools/AllTests.php new file mode 100644 index 000000000..5d6ac3c07 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/AllTests.php @@ -0,0 +1,31 @@ +addTestSuite('Doctrine\Tests\ORM\Tools\Export\ClassMetadataExporterTest'); + + return $suite; + } +} + +if (PHPUnit_MAIN_METHOD == 'Orm_Tools_AllTests::main') { + AllTests::main(); +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/ClassMetadataExporterTest.php b/tests/Doctrine/Tests/ORM/Tools/Export/ClassMetadataExporterTest.php new file mode 100644 index 000000000..f0eab7c4b --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/Export/ClassMetadataExporterTest.php @@ -0,0 +1,151 @@ +. + */ + +namespace Doctrine\Tests\ORM\Tools\Export; + +use Doctrine\ORM\Tools\Export\ClassMetadataExporter; + +require_once __DIR__ . '/../../../TestInit.php'; + +/** + * Test case for ClassMetadataExporter + * + * @author Jonathan H. Wage + * @author Roman Borschel getExporter('xml'); + $this->assertTrue($exporter instanceof \Doctrine\ORM\Tools\Export\Driver\XmlExporter); + + $exporter = $cme->getExporter('yml'); + $this->assertTrue($exporter instanceof \Doctrine\ORM\Tools\Export\Driver\YamlExporter); + + $exporter = $cme->getExporter('annotation'); + $this->assertTrue($exporter instanceof \Doctrine\ORM\Tools\Export\Driver\AnnotationExporter); + } + + /** + * Test that we can add mapping directories for the different types of + * mapping information. + */ + public function testAddMappingDirectory() + { + $cme = new ClassMetadataExporter(); + $cme->addMappingDir(__DIR__ . '/annotation', 'annotation'); + $cme->addMappingDir(__DIR__ . '/php', 'php'); + $cme->addMappingDir(__DIR__ . '/xml', 'xml'); + $cme->addMappingDir(__DIR__ . '/yml', 'yml'); + + $mappingDirectories = $cme->getMappingDirectories(); + $this->assertEquals(4, count($mappingDirectories)); + + $this->assertEquals($mappingDirectories[0][0], __DIR__.'/annotation'); + $this->assertTrue($mappingDirectories[0][1] instanceof \Doctrine\ORM\Mapping\Driver\AnnotationDriver); + + $this->assertEquals($mappingDirectories[1][0], __DIR__.'/php'); + $this->assertEquals('php', $mappingDirectories[1][1]); + + $this->assertEquals($mappingDirectories[2][0], __DIR__.'/xml'); + $this->assertTrue($mappingDirectories[2][1] instanceof \Doctrine\ORM\Mapping\Driver\XmlDriver); + + $this->assertEquals($mappingDirectories[3][0], __DIR__.'/yml'); + $this->assertTrue($mappingDirectories[3][1] instanceof \Doctrine\ORM\Mapping\Driver\YamlDriver); + } + + /** + * Test that we can add mapping directories then retrieve all the defined + * ClassMetadata instances that are defined in the directories + */ + public function testGetMetadataInstances() + { + $cme = new ClassMetadataExporter(); + $cme->addMappingDir(__DIR__ . '/annotation', 'annotation'); + $cme->addMappingDir(__DIR__ . '/php', 'php'); + $cme->addMappingDir(__DIR__ . '/xml', 'xml'); + $cme->addMappingDir(__DIR__ . '/yml', 'yml'); + + $metadataInstances = $cme->getMetadataInstances(); + $this->assertEquals(4, count($metadataInstances)); + $this->assertEquals('AnnotationTest', $metadataInstances[0]->name); + $this->assertEquals('PhpTest', $metadataInstances[1]->name); + $this->assertEquals('XmlTest', $metadataInstances[2]->name); + $this->assertEquals('YmlTest', $metadataInstances[3]->name); + } + + /** + * Test that we can export mapping directories to another format and that + * the exported data can then be read back in properly. + */ + public function testExport() + { + $exportDir = __DIR__ . '/export'; + + if ( ! is_dir($exportDir)) { + mkdir($exportDir, 0777, true); + } + + $types = array('annotation', 'php', 'xml', 'yml'); + + $cme = new ClassMetadataExporter(); + $cme->addMappingDir(__DIR__ . '/php', 'php'); + $cme->addMappingDir(__DIR__ . '/xml', 'xml'); + $cme->addMappingDir(__DIR__ . '/yml', 'yml'); + + foreach ($types as $type) { + // Export the above mapping directories to the type + $exporter = $cme->getExporter($type, __DIR__ . '/export/' . $type); + $exporter->export(); + + // Make sure the files were written + $this->assertTrue(file_exists(__DIR__ . '/export/' . $type . '/PhpTest'.$exporter->getExtension())); + $this->assertTrue(file_exists(__DIR__ . '/export/' . $type . '/XmlTest'.$exporter->getExtension())); + $this->assertTrue(file_exists(__DIR__ . '/export/' . $type . '/YmlTest'.$exporter->getExtension())); + + // Try and read back in the exported mapping files to make sure they are valid + $cme2 = new ClassMetadataExporter(); + $cme2->addMappingDir(__DIR__ . '/export/' . $type, $type); + $metadataInstances = $cme2->getMetadataInstances(); + $this->assertEquals(3, count($metadataInstances)); + $this->assertEquals('PhpTest', $metadataInstances[0]->name); + $this->assertEquals('XmlTest', $metadataInstances[1]->name); + $this->assertEquals('YmlTest', $metadataInstances[2]->name); + + // Cleanup + unlink(__DIR__ . '/export/' . $type . '/PhpTest'.$exporter->getExtension()); + unlink(__DIR__ . '/export/' . $type . '/XmlTest'.$exporter->getExtension()); + unlink(__DIR__ . '/export/' . $type . '/YmlTest'.$exporter->getExtension()); + rmdir(__DIR__ . '/export/'.$type); + } + rmdir(__DIR__ . '/export'); + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/annotation/AnnotationTest.php b/tests/Doctrine/Tests/ORM/Tools/Export/annotation/AnnotationTest.php new file mode 100644 index 000000000..86b578621 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/Export/annotation/AnnotationTest.php @@ -0,0 +1,52 @@ +id = $value; + } + + /** + * Get id + */ + public function getId() + { + return $this->id; + } + + /** + * Set name + */ + public function setName($value) + { + $this->name = $value; + } + + /** + * Get name + */ + public function getName() + { + return $this->name; + } +} \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/php/PhpTest.php b/tests/Doctrine/Tests/ORM/Tools/Export/php/PhpTest.php new file mode 100644 index 000000000..be1b84309 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/Export/php/PhpTest.php @@ -0,0 +1,23 @@ +setInheritanceType(ClassMetadataInfo::INHERITANCE_TYPE_NONE); +$metadata->setPrimaryTable(array( + 'name' => 'php_test', + )); +$metadata->setChangeTrackingPolicy(ClassMetadataInfo::CHANGETRACKING_DEFERRED_IMPLICIT); +$metadata->mapField(array( + 'id' => true, + 'fieldName' => 'id', + 'type' => 'integer', + 'columnName' => 'id', + )); +$metadata->mapField(array( + 'fieldName' => 'name', + 'type' => 'string', + 'length' => 50, + 'columnName' => 'name', + )); +$metadata->setIdGeneratorType(ClassMetadataInfo::GENERATOR_TYPE_AUTO); \ No newline at end of file diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/xml/XmlTest.dcm.xml b/tests/Doctrine/Tests/ORM/Tools/Export/xml/XmlTest.dcm.xml new file mode 100644 index 000000000..17be3e308 --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/Export/xml/XmlTest.dcm.xml @@ -0,0 +1,2 @@ + +DEFERRED_IMPLICIT diff --git a/tests/Doctrine/Tests/ORM/Tools/Export/yml/YmlTest.dcm.yml b/tests/Doctrine/Tests/ORM/Tools/Export/yml/YmlTest.dcm.yml new file mode 100644 index 000000000..be69e80fa --- /dev/null +++ b/tests/Doctrine/Tests/ORM/Tools/Export/yml/YmlTest.dcm.yml @@ -0,0 +1,12 @@ +YmlTest: + type: entity + table: yml_test + id: + id: + type: integer + generator: + strategy: AUTO + fields: + name: + type: string + length: 50 \ No newline at end of file