99 lines
3.1 KiB
Go
99 lines
3.1 KiB
Go
/*
|
|
|
|
Table provides a simple DSL for Ginkgo-native Table-Driven Tests
|
|
|
|
The godoc documentation describes Table's API. More comprehensive documentation (with examples!) is available at http://onsi.github.io/ginkgo#table-driven-tests
|
|
|
|
*/
|
|
|
|
package table
|
|
|
|
import (
|
|
"fmt"
|
|
"reflect"
|
|
|
|
"github.com/onsi/ginkgo"
|
|
)
|
|
|
|
/*
|
|
DescribeTable describes a table-driven test.
|
|
|
|
For example:
|
|
|
|
DescribeTable("a simple table",
|
|
func(x int, y int, expected bool) {
|
|
Ω(x > y).Should(Equal(expected))
|
|
},
|
|
Entry("x > y", 1, 0, true),
|
|
Entry("x == y", 0, 0, false),
|
|
Entry("x < y", 0, 1, false),
|
|
)
|
|
|
|
The first argument to `DescribeTable` is a string description.
|
|
The second argument is a function that will be run for each table entry. Your assertions go here - the function is equivalent to a Ginkgo It.
|
|
The subsequent arguments must be of type `TableEntry`. We recommend using the `Entry` convenience constructors.
|
|
|
|
The `Entry` constructor takes a string description followed by an arbitrary set of parameters. These parameters are passed into your function.
|
|
|
|
Under the hood, `DescribeTable` simply generates a new Ginkgo `Describe`. Each `Entry` is turned into an `It` within the `Describe`.
|
|
|
|
It's important to understand that the `Describe`s and `It`s are generated at evaluation time (i.e. when Ginkgo constructs the tree of tests and before the tests run).
|
|
|
|
Individual Entries can be focused (with FEntry) or marked pending (with PEntry or XEntry). In addition, the entire table can be focused or marked pending with FDescribeTable and PDescribeTable/XDescribeTable.
|
|
*/
|
|
func DescribeTable(description string, itBody interface{}, entries ...TableEntry) bool {
|
|
describeTable(description, itBody, entries, false, false)
|
|
return true
|
|
}
|
|
|
|
/*
|
|
You can focus a table with `FDescribeTable`. This is equivalent to `FDescribe`.
|
|
*/
|
|
func FDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool {
|
|
describeTable(description, itBody, entries, false, true)
|
|
return true
|
|
}
|
|
|
|
/*
|
|
You can mark a table as pending with `PDescribeTable`. This is equivalent to `PDescribe`.
|
|
*/
|
|
func PDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool {
|
|
describeTable(description, itBody, entries, true, false)
|
|
return true
|
|
}
|
|
|
|
/*
|
|
You can mark a table as pending with `XDescribeTable`. This is equivalent to `XDescribe`.
|
|
*/
|
|
func XDescribeTable(description string, itBody interface{}, entries ...TableEntry) bool {
|
|
describeTable(description, itBody, entries, true, false)
|
|
return true
|
|
}
|
|
|
|
func describeTable(description string, itBody interface{}, entries []TableEntry, pending bool, focused bool) {
|
|
itBodyValue := reflect.ValueOf(itBody)
|
|
if itBodyValue.Kind() != reflect.Func {
|
|
panic(fmt.Sprintf("DescribeTable expects a function, got %#v", itBody))
|
|
}
|
|
|
|
if pending {
|
|
ginkgo.PDescribe(description, func() {
|
|
for _, entry := range entries {
|
|
entry.generateIt(itBodyValue)
|
|
}
|
|
})
|
|
} else if focused {
|
|
ginkgo.FDescribe(description, func() {
|
|
for _, entry := range entries {
|
|
entry.generateIt(itBodyValue)
|
|
}
|
|
})
|
|
} else {
|
|
ginkgo.Describe(description, func() {
|
|
for _, entry := range entries {
|
|
entry.generateIt(itBodyValue)
|
|
}
|
|
})
|
|
}
|
|
}
|