encoding/openapi: convert CUE to openapi schemas

Change-Id: Iea3369d702f7cb91e49e61153518c04d6845f03c
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/2120
Reviewed-by: Marcel van Lohuizen <mpvl@google.com>
diff --git a/encoding/openapi/openapi_test.go b/encoding/openapi/openapi_test.go
new file mode 100644
index 0000000..504b75a
--- /dev/null
+++ b/encoding/openapi/openapi_test.go
@@ -0,0 +1,80 @@
+// 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 openapi
+
+import (
+	"bytes"
+	"encoding/json"
+	"flag"
+	"io/ioutil"
+	"path/filepath"
+	"testing"
+
+	"cuelang.org/go/cue"
+	"cuelang.org/go/cue/build"
+	"cuelang.org/go/cue/load"
+	"cuelang.org/go/cue/parser"
+	"github.com/kylelemons/godebug/diff"
+)
+
+var update *bool = flag.Bool("update", false, "update the test output")
+
+var config = &load.Config{
+	Context: build.NewContext(build.ParseOptions(parser.ParseComments)),
+}
+
+func TestParseDefinitions(t *testing.T) {
+	defaultConfig := &Config{}
+	resolveRefs := &Config{ExpandReferences: true}
+
+	testCases := []struct {
+		in, out string
+		config  *Config
+	}{{
+		"openapi.cue",
+		"openapi.json",
+		defaultConfig,
+	}, {
+		"openapi.cue",
+		"openapi-norefs.json",
+		resolveRefs,
+	}}
+	for _, tc := range testCases {
+		t.Run(tc.out, func(t *testing.T) {
+			filename := filepath.Join("testdata", filepath.FromSlash(tc.in))
+
+			inst := cue.Build(load.Instances([]string{filename}, config))[0]
+
+			b, err := Gen(inst, tc.config)
+			var out = &bytes.Buffer{}
+			json.Indent(out, b, "", "   ")
+
+			wantFile := filepath.Join("testdata", tc.out)
+			if *update {
+				ioutil.WriteFile(wantFile, out.Bytes(), 0644)
+				return
+			}
+
+			b, err = ioutil.ReadFile(wantFile)
+			if err != nil {
+				t.Fatal(err)
+			}
+
+			if d := diff.Diff(string(b), out.String()); d != "" {
+				t.Errorf("files differ:\n%v", d)
+			}
+		})
+	}
+}