internal/lsp: change the unified diff tests to be less fragile

Change-Id: Ifd9dd5684c8467442cb551a72b4d35ae6faed599
Reviewed-on: https://go-review.googlesource.com/c/tools/+/197158
Run-TryBot: Ian Cottrell <iancottrell@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Rebecca Stambler <rstambler@golang.org>
This commit is contained in:
Ian Cottrell 2019-09-23 22:50:50 -04:00
parent 7b81e57de2
commit 030b2cf115
14 changed files with 89 additions and 455 deletions

View File

@ -5,6 +5,9 @@
package cmdtest
import (
"bytes"
"io/ioutil"
"os"
"os/exec"
"regexp"
"strings"
@ -15,37 +18,33 @@ import (
"golang.org/x/tools/internal/tool"
)
var formatModes = [][]string{
[]string{},
[]string{"-d"},
}
func (r *runner) Format(t *testing.T, spn span.Span) {
for _, mode := range formatModes {
tag := "gofmt" + strings.Join(mode, "")
uri := spn.URI()
filename := uri.Filename()
args := append(mode, filename)
expect := string(r.data.Golden(tag, filename, func() ([]byte, error) {
cmd := exec.Command("gofmt", args...)
contents, _ := cmd.Output() // ignore error, sometimes we have intentionally ungofmt-able files
contents = []byte(normalizePaths(r.data, fixFileHeader(string(contents))))
return contents, nil
}))
if expect == "" {
//TODO: our error handling differs, for now just skip unformattable files
continue
}
app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env)
got := CaptureStdOut(t, func() {
_ = tool.Run(r.ctx, app, append([]string{"-remote=internal", "format"}, args...))
})
got = normalizePaths(r.data, got)
// check the first two lines are the expected file header
if expect != got {
t.Errorf("format failed with %#v expected:\n%s\ngot:\n%s", args, expect, got)
}
tag := "gofmt"
uri := spn.URI()
filename := uri.Filename()
expect := string(r.data.Golden(tag, filename, func() ([]byte, error) {
cmd := exec.Command("gofmt", filename)
contents, _ := cmd.Output() // ignore error, sometimes we have intentionally ungofmt-able files
contents = []byte(normalizePaths(r.data, fixFileHeader(string(contents))))
return contents, nil
}))
if expect == "" {
//TODO: our error handling differs, for now just skip unformattable files
t.Skip("Unformattable file")
}
app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env)
got := CaptureStdOut(t, func() {
_ = tool.Run(r.ctx, app, append([]string{"-remote=internal", "format"}, filename))
})
got = normalizePaths(r.data, got)
if expect != got {
t.Errorf("format failed for %s expected:\n%s\ngot:\n%s", filename, expect, got)
}
// now check we can build a valid unified diff
unified := CaptureStdOut(t, func() {
_ = tool.Run(r.ctx, app, append([]string{"-remote=internal", "format", "-d"}, filename))
})
checkUnified(t, filename, expect, unified)
}
var unifiedHeader = regexp.MustCompile(`^diff -u.*\n(---\s+\S+\.go\.orig)\s+[\d-:. ]+(\n\+\+\+\s+\S+\.go)\s+[\d-:. ]+(\n@@)`)
@ -57,3 +56,40 @@ func fixFileHeader(s string) string {
}
return strings.Join(append(match[1:], s[len(match[0]):]), "")
}
func checkUnified(t *testing.T, filename string, expect string, patch string) {
if testing.Short() {
t.Skip("running patch is expensive")
}
if strings.Count(patch, "\n+++ ") > 1 {
// TODO(golang/go/#34580)
t.Skip("multi-file patch tests not supported yet")
}
applied := ""
if patch == "" {
applied = expect
} else {
temp, err := ioutil.TempFile("", "applied")
if err != nil {
t.Fatal(err)
}
temp.Close()
defer os.Remove(temp.Name())
cmd := exec.Command("patch", "-u", "-p0", "-o", temp.Name(), filename)
cmd.Stdin = bytes.NewBuffer([]byte(patch))
msg, err := cmd.CombinedOutput()
if err != nil {
t.Errorf("failed applying patch to %s: %v\ngot:\n%s\npatch:\n%s", filename, err, msg, patch)
return
}
out, err := ioutil.ReadFile(temp.Name())
if err != nil {
t.Errorf("failed reading patched output for %s: %v\n", filename, err)
return
}
applied = string(out)
}
if expect != applied {
t.Errorf("apply unified gave wrong result for %s expected:\n%s\ngot:\n%s\npatch:\n%s", filename, expect, applied, patch)
}
}

