blob: 85780ccde7d1002b64b7ed82a15e5dfddfa1106a [file] [log] [blame]
// Copyright 2019 CUE Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package gocode
import (
"bytes"
"flag"
"io/ioutil"
"os"
"path/filepath"
"regexp"
"testing"
"github.com/kylelemons/godebug/diff"
"cuelang.org/go/cue"
"cuelang.org/go/cue/errors"
"cuelang.org/go/cue/load"
)
var update = flag.Bool("update", false, "update test files")
func TestGenerate(t *testing.T) {
dirs, err := ioutil.ReadDir("testdata")
if err != nil {
t.Fatal(err)
}
cwd, err := os.Getwd()
if err != nil {
t.Fatal(err)
}
for _, d := range dirs {
if !d.IsDir() {
continue
}
t.Run(d.Name(), func(t *testing.T) {
dir := filepath.Join(cwd, "testdata")
pkg := "." + string(filepath.Separator) + d.Name()
inst := cue.Build(load.Instances([]string{pkg}, &load.Config{
Dir: dir,
ModuleRoot: dir,
Module: "cuelang.org/go/encoding/gocode/testdata",
}))[0]
if err := inst.Err; err != nil {
t.Fatal(err)
}
goPkg := "./testdata/" + d.Name()
b, err := Generate(goPkg, inst, nil)
if err != nil {
t.Fatal(errStr(err))
}
goFile := filepath.Join("testdata", d.Name(), "cue_gen.go")
if *update {
_ = ioutil.WriteFile(goFile, b, 0644)
return
}
want, err := ioutil.ReadFile(goFile)
if err != nil {
t.Fatal(err)
}
if d := diff.Diff(string(want), string(b)); d != "" {
t.Errorf("files differ:\n%v", d)
}
})
}
}
func errStr(err error) string {
if err == nil {
return "nil"
}
buf := &bytes.Buffer{}
errors.Print(buf, err, nil)
r := regexp.MustCompile(`.cue:\d+:\d+`)
return r.ReplaceAllString(buf.String(), ".cue:x:x")
}