diff options
author | Ryo Nihei <nihei.dev@gmail.com> | 2021-05-27 22:14:53 +0900 |
---|---|---|
committer | Ryo Nihei <nihei.dev@gmail.com> | 2021-05-27 22:14:53 +0900 |
commit | e6bd501a9d6a33f5b0b5c67cb4b4af76cb4c5572 (patch) | |
tree | f123dd54095ee8f6b7f7544ca71780ec3549ae8d /compiler/compiler_test.go | |
parent | Add fragment expression (diff) | |
download | tre-e6bd501a9d6a33f5b0b5c67cb4b4af76cb4c5572.tar.gz tre-e6bd501a9d6a33f5b0b5c67cb4b4af76cb4c5572.tar.xz |
Allow duplicate names between fragments and non-fragments
Diffstat (limited to 'compiler/compiler_test.go')
-rw-r--r-- | compiler/compiler_test.go | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/compiler/compiler_test.go b/compiler/compiler_test.go new file mode 100644 index 0000000..c76bb24 --- /dev/null +++ b/compiler/compiler_test.go @@ -0,0 +1,103 @@ +package compiler + +import ( + "encoding/json" + "fmt" + "testing" + + "github.com/nihei9/maleeni/spec" +) + +func TestCompile(t *testing.T) { + tests := []struct { + Caption string + Spec string + Err bool + }{ + { + Caption: "allow duplicates names between fragments and non-fragments", + Spec: ` +{ + "entries": [ + { + "kind": "a2z", + "pattern": "\\f{a2z}" + }, + { + "fragment": true, + "kind": "a2z", + "pattern": "[a-z]" + } + ] +} +`, + }, + { + Caption: "don't allow duplicates names in non-fragments", + Spec: ` +{ + "entries": [ + { + "kind": "a2z", + "pattern": "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z" + }, + { + "kind": "a2z", + "pattern": "[a-z]" + } + ] +} +`, + Err: true, + }, + { + Caption: "don't allow duplicates names in fragments", + Spec: ` +{ + "entries": [ + { + "kind": "a2z", + "pattern": "\\f{a2z}" + }, + { + "fragments": true, + "kind": "a2z", + "pattern": "a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z" + }, + { + "fragments": true, + "kind": "a2z", + "pattern": "[a-z]" + } + ] +} +`, + Err: true, + }, + } + for i, tt := range tests { + t.Run(fmt.Sprintf("#%v %s", i, tt.Caption), func(t *testing.T) { + lspec := &spec.LexSpec{} + err := json.Unmarshal([]byte(tt.Spec), lspec) + if err != nil { + t.Fatalf("%v", err) + } + clspec, err := Compile(lspec) + if tt.Err { + if err == nil { + t.Fatalf("expected an error") + } + if clspec != nil { + t.Fatalf("Compile function mustn't return a compiled specification") + } + } else { + if err != nil { + t.Fatalf("unexpected error") + } + if clspec == nil { + t.Fatalf("Compile function must return a compiled specification") + } + } + }) + } +} |