tools: Index | Files

package fake

import ""

Package fake provides fake implementations of a text editor, LSP client plugin, and Sandbox environment for use in tests.

The Editor type provides a high level API for text editor operations (open/modify/save/close a buffer, jump to definition, etc.), and the Client type exposes an LSP client for the editor that can be connected to a language server. By default, the Editor and Client should be compliant with the LSP spec: their intended use is to verify server compliance with the spec in a variety of environment. Possible future enhancements of these types may allow them to misbehave in configurable ways, but that is not their primary use.

The Sandbox type provides a facility for executing tests with a temporary directory, module proxy, and GOPATH.


Package Files

client.go doc.go edit.go editor.go proxy.go sandbox.go workdir.go


var (
    ErrNoMatch       = errors.New("no match")
    ErrUnknownBuffer = errors.New("unknown buffer")

ErrNoMatch is returned if a regexp search fails.

type Client Uses

type Client struct {
    // contains filtered or unexported fields

Client is an adapter that converts an *Editor into an LSP Client. It mosly delegates functionality to hooks that can be configured by tests.

func (*Client) ApplyEdit Uses

func (c *Client) ApplyEdit(ctx context.Context, params *protocol.ApplyWorkspaceEditParams) (*protocol.ApplyWorkspaceEditResponse, error)

ApplyEdit applies edits sent from the server. Note that as of writing gopls doesn't use this feature, so it is untested.

func (*Client) Configuration Uses

func (c *Client) Configuration(_ context.Context, p *protocol.ParamConfiguration) ([]interface{}, error)

func (*Client) Event Uses

func (c *Client) Event(ctx context.Context, event *interface{}) error

func (*Client) LogMessage Uses

func (c *Client) LogMessage(ctx context.Context, params *protocol.LogMessageParams) error

func (*Client) Progress Uses

func (c *Client) Progress(ctx context.Context, params *protocol.ProgressParams) error

func (*Client) PublishDiagnostics Uses

func (c *Client) PublishDiagnostics(ctx context.Context, params *protocol.PublishDiagnosticsParams) error

func (*Client) RegisterCapability Uses

func (c *Client) RegisterCapability(context.Context, *protocol.RegistrationParams) error

func (*Client) ShowMessage Uses

func (c *Client) ShowMessage(ctx context.Context, params *protocol.ShowMessageParams) error

func (*Client) ShowMessageRequest Uses

func (c *Client) ShowMessageRequest(ctx context.Context, params *protocol.ShowMessageRequestParams) (*protocol.MessageActionItem, error)

func (*Client) UnregisterCapability Uses

func (c *Client) UnregisterCapability(context.Context, *protocol.UnregistrationParams) error

func (*Client) WorkDoneProgressCreate Uses

func (c *Client) WorkDoneProgressCreate(ctx context.Context, params *protocol.WorkDoneProgressCreateParams) error

func (*Client) WorkspaceFolders Uses

func (c *Client) WorkspaceFolders(context.Context) ([]protocol.WorkspaceFolder, error)

type ClientHooks Uses

type ClientHooks struct {
    OnLogMessage             func(context.Context, *protocol.LogMessageParams) error
    OnDiagnostics            func(context.Context, *protocol.PublishDiagnosticsParams) error
    OnWorkDoneProgressCreate func(context.Context, *protocol.WorkDoneProgressCreateParams) error
    OnProgress               func(context.Context, *protocol.ProgressParams) error
    OnShowMessage            func(context.Context, *protocol.ShowMessageParams) error
    OnShowMessageRequest     func(context.Context, *protocol.ShowMessageRequestParams) error

ClientHooks are called to handle the corresponding client LSP method.

type Edit Uses

type Edit struct {
    Start, End Pos
    Text       string

Edit represents a single (contiguous) buffer edit.

func NewEdit Uses

func NewEdit(startLine, startColumn, endLine, endColumn int, text string) Edit

NewEdit creates an edit replacing all content between (startLine, startColumn) and (endLine, endColumn) with text.

type Editor Uses

type Editor struct {
    Config EditorConfig

    // Server, client, and sandbox are concurrency safe and written only
    // at construction time, so do not require synchronization.
    Server protocol.Server
    // contains filtered or unexported fields

Editor is a fake editor client. It keeps track of client state and can be used for writing LSP tests.

func NewEditor Uses

func NewEditor(ws *Sandbox, config EditorConfig) *Editor

NewEditor Creates a new Editor.

func (*Editor) ApplyQuickFixes Uses

func (e *Editor) ApplyQuickFixes(ctx context.Context, path string, diagnostics []protocol.Diagnostic) error

ApplyQuickFixes requests and performs the quickfix codeAction.

func (*Editor) BufferText Uses

func (e *Editor) BufferText(name string) string

BufferText returns the content of the buffer with the given name.

func (*Editor) BufferVersion Uses

func (e *Editor) BufferVersion(name string) int

BufferVersion returns the current version of the buffer corresponding to name (or 0 if it is not being edited).

func (*Editor) Client Uses

func (e *Editor) Client() *Client

Client returns the LSP client for this editor.

func (*Editor) Close Uses

func (e *Editor) Close(ctx context.Context) error

Close issues the shutdown and exit sequence an editor should.

func (*Editor) CloseBuffer Uses

func (e *Editor) CloseBuffer(ctx context.Context, path string) error

CloseBuffer removes the current buffer (regardless of whether it is saved).

func (*Editor) CodeAction Uses

func (e *Editor) CodeAction(ctx context.Context, path string) ([]protocol.CodeAction, error)

CodeAction executes a codeAction request on the server.

func (*Editor) CodeLens Uses

func (e *Editor) CodeLens(ctx context.Context, path string) ([]protocol.CodeLens, error)

CodeLens execute a codelens request on the server.

func (*Editor) Connect Uses

func (e *Editor) Connect(ctx context.Context, conn jsonrpc2.Conn, hooks ClientHooks) (*Editor, error)

Connect configures the editor to communicate with an LSP server on conn. It is not concurrency safe, and should be called at most once, before using the editor.

It returns the editor, so that it may be called as follows:

editor, err := NewEditor(s).Connect(ctx, conn)

func (*Editor) CreateBuffer Uses

func (e *Editor) CreateBuffer(ctx context.Context, path, content string) error

CreateBuffer creates a new unsaved buffer corresponding to the workdir path, containing the given textual content.

func (e *Editor) DocumentLink(ctx context.Context, path string) ([]protocol.DocumentLink, error)

func (*Editor) EditBuffer Uses

func (e *Editor) EditBuffer(ctx context.Context, path string, edits []Edit) error

EditBuffer applies the given test edits to the buffer identified by path.

func (*Editor) Exit Uses

func (e *Editor) Exit(ctx context.Context) error

Exit issues the 'exit' LSP notification.

func (*Editor) FormatBuffer Uses

func (e *Editor) FormatBuffer(ctx context.Context, path string) error

FormatBuffer gofmts a Go file.

func (*Editor) GoToDefinition Uses

func (e *Editor) GoToDefinition(ctx context.Context, path string, pos Pos) (string, Pos, error)

GoToDefinition jumps to the definition of the symbol at the given position in an open buffer.

func (*Editor) Hover Uses

func (e *Editor) Hover(ctx context.Context, path string, pos Pos) (*protocol.MarkupContent, Pos, error)

Hover triggers a hover at the given position in an open buffer.

func (*Editor) OpenFile Uses

func (e *Editor) OpenFile(ctx context.Context, path string) error

OpenFile creates a buffer for the given workdir-relative file.

func (*Editor) OpenFileWithContent Uses

func (e *Editor) OpenFileWithContent(ctx context.Context, path, content string) error

OpenFileWithContent creates a buffer for the given workdir-relative file with the given contents.

func (*Editor) OrganizeImports Uses

func (e *Editor) OrganizeImports(ctx context.Context, path string) error

OrganizeImports requests and performs the source.organizeImports codeAction.

func (*Editor) RegexpReplace Uses

func (e *Editor) RegexpReplace(ctx context.Context, path, re, replace string) error

RegexpReplace edits the buffer corresponding to path by replacing the first instance of re, or its first subgroup, with the replace text. See RegexpSearch for more explanation of these two modes. It returns an error if re is invalid, has more than one subgroup, or doesn't match the buffer.

func (*Editor) RegexpSearch Uses

func (e *Editor) RegexpSearch(bufName, re string) (Pos, error)

RegexpSearch returns the position of the first match for re in the buffer bufName. For convenience, RegexpSearch supports the following two modes:

1. If re has no subgroups, return the position of the match for re itself.
2. If re has one subgroup, return the position of the first subgroup.

It returns an error re is invalid, has more than one subgroup, or doesn't match the buffer.

func (*Editor) RunGenerate Uses

func (e *Editor) RunGenerate(ctx context.Context, dir string) error

RunGenerate runs `go generate` non-recursively in the workdir-relative dir path. It does not report any resulting file changes as a watched file change, so must be followed by a call to Workdir.CheckForFileChanges once the generate command has completed.

func (*Editor) SaveBuffer Uses

func (e *Editor) SaveBuffer(ctx context.Context, path string) error

SaveBuffer writes the content of the buffer specified by the given path to the filesystem.

func (*Editor) SaveBufferWithoutActions Uses

func (e *Editor) SaveBufferWithoutActions(ctx context.Context, path string) error

func (*Editor) Shutdown Uses

func (e *Editor) Shutdown(ctx context.Context) error

Shutdown issues the 'shutdown' LSP notification.

func (*Editor) Symbol Uses

func (e *Editor) Symbol(ctx context.Context, query string) ([]SymbolInformation, error)

Symbol performs a workspace symbol search using query

type EditorConfig Uses

type EditorConfig struct {
    Env []string

    // CodeLens is a map defining whether codelens are enabled, keyed by the
    // codeLens command. CodeLens which are not present in this map are left in
    // their default state.
    CodeLens map[string]bool

    // SymbolMatcher is the config associated with the "symbolMatcher" gopls
    // config option.
    SymbolMatcher *string

EditorConfig configures the editor's LSP session. This is similar to source.UserOptions, but we use a separate type here so that we expose only that configuration which we support.

The zero value for EditorConfig should correspond to its defaults.

type FileEvent Uses

type FileEvent struct {
    Path          string
    ProtocolEvent protocol.FileEvent

FileEvent wraps the protocol.FileEvent so that it can be associated with a workdir-relative path.

type Location Uses

type Location struct {
    Path  string
    Range Range

Location is the editor friendly equivalent of protocol.Location

type Pos Uses

type Pos struct {
    Line, Column int

Pos represents a position in a text buffer. Both Line and Column are 0-indexed.

type Proxy Uses

type Proxy struct {
    // contains filtered or unexported fields

Proxy is a file-based module proxy.

func NewProxy Uses

func NewProxy(tmpdir, txt string) (*Proxy, error)

NewProxy creates a new proxy file tree using the txtar-encoded content.

func (*Proxy) GOPROXY Uses

func (p *Proxy) GOPROXY() string

GOPROXY returns the GOPROXY environment variable value for this proxy directory.

type Range Uses

type Range struct {
    Start Pos
    End   Pos

Range corresponds to protocol.Range, but uses the editor friend Pos instead of UTF-16 oriented protocol.Position

type Sandbox Uses

type Sandbox struct {
    Proxy   *Proxy
    Workdir *Workdir
    // contains filtered or unexported fields

Sandbox holds a collection of temporary resources to use for working with Go code in tests.

func NewSandbox Uses

func NewSandbox(name, srctxt, proxytxt string, inGopath bool, withoutWorkspaceFolders bool) (_ *Sandbox, err error)

NewSandbox creates a collection of named temporary resources, with a working directory populated by the txtar-encoded content in srctxt, and a file-based module proxy populated with the txtar-encoded content in proxytxt.

func (*Sandbox) Close Uses

func (sb *Sandbox) Close() error

Close removes all state associated with the sandbox.

func (*Sandbox) GOPATH Uses

func (sb *Sandbox) GOPATH() string

GOPATH returns the value of the Sandbox GOPATH.

func (*Sandbox) GoEnv Uses

func (sb *Sandbox) GoEnv() []string

GoEnv returns the default environment variables that can be used for invoking Go commands in the sandbox.

func (*Sandbox) RunGoCommand Uses

func (sb *Sandbox) RunGoCommand(ctx context.Context, verb string, args ...string) error

RunGoCommand executes a go command in the sandbox.

type SymbolInformation Uses

type SymbolInformation struct {
    Name     string
    Kind     protocol.SymbolKind
    Location Location

SymbolInformation is an editor friendly version of protocol.SymbolInformation, with location information transformed to byte offsets. Field names correspond to the protocol type.

type Workdir Uses

type Workdir struct {
    // contains filtered or unexported fields

Workdir is a temporary working directory for tests. It exposes file operations in terms of relative paths, and fakes file watching by triggering events on file operations.

func NewWorkdir Uses

func NewWorkdir(dir, txt string) (*Workdir, error)

NewWorkdir writes the txtar-encoded file data in txt to dir, and returns a Workir for operating on these files using

func (*Workdir) AddWatcher Uses

func (w *Workdir) AddWatcher(watcher func(context.Context, []FileEvent))

AddWatcher registers the given func to be called on any file change.

func (*Workdir) CheckForFileChanges Uses

func (w *Workdir) CheckForFileChanges(ctx context.Context) error

CheckForFileChanges walks the working directory and checks for any files that have changed since the last poll.

func (*Workdir) ListFiles Uses

func (w *Workdir) ListFiles(dir string) (map[string]time.Time, error)

ListFiles lists files in the given directory, returning a map of relative path to modification time.

func (*Workdir) ReadFile Uses

func (w *Workdir) ReadFile(path string) (string, error)

ReadFile reads a text file specified by a workdir-relative path.

func (*Workdir) RegexpSearch Uses

func (w *Workdir) RegexpSearch(path string, re string) (Pos, error)

RegexpSearch searches the file corresponding to path for the first position matching re.

func (*Workdir) RemoveFile Uses

func (w *Workdir) RemoveFile(ctx context.Context, path string) error

RemoveFile removes a workdir-relative file path.

func (*Workdir) RootURI Uses

func (w *Workdir) RootURI() protocol.DocumentURI

RootURI returns the root URI for this working directory of this scratch environment.

func (*Workdir) URI Uses

func (w *Workdir) URI(path string) protocol.DocumentURI

URI returns the URI to a the workdir-relative path.

func (*Workdir) URIToPath Uses

func (w *Workdir) URIToPath(uri protocol.DocumentURI) string

URIToPath converts a uri to a workdir-relative path (or an absolute path, if the uri is outside of the workdir).

func (*Workdir) WriteFile Uses

func (w *Workdir) WriteFile(ctx context.Context, path, content string) error

WriteFile writes text file content to a workdir-relative path.

func (*Workdir) WriteFiles Uses

func (w *Workdir) WriteFiles(ctx context.Context, files map[string]string) error

WriteFiles writes the text file content to workdir-relative paths. It batches notifications rather than sending them consecutively.

Package fake imports 19 packages (graph) and is imported by 2 packages. Updated 2020-07-07. Refresh now. Tools for package owners.