Browse Source

Stub the tree builder properly

split-manual
J. King 3 years ago
parent
commit
bb4002abcb
  1. 34
      tests/cases/TestTreeConstructor.php

34
tests/cases/TestTreeConstructor.php

@ -2,11 +2,18 @@
declare(strict_types=1);
namespace dW\HTML5\TestCase;
use dW\HTML5\Data;
use dW\HTML5\Document;
use dW\HTML5\EOFToken;
use dW\HTML5\OpenElementsStack;
use dW\HTML5\ParseError;
use dW\HTML5\Parser;
use dW\HTML5\TemplateInsertionModesStack;
use dW\HTML5\Tokenizer;
use dW\HTML5\TreeBuilder;
/**
* @covers \dW\HTML5\TreeBuilder
* @covers \dW\HTML5\Parser
*/
class TestTreeConstructor extends \PHPUnit\Framework\TestCase {
protected const NS = [
@ -25,7 +32,30 @@ class TestTreeConstructor extends \PHPUnit\Framework\TestCase {
} elseif ($fragment) {
$this->markTestSkipped("Fragment tests still to be implemented");
}
$doc = Parser::parse($data);
// convert parse error constants into standard symbols in specification
$errorMap = array_map(function($str) {
return strtolower(str_replace("_", "-", $str));
}, array_flip(array_filter((new \ReflectionClass(ParseError::class))->getConstants(), function($v) {
return is_int($v);
})));
// create a stub error handler which collects parse errors
$errors = [];
$errorHandler = $this->createStub(ParseError::class);
$errorHandler->method("emit")->willReturnCallback(function($file, $line, $col, $code) use (&$errors, $errorMap) {
$errors[] = ['code' => $errorMap[$code], 'line' => $line, 'col' => $col];
return true;
});
// initialize the classes we need
$decoder = new Data($data, "STDIN", $errorHandler);
$stack = new OpenElementsStack;
$tokenizer = new Tokenizer($decoder, $stack, $errorHandler);
$doc = new Document;
$treeBuilder = new TreeBuilder($doc, null, false, null, $stack, new TemplateInsertionModesStack, $tokenizer, $errorHandler, $decoder);
// run the tree builder
do {
$token = $tokenizer->createToken();
$treeBuilder->emitToken($token);
} while (!$token instanceof EOFToken);
$act = $this->serializeTree($doc);
$this->assertEquals($exp, $act);
// TODO: evaluate errors

Loading…
Cancel
Save