Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201105173854-bc9fc8d8c4bc / internal / lsp / diff / difftest / difftest_test.go
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/lsp/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/lsp/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                         t.Helper()
27                         if test.NoDiff {
28                                 t.Skip("diff tool produces expected different results")
29                         }
30                         diff, err := getDiffOutput(test.In, test.Out)
31                         if err != nil {
32                                 t.Fatal(err)
33                         }
34                         if len(diff) > 0 {
35                                 diff = difftest.UnifiedPrefix + diff
36                         }
37                         if diff != test.Unified {
38                                 t.Errorf("unified:\n%q\ndiff -u:\n%q", test.Unified, diff)
39                         }
40                 })
41         }
42 }
43
44 func getDiffOutput(a, b string) (string, error) {
45         fileA, err := ioutil.TempFile("", "myers.in")
46         if err != nil {
47                 return "", err
48         }
49         defer os.Remove(fileA.Name())
50         if _, err := fileA.Write([]byte(a)); err != nil {
51                 return "", err
52         }
53         if err := fileA.Close(); err != nil {
54                 return "", err
55         }
56         fileB, err := ioutil.TempFile("", "myers.in")
57         if err != nil {
58                 return "", err
59         }
60         defer os.Remove(fileB.Name())
61         if _, err := fileB.Write([]byte(b)); err != nil {
62                 return "", err
63         }
64         if err := fileB.Close(); err != nil {
65                 return "", err
66         }
67         cmd := exec.Command("diff", "-u", fileA.Name(), fileB.Name())
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 }