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  }