public function testExampleTypeInfo() { $context = new Context\ProductContext(); $descriptor = $context->getContextDescriptor(); $this->assertEquals(['product' => new Util\TypeInfoMember('product', ['uuf6429\\Rune\\example\\Model\\Product']), 'String' => new Util\TypeInfoMember('String', ['uuf6429\\Rune\\example\\Model\\StringUtils'])], $descriptor->getVariableTypeInfo(), 'Assert variable type information'); $this->assertEquals([], $descriptor->getFunctionTypeInfo(), 'Assert function type information'); $this->assertEquals(['uuf6429\\Rune\\example\\Context\\ProductContext' => new Util\TypeInfoClass('uuf6429\\Rune\\example\\Context\\ProductContext', ['product' => new Util\TypeInfoMember('product', ['uuf6429\\Rune\\example\\Model\\Product']), 'getContextDescriptor' => new Util\TypeInfoMember('getContextDescriptor', ['method'], '<div class="cm-signature"><span class="type"></span> <span class="name">getContextDescriptor</span>(<span class="args"></span>)</span></div>'), 'String' => new Util\TypeInfoMember('String', ['uuf6429\\Rune\\example\\Model\\StringUtils'], '')]), 'uuf6429\\Rune\\example\\Model\\Product' => new Util\TypeInfoClass('uuf6429\\Rune\\example\\Model\\Product', ['id' => new Util\TypeInfoMember('id', ['integer']), 'name' => new Util\TypeInfoMember('name', ['string']), 'colour' => new Util\TypeInfoMember('colour', ['string']), 'category' => new Util\TypeInfoMember('category', ['uuf6429\\Rune\\example\\Model\\Category'])]), 'uuf6429\\Rune\\example\\Model\\Category' => new Util\TypeInfoClass('uuf6429\\Rune\\example\\Model\\Category', ['id' => new Util\TypeInfoMember('id', ['integer']), 'name' => new Util\TypeInfoMember('name', ['string']), 'in' => new Util\TypeInfoMember('in', ['method'], '<div class="cm-signature"><span class="type">bool</span> <span class="name">in</span>(<span class="args"><span class="arg" title=""><span class="type">string </span>$name</span></span>)</span></div>Returns true if category name or any of its parents are identical to $name.'), 'parent' => new Util\TypeInfoMember('parent', ['uuf6429\\Rune\\example\\Model\\Category'])]), 'uuf6429\\Rune\\example\\Model\\StringUtils' => new Util\TypeInfoClass('uuf6429\\Rune\\example\\Model\\StringUtils', ['lower' => new Util\TypeInfoMember('lower', ['method'], '<div class="cm-signature"><span class="type">string</span> <span class="name">lower</span>(<span class="args"><span class="arg" title=""><span class="type">string </span>$text</span></span>)</span></div>Lowercases some text.'), 'upper' => new Util\TypeInfoMember('upper', ['method'], '<div class="cm-signature"><span class="type">string</span> <span class="name">upper</span>(<span class="args"><span class="arg" title=""><span class="type">string </span>$text</span></span>)</span></div>Uppercases some text.')])], $descriptor->getDetailedTypeInfo(), 'Assert detailed type information'); }
return new Rune\Rule\GenericRule($index + 1, $data[0], $data[1]); }, array_keys($data['rules']), $data['rules']); $categories = []; $categoryProvider = function ($id) use(&$categories) { return $id ? $categories[$id - 1] : null; }; $categories = array_map(function ($index, $data) use($categoryProvider) { return new Model\Category($index + 1, $data[0], $data[1], $categoryProvider); }, array_keys($data['categories']), $data['categories']); $products = array_map(function ($index, $data) use($categoryProvider) { return new Model\Product($index + 1, $data[0], $data[1], $data[2], $categoryProvider); }, array_keys($data['products']), $data['products']); $exceptionHandler = new Rune\Exception\ExceptionCollectorHandler(); $engine = new Rune\Engine($exceptionHandler); $action = new Action\PrintAction(); $context = new Context\ProductContext(); $descriptor = $context->getContextDescriptor(); // Provide code compiled from rule conditions $output_generated = ''; $eval = new Rune\Util\SymfonyEvaluator(); $maxLength = 0; foreach ($rules as $rule) { $maxLength = max($maxLength, strlen($rule->getName())); } foreach ($rules as $rule) { try { $eval->setFunctions($descriptor->getFunctions()); $eval->setVariables($descriptor->getVariables()); $code = $eval->compile($rule->getCondition()); } catch (\Exception $ex) { $code = 'Compile Error (' . get_class($ex) . '): ' . $ex->getMessage();