package planr import ( "fmt" ) type Runner struct { adapters []Adapter } 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 } // [Initialization] -> [Generation] -> [Finalization] -> // [Build] -> [Evaluation] -> [Clean] func (r Runner) cycle(tcs []TestCase) []TestResult { results := make([]TestResult, 0) for _, adapter := range r.adapters { aname := adapter.Config().Name adapter.InitializeBuild() for _, tc := range tcs { if tc.ContainsAdapter(aname) { fmt.Printf("[R] Building %s\n", tc.Path) adapter.Build(tc) } } adapter.FinalizeBuild() adapter.Make() for _, tc := range tcs { if tc.ContainsAdapter(aname) { fmt.Printf("[R] Evaluating %s\n", tc.Path) results = append(results, adapter.Evaluate(tc)) } } adapter.Cleanup() } return results } func (r Runner) Run(root string) [] TestResult { tcs := collectUnits(root, r.adapterCfgs()) trs := r.cycle(tcs) return trs }