View File

@ -6,7 +6,6 @@ package cmdtest
import (
"fmt"
"strings"
"testing"
"golang.org/x/tools/internal/lsp/cmd"
@ -14,35 +13,28 @@ import (
"golang.org/x/tools/internal/tool"
)
var renameModes = [][]string{
[]string{},
[]string{"-d"},
}
func (r *runner) Rename(t *testing.T, spn span.Span, newText string) {
filename := spn.URI().Filename()
for _, mode := range renameModes {
goldenTag := newText + strings.Join(mode, "") + "-rename"
app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env)
loc := fmt.Sprintf("%v", spn)
args := []string{"-remote=internal", "rename"}
if strings.Join(mode, "") != "" {
args = append(args, strings.Join(mode, ""))
}
args = append(args, loc, newText)
var err error
got := CaptureStdOut(t, func() {
err = tool.Run(r.ctx, app, args)
})
if err != nil {
got = err.Error()
}
got = normalizePaths(r.data, got)
expect := string(r.data.Golden(goldenTag, filename, func() ([]byte, error) {
return []byte(got), nil
}))
if expect != got {
t.Errorf("rename failed with %#v expected:\n%s\ngot:\n%s", args, expect, got)
}
goldenTag := newText + "-rename"
app := cmd.New("gopls-test", r.data.Config.Dir, r.data.Config.Env)
loc := fmt.Sprintf("%v", spn)
var err error
got := CaptureStdOut(t, func() {
err = tool.Run(r.ctx, app, []string{"-remote=internal", "rename", loc, newText})
})
if err != nil {
got = err.Error()
}
got = normalizePaths(r.data, got)
expect := string(r.data.Golden(goldenTag, filename, func() ([]byte, error) {
return []byte(got), nil
}))
if expect != got {
t.Errorf("rename failed with %v %v expected:\n%s\ngot:\n%s", loc, newText, expect, got)
}
// now check we can build a valid unified diff
unified := CaptureStdOut(t, func() {
_ = tool.Run(r.ctx, app, []string{"-remote=internal", "rename", "-d", loc, newText})
})
checkUnified(t, filename, expect, unified)
}

View File

@ -104,6 +104,9 @@ func addEqualLines(h *Hunk, lines []string, start, end int) int {
}
func (u Unified) Format(f fmt.State, r rune) {
if len(u.Hunks) == 0 {
return
}
fmt.Fprintf(f, "--- %s\n", u.From)
fmt.Fprintf(f, "+++ %s\n", u.To)
for _, hunk := range u.Hunks {

View File

@ -19,25 +19,3 @@ func hi() {
log.Printf("")
}
-- gofmt-d --
--- format/bad_format.go.orig
+++ format/bad_format.go
@@ -1,16 +1,13 @@
package format //@format("package")
import (
- "runtime"
"fmt"
"log"
+ "runtime"
)
func hello() {
-
-
-
var x int //@diag("x", "LSP", "x declared but not used")
}

View File

@ -9,5 +9,3 @@ func goodbye() {
log.Printf("byeeeee")
}
-- gofmt-d --

View File

@ -2,12 +2,3 @@
package format //@format("package")
func _() {}
-- gofmt-d --
--- format/newline_format.go.orig
+++ format/newline_format.go
@@ -1,2 +1,2 @@
package format //@format("package")
-func _() {}
\ No newline at end of file
+func _() {}

View File

@ -1,11 +1,3 @@
-- gofmt --
package format //@format("package")
-- gofmt-d --
--- format/one_line.go.orig
+++ format/one_line.go
@@ -1 +1 @@
-package format //@format("package")
\ No newline at end of file
+package format //@format("package")

View File

@ -1,4 +1,2 @@
-- gofmt --
-- gofmt-d --

View File

@ -5,16 +5,3 @@ func _() {
f()
}
-- gofmt-d --
--- noparse_format/parse_format.go.orig
+++ noparse_format/parse_format.go
@@ -1,5 +1,5 @@
package noparse_format //@format("package")
func _() {
-f()
-}
\ No newline at end of file
+ f()
+}

View File

@ -1,23 +1,3 @@
-- GetSum-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -19,13 +19,13 @@
x, y int
}
-func (p *Pos) Sum() int {
+func (p *Pos) GetSum() int {
return p.x + p.y //@rename("x", "myX")
}
func _() {
var p Pos //@rename("p", "pos")
- _ = p.Sum() //@rename("Sum", "GetSum")
+ _ = p.GetSum() //@rename("Sum", "GetSum")
}
func sw() {
-- GetSum-rename --
package a
@ -62,27 +42,6 @@ func sw() {
}
}
-- f2name-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -3,7 +3,7 @@
import (
lg "log"
"fmt" //@rename("fmt", "fmty")
- f2 "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
+ f2name "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
)
func Random() int {
@@ -37,6 +37,6 @@
case string:
lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
default:
- f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
+ f2name.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
}
}
-- f2name-rename --
package a
@ -127,27 +86,6 @@ func sw() {
}
}
-- f2y-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -3,7 +3,7 @@
import (
lg "log"
"fmt" //@rename("fmt", "fmty")
- f2 "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
+ f2y "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
)
func Random() int {
@@ -37,6 +37,6 @@
case string:
lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
default:
- f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
+ f2y.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
}
}
-- f2y-rename --
package a
@ -192,27 +130,6 @@ func sw() {
}
}
-- fmt2-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -3,7 +3,7 @@
import (
lg "log"
"fmt" //@rename("fmt", "fmty")
- f2 "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
+ fmt2 "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
)
func Random() int {
@@ -37,6 +37,6 @@
case string:
lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
default:
- f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
+ fmt2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
}
}
-- fmt2-rename --
package a
@ -257,28 +174,6 @@ func sw() {
}
}
-- fmty-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -2,7 +2,7 @@
import (
lg "log"
- "fmt" //@rename("fmt", "fmty")
+ fmty "fmt" //@rename("fmt", "fmty")
f2 "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
)
@@ -33,7 +33,7 @@
switch y := x.(type) { //@rename("y", "y0")
case int:
- fmt.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
+ fmty.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
case string:
lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
default:
-- fmty-rename --
package a
@ -323,28 +218,6 @@ func sw() {
}
}
-- format-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -2,7 +2,7 @@
import (
lg "log"
- "fmt" //@rename("fmt", "fmty")
+ format "fmt" //@rename("fmt", "fmty")
f2 "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
)
@@ -33,7 +33,7 @@
switch y := x.(type) { //@rename("y", "y0")
case int:
- fmt.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
+ format.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
case string:
lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
default:
-- format-rename --
package a
@ -389,28 +262,6 @@ func sw() {
}
}
-- log-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -1,7 +1,7 @@
package a
import (
- lg "log"
+ "log"
"fmt" //@rename("fmt", "fmty")
f2 "fmt" //@rename("f2", "f2name"),rename("fmt","f2y")
)
@@ -35,7 +35,7 @@
case int:
fmt.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
case string:
- lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
+ log.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
default:
f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
}
-- log-rename --
package a
@ -455,24 +306,6 @@ func sw() {
}
}
-- myX-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -16,11 +16,11 @@
}
type Pos struct {
- x, y int
+ myX, y int
}
func (p *Pos) Sum() int {
- return p.x + p.y //@rename("x", "myX")
+ return p.myX + p.y //@rename("x", "myX")
}
func _() {
-- myX-rename --
package a
@ -517,21 +350,6 @@ func sw() {
}
}
-- pos-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -24,8 +24,8 @@
}
func _() {
- var p Pos //@rename("p", "pos")
- _ = p.Sum() //@rename("Sum", "GetSum")
+ var pos Pos //@rename("p", "pos")
+ _ = pos.Sum() //@rename("Sum", "GetSum")
}
func sw() {
-- pos-rename --
package a
@ -576,27 +394,6 @@ func sw() {
}
}
-- y0-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -31,12 +31,12 @@
func sw() {
var x interface{}
- switch y := x.(type) { //@rename("y", "y0")
+ switch y0 := x.(type) { //@rename("y", "y0")
case int:
- fmt.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
+ fmt.Printf("%d", y0) //@rename("y", "y1"),rename("fmt", "format")
case string:
- lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
+ lg.Printf("%s", y0) //@rename("y", "y2"),rename("lg","log")
default:
- f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
+ f2.Printf("%v", y0) //@rename("y", "y3"),rename("f2","fmt2")
}
}
-- y0-rename --
package a
@ -641,27 +438,6 @@ func sw() {
}
}
-- y1-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -31,12 +31,12 @@
func sw() {
var x interface{}
- switch y := x.(type) { //@rename("y", "y0")
+ switch y1 := x.(type) { //@rename("y", "y0")
case int:
- fmt.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
+ fmt.Printf("%d", y1) //@rename("y", "y1"),rename("fmt", "format")
case string:
- lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
+ lg.Printf("%s", y1) //@rename("y", "y2"),rename("lg","log")
default:
- f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
+ f2.Printf("%v", y1) //@rename("y", "y3"),rename("f2","fmt2")
}
}
-- y1-rename --
package a
@ -706,27 +482,6 @@ func sw() {
}
}
-- y2-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -31,12 +31,12 @@
func sw() {
var x interface{}
- switch y := x.(type) { //@rename("y", "y0")
+ switch y2 := x.(type) { //@rename("y", "y0")
case int:
- fmt.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
+ fmt.Printf("%d", y2) //@rename("y", "y1"),rename("fmt", "format")
case string:
- lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
+ lg.Printf("%s", y2) //@rename("y", "y2"),rename("lg","log")
default:
- f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
+ f2.Printf("%v", y2) //@rename("y", "y3"),rename("f2","fmt2")
}
}
-- y2-rename --
package a
@ -771,27 +526,6 @@ func sw() {
}
}
-- y3-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -31,12 +31,12 @@
func sw() {
var x interface{}
- switch y := x.(type) { //@rename("y", "y0")
+ switch y3 := x.(type) { //@rename("y", "y0")
case int:
- fmt.Printf("%d", y) //@rename("y", "y1"),rename("fmt", "format")
+ fmt.Printf("%d", y3) //@rename("y", "y1"),rename("fmt", "format")
case string:
- lg.Printf("%s", y) //@rename("y", "y2"),rename("lg","log")
+ lg.Printf("%s", y3) //@rename("y", "y2"),rename("lg","log")
default:
- f2.Printf("%v", y) //@rename("y", "y3"),rename("f2","fmt2")
+ f2.Printf("%v", y3) //@rename("y", "y3"),rename("f2","fmt2")
}
}
-- y3-rename --
package a
@ -836,21 +570,6 @@ func sw() {
}
}
-- z-d-rename --
--- rename/a/random.go.orig
+++ rename/a/random.go
@@ -11,8 +11,8 @@
return y
}
-func Random2(y int) int { //@rename("y", "z")
- return y
+func Random2(z int) int { //@rename("y", "z")
+ return z
}
type Pos struct {
-- z-rename --
package a

View File

@ -1,4 +1,2 @@
-- uint-d-rename --
cannot rename builtin "int"
-- uint-rename --
cannot rename builtin "int"

View File

@ -1,4 +1,2 @@
-- rFunc-d-rename --
renaming "sFunc" to "rFunc" not possible because "golang.org/x/tools/internal/lsp/rename/bad" has errors
-- rFunc-rename --
renaming "sFunc" to "rFunc" not possible because "golang.org/x/tools/internal/lsp/rename/bad" has errors

View File

@ -1,14 +1,3 @@
-- bar-d-rename --
--- rename/testy/testy.go.orig
+++ rename/testy/testy.go
@@ -3,5 +3,5 @@
type tt int //@rename("tt", "testyType")
func a() {
- foo := 42 //@rename("foo", "bar")
+ bar := 42 //@rename("foo", "bar")
}
-- bar-rename --
package testy
@ -18,18 +7,6 @@ func a() {
bar := 42 //@rename("foo", "bar")
}
-- testyType-d-rename --
--- rename/testy/testy.go.orig
+++ rename/testy/testy.go
@@ -1,6 +1,6 @@
package testy
-type tt int //@rename("tt", "testyType")
+type testyType int //@rename("tt", "testyType")
func a() {
foo := 42 //@rename("foo", "bar")
-- testyType-rename --
package testy

View File

@ -1,24 +1,3 @@
-- b-d-rename --
--- rename/testy/testy.go.orig
+++ rename/testy/testy.go
@@ -2,6 +2,6 @@
type tt int //@rename("tt", "testyType")
-func a() {
+func b() {
foo := 42 //@rename("foo", "bar")
}
--- rename/testy/testy_test.go.orig
+++ rename/testy/testy_test.go
@@ -4,5 +4,5 @@
func TestSomething(t *testing.T) {
var x int //@rename("x", "testyX")
- a() //@rename("a", "b")
+ b() //@rename("a", "b")
}
-- b-rename --
testy.go:
package testy
@ -39,18 +18,6 @@ func TestSomething(t *testing.T) {
b() //@rename("a", "b")
}
-- testyX-d-rename --
--- rename/testy/testy_test.go.orig
+++ rename/testy/testy_test.go
@@ -3,6 +3,6 @@
import "testing"
func TestSomething(t *testing.T) {
- var x int //@rename("x", "testyX")
+ var testyX int //@rename("x", "testyX")
a() //@rename("a", "b")
}
-- testyX-rename --
package testy