1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
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")
}
}
})
}
}
|