| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Package vdltestutil provides testing utilities for v.io/x/ref/lib/vdl/... |
| package vdltestutil |
| |
| import ( |
| "io" |
| "io/ioutil" |
| "regexp" |
| "strings" |
| "testing" |
| |
| "v.io/x/ref/lib/vdl/build" |
| "v.io/x/ref/lib/vdl/vdlutil" |
| ) |
| |
| // ExpectPass makes sure errs has no errors. |
| func ExpectPass(t *testing.T, errs *vdlutil.Errors, testName string) { |
| if !errs.IsEmpty() { |
| t.Errorf("%v expected no errors but saw: %v", testName, errs.ToError()) |
| errs.Reset() |
| } |
| } |
| |
| // ExpectFail makes sure errs has an error that matches all the re regexps. |
| func ExpectFail(t *testing.T, errs *vdlutil.Errors, testName string, re ...string) { |
| if errs.IsEmpty() { |
| t.Errorf("%v expected errors but didn't see any", testName) |
| return |
| } |
| actual := errs.ToError().Error() |
| errs.Reset() |
| for index, errRe := range re { |
| matched, err := regexp.Match(errRe, []byte(actual)) |
| if err != nil { |
| t.Errorf("%v bad regexp pattern [%v] %q", testName, index, errRe) |
| return |
| } |
| if !matched { |
| t.Errorf("%v couldn't match pattern [%v] %q against %q", testName, index, errRe, actual) |
| } |
| } |
| } |
| |
| // ExpectResult ensures errs has an error that matches all the re regexps, or |
| // that errs has no errors if no regexps were provided, or only one was provided |
| // with the empty string. |
| func ExpectResult(t *testing.T, errs *vdlutil.Errors, testName string, re ...string) { |
| if len(re) == 0 || len(re) == 1 && re[0] == "" { |
| ExpectPass(t, errs, testName) |
| } else { |
| ExpectFail(t, errs, testName, re...) |
| } |
| } |
| |
| // FakeBuildPackage constructs a fake build package for testing, with files |
| // mapping from file names to file contents. |
| func FakeBuildPackage(name, path string, files map[string]string) *build.Package { |
| var fnames []string |
| for fname, _ := range files { |
| fnames = append(fnames, fname) |
| } |
| return &build.Package{ |
| Dir: "", |
| Name: name, |
| Path: path, |
| BaseFileNames: fnames, |
| OpenFilesFunc: FakeOpenFiles(files), |
| } |
| } |
| |
| // FakeOpenFiles returns a function that obeys the build.Package.OpenFilesFunc |
| // signature, that simply uses the files map to return readers. |
| func FakeOpenFiles(files map[string]string) func(fnames []string) (map[string]io.ReadCloser, error) { |
| return func(fnames []string) (map[string]io.ReadCloser, error) { |
| ret := make(map[string]io.ReadCloser, len(fnames)) |
| for _, fname := range fnames { |
| ret[fname] = ioutil.NopCloser(strings.NewReader(files[fname])) |
| } |
| return ret, nil |
| } |
| } |