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 }