packer-cn/vendor/github.com/approvals/go-approval-tests/combination_approvals.go

297 lines
7.6 KiB
Go

package approvaltests
import (
"fmt"
"strings"
"reflect"
)
type emptyType struct{}
var (
// SkipThisCombination should be returned if you do not want to process a particular combination
SkipThisCombination = "♬ SKIP THIS COMBINATION ♬"
empty = emptyType{}
emptyCollection = []emptyType{empty}
)
// VerifyAllCombinationsFor1 Example:
// VerifyAllCombinationsFor1(t, "uppercase", func(x interface{}) string { return strings.ToUpper(x.(string)) }, []string("dog", "cat"})
func VerifyAllCombinationsFor1(t Failable, header string, transform func(interface{}) string, collection1 interface{}) error {
transform2 := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1)
}
return VerifyAllCombinationsFor9(t, header, transform2, collection1,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection)
}
// VerifyAllCombinationsFor2 Example:
// VerifyAllCombinationsFor2(t, "uppercase", func(x interface{}) string { return strings.ToUpper(x.(string)) }, []string("dog", "cat"}, []int{1,2)
func VerifyAllCombinationsFor2(t Failable, header string, transform func(interface{}, interface{}) string, collection1 interface{}, collection2 interface{}) error {
transform2 := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1, p2)
}
return VerifyAllCombinationsFor9(t, header, transform2, collection1,
collection2,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection)
}
// VerifyAllCombinationsFor3 is for combinations of 3.
func VerifyAllCombinationsFor3(
t Failable,
header string,
transform func(p1, p2, p3 interface{}) string,
collection1, collection2, collection3 interface{}) error {
kerning := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1, p2, p3)
}
return VerifyAllCombinationsFor9(t, header, kerning,
collection1,
collection2,
collection3,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection)
}
// VerifyAllCombinationsFor4 is for combinations of 4.
func VerifyAllCombinationsFor4(
t Failable,
header string,
transform func(p1, p2, p3, p4 interface{}) string,
collection1, collection2, collection3, collection4 interface{}) error {
kerning := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1, p2, p3, p4)
}
return VerifyAllCombinationsFor9(t, header, kerning,
collection1,
collection2,
collection3,
collection4,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection)
}
// VerifyAllCombinationsFor5 is for combinations of 5.
func VerifyAllCombinationsFor5(
t Failable,
header string,
transform func(p1, p2, p3, p4, p5 interface{}) string,
collection1, collection2, collection3, collection4, collection5 interface{}) error {
kerning := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1, p2, p3, p4, p5)
}
return VerifyAllCombinationsFor9(t, header, kerning,
collection1,
collection2,
collection3,
collection4,
collection5,
emptyCollection,
emptyCollection,
emptyCollection,
emptyCollection)
}
// VerifyAllCombinationsFor6 is for combinations of 6.
func VerifyAllCombinationsFor6(
t Failable,
header string,
transform func(p1, p2, p3, p4, p5, p6 interface{}) string,
collection1, collection2, collection3, collection4, collection5, collection6 interface{}) error {
kerning := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1, p2, p3, p4, p5, p6)
}
return VerifyAllCombinationsFor9(t, header, kerning,
collection1,
collection2,
collection3,
collection4,
collection5,
collection6,
emptyCollection,
emptyCollection,
emptyCollection)
}
// VerifyAllCombinationsFor7 is for combinations of 7.
func VerifyAllCombinationsFor7(
t Failable,
header string,
transform func(p1, p2, p3, p4, p5, p6, p7 interface{}) string,
collection1, collection2, collection3, collection4, collection5, collection6, collection7 interface{}) error {
kerning := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1, p2, p3, p4, p5, p6, p7)
}
return VerifyAllCombinationsFor9(t, header, kerning,
collection1,
collection2,
collection3,
collection4,
collection5,
collection6,
collection7,
emptyCollection,
emptyCollection)
}
// VerifyAllCombinationsFor8 is for combinations of 8.
func VerifyAllCombinationsFor8(
t Failable,
header string,
transform func(p1, p2, p3, p4, p5, p6, p7, p8 interface{}) string,
collection1, collection2, collection3, collection4, collection5, collection6, collection7, collection8 interface{}) error {
kerning := func(p1, p2, p3, p4, p5, p6, p7, p8, p9 interface{}) string {
return transform(p1, p2, p3, p4, p5, p6, p7, p8)
}
return VerifyAllCombinationsFor9(t, header, kerning,
collection1,
collection2,
collection3,
collection4,
collection5,
collection6,
collection7,
collection8,
emptyCollection)
}
// VerifyAllCombinationsFor9 is for combinations of 9.
func VerifyAllCombinationsFor9(
t Failable,
header string,
transform func(a, b, c, d, e, f, g, h, i interface{}) string,
collection1,
collection2,
collection3,
collection4,
collection5,
collection6,
collection7,
collection8,
collection9 interface{}) error {
if len(header) != 0 {
header = fmt.Sprintf("%s\n\n\n", header)
}
var mapped []string
slice1 := reflect.ValueOf(collection1)
slice2 := reflect.ValueOf(collection2)
slice3 := reflect.ValueOf(collection3)
slice4 := reflect.ValueOf(collection4)
slice5 := reflect.ValueOf(collection5)
slice6 := reflect.ValueOf(collection6)
slice7 := reflect.ValueOf(collection7)
slice8 := reflect.ValueOf(collection8)
slice9 := reflect.ValueOf(collection9)
for i1 := 0; i1 < slice1.Len(); i1++ {
for i2 := 0; i2 < slice2.Len(); i2++ {
for i3 := 0; i3 < slice3.Len(); i3++ {
for i4 := 0; i4 < slice4.Len(); i4++ {
for i5 := 0; i5 < slice5.Len(); i5++ {
for i6 := 0; i6 < slice6.Len(); i6++ {
for i7 := 0; i7 < slice7.Len(); i7++ {
for i8 := 0; i8 < slice8.Len(); i8++ {
for i9 := 0; i9 < slice9.Len(); i9++ {
p1 := slice1.Index(i1).Interface()
p2 := slice2.Index(i2).Interface()
p3 := slice3.Index(i3).Interface()
p4 := slice4.Index(i4).Interface()
p5 := slice5.Index(i5).Interface()
p6 := slice6.Index(i6).Interface()
p7 := slice7.Index(i7).Interface()
p8 := slice8.Index(i8).Interface()
p9 := slice9.Index(i9).Interface()
parameterText := getParameterText(p1, p2, p3, p4, p5, p6, p7, p8, p9)
transformText := getTransformText(transform, p1, p2, p3, p4, p5, p6, p7, p8, p9)
if transformText != SkipThisCombination {
mapped = append(mapped, fmt.Sprintf("%s => %s", parameterText, transformText))
}
}
}
}
}
}
}
}
}
}
outputText := header + strings.Join(mapped, "\n")
return VerifyString(t, outputText)
}
func getParameterText(args ...interface{}) string {
parameterText := "["
for _, x := range args {
if x != empty {
parameterText += fmt.Sprintf("%v,", x)
}
}
parameterText = parameterText[0 : len(parameterText)-1]
parameterText += "]"
return parameterText
}
func getTransformText(
transform func(a, b, c, d, e, f, g, h, i interface{}) string,
p1,
p2,
p3,
p4,
p5,
p6,
p7,
p8,
p9 interface{}) (s string) {
defer func() {
r := recover()
if r != nil {
s = "panic occurred"
}
}()
return transform(p1, p2, p3, p4, p5, p6, p7, p8, p9)
}