mirror of
https://github.com/golang/go
synced 2024-11-06 04:36:15 -07:00
c02c21e5e9
We intend to use the GOPATH resolver's results during LSP autocompletion. That means we have to be able to cache its data, same as we do for modules. Convert it to use a dirInfoCache. Cache exports in the dirInfoCache. Along the way, store exports as slices rather than maps. We don't need the extra structure the vast majority of the time, and the memory overhead is nontrivial. Change-Id: If267d6b00da2163a960b93b2cf2088ec2538f73d Reviewed-on: https://go-review.googlesource.com/c/tools/+/205162 Run-TryBot: Heschi Kreinick <heschi@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org>
125 lines
2.5 KiB
Go
125 lines
2.5 KiB
Go
package imports
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
"sort"
|
|
"testing"
|
|
)
|
|
|
|
func TestDirectoryPackageInfoReachedStatus(t *testing.T) {
|
|
tests := []struct {
|
|
info directoryPackageInfo
|
|
target directoryPackageStatus
|
|
wantStatus bool
|
|
wantError bool
|
|
}{
|
|
{
|
|
info: directoryPackageInfo{
|
|
status: directoryScanned,
|
|
err: nil,
|
|
},
|
|
target: directoryScanned,
|
|
wantStatus: true,
|
|
},
|
|
{
|
|
info: directoryPackageInfo{
|
|
status: directoryScanned,
|
|
err: fmt.Errorf("error getting to directory scanned"),
|
|
},
|
|
target: directoryScanned,
|
|
wantStatus: true,
|
|
wantError: true,
|
|
},
|
|
{
|
|
info: directoryPackageInfo{},
|
|
target: directoryScanned,
|
|
wantStatus: false,
|
|
},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
gotStatus, gotErr := tt.info.reachedStatus(tt.target)
|
|
if gotErr != nil {
|
|
if !tt.wantError {
|
|
t.Errorf("unexpected error: %s", gotErr)
|
|
}
|
|
continue
|
|
}
|
|
|
|
if tt.wantStatus != gotStatus {
|
|
t.Errorf("reached status expected: %v, got: %v", tt.wantStatus, gotStatus)
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestModCacheInfo(t *testing.T) {
|
|
m := &dirInfoCache{
|
|
dirs: make(map[string]*directoryPackageInfo),
|
|
}
|
|
|
|
dirInfo := []struct {
|
|
dir string
|
|
info directoryPackageInfo
|
|
}{
|
|
{
|
|
dir: "mypackage",
|
|
info: directoryPackageInfo{
|
|
status: directoryScanned,
|
|
dir: "mypackage",
|
|
nonCanonicalImportPath: "example.com/mypackage",
|
|
needsReplace: false,
|
|
},
|
|
},
|
|
{
|
|
dir: "bad package",
|
|
info: directoryPackageInfo{
|
|
status: directoryScanned,
|
|
err: fmt.Errorf("bad package"),
|
|
},
|
|
},
|
|
{
|
|
dir: "mypackage/other",
|
|
info: directoryPackageInfo{
|
|
dir: "mypackage/other",
|
|
nonCanonicalImportPath: "example.com/mypackage/other",
|
|
needsReplace: false,
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, d := range dirInfo {
|
|
m.Store(d.dir, d.info)
|
|
}
|
|
|
|
for _, d := range dirInfo {
|
|
val, ok := m.Load(d.dir)
|
|
if !ok {
|
|
t.Errorf("directory not loaded: %s", d.dir)
|
|
}
|
|
|
|
if !reflect.DeepEqual(d.info, val) {
|
|
t.Errorf("expected: %v, got: %v", d.info, val)
|
|
}
|
|
}
|
|
|
|
var wantKeys []string
|
|
for _, d := range dirInfo {
|
|
wantKeys = append(wantKeys, d.dir)
|
|
}
|
|
sort.Strings(wantKeys)
|
|
|
|
gotKeys := m.Keys()
|
|
sort.Strings(gotKeys)
|
|
|
|
if len(gotKeys) != len(wantKeys) {
|
|
t.Errorf("different length of keys. expected: %d, got: %d", len(wantKeys), len(gotKeys))
|
|
}
|
|
|
|
for i, want := range wantKeys {
|
|
if want != gotKeys[i] {
|
|
t.Errorf("%d: expected %s, got %s", i, want, gotKeys[i])
|
|
}
|
|
}
|
|
}
|