| // Copyright 2023 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 main |
| |
| import ( |
| "context" |
| "flag" |
| "os" |
| "path/filepath" |
| "testing" |
| |
| "github.com/google/go-cmp/cmp" |
| ) |
| |
| var ( |
| update = flag.Bool("update", false, "update test goldens") |
| keep = flag.Bool("keep", false, "do not remove generated files") |
| ) |
| |
| func TestGeneration(t *testing.T) { |
| ctx := context.Background() |
| entries, err := os.ReadDir("testdata") |
| if err != nil { |
| t.Fatal(err) |
| } |
| for _, e := range entries { |
| if e.IsDir() { |
| t.Run(e.Name(), func(t *testing.T) { |
| dir := filepath.Join("testdata", e.Name()) |
| configFile := filepath.Join(dir, "config.yaml") |
| goldenFile := filepath.Join(dir, "golden") |
| outFile := filepath.Join(dir, e.Name()+"_veneer.gen.go") |
| if *keep { |
| t.Logf("keeping %s", outFile) |
| } else { |
| defer os.Remove(outFile) |
| } |
| if err := run(ctx, configFile, dir, dir); err != nil { |
| t.Fatal(err) |
| } |
| if *update { |
| if err := os.Remove(goldenFile); err != nil { |
| t.Fatal(err) |
| } |
| if err := os.Rename(outFile, goldenFile); err != nil { |
| t.Fatal(err) |
| } |
| t.Logf("updated golden") |
| } else { |
| if diff := diffFiles(goldenFile, outFile); diff != "" { |
| t.Errorf("diff (-want, +got):\n%s", diff) |
| } |
| } |
| }) |
| } |
| } |
| } |
| |
| func diffFiles(wantFile, gotFile string) string { |
| want, err := os.ReadFile(wantFile) |
| if err != nil { |
| return err.Error() |
| } |
| got, err := os.ReadFile(gotFile) |
| if err != nil { |
| return err.Error() |
| } |
| return cmp.Diff(string(want), string(got)) |
| } |
| |
| func TestCamelToUpperSnakeCase(t *testing.T) { |
| for _, test := range []struct { |
| in, want string |
| }{ |
| {"foo", "FOO"}, |
| {"fooBar", "FOO_BAR"}, |
| {"aBC", "A_B_C"}, |
| {"ABC", "A_B_C"}, |
| } { |
| got := camelToUpperSnakeCase(test.in) |
| if got != test.want { |
| t.Errorf("%q: got %q, want %q", test.in, got, test.want) |
| } |
| } |
| } |
| |
| func TestAdjustDoc(t *testing.T) { |
| const protoName = "PName" |
| const veneerName = "VName" |
| for i, test := range []struct { |
| origDoc string |
| verb string |
| newDoc string |
| want string |
| }{ |
| { |
| origDoc: "", |
| verb: "foo", |
| newDoc: "", |
| want: "", |
| }, |
| { |
| origDoc: "", |
| verb: "", |
| newDoc: "is new doc.", |
| want: "VName is new doc.", |
| }, |
| { |
| origDoc: "The harm category is dangerous content.", |
| verb: "means", |
| want: "VName means the harm category is dangerous content.", |
| }, |
| { |
| origDoc: "URI for the file.", |
| verb: "is the", |
| want: "VName is the URI for the file.", |
| }, |
| { |
| origDoc: "PName is a thing.", |
| newDoc: "contains something else.", |
| want: "VName contains something else.", |
| }, |
| { |
| origDoc: "PName is a thing.", |
| verb: "ignored", |
| want: "VName is a thing.", |
| }, |
| } { |
| got := adjustDoc(test.origDoc, protoName, veneerName, test.verb, test.newDoc) |
| if got != test.want { |
| t.Errorf("#%d: got %q, want %q", i, got, test.want) |
| } |
| } |
| } |