aboutsummaryrefslogtreecommitdiff
path: root/compiler/compiler_test.go
blob: 2534d9f994c2f8bd72d33a2e5c41675850fb662b (plain) (blame)
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
104
105
106
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: `
{
    "name": "test",
    "entries": [
        {
            "kind": "a2z",
            "pattern": "\\f{a2z}"
        },
        {
            "fragment": true,
            "kind": "a2z",
            "pattern": "[a-z]"
        }
    ]
}
`,
		},
		{
			Caption: "don't allow duplicates names in non-fragments",
			Spec: `
{
    "name": "test",
    "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: `
{
    "name": "test",
    "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: %v", err)
				}
				if clspec == nil {
					t.Fatalf("Compile function must return a compiled specification")
				}
			}
		})
	}
}