...
1
2
3
4
5
6
7
8 package difftest_test
9
10 import (
11 "fmt"
12 "os"
13 "os/exec"
14 "strings"
15 "testing"
16
17 "golang.org/x/tools/internal/diff/difftest"
18 "golang.org/x/tools/internal/testenv"
19 )
20
21 func TestVerifyUnified(t *testing.T) {
22 testenv.NeedsTool(t, "diff")
23 for _, test := range difftest.TestCases {
24 t.Run(test.Name, func(t *testing.T) {
25 if test.NoDiff {
26 t.Skip("diff tool produces expected different results")
27 }
28 diff, err := getDiffOutput(test.In, test.Out)
29 if err != nil {
30 t.Fatal(err)
31 }
32 if len(diff) > 0 {
33 diff = difftest.UnifiedPrefix + diff
34 }
35 if diff != test.Unified {
36 t.Errorf("unified:\n%s\ndiff -u:\n%s", test.Unified, diff)
37 }
38 })
39 }
40 }
41
42 func getDiffOutput(a, b string) (string, error) {
43 fileA, err := os.CreateTemp("", "myers.in")
44 if err != nil {
45 return "", err
46 }
47 defer os.Remove(fileA.Name())
48 if _, err := fileA.Write([]byte(a)); err != nil {
49 return "", err
50 }
51 if err := fileA.Close(); err != nil {
52 return "", err
53 }
54 fileB, err := os.CreateTemp("", "myers.in")
55 if err != nil {
56 return "", err
57 }
58 defer os.Remove(fileB.Name())
59 if _, err := fileB.Write([]byte(b)); err != nil {
60 return "", err
61 }
62 if err := fileB.Close(); err != nil {
63 return "", err
64 }
65 cmd := exec.Command("diff", "-u", fileA.Name(), fileB.Name())
66 cmd.Env = append(cmd.Env, "LANG=en_US.UTF-8")
67 out, err := cmd.Output()
68 if err != nil {
69 exit, ok := err.(*exec.ExitError)
70 if !ok {
71 return "", fmt.Errorf("can't exec %s: %v", cmd, err)
72 }
73 if len(out) == 0 {
74
75 return "", fmt.Errorf("%s failed: %v; stderr:\n%s", cmd, err, exit.Stderr)
76 }
77
78 }
79 diff := string(out)
80 if len(diff) <= 0 {
81 return diff, nil
82 }
83 bits := strings.SplitN(diff, "\n", 3)
84 if len(bits) != 3 {
85 return "", fmt.Errorf("diff output did not have file prefix:\n%s", diff)
86 }
87 return bits[2], nil
88 }
89
View as plain text