示例#1
0
 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();
 }
示例#2
0
 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]);
 }
示例#3
0
 /**
  * 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);
     }
 }
示例#4
0
 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());
 }
示例#5
0
 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']);
 }
示例#6
0
 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();
 }
示例#7
0
 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']);
 }
示例#8
0
 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]);
 }