// Copyright 2019 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 difftest supplies a set of tests that will operate on any // implementation of a diff algorithm as exposed by // "golang.org/x/tools/internal/lsp/diff" package difftest_test import ( "fmt" "io/ioutil" "os" "os/exec" "strings" "testing" "golang.org/x/tools/internal/lsp/diff/difftest" "golang.org/x/tools/internal/testenv" ) func TestVerifyUnified(t *testing.T) { testenv.NeedsTool(t, "diff") for _, test := range difftest.TestCases { t.Run(test.Name, func(t *testing.T) { t.Helper() if test.NoDiff { t.Skip("diff tool produces expected different results") } diff, err := getDiffOutput(test.In, test.Out) if err != nil { t.Fatal(err) } if len(diff) > 0 { diff = difftest.UnifiedPrefix + diff } if diff != test.Unified { t.Errorf("unified:\n%q\ndiff -u:\n%q", test.Unified, diff) } }) } } func getDiffOutput(a, b string) (string, error) { fileA, err := ioutil.TempFile("", "myers.in") if err != nil { return "", err } defer os.Remove(fileA.Name()) if _, err := fileA.Write([]byte(a)); err != nil { return "", err } if err := fileA.Close(); err != nil { return "", err } fileB, err := ioutil.TempFile("", "myers.in") if err != nil { return "", err } defer os.Remove(fileB.Name()) if _, err := fileB.Write([]byte(b)); err != nil { return "", err } if err := fileB.Close(); err != nil { return "", err } cmd := exec.Command("diff", "-u", fileA.Name(), fileB.Name()) out, err := cmd.CombinedOutput() if err != nil { if _, ok := err.(*exec.ExitError); !ok { return "", fmt.Errorf("failed to run diff -u %v %v: %v\n%v", fileA.Name(), fileB.Name(), err, string(out)) } } diff := string(out) if len(diff) <= 0 { return diff, nil } bits := strings.SplitN(diff, "\n", 3) if len(bits) != 3 { return "", fmt.Errorf("diff output did not have file prefix:\n%s", diff) } return bits[2], nil }