-
Notifications
You must be signed in to change notification settings - Fork 38
/
main_test.go
95 lines (88 loc) · 2.06 KB
/
main_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package main
import (
"fmt"
"os"
"os/exec"
"strings"
"testing"
)
const (
jdFlags = "JD_FLAGS"
)
func TestMain(t *testing.T) {
if flags := os.Getenv(jdFlags); flags != "" {
args := strings.Split(flags, " ")
os.Args = append([]string{os.Args[0]}, args...)
main()
}
testCases := []struct {
name string
files map[string]string
args []string
exitCode int
out string
outFile string
}{{
name: "no diff",
files: map[string]string{
"a.json": `{"foo":"bar"}`,
"b.json": `{"foo":"bar"}`,
},
args: []string{"a.json", "b.json"},
out: "",
exitCode: 0,
}, {
name: "diff",
files: map[string]string{
"a.json": `{"foo":"bar"}`,
"b.json": `{"foo":"baz"}`,
},
args: []string{"a.json", "b.json"},
out: s(
`@ ["foo"]`,
`- "bar"`,
`+ "baz"`,
),
exitCode: 1,
}}
testName := t.Name()
for _, tc := range testCases {
t.Run(tc.name, func(t *testing.T) {
temp, err := os.MkdirTemp("", testName)
if err != nil {
t.Fatalf("error creating temp directory: %v", err)
}
defer func() {
os.RemoveAll(temp)
}()
files := map[string]struct{}{}
for filename, content := range tc.files {
files[filename] = struct{}{}
err := os.WriteFile(fmt.Sprintf("%v%v%v", temp, os.PathSeparator, filename), []byte(content), 0666)
if err != nil {
t.Fatalf("error writing temp file: %v", err)
}
}
args := make([]string, len(tc.args))
for i, arg := range tc.args {
if _, isFile := files[arg]; isFile {
args[i] = fmt.Sprintf("%v%v%v", temp, os.PathSeparator, arg)
} else {
args[i] = arg
}
}
cmd := exec.Command(os.Args[0], "-test.run", testName)
cmd.Env = append(os.Environ(), jdFlags+"="+strings.Join(args, " "))
out, _ := cmd.CombinedOutput()
if string(out) != tc.out {
t.Errorf("wanted out %q. got %q", tc.out, string(out))
}
if exitCode := cmd.ProcessState.ExitCode(); exitCode != tc.exitCode {
t.Errorf("wanted exit code %v. got %v", tc.exitCode, exitCode)
}
})
}
}
func s(s ...string) string {
return strings.Join(s, "\n") + "\n"
}