From 38745f21cfea67250b45ad85ccf7923bdf5f05de Mon Sep 17 00:00:00 2001 From: ilslv <47687266+ilslv@users.noreply.github.com> Date: Tue, 25 Oct 2022 12:59:40 +0200 Subject: [PATCH] Fix `@retry`, `@serial` and `@allow.skipped` tags semantics inheritance (#237) --- CHANGELOG.md | 9 +++++++- book/src/writing/tags.md | 6 +++-- src/cucumber.rs | 5 +---- src/runner/basic.rs | 22 +++++++++++-------- src/writer/fail_on_skipped.rs | 8 +++++-- ...outline_with_tags_and_comments.feature.out | 20 ++++++++--------- 6 files changed, 42 insertions(+), 28 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e1ca12cb..42edfd73 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,10 +11,17 @@ All user visible changes to `cucumber` crate will be documented in this file. Th [Diff](/../../compare/v0.15.1...v0.15.2) | [Milestone](/../../milestone/17) +### Changed + +- Upgraded [`gherkin`] crate to 0.13 version. ([4cad49f8]) + ### Fixed -- Parsing error on a `Feature` having comment and tag simultaneously. ([cucumber-rs/gherkin#37], [cucumber-rs/gherkin#35]) +- Parsing error on a `Feature` having comment and tag simultaneously. ([4cad49f8], [cucumber-rs/gherkin#37], [cucumber-rs/gherkin#35]) +- `@retry`, `@serial` and `@allow.skipped` tags semantics inheritance. ([#237]) +[#237]: /../../pull/237 +[4cad49f8]: /../../commit/4cad49f8d8f5d0458dcb538aa044a5fff1e6fa10 [cucumber-rs/gherkin#35]: https://github.com/cucumber-rs/gherkin/issues/35 [cucumber-rs/gherkin#37]: https://github.com/cucumber-rs/gherkin/pull/37 diff --git a/book/src/writing/tags.md b/book/src/writing/tags.md index 19d0ce36..adbc28ba 100644 --- a/book/src/writing/tags.md +++ b/book/src/writing/tags.md @@ -43,6 +43,7 @@ To filter out running [scenario]s we may use: [Tags][tag] may be placed above the following [Gherkin] elements: - [`Feature`][feature] +- [`Rule`][rule] - [`Scenario`][scenario] - [`Scenario Outline`] - [`Examples`] @@ -50,7 +51,7 @@ To filter out running [scenario]s we may use: It's _not_ possible to place [tag]s above [`Background`](background.md) or [step]s (`Given`, `When`, `Then`, `And` and `But`). [Tags][tag] are inherited by child elements: -- [`Feature`][feature] [tag]s will be inherited by [`Scenario`][scenario], [`Scenario Outline`], or [`Examples`]. +- [`Feature`][feature] and [`Rule`][rule] [tag]s will be inherited by [`Scenario`][scenario], [`Scenario Outline`], or [`Examples`]. - [`Scenario Outline`] [tag]s will be inherited by [`Examples`]. ```gherkin @@ -221,7 +222,8 @@ Feature: Animal feature [escaping]: https://github.com/cucumber/tag-expressions/tree/6f444830b23bd8e0c5a2617cd51b91bc2e05adde#escaping [feature]: https://cucumber.io/docs/gherkin/reference#feature [Gherkin]: https://cucumber.io/docs/gherkin/reference +[rule]: https://cucumber.io/docs/gherkin/reference#rule [scenario]: https://cucumber.io/docs/gherkin/reference#example +[step]: https://cucumber.io/docs/gherkin/reference#steps [tag]: https://cucumber.io/docs/cucumber/api#tags [tag expressions]: https://cucumber.io/docs/cucumber/api#tag-expressions -[step]: https://cucumber.io/docs/gherkin/reference#steps diff --git a/src/cucumber.rs b/src/cucumber.rs index 77dc023e..7d4125c4 100644 --- a/src/cucumber.rs +++ b/src/cucumber.rs @@ -731,10 +731,7 @@ where tags.eval( feat.tags .iter() - .chain( - rule.into_iter() - .flat_map(|r| r.tags.iter()), - ) + .chain(rule.iter().flat_map(|r| &r.tags)) .chain(scenario.tags.iter()), ) }, diff --git a/src/runner/basic.rs b/src/runner/basic.rs index 03c9634b..9f679eae 100644 --- a/src/runner/basic.rs +++ b/src/runner/basic.rs @@ -170,7 +170,11 @@ impl RetryOptions { let apply_cli = |options: Option<_>| { let matched = cli.retry_tag_filter.as_ref().map_or_else( || cli.retry.is_some() || cli.retry_after.is_some(), - |op| op.eval(&scenario.tags), + |op| { + op.eval(scenario.tags.iter().chain( + rule.iter().flat_map(|r| &r.tags).chain(&feature.tags), + )) + }, ); (options.is_some() || matched).then(|| Self { @@ -388,14 +392,14 @@ impl fmt::Debug for Basic { impl Default for Basic { fn default() -> Self { - let which_scenario: WhichScenarioFn = |_, _, scenario| { - let has_serial_tag = - scenario.tags.iter().any(|tag| tag == "serial"); - if has_serial_tag { - ScenarioType::Serial - } else { - ScenarioType::Concurrent - } + let which_scenario: WhichScenarioFn = |feature, rule, scenario| { + scenario + .tags + .iter() + .chain(rule.iter().flat_map(|r| &r.tags)) + .chain(&feature.tags) + .find(|tag| *tag == "serial") + .map_or(ScenarioType::Concurrent, |_| ScenarioType::Serial) }; Self { diff --git a/src/writer/fail_on_skipped.rs b/src/writer/fail_on_skipped.rs index ecb7a6d6..f8b5f402 100644 --- a/src/writer/fail_on_skipped.rs +++ b/src/writer/fail_on_skipped.rs @@ -209,8 +209,12 @@ impl From for FailOnSkipped { fn from(writer: Writer) -> Self { Self { writer, - should_fail: |_, _, sc| { - !sc.tags.iter().any(|t| t == "allow.skipped") + should_fail: |feat, rule, sc| { + !sc.tags + .iter() + .chain(rule.iter().flat_map(|r| &r.tags)) + .chain(&feat.tags) + .any(|t| t == "allow.skipped") }, } } diff --git a/tests/features/output/scenario_outline_with_tags_and_comments.feature.out b/tests/features/output/scenario_outline_with_tags_and_comments.feature.out index 9699889f..311026c4 100644 --- a/tests/features/output/scenario_outline_with_tags_and_comments.feature.out +++ b/tests/features/output/scenario_outline_with_tags_and_comments.feature.out @@ -1,13 +1,13 @@ ParsingFinished { features: 1, rules: 0, scenarios: 1, steps: 3, parser_errors: 0 } Started -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Started) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Started, retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Step(Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Started), retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Step(Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Passed(CaptureLocations(Locations([Some(0), Some(8), Some(7), Some(8)])), Some(Location { line: 12, column: 1 }))), retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Step(Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Started), retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Step(Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Passed(CaptureLocations(Locations([Some(0), Some(8), Some(7), Some(8)])), Some(Location { line: 13, column: 1 }))), retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Step(Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }, Started), retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Step(Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }, Passed(CaptureLocations(Locations([Some(0), Some(8), Some(7), Some(8)])), Some(Location { line: 14, column: 1 }))), retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }, RetryableScenario { event: Finished, retries: None })) -Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 9 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 11 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Finished) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Started) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Started, retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Step(Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Started), retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Step(Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Passed(CaptureLocations(Locations([Some(0), Some(8), Some(7), Some(8)])), Some(Location { line: 12, column: 1 }))), retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Step(Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Started), retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Step(Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Passed(CaptureLocations(Locations([Some(0), Some(8), Some(7), Some(8)])), Some(Location { line: 13, column: 1 }))), retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Step(Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }, Started), retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Step(Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }, Passed(CaptureLocations(Locations([Some(0), Some(8), Some(7), Some(8)])), Some(Location { line: 14, column: 1 }))), retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Scenario(Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }, RetryableScenario { event: Finished, retries: None })) +Feature(Feature { keyword: "Feature", name: "Outline", description: None, background: None, scenarios: [Scenario { keyword: "Scenario Outline", name: "foo", description: None, steps: [Step { keyword: "Given ", ty: Given, value: "foo is 0", docstring: None, table: None, position: LineCol { line: 5 } }, Step { keyword: "When ", ty: When, value: "foo is 1", docstring: None, table: None, position: LineCol { line: 6 } }, Step { keyword: "Then ", ty: Then, value: "foo is 2", docstring: None, table: None, position: LineCol { line: 7 } }], examples: [Examples { keyword: "Examples", name: None, description: None, table: Some(Table { rows: [["bar1", "bar2", "bar3"], ["0", "1", "2"]], position: LineCol { line: 13 } }), tags: ["#examples()"], position: LineCol { line: 12 } }], tags: ["original", "merged.tag", "#examples()"], position: LineCol { line: 14 } }], rules: [], tags: [], position: LineCol { line: 1 }, }, Finished) Finished