Files
dolt/nomdl/codegen/codegen_test.go

119 lines
3.6 KiB
Go

package main
import (
"bytes"
"io/ioutil"
"os"
"path/filepath"
"testing"
"github.com/attic-labs/noms/chunks"
"github.com/attic-labs/noms/d"
"github.com/attic-labs/noms/datas"
"github.com/attic-labs/noms/dataset"
"github.com/attic-labs/noms/nomdl/codegen/code"
"github.com/attic-labs/noms/nomdl/pkg"
"github.com/attic-labs/noms/ref"
"github.com/attic-labs/noms/types"
"github.com/stretchr/testify/assert"
)
func assertOutput(inPath, goldenPath string, t *testing.T) {
assert := assert.New(t)
emptyDS := datas.NewDataStore(chunks.NewMemoryStore()) // Will be DataStore containing imports
depsDir, err := ioutil.TempDir("", "")
assert.NoError(err)
defer os.RemoveAll(depsDir)
inFile, err := os.Open(inPath)
assert.NoError(err)
defer inFile.Close()
goldenFile, err := os.Open(goldenPath)
assert.NoError(err)
defer goldenFile.Close()
goldenBytes, err := ioutil.ReadAll(goldenFile)
d.Chk.NoError(err)
var buf bytes.Buffer
pkg := pkg.ParseNomDL("gen", inFile, filepath.Dir(inPath), emptyDS)
written := map[string]bool{}
gen := newCodeGen(&buf, getBareFileName(inPath), written, depsMap{}, pkg)
gen.WritePackage()
bs := buf.Bytes()
assert.Equal(string(goldenBytes), string(bs), "%s did not generate the same string", inPath)
}
func TestGeneratedFiles(t *testing.T) {
files, err := filepath.Glob("test/*.noms")
d.Chk.NoError(err)
assert.NotEmpty(t, files)
for _, n := range files {
_, file := filepath.Split(n)
if file == "struct_with_imports.noms" {
// We are not writing deps in this test so lookup by ref does not work.
continue
}
if file == "struct_with_list.noms" || file == "struct_with_dup_list.noms" {
// These two files race to write ListOfNumber
continue
}
assertOutput(n, filepath.Join("test", "gen", file+".js"), t)
}
}
func TestSkipDuplicateTypes(t *testing.T) {
assert := assert.New(t)
dir, err := ioutil.TempDir("", "codegen_test_")
assert.NoError(err)
defer os.RemoveAll(dir)
leaf1 := types.NewPackage([]*types.Type{
types.MakeStructType("S1", []types.Field{
types.Field{"f", types.MakeListType(types.NumberType), false},
types.Field{"e", types.MakeType(ref.Ref{}, 0), false},
}, []types.Field{}),
}, []ref.Ref{})
leaf2 := types.NewPackage([]*types.Type{
types.MakeStructType("S2", []types.Field{
types.Field{"f", types.MakeListType(types.NumberType), false},
}, []types.Field{}),
}, []ref.Ref{})
written := map[string]bool{}
tag1 := code.ToTag(leaf1.Ref())
leaf1Path := filepath.Join(dir, tag1+".js")
generateAndEmit(tag1, leaf1Path, written, depsMap{}, pkg.Parsed{Package: leaf1, Name: "p"})
tag2 := code.ToTag(leaf2.Ref())
leaf2Path := filepath.Join(dir, tag2+".js")
generateAndEmit(tag2, leaf2Path, written, depsMap{}, pkg.Parsed{Package: leaf2, Name: "p"})
code, err := ioutil.ReadFile(leaf2Path)
assert.NoError(err)
assert.NotContains(string(code), "type ListOfNumber")
}
func TestCommitNewPackages(t *testing.T) {
assert := assert.New(t)
ds := datas.NewDataStore(chunks.NewMemoryStore())
pkgDS := dataset.NewDataset(ds, "packages")
dir, err := ioutil.TempDir("", "")
assert.NoError(err)
defer os.RemoveAll(dir)
inFile := filepath.Join(dir, "in.noms")
err = ioutil.WriteFile(inFile, []byte("struct Simple{a:Bool}"), 0600)
assert.NoError(err)
p := parsePackageFile("name", inFile, pkgDS)
localPkgs := refSet{p.Ref(): true}
pkgDS = generate("name", inFile, filepath.Join(dir, "out.js"), dir, map[string]bool{}, p, localPkgs, pkgDS)
s := pkgDS.Head().Get(datas.ValueField).(types.Set)
assert.EqualValues(1, s.Len())
tr := s.First().(types.Ref).TargetValue(ds).(types.Package).Types()[0]
assert.EqualValues(types.StructKind, tr.Kind())
}