# 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", "Fill anonymous struct")`. 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/gopls/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
```
