1
2
3
4
5 package ebnf
6
7 import (
8 "go/token"
9 "io/ioutil"
10 "testing"
11 )
12
13 var fset = token.NewFileSet()
14
15 var goodGrammars = []string{
16 `Program = .`,
17
18 `Program = foo .
19 foo = "foo" .`,
20
21 `Program = "a" | "b" "c" .`,
22
23 `Program = "a" … "z" .`,
24
25 `Program = Song .
26 Song = { Note } .
27 Note = Do | (Re | Mi | Fa | So | La) | Ti .
28 Do = "c" .
29 Re = "d" .
30 Mi = "e" .
31 Fa = "f" .
32 So = "g" .
33 La = "a" .
34 Ti = ti .
35 ti = "b" .`,
36 }
37
38 var badGrammars = []string{
39 `Program = | .`,
40 `Program = | b .`,
41 `Program = a … b .`,
42 `Program = "a" … .`,
43 `Program = … "b" .`,
44 `Program = () .`,
45 `Program = [] .`,
46 `Program = {} .`,
47 }
48
49 func checkGood(t *testing.T, filename string, src []byte) {
50 grammar, err := Parse(fset, filename, src)
51 if err != nil {
52 t.Errorf("Parse(%s) failed: %v", src, err)
53 }
54 if err = Verify(fset, grammar, "Program"); err != nil {
55 t.Errorf("Verify(%s) failed: %v", src, err)
56 }
57 }
58
59 func checkBad(t *testing.T, filename string, src []byte) {
60 _, err := Parse(fset, filename, src)
61 if err == nil {
62 t.Errorf("Parse(%s) should have failed", src)
63 }
64 }
65
66 func TestGrammars(t *testing.T) {
67 for _, src := range goodGrammars {
68 checkGood(t, "", []byte(src))
69 }
70 for _, src := range badGrammars {
71 checkBad(t, "", []byte(src))
72 }
73 }
74
75 var files = []string{
76
77 }
78
79 func TestFiles(t *testing.T) {
80 for _, filename := range files {
81 src, err := ioutil.ReadFile(filename)
82 if err != nil {
83 t.Fatal(err)
84 }
85 checkGood(t, filename, src)
86 }
87 }