summaryrefslogtreecommitdiff
path: root/gocomplete/tests.go
blob: 60218a54b4743e0db248d89f84cf388b3c1542ef (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package main

import (
	"go/ast"
	"go/parser"
	"go/token"
	"os"
	"path/filepath"
	"strings"

	"github.com/posener/complete"
)

func predictTest(testType string) complete.Predicate {
	return func(last string) []complete.Option {
		tests := testNames(testType)
		options := make([]complete.Option, len(tests))
		for i := range tests {
			options[i] = complete.Arg(tests[i])
		}
		return options
	}
}

// get all test names in current directory
func testNames(testType string) (tests []string) {
	filepath.Walk("./", func(path string, info os.FileInfo, err error) error {
		// if not a test file, skip
		if !strings.HasSuffix(path, "_test.go") {
			return nil
		}
		// inspect test file and append all the test names
		tests = append(tests, testsInFile(testType, path)...)
		return nil
	})
	return
}

func testsInFile(testType, path string) (tests []string) {
	fset := token.NewFileSet()
	f, err := parser.ParseFile(fset, path, nil, 0)
	if err != nil {
		complete.Log("Failed parsing %s: %s", path, err)
		return nil
	}
	for _, d := range f.Decls {
		if f, ok := d.(*ast.FuncDecl); ok {
			name := f.Name.String()
			if strings.HasPrefix(name, testType) {
				tests = append(tests, name)
			}
		}
	}
	return
}