| // Copyright 2009 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package ebnf | |
| import ( | |
| "go/token" | |
| "io/ioutil" | |
| "testing" | |
| ) | |
| var fset = token.NewFileSet() | |
| var goodGrammars = []string{ | |
| `Program = .`, | |
| `Program = foo . | |
| foo = "foo" .`, | |
| `Program = "a" | "b" "c" .`, | |
| `Program = "a" … "z" .`, | |
| `Program = Song . | |
| Song = { Note } . | |
| Note = Do | (Re | Mi | Fa | So | La) | Ti . | |
| Do = "c" . | |
| Re = "d" . | |
| Mi = "e" . | |
| Fa = "f" . | |
| So = "g" . | |
| La = "a" . | |
| Ti = ti . | |
| ti = "b" .`, | |
| } | |
| var badGrammars = []string{ | |
| `Program = | .`, | |
| `Program = | b .`, | |
| `Program = a … b .`, | |
| `Program = "a" … .`, | |
| `Program = … "b" .`, | |
| `Program = () .`, | |
| `Program = [] .`, | |
| `Program = {} .`, | |
| } | |
| func checkGood(t *testing.T, filename string, src []byte) { | |
| grammar, err := Parse(fset, filename, src) | |
| if err != nil { | |
| t.Errorf("Parse(%s) failed: %v", src, err) | |
| } | |
| if err = Verify(fset, grammar, "Program"); err != nil { | |
| t.Errorf("Verify(%s) failed: %v", src, err) | |
| } | |
| } | |
| func checkBad(t *testing.T, filename string, src []byte) { | |
| _, err := Parse(fset, filename, src) | |
| if err == nil { | |
| t.Errorf("Parse(%s) should have failed", src) | |
| } | |
| } | |
| func TestGrammars(t *testing.T) { | |
| for _, src := range goodGrammars { | |
| checkGood(t, "", []byte(src)) | |
| } | |
| for _, src := range badGrammars { | |
| checkBad(t, "", []byte(src)) | |
| } | |
| } | |
| var files = []string{ | |
| // TODO(gri) add some test files | |
| } | |
| func TestFiles(t *testing.T) { | |
| for _, filename := range files { | |
| src, err := ioutil.ReadFile(filename) | |
| if err != nil { | |
| t.Fatal(err) | |
| } | |
| checkGood(t, filename, src) | |
| } | |
| } |