github.com/jd-ly/tools@v0.5.7/internal/lsp/diff/difftest/difftest_test.go (about) 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 // "github.com/jd-ly/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 "github.com/jd-ly/tools/internal/lsp/diff/difftest" 19 "github.com/jd-ly/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 cmd.Env = append(cmd.Env, "LANG=en_US.UTF-8") 69 out, err := cmd.CombinedOutput() 70 if err != nil { 71 if _, ok := err.(*exec.ExitError); !ok { 72 return "", fmt.Errorf("failed to run diff -u %v %v: %v\n%v", fileA.Name(), fileB.Name(), err, string(out)) 73 } 74 } 75 diff := string(out) 76 if len(diff) <= 0 { 77 return diff, nil 78 } 79 bits := strings.SplitN(diff, "\n", 3) 80 if len(bits) != 3 { 81 return "", fmt.Errorf("diff output did not have file prefix:\n%s", diff) 82 } 83 return bits[2], nil 84 }