github.com/loov/combiner@v0.1.0/testsuite/all.go (about) 1 package testsuite 2 3 import ( 4 "encoding/gob" 5 "fmt" 6 "testing" 7 ) 8 9 var ( 10 Test = Params{ 11 Procs: []int{1, 2, 3, 4, 8, 16, 32, 64}, 12 Bounds: []int{1, 2, 3, 4, 5, 6, 7, 8}, 13 WorkStart: []int{0}, 14 WorkDo: []int{0}, 15 WorkFinish: []int{0}, 16 } 17 18 Bench = Params{ 19 Procs: []int{1, 4, 32, 256}, 20 Bounds: []int{4, 8, 16, 64}, 21 WorkStart: []int{0}, 22 WorkDo: []int{0}, 23 WorkFinish: []int{0, 100}, 24 } 25 ) 26 27 type Desc struct { 28 Name string 29 Bounded bool 30 Create func(exe Batcher, bound int) Combiner 31 } 32 33 type Descs []Desc 34 35 type Params struct { 36 Procs []int 37 Bounds []int 38 WorkStart []int 39 WorkDo []int 40 WorkFinish []int 41 } 42 43 func (params *Params) Iterate(descs Descs, fn func(*Setup)) { 44 setup := Setup{} 45 for _, desc := range descs { 46 setup.Name = desc.Name 47 setup.Create = desc.Create 48 49 bounds := params.Bounds 50 if !desc.Bounded { 51 bounds = []int{0} 52 } 53 54 for _, setup.Bounds = range bounds { 55 for _, setup.Procs = range params.Procs { 56 for _, setup.WorkStart = range params.WorkStart { 57 for _, setup.WorkDo = range params.WorkDo { 58 for _, setup.WorkFinish = range params.WorkFinish { 59 tmp := setup 60 fn(&tmp) 61 } 62 } 63 } 64 } 65 } 66 } 67 } 68 69 type Setup struct { 70 Name string 71 Create func(exe Batcher, bound int) Combiner 72 Bounds int 73 Procs int 74 WorkStart int 75 WorkDo int 76 WorkFinish int 77 } 78 79 func init() { gob.Register(Setup{}) } 80 81 func (setup *Setup) Make() (*Worker, Combiner) { 82 worker := &Worker{} 83 worker.WorkStart = setup.WorkStart 84 worker.WorkDo = setup.WorkDo 85 worker.WorkFinish = setup.WorkFinish 86 combiner := setup.Create(worker, setup.Bounds) 87 return worker, combiner 88 } 89 90 func (setup *Setup) FullName(test string) string { 91 return fmt.Sprintf("%v/b%v/%v/p%vs%vi%vr%v", 92 setup.Name, 93 setup.Bounds, 94 test, 95 setup.Procs, 96 setup.WorkStart, 97 setup.WorkDo, 98 setup.WorkFinish, 99 ) 100 } 101 102 func (setup *Setup) Test(t *testing.T, name string, test func(t *testing.T, setup *Setup)) { 103 t.Helper() 104 t.Run(setup.FullName(name), func(t *testing.T) { 105 test(t, setup) 106 }) 107 } 108 109 func (setup *Setup) Bench(b *testing.B, name string, bench func(b *testing.B, setup *Setup)) { 110 b.Helper() 111 b.Run(setup.FullName(name), func(b *testing.B) { 112 bench(b, setup) 113 }) 114 }