--- /dev/null
+# Testing
+
+LSP has "marker tests" defined in `internal/lsp/testdata`, as well as
+traditional tests.
+
+## Marker tests
+
+Marker tests have a standard input file, like
+`internal/lsp/testdata/foo/bar.go`, and some may have a corresponding golden
+file, like `internal/lsp/testdata/foo/bar.go.golden`. The former is the "input"
+and the latter is the expected output.
+
+Each input file contains annotations like
+`//@suggestedfix("}", "refactor.rewrite")`. These annotations are interpreted by
+test runners to perform certain actions. The expected output after those actions
+is encoded in the golden file.
+
+When tests are run, each annotation results in a new subtest, which is encoded
+in the golden file with a heading like,
+
+```bash
+-- suggestedfix_bar_11_21 --
+// expected contents go here
+-- suggestedfix_bar_13_20 --
+// expected contents go here
+```
+
+The format of these headings vary: they are defined by the
+[`Golden`](https://pkg.go.dev/golang.org/x/tools/internal/lsp/tests#Data.Golden)
+function for each annotation. In the case above, the format is: annotation
+name, file name, annotation line location, annotation character location.
+
+So, if `internal/lsp/testdata/foo/bar.go` has three `suggestedfix` annotations,
+the golden file should have three headers with `suggestedfix_bar_xx_yy`
+headings.
+
+To see a list of all available annotations, see the exported "expectations" in
+[tests.go](https://github.com/golang/tools/blob/299f270db45902e93469b1152fafed034bb3f033/internal/lsp/tests/tests.go#L418-L447).
+
+To run marker tests,
+
+```bash
+cd /path/to/tools
+
+# The marker tests are located in "internal/lsp", "internal/lsp/cmd, and
+# "internal/lsp/source".
+go test ./internal/lsp/...
+```
+
+There are quite a lot of marker tests, so to run one individually, pass the test
+path and heading into a -run argument:
+
+```bash
+cd /path/to/tools
+go test ./internal/lsp -v -run TestLSP/Modules/SuggestedFix/bar_11_21
+```
+
+## Resetting marker tests
+
+Sometimes, a change is made to lsp that requires a change to multiple golden
+files. When this happens, you can run,
+
+```bash
+cd /path/to/tools
+./internal/lsp/reset_golden.sh
+```