internal/regtest/bench: add benchmark tests for gopls

Change-Id: Ic25fdfde6a7236eee488299e24d8fe440fffc4ac
Reviewed-on: https://go-review.googlesource.com/c/tools/+/450555
gopls-CI: kokoro <noreply+kokoro@google.com>
Reviewed-by: Robert Findley <rfindley@google.com>
Run-TryBot: Dylan Le <dungtuanle@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
diff --git a/gopls/internal/regtest/bench/editor_features_test.go b/gopls/internal/regtest/bench/editor_features_test.go
new file mode 100644
index 0000000..92df344
--- /dev/null
+++ b/gopls/internal/regtest/bench/editor_features_test.go
@@ -0,0 +1,55 @@
+// Copyright 2022 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 bench
+
+import (
+	"fmt"
+	"testing"
+)
+
+func BenchmarkGoToDefinition(b *testing.B) {
+	env := benchmarkEnv(b)
+
+	env.OpenFile("internal/imports/mod.go")
+	pos := env.RegexpSearch("internal/imports/mod.go", "ModuleJSON")
+	env.GoToDefinition("internal/imports/mod.go", pos)
+	env.Await(env.DoneWithOpen())
+
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		env.GoToDefinition("internal/imports/mod.go", pos)
+	}
+}
+
+func BenchmarkFindAllReferences(b *testing.B) {
+	env := benchmarkEnv(b)
+
+	env.OpenFile("internal/imports/mod.go")
+	pos := env.RegexpSearch("internal/imports/mod.go", "gopathwalk")
+	env.References("internal/imports/mod.go", pos)
+	env.Await(env.DoneWithOpen())
+
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		env.References("internal/imports/mod.go", pos)
+	}
+}
+
+func BenchmarkRename(b *testing.B) {
+	env := benchmarkEnv(b)
+
+	env.OpenFile("internal/imports/mod.go")
+	env.Await(env.DoneWithOpen())
+
+	b.ResetTimer()
+
+	for i := 0; i < b.N; i++ {
+		pos := env.RegexpSearch("internal/imports/mod.go", "gopathwalk")
+		newName := fmt.Sprintf("%s%d", "gopathwalk", i)
+		env.Rename("internal/imports/mod.go", pos, newName)
+	}
+}