| // 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 genai | |
| import ( | |
| "bytes" | |
| "flag" | |
| "path/filepath" | |
| "strings" | |
| "testing" | |
| "github.com/google/go-cmp/cmp" | |
| ) | |
| var update = flag.Bool("update", false, "update the data files based on the examples in data/examples.json") | |
| func TestWriteCheckFiles(t *testing.T) { | |
| tmp := t.TempDir() | |
| es := Examples{ | |
| { | |
| Input: Input{ | |
| Module: "foo", | |
| Description: "a description", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "an issue with foo", | |
| Description: "a description of the issue with foo", | |
| }, | |
| }, | |
| { | |
| Input: Input{ | |
| Module: "bar", | |
| Description: "something about bar", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "bad bar", | |
| Description: "something more about bar containing `backticks` and \"quotes\"", | |
| }, | |
| }, | |
| } | |
| if err := es.WriteFiles(tmp); err != nil { | |
| t.Fatalf("WriteFiles err = %v", err) | |
| } | |
| if err := checkFiles(tmp, 2); err != nil { | |
| t.Fatalf("CheckFiles err = %v", err) | |
| } | |
| wantErr := "fewer than 3 examples" | |
| if err := checkFiles(tmp, 3); err == nil || !strings.Contains(err.Error(), wantErr) { | |
| t.Fatalf("CheckFiles err = %v, want err containing %q", err, wantErr) | |
| } | |
| } | |
| func TestCheckRealFiles(t *testing.T) { | |
| folder := "." | |
| if err := checkFiles(folder, defaultMaxExamples); err != nil { | |
| if *update { | |
| // If the .json file is valid, use it as a source of truth to update | |
| // the other files. | |
| es, err := readFile(filepath.Join(folder, dataFolder, jsonFile)) | |
| if err != nil { | |
| t.Fatalf("could not update files: could not read %q: %v", jsonFile, err) | |
| } | |
| if err := es.WriteFiles(folder); err != nil { | |
| t.Fatalf("could not update files: %v", err) | |
| } | |
| if err := checkFiles(folder, defaultMaxExamples); err != nil { | |
| t.Fatalf("files still invalid after update: %v", err) | |
| } | |
| return | |
| } | |
| t.Fatal(err) | |
| } | |
| } | |
| func TestWriteCSV(t *testing.T) { | |
| tests := []struct { | |
| name string | |
| examples Examples | |
| want string | |
| }{ | |
| { | |
| name: "empty", | |
| examples: Examples{}, | |
| want: "", | |
| }, | |
| { | |
| name: "one example", | |
| examples: Examples{ | |
| { | |
| Input: Input{ | |
| Module: "foo", | |
| Description: "a description", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "an issue with foo", | |
| Description: "a description of the issue with foo", | |
| }, | |
| }, | |
| }, | |
| want: "\"{\"\"Module\"\":\"\"foo\"\",\"\"Description\"\":\"\"a description\"\"}\",\"{\"\"Summary\"\":\"\"an issue with foo\"\",\"\"Description\"\":\"\"a description of the issue with foo\"\"}\"\n", | |
| }, | |
| { | |
| name: "multiple examples", | |
| examples: Examples{ | |
| { | |
| Input: Input{ | |
| Module: "foo", | |
| Description: "a description", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "an issue with foo", | |
| Description: "a description of the issue with foo", | |
| }, | |
| }, | |
| { | |
| Input: Input{ | |
| Module: "bar", | |
| Description: "something about bar", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "bad bar", | |
| Description: "something more about bar containing `backticks` and \"quotes\"", | |
| }, | |
| }, | |
| }, | |
| want: "\"{\"\"Module\"\":\"\"foo\"\",\"\"Description\"\":\"\"a description\"\"}\",\"{\"\"Summary\"\":\"\"an issue with foo\"\",\"\"Description\"\":\"\"a description of the issue with foo\"\"}\"\n\"{\"\"Module\"\":\"\"bar\"\",\"\"Description\"\":\"\"something about bar\"\"}\",\"{\"\"Summary\"\":\"\"bad bar\"\",\"\"Description\"\":\"\"something more about bar containing `backticks` and \\\"\"quotes\\\"\"\"\"}\"\n", | |
| }, | |
| } | |
| for _, test := range tests { | |
| t.Run(test.name, func(t *testing.T) { | |
| w := &bytes.Buffer{} | |
| if err := test.examples.writeCSV(w); err != nil { | |
| t.Fatalf("WriteCSV: %v", err) | |
| } | |
| if got := w.String(); got != test.want { | |
| t.Errorf("WriteCSV: got %q, want %q", got, test.want) | |
| } | |
| }) | |
| } | |
| } | |
| func TestReadWriteJSON(t *testing.T) { | |
| tests := []struct { | |
| name string | |
| examples Examples | |
| jsonString string | |
| }{ | |
| { | |
| name: "empty", | |
| examples: Examples{}, | |
| jsonString: "[]\n", | |
| }, | |
| { | |
| name: "one example", | |
| examples: Examples{ | |
| { | |
| Input: Input{ | |
| Module: "foo", | |
| Description: "a description", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "an issue with foo", | |
| Description: "a description of the issue with foo", | |
| }, | |
| }, | |
| }, | |
| jsonString: "[{\"Input\":{\"Module\":\"foo\",\"Description\":\"a description\"},\"Suggestion\":{\"Summary\":\"an issue with foo\",\"Description\":\"a description of the issue with foo\"}}]\n", | |
| }, | |
| { | |
| name: "multiple examples", | |
| examples: Examples{ | |
| { | |
| Input: Input{ | |
| Module: "foo", | |
| Description: "a description", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "an issue with foo", | |
| Description: "a description of the issue with foo", | |
| }, | |
| }, | |
| { | |
| Input: Input{ | |
| Module: "bar", | |
| Description: "something about bar", | |
| }, | |
| Suggestion: Suggestion{ | |
| Summary: "bad bar", | |
| Description: "something more about bar containing `backticks` and \"quotes\"", | |
| }, | |
| }, | |
| }, | |
| jsonString: "[{\"Input\":{\"Module\":\"foo\",\"Description\":\"a description\"},\"Suggestion\":{\"Summary\":\"an issue with foo\",\"Description\":\"a description of the issue with foo\"}},{\"Input\":{\"Module\":\"bar\",\"Description\":\"something about bar\"},\"Suggestion\":{\"Summary\":\"bad bar\",\"Description\":\"something more about bar containing `backticks` and \\\"quotes\\\"\"}}]\n", | |
| }, | |
| } | |
| for _, test := range tests { | |
| t.Run(test.name, func(t *testing.T) { | |
| w := &bytes.Buffer{} | |
| if err := test.examples.writeJSON(w); err != nil { | |
| t.Fatalf("WriteJSON: %v", err) | |
| } | |
| if got := w.String(); got != test.jsonString { | |
| t.Errorf("WriteJSON: got %q, want %q", got, test.jsonString) | |
| } | |
| r := strings.NewReader(test.jsonString) | |
| var got Examples | |
| if err := got.ReadJSON(r); err != nil { | |
| t.Fatalf("ReadJSON() %v", err) | |
| } | |
| if diff := cmp.Diff(test.examples, got); diff != "" { | |
| t.Errorf("ReadJSON() unexpected diff (-want,+got):\n%s", diff) | |
| } | |
| }) | |
| } | |
| } |