github.com/ezbuy/gauge@v0.9.4-0.20171013092048-7ac5bd3931cd/parser/dataTableSpecs_test.go (about)

     1  // Copyright 2015 ThoughtWorks, Inc.
     2  
     3  // This file is part of Gauge.
     4  
     5  // Gauge is free software: you can redistribute it and/or modify
     6  // it under the terms of the GNU General Public License as published by
     7  // the Free Software Foundation, either version 3 of the License, or
     8  // (at your option) any later version.
     9  
    10  // Gauge is distributed in the hope that it will be useful,
    11  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    12  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    13  // GNU General Public License for more details.
    14  
    15  // You should have received a copy of the GNU General Public License
    16  // along with Gauge.  If not, see <http://www.gnu.org/licenses/>.
    17  
    18  package parser
    19  
    20  import (
    21  	"testing"
    22  
    23  	"encoding/json"
    24  	"reflect"
    25  
    26  	"github.com/getgauge/gauge/gauge"
    27  )
    28  
    29  type DataTableSpecTest struct {
    30  	specs   []*gauge.Specification
    31  	want    int
    32  	message string
    33  }
    34  
    35  var tests = []DataTableSpecTest{
    36  	{
    37  		specs: []*gauge.Specification{
    38  			{
    39  				Heading:   &gauge.Heading{},
    40  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
    41  				DataTable: gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    42  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    43  				}, 0)},
    44  			},
    45  		},
    46  		want:    2,
    47  		message: "Create specs for each data table row",
    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  			},
    55  		},
    56  		want:    1,
    57  		message: "Create non data table driven specs",
    58  	},
    59  	{
    60  		specs: []*gauge.Specification{
    61  			{
    62  				Heading:   &gauge.Heading{},
    63  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
    64  				DataTable: gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    65  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    66  				}, 0)},
    67  			},
    68  			{
    69  				Heading:   &gauge.Heading{},
    70  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
    71  			},
    72  		},
    73  		want:    3,
    74  		message: "Create data table driven and non data table driven specs",
    75  	},
    76  	{
    77  		specs: []*gauge.Specification{
    78  			{
    79  				Heading:   &gauge.Heading{},
    80  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}}},
    81  				DataTable: gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    82  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    83  				}, 0)},
    84  				Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
    85  			},
    86  		},
    87  		want:    2,
    88  		message: "Create specs with context steps using table param",
    89  	},
    90  	{
    91  		specs: []*gauge.Specification{
    92  			{
    93  				Heading:   &gauge.Heading{},
    94  				Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}}}},
    95  				DataTable: gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
    96  					{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
    97  				}, 0)},
    98  				TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
    99  			},
   100  		},
   101  		want:    2,
   102  		message: "Create specs with Teardown steps using table param",
   103  	},
   104  }
   105  
   106  func TestGetSpecsForDataTableRows(t *testing.T) {
   107  	for _, test := range tests {
   108  		got := GetSpecsForDataTableRows(test.specs, gauge.NewBuildErrors())
   109  
   110  		if len(got) != test.want {
   111  			t.Errorf("Failed: %s. Wanted: %d specs, Got: %d specs", test.message, test.want, len(got))
   112  		}
   113  	}
   114  }
   115  
   116  func TestGetTableWithOneRow(t *testing.T) {
   117  	table := *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   118  		{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
   119  	}, 0)
   120  
   121  	want := *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{{{Value: "row1", CellType: gauge.Static}}}, 0)
   122  
   123  	got := *getTableWithOneRow(table, 0)
   124  
   125  	if !reflect.DeepEqual(want, got) {
   126  		t.Errorf("Failed: Table with 1 row. Wanted: %v, Got: %v", want, got)
   127  	}
   128  }
   129  
   130  func TestCreateSpecsForTableRows(t *testing.T) {
   131  	spec := &gauge.Specification{
   132  		Heading:   &gauge.Heading{},
   133  		Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}}},
   134  		DataTable: gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   135  			{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
   136  		}, 0)},
   137  		Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
   138  		Items: []gauge.Item{
   139  			&gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   140  				{{Value: "row1", CellType: gauge.Static}, {Value: "row2", CellType: gauge.Static}},
   141  			}, 0)},
   142  			&gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}},
   143  		},
   144  		TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}},
   145  	}
   146  
   147  	want := []*gauge.Specification{
   148  		{
   149  			Heading: &gauge.Heading{},
   150  			Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, DataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   151  				{{Value: "row1", CellType: gauge.Static}},
   152  			}, 0), DataTableRowIndex: 0}},
   153  			DataTable: gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   154  				{{Value: "row1", CellType: gauge.Static}},
   155  			}, 0)},
   156  			Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
   157  			Items: []gauge.Item{
   158  				&gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   159  					{{Value: "row1", CellType: gauge.Static}},
   160  				}, 0)},
   161  				&gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, DataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   162  					{{Value: "row1", CellType: gauge.Static}},
   163  				}, 0), DataTableRowIndex: 0},
   164  			},
   165  			TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}},
   166  		},
   167  		{
   168  			Heading: &gauge.Heading{},
   169  			Scenarios: []*gauge.Scenario{{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, DataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   170  				{{Value: "row2", CellType: gauge.Static}},
   171  			}, 0), DataTableRowIndex: 1}},
   172  			DataTable: gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   173  				{{Value: "row2", CellType: gauge.Static}},
   174  			}, 0)},
   175  			Contexts: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}},
   176  			Items: []gauge.Item{
   177  				&gauge.DataTable{Table: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   178  					{{Value: "row2", CellType: gauge.Static}},
   179  				}, 0)},
   180  				&gauge.Scenario{Steps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "header", ArgType: gauge.Dynamic, Name: "header"}}}}, DataTableRow: *gauge.NewTable([]string{"header"}, [][]gauge.TableCell{
   181  					{{Value: "row2", CellType: gauge.Static}},
   182  				}, 0), DataTableRowIndex: 1},
   183  			},
   184  			TearDownSteps: []*gauge.Step{{Args: []*gauge.StepArg{{Value: "abc", ArgType: gauge.Static}}}},
   185  		},
   186  	}
   187  
   188  	got := createSpecsForTableRows(spec, spec.Scenarios, gauge.NewBuildErrors())
   189  
   190  	if !reflect.DeepEqual(want, got) {
   191  		gotJson, _ := json.Marshal(got)
   192  		wantJson, _ := json.Marshal(want)
   193  		t.Errorf("Failed: Create specs for table row.\n\tWanted: %v\n\tGot: %v", string(wantJson), string(gotJson))
   194  	}
   195  }