in tools/test-reader/reader/reader.go [68:111]
func ReadTestFiles(filenames []string) ([]*Test, map[string]error) {
funcDecls := make(map[string]*ast.FuncDecl) // map of function names to function declarations
varDecls := make(map[string]*ast.BasicLit) // map of variable names to value expressions
errs := make(map[string]error) // map of file or test names to errors encountered parsing
fset := token.NewFileSet()
for _, filename := range filenames {
f, err := parser.ParseFile(fset, filename, nil, 0)
if err != nil {
errs[filename] = err
continue
}
for _, decl := range f.Decls {
if funcDecl, ok := decl.(*ast.FuncDecl); ok {
// This is a function declaration.
funcDecls[funcDecl.Name.Name] = funcDecl
} else if genDecl, ok := decl.(*ast.GenDecl); ok {
// This is an import, constant, type, or variable declaration
for _, spec := range genDecl.Specs {
if valueSpec, ok := spec.(*ast.ValueSpec); ok {
if len(valueSpec.Values) > 0 {
if basicLit, ok := valueSpec.Values[0].(*ast.BasicLit); ok {
varDecls[valueSpec.Names[0].Name] = basicLit
}
}
}
}
}
}
}
tests := make([]*Test, 0)
for name, funcDecl := range funcDecls {
if strings.HasPrefix(name, "TestAcc") {
funcTests, err := readTestFunc(funcDecl, funcDecls, varDecls)
if err != nil {
errs[name] = err
}
tests = append(tests, funcTests...)
}
}
if len(errs) > 0 {
return tests, errs
}
return tests, nil
}