1 | // Copyright 2019 The Go Authors. All rights reserved. |
---|---|
2 | // Use of this source code is governed by a BSD-style |
3 | // license that can be found in the LICENSE file. |
4 | |
5 | // Package difftest supplies a set of tests that will operate on any |
6 | // implementation of a diff algorithm as exposed by |
7 | // "golang.org/x/tools/internal/diff" |
8 | package difftest_test |
9 | |
10 | import ( |
11 | "fmt" |
12 | "io/ioutil" |
13 | "os" |
14 | "os/exec" |
15 | "strings" |
16 | "testing" |
17 | |
18 | "golang.org/x/tools/internal/diff/difftest" |
19 | "golang.org/x/tools/internal/testenv" |
20 | ) |
21 | |
22 | func TestVerifyUnified(t *testing.T) { |
23 | testenv.NeedsTool(t, "diff") |
24 | for _, test := range difftest.TestCases { |
25 | t.Run(test.Name, func(t *testing.T) { |
26 | if test.NoDiff { |
27 | t.Skip("diff tool produces expected different results") |
28 | } |
29 | diff, err := getDiffOutput(test.In, test.Out) |
30 | if err != nil { |
31 | t.Fatal(err) |
32 | } |
33 | if len(diff) > 0 { |
34 | diff = difftest.UnifiedPrefix + diff |
35 | } |
36 | if diff != test.Unified { |
37 | t.Errorf("unified:\n%s\ndiff -u:\n%s", test.Unified, diff) |
38 | } |
39 | }) |
40 | } |
41 | } |
42 | |
43 | func getDiffOutput(a, b string) (string, error) { |
44 | fileA, err := ioutil.TempFile("", "myers.in") |
45 | if err != nil { |
46 | return "", err |
47 | } |
48 | defer os.Remove(fileA.Name()) |
49 | if _, err := fileA.Write([]byte(a)); err != nil { |
50 | return "", err |
51 | } |
52 | if err := fileA.Close(); err != nil { |
53 | return "", err |
54 | } |
55 | fileB, err := ioutil.TempFile("", "myers.in") |
56 | if err != nil { |
57 | return "", err |
58 | } |
59 | defer os.Remove(fileB.Name()) |
60 | if _, err := fileB.Write([]byte(b)); err != nil { |
61 | return "", err |
62 | } |
63 | if err := fileB.Close(); err != nil { |
64 | return "", err |
65 | } |
66 | cmd := exec.Command("diff", "-u", fileA.Name(), fileB.Name()) |
67 | cmd.Env = append(cmd.Env, "LANG=en_US.UTF-8") |
68 | out, err := cmd.CombinedOutput() |
69 | if err != nil { |
70 | if _, ok := err.(*exec.ExitError); !ok { |
71 | return "", fmt.Errorf("failed to run diff -u %v %v: %v\n%v", fileA.Name(), fileB.Name(), err, string(out)) |
72 | } |
73 | } |
74 | diff := string(out) |
75 | if len(diff) <= 0 { |
76 | return diff, nil |
77 | } |
78 | bits := strings.SplitN(diff, "\n", 3) |
79 | if len(bits) != 3 { |
80 | return "", fmt.Errorf("diff output did not have file prefix:\n%s", diff) |
81 | } |
82 | return bits[2], nil |
83 | } |
84 |
Members