1
0
mirror of https://github.com/golang/go synced 2024-11-05 22:26:10 -07:00
go/internal/lsp/fake/editor_test.go
Rob Findley 4c83a7e07a internal/lsp/fake: add regexp search and replace
Expressing regtests in terms of textual coordinates is hard to read: the
reader ends up counting lines and characters to understand the text edit
or assertion.

To address, this, add two new functions for fake.Editor: RegexpSearch
and RegexpReplace, as well as a symmetric RegexpSearch function for
workspace files and wrappers for regtext.Env.

This allows expressing edits as well as buffer locations in terms of
easily scannable regexps.

An alternative solution to this problem is to integrate markers ala
packagestest. I tried this, but it ended up being cumbersome to
implement and less usable than regexps, due to the static nature of
markers: after the buffer has been edited all markers must be
updated.

Updates golang/go#36879

Change-Id: Iad087cf0d529737034197beef7b729816a159c69
Reviewed-on: https://go-review.googlesource.com/c/tools/+/224757
Run-TryBot: Robert Findley <rfindley@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Heschi Kreinick <heschi@google.com>
2020-03-24 20:17:55 +00:00

83 lines
1.6 KiB
Go

// Copyright 2020 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package fake
import (
"context"
"testing"
)
func TestContentPosition(t *testing.T) {
content := "foo\n😀\nbar"
tests := []struct {
offset, wantLine, wantColumn int
}{
{0, 0, 0},
{3, 0, 3},
{4, 1, 0},
{5, 1, 1},
{6, 2, 0},
}
for _, test := range tests {
pos, err := contentPosition(content, test.offset)
if err != nil {
t.Fatal(err)
}
if pos.Line != test.wantLine {
t.Errorf("contentPosition(%q, %d): Line = %d, want %d", content, test.offset, pos.Line, test.wantLine)
}
if pos.Column != test.wantColumn {
t.Errorf("contentPosition(%q, %d): Column = %d, want %d", content, test.offset, pos.Column, test.wantColumn)
}
}
}
const exampleProgram = `
-- go.mod --
go 1.12
-- main.go --
package main
import "fmt"
func main() {
fmt.Println("Hello World.")
}
`
func TestClientEditing(t *testing.T) {
ws, err := NewWorkspace("TestClientEditing", []byte(exampleProgram))
if err != nil {
t.Fatal(err)
}
defer ws.Close()
ctx := context.Background()
editor := NewEditor(ws)
if err := editor.OpenFile(ctx, "main.go"); err != nil {
t.Fatal(err)
}
if err := editor.EditBuffer(ctx, "main.go", []Edit{
{
Start: Pos{5, 14},
End: Pos{5, 26},
Text: "Hola, mundo.",
},
}); err != nil {
t.Fatal(err)
}
got := editor.buffers["main.go"].text()
want := `package main
import "fmt"
func main() {
fmt.Println("Hola, mundo.")
}
`
if got != want {
t.Errorf("got text %q, want %q", got, want)
}
}