github.com/getgauge/gauge@v1.6.9/parser/dataTableSpecs_test.go (about) 1 /*---------------------------------------------------------------- 2 * Copyright (c) ThoughtWorks, Inc. 3 * Licensed under the Apache License, Version 2.0 4 * See LICENSE in the project root for license information. 5 *----------------------------------------------------------------*/ 6 7 package parser 8 9 import ( 10 "testing" 11 12 "encoding/json" 13 "reflect" 14 15 "github.com/getgauge/gauge/env" 16 "github.com/getgauge/gauge/gauge" 17 ) 18 19 type DataTableSpecTest struct { 20 specs []*gauge.Specification 21 want int 22 message string 23 } 24 25 var tests = []DataTableSpecTest{ 26 { 27 specs: []*gauge.Specification{ 28 { 29 Heading: &gauge.Heading{}, 30 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}}, 31 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 32 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 33 }, 0)}, 34 }, 35 }, 36 want: 2, 37 message: "Create specs for each data table row", 38 }, 39 { 40 specs: []*gauge.Specification{ 41 { 42 Heading: &gauge.Heading{}, 43 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}}, 44 }, 45 }, 46 want: 1, 47 message: "Create non data table driven specs", 48 }, 49 { 50 specs: []*gauge.Specification{ 51 { 52 Heading: &gauge.Heading{}, 53 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}}, 54 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 55 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 56 }, 0)}, 57 }, 58 { 59 Heading: &gauge.Heading{}, 60 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}}, 61 }, 62 }, 63 want: 3, 64 message: "Create data table driven and non data table driven specs", 65 }, 66 { 67 specs: []*gauge.Specification{ 68 { 69 Heading: &gauge.Heading{}, 70 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}}}, 71 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 72 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 73 }, 0)}, 74 Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, 75 }, 76 }, 77 want: 2, 78 message: "Create specs with context steps using table param", 79 }, 80 { 81 specs: []*gauge.Specification{ 82 { 83 Heading: &gauge.Heading{}, 84 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}}}, 85 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 86 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 87 }, 0)}, 88 TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, 89 }, 90 }, 91 want: 2, 92 message: "Create specs with Teardown steps using table param", 93 }, 94 } 95 96 func TestGetSpecsForDataTableRows(t *testing.T) { 97 for _, test := range tests { 98 got := GetSpecsForDataTableRows(test.specs, gauge.NewBuildErrors()) 99 100 if len(got) != test.want { 101 t.Errorf("Failed: %s. Wanted: %d specs, Got: %d specs", test.message, test.want, len(got)) 102 } 103 } 104 } 105 106 func TestGetSpecsForDataTableRowsShouldHaveEqualNumberOfScenearioInSpecsScenariosAndItemCollection(t *testing.T) { 107 specs := []*gauge.Specification{ 108 { 109 Heading: &gauge.Heading{}, 110 Scenarios: []*gauge.Scenario{ 111 {Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}, 112 {Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "param1", ArgType: gauge.Static, Name: "param1"}}}}}, 113 }, 114 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 115 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 116 }, 0)}, 117 }, 118 } 119 actualSpecs := GetSpecsForDataTableRows(specs, gauge.NewBuildErrors()) 120 if !containsScenario(actualSpecs[0].Scenarios, actualSpecs[0].Items) { 121 itemsJSON, _ := json.Marshal(actualSpecs[0].Items) 122 scnJSON, _ := json.Marshal(actualSpecs[0].Scenarios) 123 t.Errorf("Failed: Wanted items:\n\n%s\n\nto contain all scenarios: \n\n%s", itemsJSON, scnJSON) 124 } 125 } 126 127 func containsScenario(scenarios []*gauge.Scenario, items []gauge.Item) bool { 128 for _, scenario := range scenarios { 129 contains := false 130 for _, item := range items { 131 if item.Kind() == gauge.ScenarioKind && reflect.DeepEqual(scenario, item.(*gauge.Scenario)) { 132 contains = true 133 } 134 } 135 if !contains { 136 return false 137 } 138 } 139 return true 140 } 141 142 func TestGetSpecsForDataTableRowsShouldHaveEqualNumberOfScenearioInSpecsScenariosAndItemCollectionForScenarioDataTable(t *testing.T) { 143 old := env.AllowScenarioDatatable 144 env.AllowScenarioDatatable = func() bool { 145 return true 146 } 147 specs := []*gauge.Specification{ 148 { 149 Heading: &gauge.Heading{}, 150 Scenarios: []*gauge.Scenario{ 151 { 152 Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, 153 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 154 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}, {Value: "row3", CellType: gauge.Static}}, 155 }, 0)}}, 156 }, 157 }, 158 } 159 actualSpecs := GetSpecsForDataTableRows(specs, gauge.NewBuildErrors()) 160 161 if !containsScenario(actualSpecs[0].Scenarios, actualSpecs[0].Items) { 162 itemsJSON, _ := json.Marshal(actualSpecs[0].Items) 163 scnJSON, _ := json.Marshal(actualSpecs[0].Scenarios) 164 t.Errorf("Failed: Wanted items:\n\n%s\n\nto contain all scenarios: \n\n%s", itemsJSON, scnJSON) 165 } 166 env.AllowScenarioDatatable = old 167 } 168 func TestGetTableWithOneRow(t *testing.T) { 169 table := gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 170 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 171 }, 0) 172 173 want := *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{{{Value: "row1", CellType: gauge.Static}}}, 0) 174 175 got := *getTableWithOneRow(table, 0) 176 177 if !reflect.DeepEqual(want, got) { 178 t.Errorf("Failed: Table with 1 row. Wanted: %v, Got: %v", want, got) 179 } 180 } 181 182 func TestCreateSpecsForTableRows(t *testing.T) { 183 spec := &gauge.Specification{ 184 Heading: &gauge.Heading{}, 185 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}}, 186 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 187 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 188 }, 0)}, 189 Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, 190 Items: []gauge.Item{ 191 &gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 192 {{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}}, 193 }, 0)}, 194 &gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}, 195 }, 196 TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}, 197 } 198 199 want := []*gauge.Specification{ 200 { 201 Heading: &gauge.Heading{}, 202 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 203 {{Value: "row1", CellType: gauge.Static}}, 204 }, 0), SpecDataTableRowIndex: 0}}, 205 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 206 {{Value: "row1", CellType: gauge.Static}}, 207 }, 0)}, 208 Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, 209 Items: []gauge.Item{ 210 &gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 211 {{Value: "row1", CellType: gauge.Static}}, 212 }, 0)}, 213 &gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 214 {{Value: "row1", CellType: gauge.Static}}, 215 }, 0), SpecDataTableRowIndex: 0}, 216 }, 217 TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}, 218 }, 219 { 220 Heading: &gauge.Heading{}, 221 Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 222 {{Value: "row2", CellType: gauge.Static}}, 223 }, 0), SpecDataTableRowIndex: 1}}, 224 DataTable: gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 225 {{Value: "row2", CellType: gauge.Static}}, 226 }, 0)}, 227 Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, 228 Items: []gauge.Item{ 229 &gauge.DataTable{Table: gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 230 {{Value: "row2", CellType: gauge.Static}}, 231 }, 0)}, 232 &gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, SpecDataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{ 233 {{Value: "row2", CellType: gauge.Static}}, 234 }, 0), SpecDataTableRowIndex: 1}, 235 }, 236 TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}, 237 }, 238 } 239 240 got := createSpecsForTableRows(spec, spec.Scenarios, gauge.NewBuildErrors()) 241 242 if !reflect.DeepEqual(want, got) { 243 gotJSON, _ := json.Marshal(got) 244 wantJSON, _ := json.Marshal(want) 245 t.Errorf("Failed: Create specs for table row.\n\tWanted: %v\n\tGot: %v", string(wantJSON), string(gotJSON)) 246 } 247 }