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  }