The Go Programming Language

Source file src/pkg/ebnf/ebnf_test.go

     1	// Copyright 2009 The Go Authors. All rights reserved.
     2	// Use of this source code is governed by a BSD-style
     3	// license that can be found in the LICENSE file.
     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	// TODO(gri) add some test files
    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	}

release.r60.3. Except as noted, this content is licensed under a Creative Commons Attribution 3.0 License.