|  | /* | 
|  |  | 
|  | 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) | 
|  | } | 
|  | }) | 
|  | } | 
|  | } |