...

Source file src/golang.org/x/tools/internal/diff/difftest/difftest_test.go

Documentation: golang.org/x/tools/internal/diff/difftest

     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  	"os"
    13  	"os/exec"
    14  	"strings"
    15  	"testing"
    16  
    17  	"golang.org/x/tools/internal/diff/difftest"
    18  	"golang.org/x/tools/internal/testenv"
    19  )
    20  
    21  func TestVerifyUnified(t *testing.T) {
    22  	testenv.NeedsTool(t, "diff")
    23  	for _, test := range difftest.TestCases {
    24  		t.Run(test.Name, func(t *testing.T) {
    25  			if test.NoDiff {
    26  				t.Skip("diff tool produces expected different results")
    27  			}
    28  			diff, err := getDiffOutput(test.In, test.Out)
    29  			if err != nil {
    30  				t.Fatal(err)
    31  			}
    32  			if len(diff) > 0 {
    33  				diff = difftest.UnifiedPrefix + diff
    34  			}
    35  			if diff != test.Unified {
    36  				t.Errorf("unified:\n%s\ndiff -u:\n%s", test.Unified, diff)
    37  			}
    38  		})
    39  	}
    40  }
    41  
    42  func getDiffOutput(a, b string) (string, error) {
    43  	fileA, err := os.CreateTemp("", "myers.in")
    44  	if err != nil {
    45  		return "", err
    46  	}
    47  	defer os.Remove(fileA.Name())
    48  	if _, err := fileA.Write([]byte(a)); err != nil {
    49  		return "", err
    50  	}
    51  	if err := fileA.Close(); err != nil {
    52  		return "", err
    53  	}
    54  	fileB, err := os.CreateTemp("", "myers.in")
    55  	if err != nil {
    56  		return "", err
    57  	}
    58  	defer os.Remove(fileB.Name())
    59  	if _, err := fileB.Write([]byte(b)); err != nil {
    60  		return "", err
    61  	}
    62  	if err := fileB.Close(); err != nil {
    63  		return "", err
    64  	}
    65  	cmd := exec.Command("diff", "-u", fileA.Name(), fileB.Name())
    66  	cmd.Env = append(cmd.Env, "LANG=en_US.UTF-8")
    67  	out, err := cmd.Output()
    68  	if err != nil {
    69  		exit, ok := err.(*exec.ExitError)
    70  		if !ok {
    71  			return "", fmt.Errorf("can't exec %s: %v", cmd, err)
    72  		}
    73  		if len(out) == 0 {
    74  			// Nonzero exit with no output: terminated by signal?
    75  			return "", fmt.Errorf("%s failed: %v; stderr:\n%s", cmd, err, exit.Stderr)
    76  		}
    77  		// nonzero exit + output => files differ
    78  	}
    79  	diff := string(out)
    80  	if len(diff) <= 0 {
    81  		return diff, nil
    82  	}
    83  	bits := strings.SplitN(diff, "\n", 3)
    84  	if len(bits) != 3 {
    85  		return "", fmt.Errorf("diff output did not have file prefix:\n%s", diff)
    86  	}
    87  	return bits[2], nil
    88  }
    89  

View as plain text