github.com/getgauge/gauge@v1.6.9/parser/lex_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  	"github.com/getgauge/gauge/env"
    11  	"github.com/getgauge/gauge/gauge"
    12  	. "gopkg.in/check.v1"
    13  )
    14  
    15  func (s *MySuite) TestParsingSpecHeading(c *C) {
    16  	parser := new(SpecParser)
    17  
    18  	specText := newSpecBuilder().specHeading("Spec Heading").String()
    19  	tokens, err := parser.GenerateTokens(specText, "")
    20  
    21  	c.Assert(err, IsNil)
    22  	c.Assert(len(tokens), Equals, 1)
    23  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
    24  	c.Assert(tokens[0].Value, Equals, "Spec Heading")
    25  }
    26  
    27  func (s *MySuite) TestParsingASingleStep(c *C) {
    28  	parser := new(SpecParser)
    29  	tokens, err := parser.GenerateTokens("* test step \"arg\" ", "")
    30  
    31  	c.Assert(err, IsNil)
    32  	c.Assert(len(tokens), Equals, 1)
    33  	c.Assert(tokens[0].Kind, Equals, gauge.StepKind)
    34  }
    35  
    36  func (s *MySuite) TestParsingMultipleSpecHeading(c *C) {
    37  	parser := new(SpecParser)
    38  	specText := newSpecBuilder().specHeading("Spec Heading").specHeading("Another Spec Heading").String()
    39  
    40  	tokens, err := parser.GenerateTokens(specText, "")
    41  
    42  	c.Assert(err, IsNil)
    43  	c.Assert(len(tokens), Equals, 2)
    44  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
    45  	c.Assert(tokens[0].Value, Equals, "Spec Heading")
    46  	c.Assert(tokens[1].Kind, Equals, gauge.SpecKind)
    47  	c.Assert(tokens[1].Value, Equals, "Another Spec Heading")
    48  }
    49  
    50  func (s *MySuite) TestParsingThrowErrorForEmptySpecHeading(c *C) {
    51  	parser := new(SpecParser)
    52  	specText := newSpecBuilder().specHeading("").text("dsfdsf").String()
    53  
    54  	_, res, err := parser.Parse(specText, gauge.NewConceptDictionary(), "foo.spec")
    55  	c.Assert(err, IsNil)
    56  	c.Assert(len(res.ParseErrors) > 0, Equals, true)
    57  	c.Assert(res.ParseErrors[0].Error(), Equals, "foo.spec:1 Spec heading should have at least one character => ''")
    58  }
    59  
    60  func (s *MySuite) TestParsingScenarioHeading(c *C) {
    61  	parser := new(SpecParser)
    62  	specText := newSpecBuilder().specHeading("Spec Heading").scenarioHeading("First scenario").String()
    63  
    64  	tokens, err := parser.GenerateTokens(specText, "")
    65  
    66  	c.Assert(err, IsNil)
    67  	c.Assert(len(tokens), Equals, 2)
    68  	c.Assert(tokens[1].Kind, Equals, gauge.ScenarioKind)
    69  	c.Assert(tokens[1].Value, Equals, "First scenario")
    70  }
    71  
    72  func (s *MySuite) TestParsingThrowErrorForEmptyScenarioHeading(c *C) {
    73  	parser := new(SpecParser)
    74  	specText := newSpecBuilder().specHeading("Spec Heading").scenarioHeading("").String()
    75  
    76  	_, errs := parser.GenerateTokens(specText, "foo.spec")
    77  
    78  	c.Assert(len(errs) > 0, Equals, true)
    79  	c.Assert(errs[0].Error(), Equals, "foo.spec:2 Scenario heading should have at least one character => ''")
    80  }
    81  
    82  func (s *MySuite) TestParsingScenarioWithoutSpecHeading(c *C) {
    83  	parser := new(SpecParser)
    84  	specText := newSpecBuilder().scenarioHeading("Scenario Heading").String()
    85  
    86  	tokens, err := parser.GenerateTokens(specText, "")
    87  
    88  	c.Assert(err, IsNil)
    89  	c.Assert(len(tokens), Equals, 1)
    90  	c.Assert(tokens[0].Kind, Equals, gauge.ScenarioKind)
    91  }
    92  
    93  func (s *MySuite) TestParsingComments(c *C) {
    94  	parser := new(SpecParser)
    95  	specText := newSpecBuilder().specHeading("Spec Heading").text("Hello i am a comment ").text("### A h3 comment").String()
    96  
    97  	tokens, err := parser.GenerateTokens(specText, "")
    98  
    99  	c.Assert(err, IsNil)
   100  	c.Assert(len(tokens), Equals, 3)
   101  
   102  	c.Assert(tokens[1].Kind, Equals, gauge.CommentKind)
   103  	c.Assert(tokens[1].Value, Equals, "Hello i am a comment")
   104  
   105  	c.Assert(tokens[2].Kind, Equals, gauge.CommentKind)
   106  	c.Assert(tokens[2].Value, Equals, "### A h3 comment")
   107  }
   108  
   109  func (s *MySuite) TestParsingSpecHeadingWithUnderlineOneChar(c *C) {
   110  	parser := new(SpecParser)
   111  	specText := newSpecBuilder().text("Spec heading with underline ").text("=").String()
   112  
   113  	tokens, err := parser.GenerateTokens(specText, "")
   114  
   115  	c.Assert(err, IsNil)
   116  	c.Assert(len(tokens), Equals, 1)
   117  
   118  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
   119  	c.Assert(tokens[0].Value, Equals, "Spec heading with underline")
   120  
   121  }
   122  
   123  func (s *MySuite) TestParsingSpecHeadingWithUnderlineMultipleChar(c *C) {
   124  	parser := new(SpecParser)
   125  	specText := newSpecBuilder().text("Spec heading with underline ").text("=====").String()
   126  
   127  	tokens, err := parser.GenerateTokens(specText, "")
   128  
   129  	c.Assert(err, IsNil)
   130  	c.Assert(len(tokens), Equals, 1)
   131  
   132  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
   133  	c.Assert(tokens[0].Value, Equals, "Spec heading with underline")
   134  
   135  }
   136  
   137  func (s *MySuite) TestParsingCommentWithUnderlineAndInvalidCharacters(c *C) {
   138  	parser := new(SpecParser)
   139  	specText := newSpecBuilder().text("A comment that will be with invalid underline").text("===89s").String()
   140  
   141  	tokens, err := parser.GenerateTokens(specText, "")
   142  
   143  	c.Assert(err, IsNil)
   144  	c.Assert(len(tokens), Equals, 2)
   145  
   146  	c.Assert(tokens[0].Kind, Equals, gauge.CommentKind)
   147  	c.Assert(tokens[0].Value, Equals, "A comment that will be with invalid underline")
   148  
   149  	c.Assert(tokens[1].Kind, Equals, gauge.CommentKind)
   150  	c.Assert(tokens[1].Value, Equals, "===89s")
   151  }
   152  
   153  func (s *MySuite) TestParsingScenarioHeadingWithUnderline(c *C) {
   154  	parser := new(SpecParser)
   155  	specText := newSpecBuilder().text("Spec heading with underline ").text("=").text("Scenario heading with underline").text("-").String()
   156  
   157  	tokens, err := parser.GenerateTokens(specText, "")
   158  
   159  	c.Assert(err, IsNil)
   160  	c.Assert(len(tokens), Equals, 2)
   161  
   162  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
   163  	c.Assert(tokens[0].Value, Equals, "Spec heading with underline")
   164  
   165  	c.Assert(tokens[1].Kind, Equals, gauge.ScenarioKind)
   166  	c.Assert(tokens[1].Value, Equals, "Scenario heading with underline")
   167  
   168  }
   169  
   170  func (s *MySuite) TestParsingScenarioHeadingWithUnderlineMultipleChar(c *C) {
   171  	parser := new(SpecParser)
   172  	specText := newSpecBuilder().text("Spec heading with underline ").text("=").text("Scenario heading with underline").text("----").String()
   173  
   174  	tokens, err := parser.GenerateTokens(specText, "")
   175  
   176  	c.Assert(err, IsNil)
   177  	c.Assert(len(tokens), Equals, 2)
   178  
   179  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
   180  	c.Assert(tokens[0].Value, Equals, "Spec heading with underline")
   181  
   182  	c.Assert(tokens[1].Kind, Equals, gauge.ScenarioKind)
   183  	c.Assert(tokens[1].Value, Equals, "Scenario heading with underline")
   184  
   185  }
   186  
   187  func (s *MySuite) TestParsingHeadingWithUnderlineAndHash(c *C) {
   188  	parser := new(SpecParser)
   189  	specText := newSpecBuilder().specHeading("Spec heading with hash ").text("=====").scenarioHeading("Scenario heading with hash").text("----").String()
   190  
   191  	tokens, err := parser.GenerateTokens(specText, "")
   192  
   193  	c.Assert(err, IsNil)
   194  	c.Assert(len(tokens), Equals, 4)
   195  
   196  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
   197  	c.Assert(tokens[0].Value, Equals, "Spec heading with hash")
   198  
   199  	c.Assert(tokens[1].Kind, Equals, gauge.CommentKind)
   200  	c.Assert(tokens[1].Value, Equals, "=====")
   201  
   202  	c.Assert(tokens[2].Kind, Equals, gauge.ScenarioKind)
   203  	c.Assert(tokens[2].Value, Equals, "Scenario heading with hash")
   204  
   205  	c.Assert(tokens[3].Kind, Equals, gauge.CommentKind)
   206  	c.Assert(tokens[3].Value, Equals, "----")
   207  
   208  }
   209  
   210  func (s *MySuite) TestParseSpecTags(c *C) {
   211  	parser := new(SpecParser)
   212  	specText := newSpecBuilder().specHeading("Spec heading with hash ").tags("tag1", "tag2").scenarioHeading("Scenario Heading").String()
   213  
   214  	tokens, err := parser.GenerateTokens(specText, "")
   215  
   216  	c.Assert(err, IsNil)
   217  	c.Assert(len(tokens), Equals, 3)
   218  
   219  	c.Assert(tokens[1].Kind, Equals, gauge.TagKind)
   220  	c.Assert(len(tokens[1].Args), Equals, 2)
   221  	c.Assert(tokens[1].Args[0], Equals, "tag1")
   222  	c.Assert(tokens[1].Args[1], Equals, "tag2")
   223  	c.Assert(tokens[1].LineText(), Equals, "tags: tag1,tag2")
   224  	c.Assert(tokens[1].Value, Equals, "tag1,tag2")
   225  }
   226  
   227  func (s *MySuite) TestParseSpecTagsWithSpace(c *C) {
   228  	parser := new(SpecParser)
   229  	specText := newSpecBuilder().specHeading("Spec heading with hash ").text(" tags :tag1,tag2").scenarioHeading("Scenario Heading").String()
   230  
   231  	tokens, err := parser.GenerateTokens(specText, "")
   232  
   233  	c.Assert(err, IsNil)
   234  	c.Assert(len(tokens), Equals, 3)
   235  
   236  	c.Assert(tokens[1].Kind, Equals, gauge.TagKind)
   237  	c.Assert(len(tokens[1].Args), Equals, 2)
   238  	c.Assert(tokens[1].Args[0], Equals, "tag1")
   239  	c.Assert(tokens[1].Args[1], Equals, "tag2")
   240  	c.Assert(tokens[1].LineText(), Equals, " tags :tag1,tag2")
   241  	c.Assert(tokens[1].Value, Equals, "tag1,tag2")
   242  }
   243  
   244  func (s *MySuite) TestParseEmptyTags(c *C) {
   245  	parser := new(SpecParser)
   246  	specText := newSpecBuilder().specHeading("Spec heading with hash ").tags("tag1", "", "tag2", "").scenarioHeading("Scenario Heading").String()
   247  	tokens, err := parser.GenerateTokens(specText, "")
   248  
   249  	c.Assert(err, IsNil)
   250  	c.Assert(len(tokens), Equals, 3)
   251  
   252  	c.Assert(tokens[1].Kind, Equals, gauge.TagKind)
   253  	c.Assert(len(tokens[1].Args), Equals, 2)
   254  	c.Assert(tokens[1].Args[0], Equals, "tag1")
   255  	c.Assert(tokens[1].Args[1], Equals, "tag2")
   256  	c.Assert(tokens[1].LineText(), Equals, "tags: tag1,,tag2,")
   257  	c.Assert(tokens[1].Value, Equals, "tag1,,tag2,")
   258  }
   259  
   260  func (s *MySuite) TestParseScenarioTags(c *C) {
   261  	parser := new(SpecParser)
   262  	specText := newSpecBuilder().specHeading("Spec heading with hash ").scenarioHeading("Scenario Heading").tags("tag1", "tag2").String()
   263  
   264  	tokens, err := parser.GenerateTokens(specText, "")
   265  
   266  	c.Assert(err, IsNil)
   267  	c.Assert(len(tokens), Equals, 3)
   268  
   269  	c.Assert(tokens[2].Kind, Equals, gauge.TagKind)
   270  	c.Assert(len(tokens[2].Args), Equals, 2)
   271  	c.Assert(tokens[2].Args[0], Equals, "tag1")
   272  	c.Assert(tokens[2].Args[1], Equals, "tag2")
   273  	c.Assert(tokens[2].LineText(), Equals, "tags: tag1,tag2")
   274  	c.Assert(tokens[2].Value, Equals, "tag1,tag2")
   275  }
   276  
   277  func (s *MySuite) TestParseScenarioWithTagsInMultipleLines(c *C) {
   278  	parser := new(SpecParser)
   279  	specText := newSpecBuilder().specHeading("Spec heading with hash ").scenarioHeading("Scenario Heading").tags("tag1", "\ntag2").String()
   280  
   281  	tokens, err := parser.GenerateTokens(specText, "")
   282  
   283  	c.Assert(err, IsNil)
   284  	c.Assert(len(tokens), Equals, 4)
   285  
   286  	c.Assert(tokens[2].Kind, Equals, gauge.TagKind)
   287  	c.Assert(len(tokens[2].Args), Equals, 1)
   288  	c.Assert(tokens[2].Args[0], Equals, "tag1")
   289  	c.Assert(tokens[2].LineText(), Equals, "tags: tag1,")
   290  	c.Assert(tokens[2].Value, Equals, "tag1,")
   291  	c.Assert(tokens[3].Args[0], Equals, "tag2")
   292  	c.Assert(tokens[3].LineText(), Equals, "tag2")
   293  	c.Assert(tokens[3].Value, Equals, "tag2")
   294  }
   295  
   296  func (s *MySuite) TestParseSpecTagsBeforeSpecHeading(c *C) {
   297  	parser := new(SpecParser)
   298  	specText := newSpecBuilder().tags("tag1 ").specHeading("Spec heading with hash ").String()
   299  
   300  	tokens, err := parser.GenerateTokens(specText, "")
   301  
   302  	c.Assert(err, IsNil)
   303  	c.Assert(len(tokens), Equals, 2)
   304  
   305  	c.Assert(tokens[0].Kind, Equals, gauge.TagKind)
   306  	c.Assert(len(tokens[0].Args), Equals, 1)
   307  	c.Assert(tokens[0].Args[0], Equals, "tag1")
   308  	c.Assert(tokens[0].LineText(), Equals, "tags: tag1 ")
   309  	c.Assert(tokens[0].Value, Equals, "tag1")
   310  }
   311  
   312  func (s *MySuite) TestParsingSimpleDataTable(c *C) {
   313  	parser := new(SpecParser)
   314  	specText := newSpecBuilder().specHeading("Spec heading").text("|name|id|").text("|---|---|").text("|john|123|").text("|james|007|").String()
   315  
   316  	tokens, err := parser.GenerateTokens(specText, "")
   317  	c.Assert(err, IsNil)
   318  	c.Assert(len(tokens), Equals, 5)
   319  
   320  	c.Assert(tokens[1].Kind, Equals, gauge.TableHeader)
   321  	c.Assert(len(tokens[1].Args), Equals, 2)
   322  	c.Assert(tokens[1].Args[0], Equals, "name")
   323  	c.Assert(tokens[1].Args[1], Equals, "id")
   324  
   325  	c.Assert(tokens[2].Kind, Equals, gauge.TableRow)
   326  	c.Assert(len(tokens[2].Args), Equals, 2)
   327  	c.Assert(tokens[2].Args[0], Equals, "---")
   328  	c.Assert(tokens[2].Args[1], Equals, "---")
   329  
   330  	c.Assert(tokens[3].Kind, Equals, gauge.TableRow)
   331  	c.Assert(len(tokens[3].Args), Equals, 2)
   332  	c.Assert(tokens[3].Args[0], Equals, "john")
   333  	c.Assert(tokens[3].Args[1], Equals, "123")
   334  
   335  	c.Assert(tokens[4].Kind, Equals, gauge.TableRow)
   336  	c.Assert(len(tokens[4].Args), Equals, 2)
   337  	c.Assert(tokens[4].Args[0], Equals, "james")
   338  	c.Assert(tokens[4].Args[1], Equals, "007")
   339  
   340  }
   341  func (s *MySuite) TestParsingMultipleDataTable(c *C) {
   342  	parser := new(SpecParser)
   343  	specText := newSpecBuilder().specHeading("Spec heading").text("|name|id|").text("|john|123|").text("|james|007|").step("Example step").text("|user|role|").text("|root | admin|").String()
   344  
   345  	tokens, err := parser.GenerateTokens(specText, "")
   346  	c.Assert(err, IsNil)
   347  	c.Assert(len(tokens), Equals, 7)
   348  
   349  	c.Assert(tokens[1].Kind, Equals, gauge.TableHeader)
   350  	c.Assert(len(tokens[1].Args), Equals, 2)
   351  	c.Assert(tokens[1].Args[0], Equals, "name")
   352  	c.Assert(tokens[1].Args[1], Equals, "id")
   353  
   354  	c.Assert(tokens[2].Kind, Equals, gauge.TableRow)
   355  	c.Assert(len(tokens[2].Args), Equals, 2)
   356  	c.Assert(tokens[2].Args[0], Equals, "john")
   357  	c.Assert(tokens[2].Args[1], Equals, "123")
   358  
   359  	c.Assert(tokens[3].Kind, Equals, gauge.TableRow)
   360  	c.Assert(len(tokens[3].Args), Equals, 2)
   361  	c.Assert(tokens[3].Args[0], Equals, "james")
   362  	c.Assert(tokens[3].Args[1], Equals, "007")
   363  
   364  	c.Assert(tokens[5].Kind, Equals, gauge.TableHeader)
   365  	c.Assert(len(tokens[5].Args), Equals, 2)
   366  	c.Assert(tokens[5].Args[0], Equals, "user")
   367  	c.Assert(tokens[5].Args[1], Equals, "role")
   368  
   369  	c.Assert(tokens[6].Kind, Equals, gauge.TableRow)
   370  	c.Assert(len(tokens[6].Args), Equals, 2)
   371  	c.Assert(tokens[6].Args[0], Equals, "root")
   372  	c.Assert(tokens[6].Args[1], Equals, "admin")
   373  }
   374  
   375  func (s *MySuite) TestParsingDataTableWithEmptyHeaderSeparatorRow(c *C) {
   376  	parser := new(SpecParser)
   377  	specText := newSpecBuilder().specHeading("Spec heading").text("|name|id|").text("|||").text("|john|123|").String()
   378  
   379  	tokens, err := parser.GenerateTokens(specText, "")
   380  	c.Assert(err, IsNil)
   381  	c.Assert(len(tokens), Equals, 4)
   382  
   383  	c.Assert(tokens[1].Kind, Equals, gauge.TableHeader)
   384  	c.Assert(len(tokens[1].Args), Equals, 2)
   385  	c.Assert(tokens[1].Args[0], Equals, "name")
   386  	c.Assert(tokens[1].Args[1], Equals, "id")
   387  
   388  	c.Assert(tokens[2].Kind, Equals, gauge.TableRow)
   389  	c.Assert(len(tokens[2].Args), Equals, 2)
   390  	c.Assert(tokens[2].Args[0], Equals, "")
   391  	c.Assert(tokens[2].Args[1], Equals, "")
   392  
   393  	c.Assert(tokens[3].Kind, Equals, gauge.TableRow)
   394  	c.Assert(len(tokens[3].Args), Equals, 2)
   395  	c.Assert(tokens[3].Args[0], Equals, "john")
   396  	c.Assert(tokens[3].Args[1], Equals, "123")
   397  
   398  }
   399  
   400  func (s *MySuite) TestParsingDataTableRowEscapingPipe(c *C) {
   401  	parser := new(SpecParser)
   402  	specText := newSpecBuilder().specHeading("Spec heading").text("| name|id | address| phone|").text("| escape \\| pipe |second|third|").String()
   403  
   404  	tokens, err := parser.GenerateTokens(specText, "")
   405  	c.Assert(err, IsNil)
   406  	c.Assert(len(tokens), Equals, 3)
   407  
   408  	c.Assert(tokens[1].Kind, Equals, gauge.TableHeader)
   409  	c.Assert(len(tokens[1].Args), Equals, 4)
   410  	c.Assert(tokens[1].Args[0], Equals, "name")
   411  	c.Assert(tokens[1].Args[1], Equals, "id")
   412  	c.Assert(tokens[1].Args[2], Equals, "address")
   413  	c.Assert(tokens[1].Args[3], Equals, "phone")
   414  
   415  	c.Assert(tokens[2].Kind, Equals, gauge.TableRow)
   416  	c.Assert(len(tokens[2].Args), Equals, 3)
   417  	c.Assert(tokens[2].Args[0], Equals, "escape | pipe")
   418  	c.Assert(tokens[2].Args[1], Equals, "second")
   419  	c.Assert(tokens[2].Args[2], Equals, "third")
   420  
   421  }
   422  
   423  func (s *MySuite) TestParsingDataTableThrowsErrorWithEmptyHeader(c *C) {
   424  	parser := new(SpecParser)
   425  	specText := newSpecBuilder().specHeading("Spec heading").text("| name|id |||").text("| escape \\| pipe |second|third|second|").String()
   426  
   427  	_, errs := parser.GenerateTokens(specText, "foo.spec")
   428  	c.Assert(len(errs) > 0, Equals, true)
   429  	c.Assert(errs[0].Error(), Equals, "foo.spec:2 Table header should not be blank => '| name|id |||'")
   430  }
   431  
   432  func (s *MySuite) TestParsingDataTableThrowsErrorWithSameColumnHeader(c *C) {
   433  	parser := new(SpecParser)
   434  	specText := newSpecBuilder().specHeading("Spec heading").text("| name|id|name|").text("|1|2|3|").String()
   435  
   436  	_, errs := parser.GenerateTokens(specText, "foo.spec")
   437  	c.Assert(len(errs) > 0, Equals, true)
   438  	c.Assert(errs[0].Error(), Equals, "foo.spec:2 Table header cannot have repeated column values => '| name|id|name|'")
   439  }
   440  
   441  func (s *MySuite) TestParsingDataTableWithSeparatorAsHeader(c *C) {
   442  	parser := new(SpecParser)
   443  	specText := newSpecBuilder().specHeading("Spec heading").text("|---|--|-|").text("|---|--|-|").text("|---|--|-|").text("| escape \\| pipe |second|third|").String()
   444  
   445  	tokens, err := parser.GenerateTokens(specText, "")
   446  	c.Assert(err, IsNil)
   447  	c.Assert(len(tokens), Equals, 5)
   448  
   449  	c.Assert(tokens[1].Kind, Equals, gauge.TableHeader)
   450  	c.Assert(len(tokens[1].Args), Equals, 3)
   451  	c.Assert(tokens[1].Args[0], Equals, "---")
   452  	c.Assert(tokens[1].Args[1], Equals, "--")
   453  	c.Assert(tokens[1].Args[2], Equals, "-")
   454  
   455  	c.Assert(tokens[2].Kind, Equals, gauge.TableRow)
   456  	c.Assert(len(tokens[2].Args), Equals, 3)
   457  	c.Assert(tokens[2].Args[0], Equals, "---")
   458  	c.Assert(tokens[2].Args[1], Equals, "--")
   459  	c.Assert(tokens[2].Args[2], Equals, "-")
   460  
   461  }
   462  
   463  func (s *MySuite) TestParsingSpecWithMultipleLines(c *C) {
   464  	parser := new(SpecParser)
   465  	specText := newSpecBuilder().specHeading("A spec heading").
   466  		text("Hello, i am a comment").
   467  		text(" ").
   468  		step("Context step with \"param\" and <file:foo>").
   469  		text("|a|b|c|").
   470  		text("|--||").
   471  		text("|a1|a2|a3|").
   472  		tags("one", "two").
   473  		scenarioHeading("First flow").
   474  		tags("tag1", "tag2").
   475  		step("first with \"fpp\" and <bar>").
   476  		text("").
   477  		text("Comment in scenario").
   478  		step("<table:file.csv> and <another> with \"foo\"").
   479  		scenarioHeading("First flow").
   480  		step("another").String()
   481  
   482  	tokens, err := parser.GenerateTokens(specText, "")
   483  	c.Assert(err, IsNil)
   484  	c.Assert(len(tokens), Equals, 15)
   485  
   486  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
   487  	c.Assert(tokens[1].Kind, Equals, gauge.CommentKind)
   488  	c.Assert(tokens[2].Kind, Equals, gauge.CommentKind)
   489  
   490  	c.Assert(tokens[3].Kind, Equals, gauge.StepKind)
   491  	c.Assert(tokens[3].Value, Equals, "Context step with {static} and {special}")
   492  
   493  	c.Assert(tokens[4].Kind, Equals, gauge.TableHeader)
   494  	c.Assert(tokens[5].Kind, Equals, gauge.TableRow)
   495  	c.Assert(tokens[6].Kind, Equals, gauge.TableRow)
   496  	c.Assert(tokens[7].Kind, Equals, gauge.TagKind)
   497  	c.Assert(tokens[8].Kind, Equals, gauge.ScenarioKind)
   498  	c.Assert(tokens[9].Kind, Equals, gauge.TagKind)
   499  
   500  	c.Assert(tokens[10].Kind, Equals, gauge.StepKind)
   501  	c.Assert(tokens[10].Value, Equals, "first with {static} and {dynamic}")
   502  
   503  	c.Assert(tokens[11].Kind, Equals, gauge.CommentKind)
   504  
   505  	c.Assert(tokens[12].Kind, Equals, gauge.StepKind)
   506  	c.Assert(tokens[12].Value, Equals, "{special} and {dynamic} with {static}")
   507  
   508  	c.Assert(tokens[13].Kind, Equals, gauge.ScenarioKind)
   509  
   510  	c.Assert(tokens[14].Kind, Equals, gauge.StepKind)
   511  	c.Assert(tokens[14].Value, Equals, "another")
   512  
   513  }
   514  
   515  func (s *MySuite) TestParsingSimpleScenarioDataTable(c *C) {
   516  	parser := new(SpecParser)
   517  	specText := newSpecBuilder().specHeading("Spec heading").
   518  		scenarioHeading("Scenario Heading").
   519  		text("|name|id|").
   520  		text("|---|---|").
   521  		text("|john|123|").
   522  		text("|james|007|").String()
   523  
   524  	tokens, err := parser.GenerateTokens(specText, "")
   525  	c.Assert(err, IsNil)
   526  	c.Assert(len(tokens), Equals, 6)
   527  
   528  	c.Assert(tokens[2].Kind, Equals, gauge.TableHeader)
   529  	c.Assert(len(tokens[2].Args), Equals, 2)
   530  	c.Assert(tokens[2].Args[0], Equals, "name")
   531  	c.Assert(tokens[2].Args[1], Equals, "id")
   532  
   533  	c.Assert(tokens[3].Kind, Equals, gauge.TableRow)
   534  	c.Assert(len(tokens[3].Args), Equals, 2)
   535  	c.Assert(tokens[3].Args[0], Equals, "---")
   536  	c.Assert(tokens[3].Args[1], Equals, "---")
   537  
   538  	c.Assert(tokens[4].Kind, Equals, gauge.TableRow)
   539  	c.Assert(len(tokens[4].Args), Equals, 2)
   540  	c.Assert(tokens[4].Args[0], Equals, "john")
   541  	c.Assert(tokens[4].Args[1], Equals, "123")
   542  
   543  	c.Assert(tokens[5].Kind, Equals, gauge.TableRow)
   544  	c.Assert(len(tokens[5].Args), Equals, 2)
   545  	c.Assert(tokens[5].Args[0], Equals, "james")
   546  	c.Assert(tokens[5].Args[1], Equals, "007")
   547  
   548  }
   549  
   550  func (s *MySuite) TestParsingExternalScenarioDataTable(c *C) {
   551  	parser := new(SpecParser)
   552  	specText := newSpecBuilder().specHeading("Spec heading").
   553  		scenarioHeading("Scenario Heading").
   554  		text("table:data/foo.csv").String()
   555  
   556  	tokens, err := parser.GenerateTokens(specText, "")
   557  	c.Assert(err, IsNil)
   558  	c.Assert(len(tokens), Equals, 3)
   559  	c.Assert(tokens[2].Kind, Equals, gauge.DataTableKind)
   560  }
   561  
   562  func (s *MySuite) TestParsingStepWIthNewlineAndTableParam(c *C) {
   563  	parser := new(SpecParser)
   564  	specText := newSpecBuilder().
   565  		step("step1").
   566  		text("").
   567  		tableHeader("foo|bar").
   568  		tableRow("somerow|another").String()
   569  
   570  	tokens, err := parser.GenerateTokens(specText, "")
   571  	c.Assert(err, IsNil)
   572  	c.Assert(len(tokens), Equals, 3)
   573  
   574  	c.Assert(tokens[0].Kind, Equals, gauge.StepKind)
   575  
   576  	c.Assert(tokens[1].Kind, Equals, gauge.TableHeader)
   577  	c.Assert(tokens[2].Kind, Equals, gauge.TableRow)
   578  }
   579  
   580  func (s *MySuite) TestParsingMultilineStep(c *C) {
   581  	env.AllowMultiLineStep = func() bool { return true }
   582  	parser := new(SpecParser)
   583  	specText := newSpecBuilder().
   584  		step("step1").
   585  		text("second line").String()
   586  
   587  	tokens, err := parser.GenerateTokens(specText, "")
   588  	c.Assert(err, IsNil)
   589  	c.Assert(len(tokens), Equals, 1)
   590  
   591  	c.Assert(tokens[0].Kind, Equals, gauge.StepKind)
   592  	c.Assert(tokens[0].Value, Equals, "step1 second line")
   593  }
   594  
   595  func (s *MySuite) TestParsingMultilineStepWithParams(c *C) {
   596  	env.AllowMultiLineStep = func() bool { return true }
   597  	parser := new(SpecParser)
   598  	specText := newSpecBuilder().
   599  		step("step1").
   600  		text("second line \"foo\"").
   601  		text("third line <bar>").String()
   602  
   603  	tokens, err := parser.GenerateTokens(specText, "")
   604  	c.Assert(err, IsNil)
   605  	c.Assert(len(tokens), Equals, 1)
   606  
   607  	c.Assert(tokens[0].Kind, Equals, gauge.StepKind)
   608  	c.Assert(tokens[0].Value, Equals, "step1 second line {static} third line {dynamic}")
   609  	c.Assert(len(tokens[0].Args), Equals, 2)
   610  }
   611  
   612  func (s *MySuite) TestParsingMultilineStepWithTableParam(c *C) {
   613  	env.AllowMultiLineStep = func() bool { return true }
   614  	parser := new(SpecParser)
   615  	specText := newSpecBuilder().
   616  		step("step1").
   617  		text("second line").
   618  		text("").
   619  		tableHeader("foo|bar").
   620  		tableRow("somerow|another").String()
   621  
   622  	tokens, err := parser.GenerateTokens(specText, "")
   623  	c.Assert(err, IsNil)
   624  	c.Assert(len(tokens), Equals, 3)
   625  
   626  	c.Assert(tokens[0].Kind, Equals, gauge.StepKind)
   627  	c.Assert(tokens[1].Kind, Equals, gauge.TableHeader)
   628  	c.Assert(tokens[2].Kind, Equals, gauge.TableRow)
   629  }
   630  
   631  func (s *MySuite) TestParsingMultilineStepScenarioNext(c *C) {
   632  	env.AllowMultiLineStep = func() bool { return true }
   633  	parser := new(SpecParser)
   634  	specText := newSpecBuilder().
   635  		step("step1").
   636  		text("Scenario1").
   637  		text("---------").String()
   638  
   639  	tokens, err := parser.GenerateTokens(specText, "")
   640  	c.Assert(err, IsNil)
   641  	c.Assert(len(tokens), Equals, 2)
   642  
   643  	c.Assert(tokens[0].Kind, Equals, gauge.StepKind)
   644  	c.Assert(tokens[0].Value, Equals, "step1 Scenario1")
   645  	c.Assert(tokens[1].Kind, Equals, gauge.CommentKind)
   646  }
   647  
   648  func (s *MySuite) TestParsingMultilineStepWithSpecNext(c *C) {
   649  	env.AllowMultiLineStep = func() bool { return true }
   650  	parser := new(SpecParser)
   651  	specText := newSpecBuilder().
   652  		step("step1").
   653  		text("Concept1").
   654  		text("========").String()
   655  
   656  	tokens, err := parser.GenerateTokens(specText, "")
   657  	c.Assert(err, IsNil)
   658  	c.Assert(len(tokens), Equals, 2)
   659  
   660  	c.Assert(tokens[0].Kind, Equals, gauge.StepKind)
   661  	c.Assert(tokens[0].Value, Equals, "step1 Concept1")
   662  	c.Assert(tokens[1].Kind, Equals, gauge.CommentKind)
   663  
   664  }
   665  
   666  func (s *MySuite) TestParsingSpecWithTearDownSteps(c *C) {
   667  	parser := new(SpecParser)
   668  	specText := newSpecBuilder().specHeading("A spec heading").
   669  		text("Hello, i am a comment").
   670  		scenarioHeading("First flow").
   671  		step("another").
   672  		text("_____").
   673  		step("step1").
   674  		step("step2").String()
   675  
   676  	tokens, err := parser.GenerateTokens(specText, "")
   677  	c.Assert(err, IsNil)
   678  	c.Assert(len(tokens), Equals, 7)
   679  
   680  	c.Assert(tokens[0].Kind, Equals, gauge.SpecKind)
   681  	c.Assert(tokens[1].Kind, Equals, gauge.CommentKind)
   682  
   683  	c.Assert(tokens[2].Kind, Equals, gauge.ScenarioKind)
   684  	c.Assert(tokens[3].Kind, Equals, gauge.StepKind)
   685  	c.Assert(tokens[3].Value, Equals, "another")
   686  	c.Assert(tokens[4].Kind, Equals, gauge.TearDownKind)
   687  
   688  	c.Assert(tokens[5].Kind, Equals, gauge.StepKind)
   689  	c.Assert(tokens[5].Value, Equals, "step1")
   690  	c.Assert(tokens[6].Kind, Equals, gauge.StepKind)
   691  	c.Assert(tokens[6].Value, Equals, "step2")
   692  }