|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"bytes"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path/filepath"
|
|
|
|
"strconv"
|
|
|
|
"strings"
|
|
|
|
"testing"
|
|
|
|
)
|
|
|
|
|
|
|
|
func runParseTest(t *testing.T, basepath, inpath, outpath string) {
|
|
|
|
in, err := os.Open(inpath)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("unable to open input file %s: %s", inpath, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
defer in.Close()
|
|
|
|
|
|
|
|
expected, err := ioutil.ReadFile(outpath)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("unable to read expected output for %s: %s", outpath, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
r_inpath := filepath.Base(inpath)
|
|
|
|
n, err := strconv.ParseInt(strings.TrimSuffix(r_inpath, ".in"), 0, 64)
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("unable to get test number for path %s: %s", inpath, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var buf bytes.Buffer
|
|
|
|
root, err := parse(in)
|
|
|
|
if err != nil {
|
|
|
|
t.Logf("test %d: in: %s out: %s", n, inpath, outpath)
|
|
|
|
t.Errorf("parse error in test %d: %s", n, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
if err := root.pretty(&buf, ""); err != nil {
|
|
|
|
t.Logf("test %d: in: %s out: %s", n, inpath, outpath)
|
|
|
|
t.Errorf("output error in test %d: %s", n, err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if !bytes.Equal(buf.Bytes(), expected) {
|
|
|
|
t.Logf("test %d: in: %s out: %s", n, inpath, outpath)
|
|
|
|
t.Errorf("lex output does not match expected result for test %d", n)
|
|
|
|
t.Logf("expected output:\n%s", expected)
|
|
|
|
t.Logf("received output:\n%s", buf.Bytes())
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParse(t *testing.T) {
|
|
|
|
files, err := filepath.Glob("tests/parse/*.in")
|
|
|
|
if err != nil {
|
|
|
|
t.Errorf("unable to find test files: %s", err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
for _, fname := range files {
|
|
|
|
runParseTest(t, "tests/parse/", fname, strings.Replace(fname, "in", "out", -1))
|
|
|
|
}
|
|
|
|
}
|