aboutsummaryrefslogtreecommitdiff
path: root/compiler/ast_test.go
diff options
context:
space:
mode:
authorRyo Nihei <nihei.dev@gmail.com>2021-02-17 01:32:46 +0900
committerRyo Nihei <nihei.dev@gmail.com>2021-02-17 01:32:46 +0900
commitc99ad4391d7e0c458eaf5e276ffa839efcaa13c0 (patch)
treee1af83a66dcc6ae594789be3eca77ff32e28fa1d /compiler/ast_test.go
parentAdd logging to lex command (diff)
downloadtre-c99ad4391d7e0c458eaf5e276ffa839efcaa13c0.tar.gz
tre-c99ad4391d7e0c458eaf5e276ffa839efcaa13c0.tar.xz
Fix computation of last positions
Diffstat (limited to 'compiler/ast_test.go')
-rw-r--r--compiler/ast_test.go119
1 files changed, 119 insertions, 0 deletions
diff --git a/compiler/ast_test.go b/compiler/ast_test.go
new file mode 100644
index 0000000..61d6064
--- /dev/null
+++ b/compiler/ast_test.go
@@ -0,0 +1,119 @@
+package compiler
+
+import (
+ "fmt"
+ "testing"
+)
+
+func TestASTNode(t *testing.T) {
+ tests := []struct {
+ root astNode
+ nullable bool
+ first symbolPositionSet
+ last symbolPositionSet
+ }{
+ {
+ root: newSymbolNode(nil, 0, 1),
+ nullable: false,
+ first: newSymbolPositionSet().add(1),
+ last: newSymbolPositionSet().add(1),
+ },
+ {
+ root: newEndMarkerNode(1, 1),
+ nullable: false,
+ first: newSymbolPositionSet().add(1),
+ last: newSymbolPositionSet().add(1),
+ },
+ {
+ root: newConcatNode(
+ newSymbolNode(nil, 0, 1),
+ newSymbolNode(nil, 0, 2),
+ ),
+ nullable: false,
+ first: newSymbolPositionSet().add(1),
+ last: newSymbolPositionSet().add(2),
+ },
+ {
+ root: newConcatNode(
+ newRepeatNode(newSymbolNode(nil, 0, 1)),
+ newSymbolNode(nil, 0, 2),
+ ),
+ nullable: false,
+ first: newSymbolPositionSet().add(1).add(2),
+ last: newSymbolPositionSet().add(2),
+ },
+ {
+ root: newConcatNode(
+ newSymbolNode(nil, 0, 1),
+ newRepeatNode(newSymbolNode(nil, 0, 2)),
+ ),
+ nullable: false,
+ first: newSymbolPositionSet().add(1),
+ last: newSymbolPositionSet().add(1).add(2),
+ },
+ {
+ root: newConcatNode(
+ newRepeatNode(newSymbolNode(nil, 0, 1)),
+ newRepeatNode(newSymbolNode(nil, 0, 2)),
+ ),
+ nullable: true,
+ first: newSymbolPositionSet().add(1).add(2),
+ last: newSymbolPositionSet().add(1).add(2),
+ },
+ {
+ root: newAltNode(
+ newSymbolNode(nil, 0, 1),
+ newSymbolNode(nil, 0, 2),
+ ),
+ nullable: false,
+ first: newSymbolPositionSet().add(1).add(2),
+ last: newSymbolPositionSet().add(1).add(2),
+ },
+ {
+ root: newAltNode(
+ newRepeatNode(newSymbolNode(nil, 0, 1)),
+ newSymbolNode(nil, 0, 2),
+ ),
+ nullable: true,
+ first: newSymbolPositionSet().add(1).add(2),
+ last: newSymbolPositionSet().add(1).add(2),
+ },
+ {
+ root: newAltNode(
+ newSymbolNode(nil, 0, 1),
+ newRepeatNode(newSymbolNode(nil, 0, 2)),
+ ),
+ nullable: true,
+ first: newSymbolPositionSet().add(1).add(2),
+ last: newSymbolPositionSet().add(1).add(2),
+ },
+ {
+ root: newAltNode(
+ newRepeatNode(newSymbolNode(nil, 0, 1)),
+ newRepeatNode(newSymbolNode(nil, 0, 2)),
+ ),
+ nullable: true,
+ first: newSymbolPositionSet().add(1).add(2),
+ last: newSymbolPositionSet().add(1).add(2),
+ },
+ {
+ root: newRepeatNode(newSymbolNode(nil, 0, 1)),
+ nullable: true,
+ first: newSymbolPositionSet().add(1),
+ last: newSymbolPositionSet().add(1),
+ },
+ }
+ for i, tt := range tests {
+ t.Run(fmt.Sprintf("#%v", i), func(t *testing.T) {
+ if tt.root.nullable() != tt.nullable {
+ t.Errorf("unexpected nullable attribute; want: %v, got: %v", tt.nullable, tt.root.nullable())
+ }
+ if tt.first.hash() != tt.root.first().hash() {
+ t.Errorf("unexpected first positions attribute; want: %v, got: %v", tt.first, tt.root.first())
+ }
+ if tt.last.hash() != tt.root.last().hash() {
+ t.Errorf("unexpected last positions attribute; want: %v, got: %v", tt.last, tt.root.last())
+ }
+ })
+ }
+}