public function testScenarioOTARQSchema() { $filepath = dirname(__FILE__) . '/../../_files/EasyPO/'; $xml = simplexml_load_file($filepath . '/easypo.xsd'); $parser = new PiBX_CodeGen_SchemaParser(); $parser->setSchema($xml); $parsedTree = $parser->parse(); }
public function testEasyPoXSD() { $filepath = dirname(__FILE__) . '/../../_files/EasyPO/'; $schema = simplexml_load_file($filepath . '/easypo.xsd'); $parser = new PiBX_CodeGen_SchemaParser(); $parser->setSchema($schema); $parsedTree = $parser->parse(); $namespaces = array('xs' => 'http://www.w3.org/2001/XMLSchema', 'po' => 'http://openuri.org/easypo'); $expectedTypeList = array(); $expectedType1 = new PiBX_AST_Type('purchase-order'); $expectedType1->setAsRoot(); $expectedType1->setTargetNamespace('http://openuri.org/easypo'); $expectedType1->setNamespaces($namespaces); $expectedType1->add(new PiBX_AST_TypeAttribute('customer', 'customer')); $expectedType1->add(new PiBX_AST_TypeAttribute('date', 'dateTime')); $ta = new PiBX_AST_TypeAttribute('line-item', 'line-item'); $ta->add(new PiBX_AST_CollectionItem('line-item', 'line-item')); $expectedType1->add($ta); $expectedType1->add(new PiBX_AST_TypeAttribute('shipper', 'shipper')); $expectedType2 = new PiBX_AST_Type('customer'); $expectedType2->add(new PiBX_AST_TypeAttribute('name', 'string')); $expectedType2->add(new PiBX_AST_TypeAttribute('address', 'string')); $ta = new PiBX_AST_TypeAttribute('age', 'int'); $ta->setStyle('attribute'); $expectedType2->add($ta); $ta = new PiBX_AST_TypeAttribute('moo', 'int'); $ta->setStyle('attribute'); $expectedType2->add($ta); $ta = new PiBX_AST_TypeAttribute('poo', 'int'); $ta->setStyle('attribute'); $expectedType2->add($ta); $expectedType3 = new PiBX_AST_Type('line-item'); $expectedType3->add(new PiBX_AST_TypeAttribute('description', 'string')); $expectedType3->add(new PiBX_AST_TypeAttribute('per-unit-ounces', 'decimal')); $expectedType3->add(new PiBX_AST_TypeAttribute('price', 'decimal')); $expectedType3->add(new PiBX_AST_TypeAttribute('quantity', 'integer')); $expectedType4 = new PiBX_AST_Type('shipper'); $expectedType4->add(new PiBX_AST_TypeAttribute('name', 'string')); $expectedType4->add(new PiBX_AST_TypeAttribute('per-ounce-rate', 'decimal')); $parser = new PiBX_CodeGen_SchemaParser(); $parser->setSchema($schema); $tree = $parser->parse(); $creator = new PiBX_CodeGen_ASTCreator(new PiBX_CodeGen_TypeUsage()); $tree->accept($creator); $typeList = $creator->getTypeList(); $this->assertEquals(4, count($typeList)); $this->assertEquals($expectedType1, $typeList[0]); $this->assertEquals($expectedType2, $typeList[1]); $this->assertEquals($expectedType3, $typeList[2]); $this->assertEquals($expectedType4, $typeList[3]); }
/** * Creating an object of PiBX_CodeGen starts the code generation. * * A valid schema-file has to be passed. * Options can be passed as an associative array with a value of a boolean "true". * This way the code generation can be customized. * * Possible option-values are (keys of "$options"): * - "typechecks" enables the generation of type-check code into setter methods. * * @param string $schemaFile * @param array $options */ public function __construct($schemaFile, $options) { $typeUsage = new PiBX_CodeGen_TypeUsage(); // phase 1 echo "Parsing schema file '{$schemaFile}'\n"; $parser = new PiBX_CodeGen_SchemaParser($schemaFile, $typeUsage); $parsedTree = $parser->parse(); // phase 2 echo "Creating abstract syntax tree\n"; $creator = new PiBX_CodeGen_ASTCreator($typeUsage); $parsedTree->accept($creator); $typeList = $creator->getTypeList(); // phase 3 print "Optimizing abstract syntax tree\n"; print " Before: " . count($typeList) . " type(s)\n"; $usages = $typeUsage->getTypeUsages(); $optimizer = new PiBX_CodeGen_ASTOptimizer($typeList, $typeUsage); $typeList = $optimizer->optimize(); print " After: " . count($typeList) . " type(s)\n"; // phase 4 print "Creating binding.xml\n"; $b = new PiBX_Binding_Creator(); foreach ($typeList as &$type) { $type->accept($b); } file_put_contents('./output/binding.xml', $b->getXml()); // phase 5 print "Generating classes to: ./output\n"; $generator = new PiBX_CodeGen_ClassGenerator(); if ($options['typechecks'] === true) { $generator->enableTypeChecks(); } foreach ($typeList as &$type) { $type->accept($generator); } if (!is_dir('output')) { mkdir('output'); } foreach ($generator->getClasses() as $className => $classCode) { $code = "<?php\n" . $classCode; file_put_contents('output/' . $className . '.php', $code); } }
public function testEasyPoBinding() { $filepath = dirname(__FILE__) . '/../../_files/EasyPO/'; $schemaFile = $filepath . '/easypo.xsd'; $schema = simplexml_load_file($schemaFile); $bindingFile = file_get_contents($filepath . '/binding.xml'); $typeUsage = new PiBX_CodeGen_TypeUsage(); $parser = new PiBX_CodeGen_SchemaParser($schemaFile, $typeUsage); $parsedTree = $parser->parse(); $creator = new PiBX_CodeGen_ASTCreator($typeUsage); $parsedTree->accept($creator); $typeList = $creator->getTypeList(); $usages = $typeUsage->getTypeUsages(); $optimizer = new PiBX_CodeGen_ASTOptimizer($typeList, $typeUsage); $typeList = $optimizer->optimize(); $b = new PiBX_Binding_Creator(); foreach ($typeList as &$type) { $type->accept($b); } $this->assertEquals($bindingFile, $b->getXml()); }
public function testClassGenerationWithTypeChecks() { $filepath = dirname(__FILE__) . '/../../_files/EasyPO'; $schemaFile = $filepath . '/easypo.xsd'; $bindingFile = $filepath . '/binding.xml'; $customerFile = $filepath . '/Customer_TypeChecked.php'; $lineItemFile = $filepath . '/LineItem_TypeChecked.php'; $purchaseOrderFile = $filepath . '/PurchaseOrder_TypeChecked.php'; $shipperFile = $filepath . '/Shipper_TypeChecked.php'; $typeUsage = new PiBX_CodeGen_TypeUsage(); // most of this test-case follows the flow of PiBX_CodeGen // phase 1 $parser = new PiBX_CodeGen_SchemaParser($schemaFile, $typeUsage); $parsedTree = $parser->parse(); // phase 2 $creator = new PiBX_CodeGen_ASTCreator($typeUsage); $parsedTree->accept($creator); $typeList = $creator->getTypeList(); // phase 3 $usages = $typeUsage->getTypeUsages(); $optimizer = new PiBX_CodeGen_ASTOptimizer($typeList, $typeUsage); $typeList = $optimizer->optimize(); // phase 4 $b = new PiBX_Binding_Creator(); foreach ($typeList as &$type) { $type->accept($b); } $this->assertEquals(file_get_contents($bindingFile), $b->getXml()); // phase 5 $generator = new PiBX_CodeGen_ClassGenerator(); $generator->enableTypeChecks(); foreach ($typeList as &$type) { $type->accept($generator); } $classes = $generator->getClasses(); $this->assertEquals(4, count($classes)); $this->assertEquals(file_get_contents($customerFile), "<?php\n" . $classes['Customer']); $this->assertEquals(file_get_contents($lineItemFile), "<?php\n" . $classes['LineItem']); $this->assertEquals(file_get_contents($purchaseOrderFile), "<?php\n" . $classes['PurchaseOrder']); $this->assertEquals(file_get_contents($shipperFile), "<?php\n" . $classes['Shipper']); }
public function _testScenarioBooksSchema() { $filepath = dirname(__FILE__) . '/../_files/Books/'; $xml = simplexml_load_file($filepath . '/books.xsd'); $parser = new PiBX_CodeGen_SchemaParser(); $parser->setSchema($xml); $parsedTree = $parser->parse(); }
public function testScenarioBooksClassesWithTypeChecks() { $filepath = dirname(__FILE__) . '/../_files/Books'; $schemaFile = $filepath . '/books.xsd'; $bindingFile = $filepath . '/binding.xml'; $collectionFile = $filepath . '/Collection_TypeChecked.php'; $bookTypeFile = $filepath . '/BookType_TypeChecked.php'; $typeUsage = new PiBX_CodeGen_TypeUsage(); // most of this test-case follows the flow of PiBX_CodeGen // phase 1 $parser = new PiBX_CodeGen_SchemaParser($schemaFile, $typeUsage); $parsedTree = $parser->parse(); // phase 2 $creator = new PiBX_CodeGen_ASTCreator($typeUsage); $parsedTree->accept($creator); $typeList = $creator->getTypeList(); // phase 3 $usages = $typeUsage->getTypeUsages(); $optimizer = new PiBX_CodeGen_ASTOptimizer($typeList, $typeUsage); $typeList = $optimizer->optimize(); // phase 4 $b = new PiBX_Binding_Creator(); foreach ($typeList as &$type) { $type->accept($b); } $this->assertEquals(file_get_contents($bindingFile), $b->getXml()); // phase 5 $generator = new PiBX_CodeGen_ClassGenerator(); $generator->enableTypeChecks(); foreach ($typeList as &$type) { $type->accept($generator); } $classes = $generator->getClasses(); $this->assertEquals(2, count($classes)); $this->assertEquals(file_get_contents($collectionFile), "<?php\n" . $classes['Collection']); $this->assertEquals(file_get_contents($bookTypeFile), "<?php\n" . $classes['BookType']); }
public function testBooksExampleXSD() { $data = file_get_contents(dirname(__FILE__) . '/../_files/Books/books.xsd'); $expectedTypeList = array(); $expectedType1 = new PiBX_AST_Type('Collection'); $expectedType1->setAsRoot(); $expectedType1->setAttributeCount(1); $expectedType1->setNamespaces(array('xs' => 'http://www.w3.org/2001/XMLSchema')); $ta = new PiBX_AST_TypeAttribute('books'); $c = new PiBX_AST_Collection(); $ci = new PiBX_AST_CollectionItem('book'); $ci->setType('bookType'); $expectedType1->add($ta); $ta->add($c); $c->add($ci); $expectedTypeList[] = $expectedType1; $expectedType2 = new PiBX_AST_Type('bookType'); $expectedType2->setAttributeCount(8); $expectedType2->add(new PiBX_AST_TypeAttribute('name', 'string')); $expectedType2->add(new PiBX_AST_TypeAttribute('ISBN', 'long')); $expectedType2->add(new PiBX_AST_TypeAttribute('price', 'string')); $ta = new PiBX_AST_TypeAttribute('authors'); $c = new PiBX_AST_Collection(); $ci = new PiBX_AST_CollectionItem('authorName', 'string'); $c->add($ci); $ta->add($c); $expectedType2->add($ta); $expectedType2->add(new PiBX_AST_TypeAttribute('description', 'string')); $ta = new PiBX_AST_TypeAttribute('promotion'); $s = new PiBX_AST_Structure(); $s->setStructureType(PiBX_AST_StructureType::CHOICE()); $s->add(new PiBX_AST_StructureElement('Discount', 'string')); $s->add(new PiBX_AST_StructureElement('None', 'string')); $ta->add($s); $expectedType2->add($ta); $expectedType2->add(new PiBX_AST_TypeAttribute('publicationDate', 'date')); $ta = new PiBX_AST_TypeAttribute('bookCategory'); $e = new PiBX_AST_Enumeration(); $e->add(new PiBX_AST_EnumerationValue('magazine', 'string')); $e->add($ev = new PiBX_AST_EnumerationValue('novel', 'string')); $e->add($ev = new PiBX_AST_EnumerationValue('fiction', 'string')); $e->add($ev = new PiBX_AST_EnumerationValue('other', 'string')); $ta->add($e); $expectedType2->add($ta); $ta = new PiBX_AST_TypeAttribute('itemId', 'string'); $ta->setStyle('attribute'); $expectedType2->add($ta); $expectedTypeList[] = $expectedType2; $enumeration = new PiBX_AST_Enumeration(); $enumeration->add(new PiBX_AST_EnumerationValue('magazine', 'string')); $enumeration->add(new PiBX_AST_EnumerationValue('novel', 'string')); $enumeration->add(new PiBX_AST_EnumerationValue('fiction', 'string')); $enumeration->add(new PiBX_AST_EnumerationValue('other', 'string')); $expectedType3 = new PiBX_AST_Type('bookCategoryType'); $expectedType3->add($enumeration); $expectedTypeList[] = $expectedType3; $schema = simplexml_load_string($data); $parser = new PiBX_CodeGen_SchemaParser(); $parser->setSchema($schema); $tree = $parser->parse(); $creator = new PiBX_CodeGen_ASTCreator(new PiBX_CodeGen_TypeUsage()); $tree->accept($creator); $typeList = $creator->getTypeList(); $this->assertEquals(3, count($typeList)); $this->assertEquals($expectedType1, $typeList[0]); $this->assertEquals($expectedType2, $typeList[1]); $this->assertEquals($expectedType3, $typeList[2]); }