package planr import ( "log" "os" "path" ) type Runner struct { adapters []Adapter dirs DirConfig } func (r *Runner) RegisterAdapter(a Adapter) { r.adapters = append(r.adapters, a) } func (r Runner) adapterCfgs() []AdapterConfig { cgs := make([]AdapterConfig, len(r.adapters)) for _, adapter := range r.adapters { cgs = append(cgs, adapter.Config()) } return cgs } type TcTab map[string] []*TestCase func (r Runner) buildTcLUT(tcs []TestCase) TcTab { m := make(TcTab, 0) for i := range tcs { tc := &tcs[i] nm := *tc.Config.Adapter m[nm] = append(m[nm], tc) } return m } func (r Runner) checkConfig(tcs []TestCase) { for _, tc := range tcs { tc.Config.ensureSatisfied(tc.Path) } } func (r Runner) setupEnv(adapter Adapter) { nm := adapter.Config().Name wd := path.Join(r.dirs.Build(), nm) if !directoryExists(wd) { if err := os.Mkdir(wd, 0755); err != nil { log.Fatalf("Could not create adapter config %s %v\n", wd, err) } } safeCd(wd) } func (r Runner) build(tcs []TestCase) { r.checkConfig(tcs) tcTab := r.buildTcLUT(tcs) for _, adapter := range r.adapters { nm := adapter.Config().Name r.setupEnv(adapter) adapter.Build(tcTab[nm]) } safeCd(r.dirs.Config()) } func (r Runner) init_adapters() { for _, adapter := range r.adapters { adapter.Init(r.dirs) } } func (r Runner) units() []TestCase { return collectUnits(r.dirs.Rubric(), r.adapterCfgs()) } func (r Runner) Build() { r.init_adapters() units := r.units() if !directoryExists(r.dirs.Build()) { r.dirs.MkBuild() } r.build(units) } func (r Runner) evaluate(tcs []TestCase) { tcTab := r.buildTcLUT(tcs) for _, adapter := range r.adapters { nm := adapter.Config().Name r.setupEnv(adapter) adapter.Evaluate(tcTab[nm]) } safeCd(r.dirs.Config()) } func (r Runner) Evaluate() []TestCase { r.init_adapters() units := r.units() r.evaluate(units) return units } func (r Runner) Clean() { r.dirs.CleanBuild() } func (r * Runner) SetConfigDirFromTree(childPath string) { r.dirs.SetConfigFromTree(childPath) }