summaryrefslogtreecommitdiff
path: root/tests/unit/ParserTest.php
diff options
context:
space:
mode:
Diffstat (limited to 'tests/unit/ParserTest.php')
-rw-r--r--tests/unit/ParserTest.php176
1 files changed, 176 insertions, 0 deletions
diff --git a/tests/unit/ParserTest.php b/tests/unit/ParserTest.php
new file mode 100644
index 0000000..0a5ccb8
--- /dev/null
+++ b/tests/unit/ParserTest.php
@@ -0,0 +1,176 @@
+<?php
+
+
+namespace tests\unit;
+
+use PHPUnit\Framework\TestCase;
+use kch42\ste\Parser;
+use kch42\ste\TextNode;
+use kch42\ste\VariableNode;
+use kch42\ste\TagNode;
+
+class ParserTest extends TestCase
+{
+ /**
+ * @dataProvider successfulParsingDataProvider
+ */
+ public function testSuccessfulParsing(string $source, array $expected)
+ {
+ $actual = Parser::parse($source, '-');
+
+ self::assertEquals($expected, $actual);
+ }
+
+ public function successfulParsingDataProvider()
+ {
+ return [
+ ['', []],
+
+ ['Hello', [
+ new TextNode('-', 0, 'Hello'),
+ ]],
+
+ ['$foo', [
+ new VariableNode('-', 0, 'foo', []),
+ ]],
+
+ //01234567890
+ ['foo$bar$baz', [
+ new TextNode('-', 0, 'foo'),
+ new VariableNode('-', 3, 'bar', []),
+ new VariableNode('-', 7, 'baz', []),
+ ]],
+
+ //012345678
+ ['${foo}bar', [
+ new VariableNode('-', 0, 'foo', []),
+ new TextNode('-', 6, 'bar'),
+ ]],
+
+ //012345678
+ ['$foo[bar]', [
+ new VariableNode('-', 0, 'foo', [
+ [new TextNode('-', 5, 'bar')],
+ ]),
+ ]],
+
+ //01234567890
+ ['${foo[bar]}', [
+ new VariableNode('-', 0, 'foo', [
+ [new TextNode('-', 6, 'bar')],
+ ]),
+ ]],
+
+ //012345678
+ ['$foo[$bar]', [
+ new VariableNode('-', 0, 'foo', [
+ [new VariableNode('-', 5, 'bar', [])],
+ ]),
+ ]],
+
+ //012345678901234
+ ['$foo[$bar[baz]]', [
+ new VariableNode('-', 0, 'foo', [
+ [new VariableNode('-', 5, 'bar', [
+ [new TextNode('-', 10, 'baz')],
+ ])],
+ ]),
+ ]],
+
+ //012345678901234
+ ['$foo[$bar][baz]', [
+ new VariableNode('-', 0, 'foo', [
+ [new VariableNode('-', 5, 'bar', [])],
+ [new TextNode('-', 11, 'baz')]
+ ]),
+ ]],
+
+ //0123456789012345678901
+ ['a${b[c$d[e${f}g]][h]}i', [
+ new TextNode('-', 0, 'a'),
+ new VariableNode('-', 1, 'b', [
+ [
+ new TextNode('-', 5, 'c'),
+ new VariableNode('-', 6, 'd', [
+ [
+ new TextNode('-', 9, 'e'),
+ new VariableNode('-', 10, 'f', []),
+ new TextNode('-', 14, 'g')
+ ]
+ ])
+ ],
+ [new TextNode('-', 18, 'h')],
+ ]),
+ new TextNode('-', 21, 'i'),
+ ]],
+
+ ['<ste:foo />', [
+ new TagNode('-', 0, 'foo'),
+ ]],
+
+ ['<ste:foo></ste:foo>', [
+ new TagNode('-', 0, 'foo'),
+ ]],
+
+ //0123456789012345678901
+ ['<ste:foo>bar</ste:foo>', [
+ new TagNode('-', 0, 'foo', [], [
+ new TextNode('-', 9, 'bar'),
+ ]),
+ ]],
+
+ //0 1 2 3 4 5 6 7 8 9 0
+ //012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
+ ['<ste:foo a="$b[0][$x]" c="\"" d="${e}f"><ste:foo><ste:xyz>abc</ste:xyz><ste:foo />$x</ste:foo></ste:foo>x', [
+ new TagNode('-', 0, 'foo', [
+ 'a' => [
+ new VariableNode('-', 12, 'b', [
+ [new TextNode('-', 15, '0')],
+ [new VariableNode('-', 18, 'x', [])],
+ ]),
+ ],
+ 'c' => [
+ new TextNode('-', 26, '"'),
+ ],
+ 'd' => [
+ new VariableNode('-', 33, 'e', []),
+ new TextNode('-', 37, 'f'),
+ ]
+ ], [
+ new TagNode('-', 40, 'foo', [], [
+ new TagNode('-', 49, 'xyz', [], [
+ new TextNode('-', 58, 'abc'),
+ ]),
+ new TagNode('-', 71, 'foo'),
+ new VariableNode('-', 82, 'x', []),
+ ]),
+ ]),
+ new TextNode('-', 104, 'x'),
+ ]],
+
+ //0 1 2 3
+ //01234567890123456789012345678901234567
+ ['foo?{~{$x|eq|\}$y}|b|<ste:foo/>\}}$bar', [
+ new TextNode('-', 0, 'foo'),
+ new TagNode('-', 3, 'if', [], [
+ new TagNode('-', 5, 'cmp', [
+ 'text_a' => [new VariableNode('-', 7, 'x', [])],
+ 'op' => [new TextNode('-', 10, 'eq')],
+ 'text_b' => [
+ new TextNode('-', 13, '}'),
+ new VariableNode('-', 15, 'y', []),
+ ],
+ ], []),
+ new TagNode('-', 3, 'then', [], [
+ new TextNode('-', 19, 'b'),
+ ]),
+ new TagNode('-', 3, 'else', [], [
+ new TagNode('-', 21, 'foo'),
+ new TextNode('-', 31, '}'),
+ ]),
+ ]),
+ new VariableNode('-', 34, 'bar', []),
+ ]],
+ ];
+ }
+}