github.com/cockroachdb/tools@v0.0.0-20230222021103-a6d27438930d/internal/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  // "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  }