some fixes
This commit is contained in:
@@ -36,6 +36,13 @@ func globWithAffixes(pattern string) ([]string, string, string, error) {
|
||||
}
|
||||
|
||||
func expandGlobPattern(pattern *dsl.Pattern) ([]*dsl.Test, error) {
|
||||
if pattern.StageAll {
|
||||
return nil, fmt.Errorf("pattern: `stage` is only valid with `dirs`")
|
||||
}
|
||||
if pattern.ArgsFile != "" {
|
||||
return nil, fmt.Errorf("pattern: `args_file` is only valid with `dirs`")
|
||||
}
|
||||
|
||||
inputIsGlob := strings.Contains(pattern.InputGlob, "*")
|
||||
outputIsGlob := strings.Contains(pattern.OutputGlob, "*")
|
||||
|
||||
@@ -107,6 +114,22 @@ func expandDirPattern(pattern *dsl.Pattern) ([]*dsl.Test, error) {
|
||||
return nil, fmt.Errorf("no directories matched %q", pattern.DirsGlob)
|
||||
}
|
||||
|
||||
if pattern.StageAll {
|
||||
var tests []*dsl.Test
|
||||
for _, dir := range dirs {
|
||||
info, err := os.Stat(dir)
|
||||
if err != nil || !info.IsDir() {
|
||||
continue
|
||||
}
|
||||
t, err := buildStagedDirTest(dir, pattern)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
tests = append(tests, t)
|
||||
}
|
||||
return tests, nil
|
||||
}
|
||||
|
||||
var cases []patternCase
|
||||
for _, dir := range dirs {
|
||||
info, err := os.Stat(dir)
|
||||
@@ -123,6 +146,72 @@ func expandDirPattern(pattern *dsl.Pattern) ([]*dsl.Test, error) {
|
||||
return buildTests(cases, pattern.Args)
|
||||
}
|
||||
|
||||
// buildStagedDirTest builds a single test from a directory, staging every
|
||||
// regular file in it (except the output and args files) into the test's
|
||||
// working directory. Program arguments come from ArgsFile (if set) or the
|
||||
// static Args template; the expected stdout is the content of OutputFile.
|
||||
func buildStagedDirTest(dir string, pattern *dsl.Pattern) (*dsl.Test, error) {
|
||||
base := filepath.Base(dir)
|
||||
zero := 0
|
||||
t := &dsl.Test{
|
||||
Name: fmt.Sprintf("pattern:%s", base),
|
||||
Env: map[string]string{},
|
||||
InFiles: map[string]string{},
|
||||
OutFiles: map[string]string{},
|
||||
ExitCode: &zero,
|
||||
Stdout: dsl.NoMatcher{},
|
||||
Stderr: dsl.NoMatcher{},
|
||||
}
|
||||
|
||||
skip := map[string]bool{}
|
||||
if pattern.OutputFile != "" {
|
||||
skip[pattern.OutputFile] = true
|
||||
}
|
||||
if pattern.ArgsFile != "" {
|
||||
skip[pattern.ArgsFile] = true
|
||||
}
|
||||
|
||||
entries, err := os.ReadDir(dir)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("read dir %q: %w", dir, err)
|
||||
}
|
||||
for _, e := range entries {
|
||||
if e.IsDir() || skip[e.Name()] {
|
||||
continue
|
||||
}
|
||||
content, err := os.ReadFile(filepath.Join(dir, e.Name()))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("read staged file %q: %w", e.Name(), err)
|
||||
}
|
||||
t.SetInputFile(e.Name(), content)
|
||||
}
|
||||
|
||||
argTemplate := pattern.Args
|
||||
if pattern.ArgsFile != "" {
|
||||
raw, err := os.ReadFile(filepath.Join(dir, pattern.ArgsFile))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("read args file %q: %w", pattern.ArgsFile, err)
|
||||
}
|
||||
argTemplate = strings.Fields(string(raw))
|
||||
}
|
||||
if len(argTemplate) > 0 {
|
||||
t.Args = substituteArgs(argTemplate, map[string]string{
|
||||
"{name}": base,
|
||||
"{dir}": dir,
|
||||
})
|
||||
}
|
||||
|
||||
if pattern.OutputFile != "" {
|
||||
outputContent, err := os.ReadFile(filepath.Join(dir, pattern.OutputFile))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("read output %q: %w", pattern.OutputFile, err)
|
||||
}
|
||||
t.SetStdout(outputContent)
|
||||
}
|
||||
|
||||
return t, nil
|
||||
}
|
||||
|
||||
func buildTest(c *patternCase, argTemplate []string, useInputAsFile, useOutputAsFile bool) (*dsl.Test, error) {
|
||||
inputContent, err := os.ReadFile(c.inputPath)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user