// 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)
	}
}
