From 62fdbc0d65521355ed0df0782edd12430277af42 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Thu, 17 Jul 2025 18:39:01 +0200 Subject: [PATCH 01/15] Add location to pickle --- java/pom.xml | 2 +- .../io/cucumber/gherkin/PickleCompiler.java | 6 +- .../good/background.feature.pickles.ndjson | 4 +- .../complex_background.feature.pickles.ndjson | 8 +- .../good/datatables.feature.pickles.ndjson | 2 +- ...bles_with_new_lines.feature.pickles.ndjson | 2 +- .../good/descriptions.feature.pickles.ndjson | 16 +- ...tions_with_comments.feature.pickles.ndjson | 14 +- .../good/docstrings.feature.pickles.ndjson | 2 +- .../good/escaped_pipes.feature.pickles.ndjson | 2 +- ...mple_token_multiple.feature.pickles.ndjson | 2 +- ...e_tokens_everywhere.feature.pickles.ndjson | 4 +- ...extra_table_content.feature.pickles.ndjson | 2 +- .../good/i18n_emoji.feature.pickles.ndjson | 2 +- testdata/good/i18n_fr.feature.pickles.ndjson | 22 +- testdata/good/i18n_no.feature.pickles.ndjson | 2 +- ...mplete_background_1.feature.pickles.ndjson | 2 +- ...mplete_background_2.feature.pickles.ndjson | 2 +- ...incomplete_scenario.feature.pickles.ndjson | 2 +- ...te_scenario_outline.feature.pickles.ndjson | 6 +- testdata/good/language.feature.pickles.ndjson | 2 +- .../minimal-example.feature.pickles.ndjson | 2 +- testdata/good/minimal.feature.pickles.ndjson | 2 +- .../padded_example.feature.pickles.ndjson | 2 +- .../prefixed-keywords.feature.pickles.ndjson | 2 +- .../readme_example.feature.pickles.ndjson | 4 +- testdata/good/rule.feature.pickles.ndjson | 4 +- .../good/rule_with_tag.feature.pickles.ndjson | 8 +- ...ame_and_description.feature.pickles.ndjson | 2 +- .../scenario_outline.feature.pickles.ndjson | 2 +- ..._outline_no_newline.feature.pickles.ndjson | 2 +- ...line_with_docstring.feature.pickles.ndjson | 4 +- ...ue_with_dollar_sign.feature.pickles.ndjson | 2 +- ..._trailing_backslash.feature.pickles.ndjson | 2 +- ..._outlines_with_tags.feature.pickles.ndjson | 4 +- .../several_examples.feature.pickles.ndjson | 6 +- ...th_scenario_outline.feature.pickles.ndjson | 4 +- testdata/good/tags.feature.pickles.ndjson | 12 +- .../good/very_long.feature.pickles.ndjson | 200 +++++++++--------- 39 files changed, 186 insertions(+), 184 deletions(-) diff --git a/java/pom.xml b/java/pom.xml index 9a695e568..411eece7f 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -49,7 +49,7 @@ io.cucumber messages - [19.1.4,29.0.0) + [28.0.1-SNAPSHOT,29.0.0) diff --git a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java index 935ec3c24..d33d4ae0c 100644 --- a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java +++ b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java @@ -126,7 +126,8 @@ private void compileScenario(List pickles, Scenario scenario, List language, steps, pickleTags(scenarioTags), - sourceIds + sourceIds, + scenario.getLocation() ); pickles.add(pickle); } @@ -174,7 +175,8 @@ private void compileScenarioOutline(List pickles, Scenario scenario, Lis language, steps, pickleTags(tags), - sourceIds + sourceIds, + valuesRow.getLocation() ); pickles.add(pickle); diff --git a/testdata/good/background.feature.pickles.ndjson b/testdata/good/background.feature.pickles.ndjson index 8a69f09e5..9476ae819 100644 --- a/testdata/good/background.feature.pickles.ndjson +++ b/testdata/good/background.feature.pickles.ndjson @@ -1,2 +1,2 @@ -{"pickle":{"astNodeIds":["3"],"id":"8","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"6","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["2"],"id":"7","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/background.feature"}} -{"pickle":{"astNodeIds":["5"],"id":"11","language":"en","name":"also minimalistic","steps":[{"astNodeIds":["0"],"id":"9","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["4"],"id":"10","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/background.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"8","language":"en","location":{"column":3,"line":7},"name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"6","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["2"],"id":"7","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/background.feature"}} +{"pickle":{"astNodeIds":["5"],"id":"11","language":"en","location":{"column":3,"line":10},"name":"also minimalistic","steps":[{"astNodeIds":["0"],"id":"9","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["4"],"id":"10","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/background.feature"}} diff --git a/testdata/good/complex_background.feature.pickles.ndjson b/testdata/good/complex_background.feature.pickles.ndjson index 693a0a08e..2c2967a6c 100644 --- a/testdata/good/complex_background.feature.pickles.ndjson +++ b/testdata/good/complex_background.feature.pickles.ndjson @@ -1,4 +1,4 @@ -{"pickle":{"astNodeIds":["3"],"id":"17","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"15","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["2"],"id":"16","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} -{"pickle":{"astNodeIds":["5"],"id":"20","language":"en","name":"also minimalistic","steps":[{"astNodeIds":["0"],"id":"18","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["4"],"id":"19","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} -{"pickle":{"astNodeIds":["13","10"],"id":"24","language":"en","name":"with examples","steps":[{"astNodeIds":["0"],"id":"21","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["6"],"id":"22","text":"a rule background step","type":"Context"},{"astNodeIds":["8","10"],"id":"23","text":"the 1 minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} -{"pickle":{"astNodeIds":["13","11"],"id":"28","language":"en","name":"with examples","steps":[{"astNodeIds":["0"],"id":"25","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["6"],"id":"26","text":"a rule background step","type":"Context"},{"astNodeIds":["8","11"],"id":"27","text":"the 2 minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"17","language":"en","location":{"column":3,"line":7},"name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"15","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["2"],"id":"16","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} +{"pickle":{"astNodeIds":["5"],"id":"20","language":"en","location":{"column":3,"line":10},"name":"also minimalistic","steps":[{"astNodeIds":["0"],"id":"18","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["4"],"id":"19","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} +{"pickle":{"astNodeIds":["13","10"],"id":"24","language":"en","location":{"column":7,"line":23},"name":"with examples","steps":[{"astNodeIds":["0"],"id":"21","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["6"],"id":"22","text":"a rule background step","type":"Context"},{"astNodeIds":["8","10"],"id":"23","text":"the 1 minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} +{"pickle":{"astNodeIds":["13","11"],"id":"28","language":"en","location":{"column":7,"line":24},"name":"with examples","steps":[{"astNodeIds":["0"],"id":"25","text":"the minimalism inside a background","type":"Context"},{"astNodeIds":["6"],"id":"26","text":"a rule background step","type":"Context"},{"astNodeIds":["8","11"],"id":"27","text":"the 2 minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/complex_background.feature"}} diff --git a/testdata/good/datatables.feature.pickles.ndjson b/testdata/good/datatables.feature.pickles.ndjson index 1c0367fe0..fb40817e7 100644 --- a/testdata/good/datatables.feature.pickles.ndjson +++ b/testdata/good/datatables.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["13"],"id":"19","language":"en","name":"minimalistic","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["2"],"id":"14","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["4"],"id":"15","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["6"],"id":"16","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["8"],"id":"17","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["12"],"id":"18","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/datatables.feature"}} +{"pickle":{"astNodeIds":["13"],"id":"19","language":"en","location":{"column":3,"line":3},"name":"minimalistic","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["2"],"id":"14","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["4"],"id":"15","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["6"],"id":"16","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["8"],"id":"17","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["12"],"id":"18","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/datatables.feature"}} diff --git a/testdata/good/datatables_with_new_lines.feature.pickles.ndjson b/testdata/good/datatables_with_new_lines.feature.pickles.ndjson index 70515fa1a..3af926370 100644 --- a/testdata/good/datatables_with_new_lines.feature.pickles.ndjson +++ b/testdata/good/datatables_with_new_lines.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["4"],"id":"7","language":"en","name":"some whitespace is important","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"\nraindrops--\nher last kiss\ngoodbye.\n"}]}]}},"astNodeIds":["1"],"id":"5","text":"3 lines of poetry on 5 lines","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"lost i n space"}]}]}},"astNodeIds":["3"],"id":"6","text":"an example of negative space","type":"Context"}],"tags":[],"uri":"../testdata/good/datatables_with_new_lines.feature"}} +{"pickle":{"astNodeIds":["4"],"id":"7","language":"en","location":{"column":3,"line":3},"name":"some whitespace is important","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"\nraindrops--\nher last kiss\ngoodbye.\n"}]}]}},"astNodeIds":["1"],"id":"5","text":"3 lines of poetry on 5 lines","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"lost i n space"}]}]}},"astNodeIds":["3"],"id":"6","text":"an example of negative space","type":"Context"}],"tags":[],"uri":"../testdata/good/datatables_with_new_lines.feature"}} diff --git a/testdata/good/descriptions.feature.pickles.ndjson b/testdata/good/descriptions.feature.pickles.ndjson index d006434eb..7aed05976 100644 --- a/testdata/good/descriptions.feature.pickles.ndjson +++ b/testdata/good/descriptions.feature.pickles.ndjson @@ -1,8 +1,8 @@ -{"pickle":{"astNodeIds":["1"],"id":"20","language":"en","name":"two lines","steps":[{"astNodeIds":["0"],"id":"19","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} -{"pickle":{"astNodeIds":["3"],"id":"22","language":"en","name":"without indentation","steps":[{"astNodeIds":["2"],"id":"21","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} -{"pickle":{"astNodeIds":["5"],"id":"24","language":"en","name":"empty lines in the middle","steps":[{"astNodeIds":["4"],"id":"23","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} -{"pickle":{"astNodeIds":["7"],"id":"26","language":"en","name":"empty lines around","steps":[{"astNodeIds":["6"],"id":"25","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} -{"pickle":{"astNodeIds":["9"],"id":"28","language":"en","name":"comment after description","steps":[{"astNodeIds":["8"],"id":"27","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} -{"pickle":{"astNodeIds":["11"],"id":"30","language":"en","name":"comment right after description","steps":[{"astNodeIds":["10"],"id":"29","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} -{"pickle":{"astNodeIds":["13"],"id":"32","language":"en","name":"description with escaped docstring separator","steps":[{"astNodeIds":["12"],"id":"31","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} -{"pickle":{"astNodeIds":["18","16"],"id":"34","language":"en","name":"scenario outline with a description","steps":[{"astNodeIds":["14","16"],"id":"33","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"20","language":"en","location":{"column":3,"line":4},"name":"two lines","steps":[{"astNodeIds":["0"],"id":"19","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"22","language":"en","location":{"column":1,"line":9},"name":"without indentation","steps":[{"astNodeIds":["2"],"id":"21","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["5"],"id":"24","language":"en","location":{"column":3,"line":13},"name":"empty lines in the middle","steps":[{"astNodeIds":["4"],"id":"23","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["7"],"id":"26","language":"en","location":{"column":3,"line":19},"name":"empty lines around","steps":[{"astNodeIds":["6"],"id":"25","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["9"],"id":"28","language":"en","location":{"column":3,"line":26},"name":"comment after description","steps":[{"astNodeIds":["8"],"id":"27","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["11"],"id":"30","language":"en","location":{"column":3,"line":33},"name":"comment right after description","steps":[{"astNodeIds":["10"],"id":"29","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["13"],"id":"32","language":"en","location":{"column":3,"line":40},"name":"description with escaped docstring separator","steps":[{"astNodeIds":["12"],"id":"31","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} +{"pickle":{"astNodeIds":["18","16"],"id":"34","language":"en","location":{"column":5,"line":52},"name":"scenario outline with a description","steps":[{"astNodeIds":["14","16"],"id":"33","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions.feature"}} diff --git a/testdata/good/descriptions_with_comments.feature.pickles.ndjson b/testdata/good/descriptions_with_comments.feature.pickles.ndjson index 5624b116b..bf38608f8 100644 --- a/testdata/good/descriptions_with_comments.feature.pickles.ndjson +++ b/testdata/good/descriptions_with_comments.feature.pickles.ndjson @@ -1,7 +1,7 @@ -{"pickle":{"astNodeIds":["1"],"id":"18","language":"en","name":"two lines","steps":[{"astNodeIds":["0"],"id":"17","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} -{"pickle":{"astNodeIds":["3"],"id":"20","language":"en","name":"without indentation","steps":[{"astNodeIds":["2"],"id":"19","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} -{"pickle":{"astNodeIds":["5"],"id":"22","language":"en","name":"empty lines in the middle","steps":[{"astNodeIds":["4"],"id":"21","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} -{"pickle":{"astNodeIds":["7"],"id":"24","language":"en","name":"empty lines around","steps":[{"astNodeIds":["6"],"id":"23","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} -{"pickle":{"astNodeIds":["12","10"],"id":"26","language":"en","name":"scenario outline with a description","steps":[{"astNodeIds":["8","10"],"id":"25","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} -{"pickle":{"astNodeIds":["14"],"id":"28","language":"en","name":"scenario with just a comment","steps":[{"astNodeIds":["13"],"id":"27","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} -{"pickle":{"astNodeIds":["16"],"id":"30","language":"en","name":"scenario with a comment with new lines around","steps":[{"astNodeIds":["15"],"id":"29","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"18","language":"en","location":{"column":3,"line":7},"name":"two lines","steps":[{"astNodeIds":["0"],"id":"17","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"20","language":"en","location":{"column":1,"line":14},"name":"without indentation","steps":[{"astNodeIds":["2"],"id":"19","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} +{"pickle":{"astNodeIds":["5"],"id":"22","language":"en","location":{"column":3,"line":22},"name":"empty lines in the middle","steps":[{"astNodeIds":["4"],"id":"21","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} +{"pickle":{"astNodeIds":["7"],"id":"24","language":"en","location":{"column":3,"line":29},"name":"empty lines around","steps":[{"astNodeIds":["6"],"id":"23","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} +{"pickle":{"astNodeIds":["12","10"],"id":"26","language":"en","location":{"column":5,"line":54},"name":"scenario outline with a description","steps":[{"astNodeIds":["8","10"],"id":"25","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} +{"pickle":{"astNodeIds":["14"],"id":"28","language":"en","location":{"column":3,"line":56},"name":"scenario with just a comment","steps":[{"astNodeIds":["13"],"id":"27","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} +{"pickle":{"astNodeIds":["16"],"id":"30","language":"en","location":{"column":3,"line":60},"name":"scenario with a comment with new lines around","steps":[{"astNodeIds":["15"],"id":"29","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/descriptions_with_comments.feature"}} diff --git a/testdata/good/docstrings.feature.pickles.ndjson b/testdata/good/docstrings.feature.pickles.ndjson index c228d93b9..1e1d18713 100644 --- a/testdata/good/docstrings.feature.pickles.ndjson +++ b/testdata/good/docstrings.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["8"],"id":"17","language":"en","name":"minimalistic","steps":[{"argument":{"docString":{"content":"first line (no indent)\n second line (indented with two spaces)\n\nthird line was empty"}},"astNodeIds":["0"],"id":"9","text":"a simple DocString","type":"Context"},{"argument":{"docString":{"content":"\n \n","mediaType":"xml"}},"astNodeIds":["1"],"id":"10","text":"a DocString with content type","type":"Context"},{"argument":{"docString":{"content":"wrongly indented line"}},"astNodeIds":["2"],"id":"11","text":"a DocString with wrong indentation","type":"Context"},{"argument":{"docString":{"content":"first line\nsecond line"}},"astNodeIds":["3"],"id":"12","text":"a DocString with alternative separator","type":"Context"},{"argument":{"docString":{"content":"first line\n\"\"\"\nthird line"}},"astNodeIds":["4"],"id":"13","text":"a DocString with normal separator inside","type":"Context"},{"argument":{"docString":{"content":"first line\n```\nthird line"}},"astNodeIds":["5"],"id":"14","text":"a DocString with alternative separator inside","type":"Context"},{"argument":{"docString":{"content":"first line\n\"\"\"\nthird line"}},"astNodeIds":["6"],"id":"15","text":"a DocString with escaped separator inside","type":"Context"},{"argument":{"docString":{"content":"first line\n```\nthird line"}},"astNodeIds":["7"],"id":"16","text":"a DocString with an escaped alternative separator inside","type":"Context"}],"tags":[],"uri":"../testdata/good/docstrings.feature"}} +{"pickle":{"astNodeIds":["8"],"id":"17","language":"en","location":{"column":3,"line":3},"name":"minimalistic","steps":[{"argument":{"docString":{"content":"first line (no indent)\n second line (indented with two spaces)\n\nthird line was empty"}},"astNodeIds":["0"],"id":"9","text":"a simple DocString","type":"Context"},{"argument":{"docString":{"content":"\n \n","mediaType":"xml"}},"astNodeIds":["1"],"id":"10","text":"a DocString with content type","type":"Context"},{"argument":{"docString":{"content":"wrongly indented line"}},"astNodeIds":["2"],"id":"11","text":"a DocString with wrong indentation","type":"Context"},{"argument":{"docString":{"content":"first line\nsecond line"}},"astNodeIds":["3"],"id":"12","text":"a DocString with alternative separator","type":"Context"},{"argument":{"docString":{"content":"first line\n\"\"\"\nthird line"}},"astNodeIds":["4"],"id":"13","text":"a DocString with normal separator inside","type":"Context"},{"argument":{"docString":{"content":"first line\n```\nthird line"}},"astNodeIds":["5"],"id":"14","text":"a DocString with alternative separator inside","type":"Context"},{"argument":{"docString":{"content":"first line\n\"\"\"\nthird line"}},"astNodeIds":["6"],"id":"15","text":"a DocString with escaped separator inside","type":"Context"},{"argument":{"docString":{"content":"first line\n```\nthird line"}},"astNodeIds":["7"],"id":"16","text":"a DocString with an escaped alternative separator inside","type":"Context"}],"tags":[],"uri":"../testdata/good/docstrings.feature"}} diff --git a/testdata/good/escaped_pipes.feature.pickles.ndjson b/testdata/good/escaped_pipes.feature.pickles.ndjson index 222d3adfc..b07c90e3e 100644 --- a/testdata/good/escaped_pipes.feature.pickles.ndjson +++ b/testdata/good/escaped_pipes.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["6"],"id":"9","language":"en","name":"They are the future","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"æ"},{"value":"o"}]},{"cells":[{"value":"a"},{"value":"ø"}]}]}},"astNodeIds":["2"],"id":"7","text":"they have arrived","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"|æ\\n"},{"value":"\\o\no\\"}]},{"cells":[{"value":"\\|a\\\\n"},{"value":"ø\\\nø\\"}]}]}},"astNodeIds":["5"],"id":"8","text":"they have arrived","type":"Context"}],"tags":[],"uri":"../testdata/good/escaped_pipes.feature"}} +{"pickle":{"astNodeIds":["6"],"id":"9","language":"en","location":{"column":3,"line":5},"name":"They are the future","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"æ"},{"value":"o"}]},{"cells":[{"value":"a"},{"value":"ø"}]}]}},"astNodeIds":["2"],"id":"7","text":"they have arrived","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"|æ\\n"},{"value":"\\o\no\\"}]},{"cells":[{"value":"\\|a\\\\n"},{"value":"ø\\\nø\\"}]}]}},"astNodeIds":["5"],"id":"8","text":"they have arrived","type":"Context"}],"tags":[],"uri":"../testdata/good/escaped_pipes.feature"}} diff --git a/testdata/good/example_token_multiple.feature.pickles.ndjson b/testdata/good/example_token_multiple.feature.pickles.ndjson index dbb894ac9..f9f5ba56d 100644 --- a/testdata/good/example_token_multiple.feature.pickles.ndjson +++ b/testdata/good/example_token_multiple.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","name":"Token used twice in a single step","steps":[{"astNodeIds":["0","2"],"id":"5","text":"usage usage","type":"Context"}],"tags":[],"uri":"../testdata/good/example_token_multiple.feature"}} +{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","location":{"column":7,"line":8},"name":"Token used twice in a single step","steps":[{"astNodeIds":["0","2"],"id":"5","text":"usage usage","type":"Context"}],"tags":[],"uri":"../testdata/good/example_token_multiple.feature"}} diff --git a/testdata/good/example_tokens_everywhere.feature.pickles.ndjson b/testdata/good/example_tokens_everywhere.feature.pickles.ndjson index 3d5bc1f37..09a9d68b2 100644 --- a/testdata/good/example_tokens_everywhere.feature.pickles.ndjson +++ b/testdata/good/example_tokens_everywhere.feature.pickles.ndjson @@ -1,2 +1,2 @@ -{"pickle":{"astNodeIds":["7","4"],"id":"10","language":"en","name":"the un","steps":[{"argument":{"docString":{"content":"trois"}},"astNodeIds":["0","4"],"id":"8","text":"the deux:","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"cinq"}]}]}},"astNodeIds":["2","4"],"id":"9","text":"the quatre:","type":"Context"}],"tags":[],"uri":"../testdata/good/example_tokens_everywhere.feature"}} -{"pickle":{"astNodeIds":["7","5"],"id":"13","language":"en","name":"the uno","steps":[{"argument":{"docString":{"content":"tres"}},"astNodeIds":["0","5"],"id":"11","text":"the dos:","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"cinco"}]}]}},"astNodeIds":["2","5"],"id":"12","text":"the quatro:","type":"Context"}],"tags":[],"uri":"../testdata/good/example_tokens_everywhere.feature"}} +{"pickle":{"astNodeIds":["7","4"],"id":"10","language":"en","location":{"column":7,"line":13},"name":"the un","steps":[{"argument":{"docString":{"content":"trois"}},"astNodeIds":["0","4"],"id":"8","text":"the deux:","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"cinq"}]}]}},"astNodeIds":["2","4"],"id":"9","text":"the quatre:","type":"Context"}],"tags":[],"uri":"../testdata/good/example_tokens_everywhere.feature"}} +{"pickle":{"astNodeIds":["7","5"],"id":"13","language":"en","location":{"column":7,"line":14},"name":"the uno","steps":[{"argument":{"docString":{"content":"tres"}},"astNodeIds":["0","5"],"id":"11","text":"the dos:","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"cinco"}]}]}},"astNodeIds":["2","5"],"id":"12","text":"the quatro:","type":"Context"}],"tags":[],"uri":"../testdata/good/example_tokens_everywhere.feature"}} diff --git a/testdata/good/extra_table_content.feature.pickles.ndjson b/testdata/good/extra_table_content.feature.pickles.ndjson index f2f26999b..e96d364a1 100644 --- a/testdata/good/extra_table_content.feature.pickles.ndjson +++ b/testdata/good/extra_table_content.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle": {"astNodeIds": ["3"], "id": "5", "language": "en", "name": "We're a bit extra", "steps": [{"argument": {"dataTable": {"rows": [{"cells": [{"value": "Luffy"}, {"value": "Zorro"}]}, {"cells": [{"value": "Nami"}, {"value": "Brook"}]}]}}, "astNodeIds": ["2"], "id": "4", "text": "a pirate crew", "type": "Context"}], "tags": [], "uri": "../testdata/good/extra_table_content.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"5","language":"en","location":{"column":3,"line":9},"name":"We're a bit extra","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"Luffy"},{"value":"Zorro"}]},{"cells":[{"value":"Nami"},{"value":"Brook"}]}]}},"astNodeIds":["2"],"id":"4","text":"a pirate crew","type":"Context"}],"tags":[],"uri":"../testdata/good/extra_table_content.feature"}} diff --git a/testdata/good/i18n_emoji.feature.pickles.ndjson b/testdata/good/i18n_emoji.feature.pickles.ndjson index 36e787540..b62ca43cd 100644 --- a/testdata/good/i18n_emoji.feature.pickles.ndjson +++ b/testdata/good/i18n_emoji.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["1"],"id":"3","language":"em","name":"💃","steps":[{"astNodeIds":["0"],"id":"2","text":"🎸","type":"Context"}],"tags":[],"uri":"../testdata/good/i18n_emoji.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"3","language":"em","location":{"column":3,"line":4},"name":"💃","steps":[{"astNodeIds":["0"],"id":"2","text":"🎸","type":"Context"}],"tags":[],"uri":"../testdata/good/i18n_emoji.feature"}} diff --git a/testdata/good/i18n_fr.feature.pickles.ndjson b/testdata/good/i18n_fr.feature.pickles.ndjson index a10347c05..cdcb326fb 100644 --- a/testdata/good/i18n_fr.feature.pickles.ndjson +++ b/testdata/good/i18n_fr.feature.pickles.ndjson @@ -1,11 +1,11 @@ -{"pickle":{"astNodeIds":["3"],"id":"53","language":"fr","name":"Support des caractères spéciaux","steps":[{"astNodeIds":["0"],"id":"50","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["1"],"id":"51","text":"j'ai 1 gâteau","type":"Action"},{"astNodeIds":["2"],"id":"52","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["7"],"id":"57","language":"fr","name":"Support du mot-clef \"Etant donné que \"","steps":[{"astNodeIds":["4"],"id":"54","text":"j'aime les gâteaux","type":"Context"},{"astNodeIds":["5"],"id":"55","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["6"],"id":"56","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["11"],"id":"61","language":"fr","name":"Support du mot-clef \"Etant donné qu'\"","steps":[{"astNodeIds":["8"],"id":"58","text":"offrir un gâteau rend heureux","type":"Context"},{"astNodeIds":["9"],"id":"59","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["10"],"id":"60","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["15"],"id":"65","language":"fr","name":"Support du mot-clef \"Étant donné que \"","steps":[{"astNodeIds":["12"],"id":"62","text":"j'aime les gâteaux","type":"Context"},{"astNodeIds":["13"],"id":"63","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["14"],"id":"64","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["19"],"id":"69","language":"fr","name":"Support du mot-clef \"Étant donné qu'\"","steps":[{"astNodeIds":["16"],"id":"66","text":"offrir un gâteau rend heureux","type":"Context"},{"astNodeIds":["17"],"id":"67","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["18"],"id":"68","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["24"],"id":"74","language":"fr","name":"Support du mot-clef \"Et que \"","steps":[{"astNodeIds":["20"],"id":"70","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["21"],"id":"71","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["22"],"id":"72","text":"quelqu'un m'offre 1 gâteau","type":"Action"},{"astNodeIds":["23"],"id":"73","text":"j'ai 3 gâteaux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["29"],"id":"79","language":"fr","name":"Support du mot-clef \"Et qu'\"","steps":[{"astNodeIds":["25"],"id":"75","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["26"],"id":"76","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["27"],"id":"77","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["28"],"id":"78","text":"j'ai 3 gâteaux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["34"],"id":"84","language":"fr","name":"Support du mot-clef \"Et \"","steps":[{"astNodeIds":["30"],"id":"80","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["31"],"id":"81","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["32"],"id":"82","text":"quelqu'un m'offre 1 gâteau","type":"Action"},{"astNodeIds":["33"],"id":"83","text":"j'ai 3 gâteaux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["39"],"id":"89","language":"fr","name":"Support du mot-clef \"Mais que \"","steps":[{"astNodeIds":["35"],"id":"85","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["36"],"id":"86","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["37"],"id":"87","text":"quelqu'un me vole 1 gâteau","type":"Action"},{"astNodeIds":["38"],"id":"88","text":"j'ai 1 gâteau","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["44"],"id":"94","language":"fr","name":"Support du mot-clef \"Mais qu'\"","steps":[{"astNodeIds":["40"],"id":"90","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["41"],"id":"91","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["42"],"id":"92","text":"on me vole 1 gâteau","type":"Action"},{"astNodeIds":["43"],"id":"93","text":"j'ai 1 gâteau","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} -{"pickle":{"astNodeIds":["49"],"id":"99","language":"fr","name":"Support du mot-clef \"Mais \"","steps":[{"astNodeIds":["45"],"id":"95","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["46"],"id":"96","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["47"],"id":"97","text":"quelqu'un me vole 1 gâteau","type":"Action"},{"astNodeIds":["48"],"id":"98","text":"j'ai 1 gâteau","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"53","language":"fr","location":{"column":3,"line":4},"name":"Support des caractères spéciaux","steps":[{"astNodeIds":["0"],"id":"50","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["1"],"id":"51","text":"j'ai 1 gâteau","type":"Action"},{"astNodeIds":["2"],"id":"52","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["7"],"id":"57","language":"fr","location":{"column":3,"line":9},"name":"Support du mot-clef \"Etant donné que \"","steps":[{"astNodeIds":["4"],"id":"54","text":"j'aime les gâteaux","type":"Context"},{"astNodeIds":["5"],"id":"55","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["6"],"id":"56","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["11"],"id":"61","language":"fr","location":{"column":3,"line":14},"name":"Support du mot-clef \"Etant donné qu'\"","steps":[{"astNodeIds":["8"],"id":"58","text":"offrir un gâteau rend heureux","type":"Context"},{"astNodeIds":["9"],"id":"59","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["10"],"id":"60","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["15"],"id":"65","language":"fr","location":{"column":3,"line":19},"name":"Support du mot-clef \"Étant donné que \"","steps":[{"astNodeIds":["12"],"id":"62","text":"j'aime les gâteaux","type":"Context"},{"astNodeIds":["13"],"id":"63","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["14"],"id":"64","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["19"],"id":"69","language":"fr","location":{"column":3,"line":24},"name":"Support du mot-clef \"Étant donné qu'\"","steps":[{"astNodeIds":["16"],"id":"66","text":"offrir un gâteau rend heureux","type":"Context"},{"astNodeIds":["17"],"id":"67","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["18"],"id":"68","text":"je suis heureux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["24"],"id":"74","language":"fr","location":{"column":3,"line":29},"name":"Support du mot-clef \"Et que \"","steps":[{"astNodeIds":["20"],"id":"70","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["21"],"id":"71","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["22"],"id":"72","text":"quelqu'un m'offre 1 gâteau","type":"Action"},{"astNodeIds":["23"],"id":"73","text":"j'ai 3 gâteaux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["29"],"id":"79","language":"fr","location":{"column":3,"line":35},"name":"Support du mot-clef \"Et qu'\"","steps":[{"astNodeIds":["25"],"id":"75","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["26"],"id":"76","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["27"],"id":"77","text":"on m'offre 1 gâteau","type":"Action"},{"astNodeIds":["28"],"id":"78","text":"j'ai 3 gâteaux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["34"],"id":"84","language":"fr","location":{"column":3,"line":41},"name":"Support du mot-clef \"Et \"","steps":[{"astNodeIds":["30"],"id":"80","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["31"],"id":"81","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["32"],"id":"82","text":"quelqu'un m'offre 1 gâteau","type":"Action"},{"astNodeIds":["33"],"id":"83","text":"j'ai 3 gâteaux","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["39"],"id":"89","language":"fr","location":{"column":3,"line":47},"name":"Support du mot-clef \"Mais que \"","steps":[{"astNodeIds":["35"],"id":"85","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["36"],"id":"86","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["37"],"id":"87","text":"quelqu'un me vole 1 gâteau","type":"Action"},{"astNodeIds":["38"],"id":"88","text":"j'ai 1 gâteau","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["44"],"id":"94","language":"fr","location":{"column":3,"line":53},"name":"Support du mot-clef \"Mais qu'\"","steps":[{"astNodeIds":["40"],"id":"90","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["41"],"id":"91","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["42"],"id":"92","text":"on me vole 1 gâteau","type":"Action"},{"astNodeIds":["43"],"id":"93","text":"j'ai 1 gâteau","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} +{"pickle":{"astNodeIds":["49"],"id":"99","language":"fr","location":{"column":3,"line":59},"name":"Support du mot-clef \"Mais \"","steps":[{"astNodeIds":["45"],"id":"95","text":"un exemple de scénario en français","type":"Context"},{"astNodeIds":["46"],"id":"96","text":"j'ai 2 gâteaux","type":"Action"},{"astNodeIds":["47"],"id":"97","text":"quelqu'un me vole 1 gâteau","type":"Action"},{"astNodeIds":["48"],"id":"98","text":"j'ai 1 gâteau","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_fr.feature"}} diff --git a/testdata/good/i18n_no.feature.pickles.ndjson b/testdata/good/i18n_no.feature.pickles.ndjson index e8a3d6af9..a3a1a15ec 100644 --- a/testdata/good/i18n_no.feature.pickles.ndjson +++ b/testdata/good/i18n_no.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["3"],"id":"7","language":"no","name":"Parsing many languages","steps":[{"astNodeIds":["0"],"id":"4","text":"Gherkin supports many languages","type":"Context"},{"astNodeIds":["1"],"id":"5","text":"Norwegian keywords are parsed","type":"Action"},{"astNodeIds":["2"],"id":"6","text":"they should be recognized","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_no.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"7","language":"no","location":{"column":3,"line":4},"name":"Parsing many languages","steps":[{"astNodeIds":["0"],"id":"4","text":"Gherkin supports many languages","type":"Context"},{"astNodeIds":["1"],"id":"5","text":"Norwegian keywords are parsed","type":"Action"},{"astNodeIds":["2"],"id":"6","text":"they should be recognized","type":"Outcome"}],"tags":[],"uri":"../testdata/good/i18n_no.feature"}} diff --git a/testdata/good/incomplete_background_1.feature.pickles.ndjson b/testdata/good/incomplete_background_1.feature.pickles.ndjson index d026ced20..acb482527 100644 --- a/testdata/good/incomplete_background_1.feature.pickles.ndjson +++ b/testdata/good/incomplete_background_1.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["2"],"id":"4","language":"en","name":"still pickles up","steps":[{"astNodeIds":["1"],"id":"3","text":"a step","type":"Unknown"}],"tags":[],"uri":"../testdata/good/incomplete_background_1.feature"}} +{"pickle":{"astNodeIds":["2"],"id":"4","language":"en","location":{"column":3,"line":5},"name":"still pickles up","steps":[{"astNodeIds":["1"],"id":"3","text":"a step","type":"Unknown"}],"tags":[],"uri":"../testdata/good/incomplete_background_1.feature"}} diff --git a/testdata/good/incomplete_background_2.feature.pickles.ndjson b/testdata/good/incomplete_background_2.feature.pickles.ndjson index f48f77cf3..81a507b6c 100644 --- a/testdata/good/incomplete_background_2.feature.pickles.ndjson +++ b/testdata/good/incomplete_background_2.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["2"],"id":"4","language":"en","name":"still pickles up","steps":[{"astNodeIds":["1"],"id":"3","text":"a step","type":"Unknown"}],"tags":[],"uri":"../testdata/good/incomplete_background_2.feature"}} +{"pickle":{"astNodeIds":["2"],"id":"4","language":"en","location":{"column":3,"line":6},"name":"still pickles up","steps":[{"astNodeIds":["1"],"id":"3","text":"a step","type":"Unknown"}],"tags":[],"uri":"../testdata/good/incomplete_background_2.feature"}} diff --git a/testdata/good/incomplete_scenario.feature.pickles.ndjson b/testdata/good/incomplete_scenario.feature.pickles.ndjson index 33a15c25c..59088a562 100644 --- a/testdata/good/incomplete_scenario.feature.pickles.ndjson +++ b/testdata/good/incomplete_scenario.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["2"],"id":"3","language":"en","name":"no steps","steps":[],"tags":[],"uri":"../testdata/good/incomplete_scenario.feature"}} +{"pickle":{"astNodeIds":["2"],"id":"3","language":"en","location":{"column":3,"line":6},"name":"no steps","steps":[],"tags":[],"uri":"../testdata/good/incomplete_scenario.feature"}} diff --git a/testdata/good/incomplete_scenario_outline.feature.pickles.ndjson b/testdata/good/incomplete_scenario_outline.feature.pickles.ndjson index 1721ea8df..c205d3263 100644 --- a/testdata/good/incomplete_scenario_outline.feature.pickles.ndjson +++ b/testdata/good/incomplete_scenario_outline.feature.pickles.ndjson @@ -1,3 +1,3 @@ -{"pickle":{"astNodeIds":["3"],"id":"16","language":"en","name":"steps, no examples","steps":[{"astNodeIds":["0"],"id":"14","text":"a step","type":"Unknown"},{"astNodeIds":["2"],"id":"15","text":"a step","type":"Context"}],"tags":[],"uri":"../testdata/good/incomplete_scenario_outline.feature"}} -{"pickle":{"astNodeIds":["4"],"id":"17","language":"en","name":"no steps, no examples","steps":[],"tags":[],"uri":"../testdata/good/incomplete_scenario_outline.feature"}} -{"pickle":{"astNodeIds":["13","11"],"id":"18","language":"en","name":"no steps, one example header","steps":[],"tags":[],"uri":"../testdata/good/incomplete_scenario_outline.feature"}} +{"pickle":{"astNodeIds":["3"],"id":"16","language":"en","location":{"column":3,"line":6},"name":"steps, no examples","steps":[{"astNodeIds":["0"],"id":"14","text":"a step","type":"Unknown"},{"astNodeIds":["2"],"id":"15","text":"a step","type":"Context"}],"tags":[],"uri":"../testdata/good/incomplete_scenario_outline.feature"}} +{"pickle":{"astNodeIds":["4"],"id":"17","language":"en","location":{"column":3,"line":9},"name":"no steps, no examples","steps":[],"tags":[],"uri":"../testdata/good/incomplete_scenario_outline.feature"}} +{"pickle":{"astNodeIds":["13","11"],"id":"18","language":"en","location":{"column":5,"line":24},"name":"no steps, one example header","steps":[],"tags":[],"uri":"../testdata/good/incomplete_scenario_outline.feature"}} diff --git a/testdata/good/language.feature.pickles.ndjson b/testdata/good/language.feature.pickles.ndjson index 9dec0099a..83f35e7fd 100644 --- a/testdata/good/language.feature.pickles.ndjson +++ b/testdata/good/language.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["1"],"id":"3","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"2","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/language.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"3","language":"en","location":{"column":3,"line":5},"name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"2","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/language.feature"}} diff --git a/testdata/good/minimal-example.feature.pickles.ndjson b/testdata/good/minimal-example.feature.pickles.ndjson index 900f19eb4..609de940f 100644 --- a/testdata/good/minimal-example.feature.pickles.ndjson +++ b/testdata/good/minimal-example.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["1"],"id":"3","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"2","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/minimal-example.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"3","language":"en","location":{"column":3,"line":3},"name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"2","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/minimal-example.feature"}} diff --git a/testdata/good/minimal.feature.pickles.ndjson b/testdata/good/minimal.feature.pickles.ndjson index 95d6757cf..8ed77e7d3 100644 --- a/testdata/good/minimal.feature.pickles.ndjson +++ b/testdata/good/minimal.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["1"],"id":"3","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"2","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/minimal.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"3","language":"en","location":{"column":3,"line":3},"name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"2","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/minimal.feature"}} diff --git a/testdata/good/padded_example.feature.pickles.ndjson b/testdata/good/padded_example.feature.pickles.ndjson index 5fccca8e4..4fdc84859 100644 --- a/testdata/good/padded_example.feature.pickles.ndjson +++ b/testdata/good/padded_example.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["7","5"],"id":"9","language":"en","name":"test","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"type"},{"value":"diameter"}]},{"cells":[{"value":"football"},{"value":"69"}]},{"cells":[{"value":"pool"},{"value":"5.6"}]}]}},"astNodeIds":["3","5"],"id":"8","text":"a red ball with:","type":"Context"}],"tags":[],"uri":"../testdata/good/padded_example.feature"}} +{"pickle":{"astNodeIds":["7","5"],"id":"9","language":"en","location":{"column":7,"line":18},"name":"test","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"type"},{"value":"diameter"}]},{"cells":[{"value":"football"},{"value":"69"}]},{"cells":[{"value":"pool"},{"value":"5.6"}]}]}},"astNodeIds":["3","5"],"id":"8","text":"a red ball with:","type":"Context"}],"tags":[],"uri":"../testdata/good/padded_example.feature"}} diff --git a/testdata/good/prefixed-keywords.feature.pickles.ndjson b/testdata/good/prefixed-keywords.feature.pickles.ndjson index f9bd69950..30a087512 100644 --- a/testdata/good/prefixed-keywords.feature.pickles.ndjson +++ b/testdata/good/prefixed-keywords.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle": {"astNodeIds": ["5"], "id": "11", "language": "ht", "name": "Erasing agent memory", "steps": [{"astNodeIds": ["0"], "id": "6", "text": "there is agent J", "type": "Context"}, {"astNodeIds": ["1"], "id": "7", "text": "there is agent K", "type": "Context"}, {"astNodeIds": ["2"], "id": "8", "text": "I erase agent K's memory", "type": "Action"}, {"astNodeIds": ["3"], "id": "9", "text": "there should be agent J", "type": "Outcome"}, {"astNodeIds": ["4"], "id": "10", "text": "there should not be agent K", "type": "Outcome"}], "tags": [], "uri": "../testdata/good/prefixed-keywords.feature"}} +{"pickle":{"astNodeIds":["5"],"id":"11","language":"ht","location":{"column":3,"line":6},"name":"Erasing agent memory","steps":[{"astNodeIds":["0"],"id":"6","text":"there is agent J","type":"Context"},{"astNodeIds":["1"],"id":"7","text":"there is agent K","type":"Context"},{"astNodeIds":["2"],"id":"8","text":"I erase agent K's memory","type":"Action"},{"astNodeIds":["3"],"id":"9","text":"there should be agent J","type":"Outcome"},{"astNodeIds":["4"],"id":"10","text":"there should not be agent K","type":"Outcome"}],"tags":[],"uri":"../testdata/good/prefixed-keywords.feature"}} diff --git a/testdata/good/readme_example.feature.pickles.ndjson b/testdata/good/readme_example.feature.pickles.ndjson index 479d3c78b..bff89cd1c 100644 --- a/testdata/good/readme_example.feature.pickles.ndjson +++ b/testdata/good/readme_example.feature.pickles.ndjson @@ -1,2 +1,2 @@ -{"pickle":{"astNodeIds":["6","2"],"id":"17","language":"en","name":"","steps":[{"astNodeIds":["0","2"],"id":"16","text":"y","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"4","name":"@b"},{"astNodeId":"5","name":"@c"}],"uri":"../testdata/good/readme_example.feature"}} -{"pickle":{"astNodeIds":["14","9"],"id":"19","language":"en","name":"","steps":[{"astNodeIds":["7","9"],"id":"18","text":"n","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"12","name":"@d"},{"astNodeId":"13","name":"@e"},{"astNodeId":"10","name":"@f"}],"uri":"../testdata/good/readme_example.feature"}} +{"pickle":{"astNodeIds":["6","2"],"id":"17","language":"en","location":{"column":7,"line":9},"name":"","steps":[{"astNodeIds":["0","2"],"id":"16","text":"y","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"4","name":"@b"},{"astNodeId":"5","name":"@c"}],"uri":"../testdata/good/readme_example.feature"}} +{"pickle":{"astNodeIds":["14","9"],"id":"19","language":"en","location":{"column":7,"line":18},"name":"","steps":[{"astNodeIds":["7","9"],"id":"18","text":"n","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"12","name":"@d"},{"astNodeId":"13","name":"@e"},{"astNodeId":"10","name":"@f"}],"uri":"../testdata/good/readme_example.feature"}} diff --git a/testdata/good/rule.feature.pickles.ndjson b/testdata/good/rule.feature.pickles.ndjson index e909fa7a6..11d62f984 100644 --- a/testdata/good/rule.feature.pickles.ndjson +++ b/testdata/good/rule.feature.pickles.ndjson @@ -1,2 +1,2 @@ -{"pickle":{"astNodeIds":["5"],"id":"13","language":"en","name":"Example A","steps":[{"astNodeIds":["0"],"id":"10","text":"fb","type":"Context"},{"astNodeIds":["2"],"id":"11","text":"ab","type":"Context"},{"astNodeIds":["4"],"id":"12","text":"a","type":"Context"}],"tags":[],"uri":"../testdata/good/rule.feature"}} -{"pickle":{"astNodeIds":["8"],"id":"16","language":"en","name":"Example B","steps":[{"astNodeIds":["0"],"id":"14","text":"fb","type":"Context"},{"astNodeIds":["7"],"id":"15","text":"b","type":"Context"}],"tags":[],"uri":"../testdata/good/rule.feature"}} +{"pickle":{"astNodeIds":["5"],"id":"13","language":"en","location":{"column":5,"line":12},"name":"Example A","steps":[{"astNodeIds":["0"],"id":"10","text":"fb","type":"Context"},{"astNodeIds":["2"],"id":"11","text":"ab","type":"Context"},{"astNodeIds":["4"],"id":"12","text":"a","type":"Context"}],"tags":[],"uri":"../testdata/good/rule.feature"}} +{"pickle":{"astNodeIds":["8"],"id":"16","language":"en","location":{"column":5,"line":18},"name":"Example B","steps":[{"astNodeIds":["0"],"id":"14","text":"fb","type":"Context"},{"astNodeIds":["7"],"id":"15","text":"b","type":"Context"}],"tags":[],"uri":"../testdata/good/rule.feature"}} diff --git a/testdata/good/rule_with_tag.feature.pickles.ndjson b/testdata/good/rule_with_tag.feature.pickles.ndjson index 012a40f9a..29c5ed847 100644 --- a/testdata/good/rule_with_tag.feature.pickles.ndjson +++ b/testdata/good/rule_with_tag.feature.pickles.ndjson @@ -1,4 +1,4 @@ -{"pickle":{"astNodeIds":["1"],"id":"19","language":"en","name":"Scenario with only a feature tag","steps":[{"astNodeIds":["0"],"id":"18","text":"a","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"}],"uri":"../testdata/good/rule_with_tag.feature"}} -{"pickle":{"astNodeIds":["4"],"id":"21","language":"en","name":"Scenario with feature and rule tags","steps":[{"astNodeIds":["3"],"id":"20","text":"b","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"},{"astNodeId":"15","name":"@tag_rule"}],"uri":"../testdata/good/rule_with_tag.feature"}} -{"pickle":{"astNodeIds":["7"],"id":"23","language":"en","name":"Scenario with feature, rule and scenario tags","steps":[{"astNodeIds":["5"],"id":"22","text":"b","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"},{"astNodeId":"15","name":"@tag_rule"},{"astNodeId":"6","name":"@tag_scenario"}],"uri":"../testdata/good/rule_with_tag.feature"}} -{"pickle":{"astNodeIds":["14","10"],"id":"25","language":"en","name":"Tagged Scenario outline","steps":[{"astNodeIds":["8","10"],"id":"24","text":"b","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"},{"astNodeId":"15","name":"@tag_rule"},{"astNodeId":"13","name":"@tag_outline"},{"astNodeId":"11","name":"@examples_tag"}],"uri":"../testdata/good/rule_with_tag.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"19","language":"en","location":{"column":5,"line":7},"name":"Scenario with only a feature tag","steps":[{"astNodeIds":["0"],"id":"18","text":"a","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"}],"uri":"../testdata/good/rule_with_tag.feature"}} +{"pickle":{"astNodeIds":["4"],"id":"21","language":"en","location":{"column":5,"line":14},"name":"Scenario with feature and rule tags","steps":[{"astNodeIds":["3"],"id":"20","text":"b","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"},{"astNodeId":"15","name":"@tag_rule"}],"uri":"../testdata/good/rule_with_tag.feature"}} +{"pickle":{"astNodeIds":["7"],"id":"23","language":"en","location":{"column":5,"line":18},"name":"Scenario with feature, rule and scenario tags","steps":[{"astNodeIds":["5"],"id":"22","text":"b","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"},{"astNodeId":"15","name":"@tag_rule"},{"astNodeId":"6","name":"@tag_scenario"}],"uri":"../testdata/good/rule_with_tag.feature"}} +{"pickle":{"astNodeIds":["14","10"],"id":"25","language":"en","location":{"column":9,"line":28},"name":"Tagged Scenario outline","steps":[{"astNodeIds":["8","10"],"id":"24","text":"b","type":"Context"}],"tags":[{"astNodeId":"17","name":"@tag_feature"},{"astNodeId":"15","name":"@tag_rule"},{"astNodeId":"13","name":"@tag_outline"},{"astNodeId":"11","name":"@examples_tag"}],"uri":"../testdata/good/rule_with_tag.feature"}} diff --git a/testdata/good/rule_without_name_and_description.feature.pickles.ndjson b/testdata/good/rule_without_name_and_description.feature.pickles.ndjson index 642759eec..6b7be3ee6 100644 --- a/testdata/good/rule_without_name_and_description.feature.pickles.ndjson +++ b/testdata/good/rule_without_name_and_description.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["1"],"id":"4","language":"en","name":"","steps":[{"astNodeIds":["0"],"id":"3","text":"text","type":"Context"}],"tags":[],"uri":"../testdata/good/rule_without_name_and_description.feature"}} +{"pickle":{"astNodeIds":["1"],"id":"4","language":"en","location":{"column":3,"line":4},"name":"","steps":[{"astNodeIds":["0"],"id":"3","text":"text","type":"Context"}],"tags":[],"uri":"../testdata/good/rule_without_name_and_description.feature"}} diff --git a/testdata/good/scenario_outline.feature.pickles.ndjson b/testdata/good/scenario_outline.feature.pickles.ndjson index a0fbaf7c1..cf97c97b8 100644 --- a/testdata/good/scenario_outline.feature.pickles.ndjson +++ b/testdata/good/scenario_outline.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"5","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline.feature"}} +{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","location":{"column":7,"line":8},"name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"5","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline.feature"}} diff --git a/testdata/good/scenario_outline_no_newline.feature.pickles.ndjson b/testdata/good/scenario_outline_no_newline.feature.pickles.ndjson index fb78ee081..a8cb83dfc 100644 --- a/testdata/good/scenario_outline_no_newline.feature.pickles.ndjson +++ b/testdata/good/scenario_outline_no_newline.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"5","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_no_newline.feature"}} +{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","location":{"column":3,"line":8},"name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"5","text":"the minimalism","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_no_newline.feature"}} diff --git a/testdata/good/scenario_outline_with_docstring.feature.pickles.ndjson b/testdata/good/scenario_outline_with_docstring.feature.pickles.ndjson index 0b95b33ab..45b3977fc 100644 --- a/testdata/good/scenario_outline_with_docstring.feature.pickles.ndjson +++ b/testdata/good/scenario_outline_with_docstring.feature.pickles.ndjson @@ -1,2 +1,2 @@ -{"pickle":{"astNodeIds":["5","2"],"id":"7","language":"en","name":"Greetings come in many forms","steps":[{"argument":{"docString":{"content":"Greeting:Hello","mediaType":"en"}},"astNodeIds":["0","2"],"id":"6","text":"this file:","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_docstring.feature"}} -{"pickle":{"astNodeIds":["5","3"],"id":"9","language":"en","name":"Greetings come in many forms","steps":[{"argument":{"docString":{"content":"Greeting:Bonjour","mediaType":"fr"}},"astNodeIds":["0","3"],"id":"8","text":"this file:","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_docstring.feature"}} +{"pickle":{"astNodeIds":["5","2"],"id":"7","language":"en","location":{"column":3,"line":11},"name":"Greetings come in many forms","steps":[{"argument":{"docString":{"content":"Greeting:Hello","mediaType":"en"}},"astNodeIds":["0","2"],"id":"6","text":"this file:","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_docstring.feature"}} +{"pickle":{"astNodeIds":["5","3"],"id":"9","language":"en","location":{"column":3,"line":12},"name":"Greetings come in many forms","steps":[{"argument":{"docString":{"content":"Greeting:Bonjour","mediaType":"fr"}},"astNodeIds":["0","3"],"id":"8","text":"this file:","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_docstring.feature"}} diff --git a/testdata/good/scenario_outline_with_value_with_dollar_sign.feature.pickles.ndjson b/testdata/good/scenario_outline_with_value_with_dollar_sign.feature.pickles.ndjson index a50d33cf3..cdce17d4f 100644 --- a/testdata/good/scenario_outline_with_value_with_dollar_sign.feature.pickles.ndjson +++ b/testdata/good/scenario_outline_with_value_with_dollar_sign.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"5","text":"the pa$$word","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_value_with_dollar_sign.feature"}} +{"pickle":{"astNodeIds":["4","2"],"id":"6","language":"en","location":{"column":3,"line":8},"name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"5","text":"the pa$$word","type":"Context"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_value_with_dollar_sign.feature"}} diff --git a/testdata/good/scenario_outline_with_value_with_trailing_backslash.feature.pickles.ndjson b/testdata/good/scenario_outline_with_value_with_trailing_backslash.feature.pickles.ndjson index 65ea4dbe0..255414193 100644 --- a/testdata/good/scenario_outline_with_value_with_trailing_backslash.feature.pickles.ndjson +++ b/testdata/good/scenario_outline_with_value_with_trailing_backslash.feature.pickles.ndjson @@ -1 +1 @@ -{"pickle":{"astNodeIds":["6","4"],"id":"10","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0","4"],"id":"7","text":"x\\y","type":"Context"},{"astNodeIds":["1","4"],"id":"8","text":"this\\","type":"Action"},{"astNodeIds":["2","4"],"id":"9","text":"that\\","type":"Outcome"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_value_with_trailing_backslash.feature"}} +{"pickle":{"astNodeIds":["6","4"],"id":"10","language":"en","location":{"column":3,"line":10},"name":"minimalistic","steps":[{"astNodeIds":["0","4"],"id":"7","text":"x\\y","type":"Context"},{"astNodeIds":["1","4"],"id":"8","text":"this\\","type":"Action"},{"astNodeIds":["2","4"],"id":"9","text":"that\\","type":"Outcome"}],"tags":[],"uri":"../testdata/good/scenario_outline_with_value_with_trailing_backslash.feature"}} diff --git a/testdata/good/scenario_outlines_with_tags.feature.pickles.ndjson b/testdata/good/scenario_outlines_with_tags.feature.pickles.ndjson index 19faa1a25..eefe9beec 100644 --- a/testdata/good/scenario_outlines_with_tags.feature.pickles.ndjson +++ b/testdata/good/scenario_outlines_with_tags.feature.pickles.ndjson @@ -1,2 +1,2 @@ -{"pickle":{"astNodeIds":["6","2"],"id":"17","language":"en","name":"","steps":[{"astNodeIds":["0","2"],"id":"16","text":"y","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"4","name":"@b"},{"astNodeId":"5","name":"@c"}],"uri":"../testdata/good/scenario_outlines_with_tags.feature"}} -{"pickle":{"astNodeIds":["14","9"],"id":"19","language":"en","name":"","steps":[{"astNodeIds":["7","9"],"id":"18","text":"n","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"12","name":"@d"},{"astNodeId":"13","name":"@e"},{"astNodeId":"10","name":"@f"}],"uri":"../testdata/good/scenario_outlines_with_tags.feature"}} +{"pickle":{"astNodeIds":["6","2"],"id":"17","language":"en","location":{"column":7,"line":9},"name":"","steps":[{"astNodeIds":["0","2"],"id":"16","text":"y","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"4","name":"@b"},{"astNodeId":"5","name":"@c"}],"uri":"../testdata/good/scenario_outlines_with_tags.feature"}} +{"pickle":{"astNodeIds":["14","9"],"id":"19","language":"en","location":{"column":7,"line":18},"name":"","steps":[{"astNodeIds":["7","9"],"id":"18","text":"n","type":"Context"}],"tags":[{"astNodeId":"15","name":"@a"},{"astNodeId":"12","name":"@d"},{"astNodeId":"13","name":"@e"},{"astNodeId":"10","name":"@f"}],"uri":"../testdata/good/scenario_outlines_with_tags.feature"}} diff --git a/testdata/good/several_examples.feature.pickles.ndjson b/testdata/good/several_examples.feature.pickles.ndjson index 9cadbddb2..73f91fc20 100644 --- a/testdata/good/several_examples.feature.pickles.ndjson +++ b/testdata/good/several_examples.feature.pickles.ndjson @@ -1,3 +1,3 @@ -{"pickle":{"astNodeIds":["9","2"],"id":"13","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"12","text":"the foo","type":"Context"}],"tags":[{"astNodeId":"3","name":"@foo"}],"uri":"../testdata/good/several_examples.feature"}} -{"pickle":{"astNodeIds":["9","6"],"id":"15","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0","6"],"id":"14","text":"the bar","type":"Context"}],"tags":[{"astNodeId":"7","name":"@bar"}],"uri":"../testdata/good/several_examples.feature"}} -{"pickle":{"astNodeIds":["11"],"id":"16","language":"en","name":"ha ok","steps":[],"tags":[{"astNodeId":"10","name":"@zap"}],"uri":"../testdata/good/several_examples.feature"}} +{"pickle":{"astNodeIds":["9","2"],"id":"13","language":"en","location":{"column":7,"line":9},"name":"minimalistic","steps":[{"astNodeIds":["0","2"],"id":"12","text":"the foo","type":"Context"}],"tags":[{"astNodeId":"3","name":"@foo"}],"uri":"../testdata/good/several_examples.feature"}} +{"pickle":{"astNodeIds":["9","6"],"id":"15","language":"en","location":{"column":7,"line":14},"name":"minimalistic","steps":[{"astNodeIds":["0","6"],"id":"14","text":"the bar","type":"Context"}],"tags":[{"astNodeId":"7","name":"@bar"}],"uri":"../testdata/good/several_examples.feature"}} +{"pickle":{"astNodeIds":["11"],"id":"16","language":"en","location":{"column":3,"line":17},"name":"ha ok","steps":[],"tags":[{"astNodeId":"10","name":"@zap"}],"uri":"../testdata/good/several_examples.feature"}} diff --git a/testdata/good/tagged_feature_with_scenario_outline.feature.pickles.ndjson b/testdata/good/tagged_feature_with_scenario_outline.feature.pickles.ndjson index 812b1c7a7..4942a1124 100644 --- a/testdata/good/tagged_feature_with_scenario_outline.feature.pickles.ndjson +++ b/testdata/good/tagged_feature_with_scenario_outline.feature.pickles.ndjson @@ -1,2 +1,2 @@ -{"pickle":{"astNodeIds":["5","2"],"id":"8","language":"en","name":"Bar","steps":[{"astNodeIds":["0","2"],"id":"7","text":"Baz","type":"Outcome"}],"tags":[{"astNodeId":"6","name":"@sometag"}],"uri":"../testdata/good/tagged_feature_with_scenario_outline.feature"}} -{"pickle":{"astNodeIds":["5","3"],"id":"10","language":"en","name":"Bar","steps":[{"astNodeIds":["0","3"],"id":"9","text":"Baz","type":"Outcome"}],"tags":[{"astNodeId":"6","name":"@sometag"}],"uri":"../testdata/good/tagged_feature_with_scenario_outline.feature"}} +{"pickle":{"astNodeIds":["5","2"],"id":"8","language":"en","location":{"column":5,"line":9},"name":"Bar","steps":[{"astNodeIds":["0","2"],"id":"7","text":"Baz","type":"Outcome"}],"tags":[{"astNodeId":"6","name":"@sometag"}],"uri":"../testdata/good/tagged_feature_with_scenario_outline.feature"}} +{"pickle":{"astNodeIds":["5","3"],"id":"10","language":"en","location":{"column":5,"line":10},"name":"Bar","steps":[{"astNodeIds":["0","3"],"id":"9","text":"Baz","type":"Outcome"}],"tags":[{"astNodeId":"6","name":"@sometag"}],"uri":"../testdata/good/tagged_feature_with_scenario_outline.feature"}} diff --git a/testdata/good/tags.feature.pickles.ndjson b/testdata/good/tags.feature.pickles.ndjson index f247dbdba..18bf1afd9 100644 --- a/testdata/good/tags.feature.pickles.ndjson +++ b/testdata/good/tags.feature.pickles.ndjson @@ -1,6 +1,6 @@ -{"pickle":{"astNodeIds":["4"],"id":"38","language":"en","name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"37","text":"the minimalism","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"1","name":"@scenario_tag1"},{"astNodeId":"2","name":"@scenario_tag2"},{"astNodeId":"3","name":"@scenario_tag3"}],"uri":"../testdata/good/tags.feature"}} -{"pickle":{"astNodeIds":["21","7"],"id":"40","language":"en","name":"minimalistic outline","steps":[{"astNodeIds":["5","7"],"id":"39","text":"the minimalism","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"18","name":"@so_tag1"},{"astNodeId":"19","name":"@so_tag2"},{"astNodeId":"20","name":"@so_tag3"},{"astNodeId":"8","name":"@ex_tag1"},{"astNodeId":"9","name":"@ex_tag2"},{"astNodeId":"10","name":"@ex_tag3"}],"uri":"../testdata/good/tags.feature"}} -{"pickle":{"astNodeIds":["21","13"],"id":"42","language":"en","name":"minimalistic outline","steps":[{"astNodeIds":["5","13"],"id":"41","text":"the more minimalism","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"18","name":"@so_tag1"},{"astNodeId":"19","name":"@so_tag2"},{"astNodeId":"20","name":"@so_tag3"},{"astNodeId":"14","name":"@ex_tag4"},{"astNodeId":"15","name":"@ex_tag5"},{"astNodeId":"16","name":"@ex_tag6"}],"uri":"../testdata/good/tags.feature"}} -{"pickle":{"astNodeIds":["24"],"id":"44","language":"en","name":"comments","steps":[{"astNodeIds":["22"],"id":"43","text":"a comment","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"23","name":"@comment_tag1"}],"uri":"../testdata/good/tags.feature"}} -{"pickle":{"astNodeIds":["27"],"id":"46","language":"en","name":"hash in tags","steps":[{"astNodeIds":["25"],"id":"45","text":"a comment is preceded by a space","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"26","name":"@comment_tag#2"}],"uri":"../testdata/good/tags.feature"}} -{"pickle":{"astNodeIds":["31"],"id":"48","language":"en","name":"joined tags","steps":[{"astNodeIds":["28"],"id":"47","text":"the @delimits tags","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"32","name":"@rule_tag"},{"astNodeId":"29","name":"@joined_tag3"},{"astNodeId":"30","name":"@joined_tag4"}],"uri":"../testdata/good/tags.feature"}} +{"pickle":{"astNodeIds":["4"],"id":"38","language":"en","location":{"column":1,"line":7},"name":"minimalistic","steps":[{"astNodeIds":["0"],"id":"37","text":"the minimalism","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"1","name":"@scenario_tag1"},{"astNodeId":"2","name":"@scenario_tag2"},{"astNodeId":"3","name":"@scenario_tag3"}],"uri":"../testdata/good/tags.feature"}} +{"pickle":{"astNodeIds":["21","7"],"id":"40","language":"en","location":{"column":3,"line":19},"name":"minimalistic outline","steps":[{"astNodeIds":["5","7"],"id":"39","text":"the minimalism","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"18","name":"@so_tag1"},{"astNodeId":"19","name":"@so_tag2"},{"astNodeId":"20","name":"@so_tag3"},{"astNodeId":"8","name":"@ex_tag1"},{"astNodeId":"9","name":"@ex_tag2"},{"astNodeId":"10","name":"@ex_tag3"}],"uri":"../testdata/good/tags.feature"}} +{"pickle":{"astNodeIds":["21","13"],"id":"42","language":"en","location":{"column":3,"line":25},"name":"minimalistic outline","steps":[{"astNodeIds":["5","13"],"id":"41","text":"the more minimalism","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"18","name":"@so_tag1"},{"astNodeId":"19","name":"@so_tag2"},{"astNodeId":"20","name":"@so_tag3"},{"astNodeId":"14","name":"@ex_tag4"},{"astNodeId":"15","name":"@ex_tag5"},{"astNodeId":"16","name":"@ex_tag6"}],"uri":"../testdata/good/tags.feature"}} +{"pickle":{"astNodeIds":["24"],"id":"44","language":"en","location":{"column":1,"line":28},"name":"comments","steps":[{"astNodeIds":["22"],"id":"43","text":"a comment","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"23","name":"@comment_tag1"}],"uri":"../testdata/good/tags.feature"}} +{"pickle":{"astNodeIds":["27"],"id":"46","language":"en","location":{"column":1,"line":32},"name":"hash in tags","steps":[{"astNodeIds":["25"],"id":"45","text":"a comment is preceded by a space","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"26","name":"@comment_tag#2"}],"uri":"../testdata/good/tags.feature"}} +{"pickle":{"astNodeIds":["31"],"id":"48","language":"en","location":{"column":1,"line":39},"name":"joined tags","steps":[{"astNodeIds":["28"],"id":"47","text":"the @delimits tags","type":"Context"}],"tags":[{"astNodeId":"34","name":"@feature_tag1"},{"astNodeId":"35","name":"@feature_tag2"},{"astNodeId":"36","name":"@feature_tag3"},{"astNodeId":"32","name":"@rule_tag"},{"astNodeId":"29","name":"@joined_tag3"},{"astNodeId":"30","name":"@joined_tag4"}],"uri":"../testdata/good/tags.feature"}} diff --git a/testdata/good/very_long.feature.pickles.ndjson b/testdata/good/very_long.feature.pickles.ndjson index e1aae5a12..e6e900334 100644 --- a/testdata/good/very_long.feature.pickles.ndjson +++ b/testdata/good/very_long.feature.pickles.ndjson @@ -1,100 +1,100 @@ -{"pickle":{"astNodeIds":["13"],"id":"1405","language":"en","name":"scenario 01","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["2"],"id":"1400","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["4"],"id":"1401","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["6"],"id":"1402","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["8"],"id":"1403","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["12"],"id":"1404","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["27"],"id":"1411","language":"en","name":"scenario 02","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["16"],"id":"1406","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["18"],"id":"1407","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["20"],"id":"1408","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["22"],"id":"1409","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["26"],"id":"1410","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["41"],"id":"1417","language":"en","name":"scenario 03","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["30"],"id":"1412","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["32"],"id":"1413","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["34"],"id":"1414","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["36"],"id":"1415","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["40"],"id":"1416","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["55"],"id":"1423","language":"en","name":"scenario 04","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["44"],"id":"1418","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["46"],"id":"1419","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["48"],"id":"1420","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["50"],"id":"1421","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["54"],"id":"1422","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["69"],"id":"1429","language":"en","name":"scenario 05","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["58"],"id":"1424","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["60"],"id":"1425","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["62"],"id":"1426","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["64"],"id":"1427","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["68"],"id":"1428","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["83"],"id":"1435","language":"en","name":"scenario 06","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["72"],"id":"1430","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["74"],"id":"1431","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["76"],"id":"1432","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["78"],"id":"1433","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["82"],"id":"1434","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["97"],"id":"1441","language":"en","name":"scenario 07","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["86"],"id":"1436","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["88"],"id":"1437","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["90"],"id":"1438","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["92"],"id":"1439","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["96"],"id":"1440","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["111"],"id":"1447","language":"en","name":"scenario 08","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["100"],"id":"1442","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["102"],"id":"1443","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["104"],"id":"1444","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["106"],"id":"1445","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["110"],"id":"1446","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["125"],"id":"1453","language":"en","name":"scenario 09","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["114"],"id":"1448","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["116"],"id":"1449","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["118"],"id":"1450","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["120"],"id":"1451","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["124"],"id":"1452","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["139"],"id":"1459","language":"en","name":"scenario 10","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["128"],"id":"1454","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["130"],"id":"1455","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["132"],"id":"1456","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["134"],"id":"1457","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["138"],"id":"1458","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["153"],"id":"1465","language":"en","name":"scenario 11","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["142"],"id":"1460","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["144"],"id":"1461","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["146"],"id":"1462","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["148"],"id":"1463","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["152"],"id":"1464","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["167"],"id":"1471","language":"en","name":"scenario 12","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["156"],"id":"1466","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["158"],"id":"1467","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["160"],"id":"1468","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["162"],"id":"1469","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["166"],"id":"1470","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["181"],"id":"1477","language":"en","name":"scenario 13","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["170"],"id":"1472","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["172"],"id":"1473","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["174"],"id":"1474","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["176"],"id":"1475","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["180"],"id":"1476","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["195"],"id":"1483","language":"en","name":"scenario 14","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["184"],"id":"1478","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["186"],"id":"1479","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["188"],"id":"1480","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["190"],"id":"1481","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["194"],"id":"1482","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["209"],"id":"1489","language":"en","name":"scenario 15","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["198"],"id":"1484","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["200"],"id":"1485","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["202"],"id":"1486","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["204"],"id":"1487","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["208"],"id":"1488","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["223"],"id":"1495","language":"en","name":"scenario 16","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["212"],"id":"1490","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["214"],"id":"1491","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["216"],"id":"1492","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["218"],"id":"1493","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["222"],"id":"1494","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["237"],"id":"1501","language":"en","name":"scenario 17","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["226"],"id":"1496","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["228"],"id":"1497","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["230"],"id":"1498","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["232"],"id":"1499","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["236"],"id":"1500","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["251"],"id":"1507","language":"en","name":"scenario 18","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["240"],"id":"1502","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["242"],"id":"1503","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["244"],"id":"1504","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["246"],"id":"1505","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["250"],"id":"1506","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["265"],"id":"1513","language":"en","name":"scenario 19","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["254"],"id":"1508","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["256"],"id":"1509","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["258"],"id":"1510","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["260"],"id":"1511","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["264"],"id":"1512","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["279"],"id":"1519","language":"en","name":"scenario 20","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["268"],"id":"1514","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["270"],"id":"1515","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["272"],"id":"1516","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["274"],"id":"1517","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["278"],"id":"1518","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["293"],"id":"1525","language":"en","name":"scenario 21","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["282"],"id":"1520","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["284"],"id":"1521","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["286"],"id":"1522","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["288"],"id":"1523","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["292"],"id":"1524","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["307"],"id":"1531","language":"en","name":"scenario 22","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["296"],"id":"1526","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["298"],"id":"1527","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["300"],"id":"1528","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["302"],"id":"1529","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["306"],"id":"1530","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["321"],"id":"1537","language":"en","name":"scenario 23","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["310"],"id":"1532","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["312"],"id":"1533","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["314"],"id":"1534","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["316"],"id":"1535","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["320"],"id":"1536","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["335"],"id":"1543","language":"en","name":"scenario 24","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["324"],"id":"1538","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["326"],"id":"1539","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["328"],"id":"1540","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["330"],"id":"1541","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["334"],"id":"1542","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["349"],"id":"1549","language":"en","name":"scenario 25","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["338"],"id":"1544","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["340"],"id":"1545","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["342"],"id":"1546","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["344"],"id":"1547","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["348"],"id":"1548","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["363"],"id":"1555","language":"en","name":"scenario 26","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["352"],"id":"1550","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["354"],"id":"1551","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["356"],"id":"1552","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["358"],"id":"1553","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["362"],"id":"1554","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["377"],"id":"1561","language":"en","name":"scenario 27","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["366"],"id":"1556","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["368"],"id":"1557","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["370"],"id":"1558","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["372"],"id":"1559","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["376"],"id":"1560","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["391"],"id":"1567","language":"en","name":"scenario 28","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["380"],"id":"1562","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["382"],"id":"1563","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["384"],"id":"1564","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["386"],"id":"1565","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["390"],"id":"1566","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["405"],"id":"1573","language":"en","name":"scenario 29","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["394"],"id":"1568","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["396"],"id":"1569","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["398"],"id":"1570","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["400"],"id":"1571","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["404"],"id":"1572","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["419"],"id":"1579","language":"en","name":"scenario 30","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["408"],"id":"1574","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["410"],"id":"1575","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["412"],"id":"1576","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["414"],"id":"1577","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["418"],"id":"1578","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["433"],"id":"1585","language":"en","name":"scenario 31","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["422"],"id":"1580","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["424"],"id":"1581","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["426"],"id":"1582","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["428"],"id":"1583","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["432"],"id":"1584","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["447"],"id":"1591","language":"en","name":"scenario 32","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["436"],"id":"1586","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["438"],"id":"1587","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["440"],"id":"1588","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["442"],"id":"1589","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["446"],"id":"1590","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["461"],"id":"1597","language":"en","name":"scenario 33","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["450"],"id":"1592","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["452"],"id":"1593","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["454"],"id":"1594","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["456"],"id":"1595","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["460"],"id":"1596","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["475"],"id":"1603","language":"en","name":"scenario 34","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["464"],"id":"1598","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["466"],"id":"1599","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["468"],"id":"1600","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["470"],"id":"1601","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["474"],"id":"1602","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["489"],"id":"1609","language":"en","name":"scenario 35","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["478"],"id":"1604","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["480"],"id":"1605","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["482"],"id":"1606","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["484"],"id":"1607","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["488"],"id":"1608","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["503"],"id":"1615","language":"en","name":"scenario 36","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["492"],"id":"1610","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["494"],"id":"1611","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["496"],"id":"1612","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["498"],"id":"1613","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["502"],"id":"1614","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["517"],"id":"1621","language":"en","name":"scenario 37","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["506"],"id":"1616","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["508"],"id":"1617","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["510"],"id":"1618","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["512"],"id":"1619","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["516"],"id":"1620","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["531"],"id":"1627","language":"en","name":"scenario 38","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["520"],"id":"1622","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["522"],"id":"1623","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["524"],"id":"1624","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["526"],"id":"1625","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["530"],"id":"1626","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["545"],"id":"1633","language":"en","name":"scenario 39","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["534"],"id":"1628","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["536"],"id":"1629","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["538"],"id":"1630","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["540"],"id":"1631","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["544"],"id":"1632","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["559"],"id":"1639","language":"en","name":"scenario 40","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["548"],"id":"1634","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["550"],"id":"1635","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["552"],"id":"1636","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["554"],"id":"1637","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["558"],"id":"1638","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["573"],"id":"1645","language":"en","name":"scenario 41","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["562"],"id":"1640","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["564"],"id":"1641","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["566"],"id":"1642","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["568"],"id":"1643","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["572"],"id":"1644","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["587"],"id":"1651","language":"en","name":"scenario 42","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["576"],"id":"1646","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["578"],"id":"1647","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["580"],"id":"1648","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["582"],"id":"1649","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["586"],"id":"1650","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["601"],"id":"1657","language":"en","name":"scenario 43","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["590"],"id":"1652","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["592"],"id":"1653","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["594"],"id":"1654","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["596"],"id":"1655","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["600"],"id":"1656","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["615"],"id":"1663","language":"en","name":"scenario 44","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["604"],"id":"1658","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["606"],"id":"1659","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["608"],"id":"1660","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["610"],"id":"1661","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["614"],"id":"1662","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["629"],"id":"1669","language":"en","name":"scenario 45","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["618"],"id":"1664","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["620"],"id":"1665","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["622"],"id":"1666","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["624"],"id":"1667","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["628"],"id":"1668","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["643"],"id":"1675","language":"en","name":"scenario 46","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["632"],"id":"1670","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["634"],"id":"1671","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["636"],"id":"1672","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["638"],"id":"1673","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["642"],"id":"1674","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["657"],"id":"1681","language":"en","name":"scenario 47","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["646"],"id":"1676","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["648"],"id":"1677","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["650"],"id":"1678","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["652"],"id":"1679","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["656"],"id":"1680","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["671"],"id":"1687","language":"en","name":"scenario 48","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["660"],"id":"1682","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["662"],"id":"1683","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["664"],"id":"1684","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["666"],"id":"1685","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["670"],"id":"1686","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["685"],"id":"1693","language":"en","name":"scenario 49","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["674"],"id":"1688","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["676"],"id":"1689","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["678"],"id":"1690","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["680"],"id":"1691","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["684"],"id":"1692","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["699"],"id":"1699","language":"en","name":"scenario 50","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["688"],"id":"1694","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["690"],"id":"1695","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["692"],"id":"1696","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["694"],"id":"1697","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["698"],"id":"1698","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["713"],"id":"1705","language":"en","name":"scenario 51","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["702"],"id":"1700","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["704"],"id":"1701","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["706"],"id":"1702","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["708"],"id":"1703","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["712"],"id":"1704","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["727"],"id":"1711","language":"en","name":"scenario 52","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["716"],"id":"1706","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["718"],"id":"1707","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["720"],"id":"1708","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["722"],"id":"1709","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["726"],"id":"1710","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["741"],"id":"1717","language":"en","name":"scenario 53","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["730"],"id":"1712","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["732"],"id":"1713","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["734"],"id":"1714","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["736"],"id":"1715","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["740"],"id":"1716","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["755"],"id":"1723","language":"en","name":"scenario 54","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["744"],"id":"1718","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["746"],"id":"1719","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["748"],"id":"1720","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["750"],"id":"1721","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["754"],"id":"1722","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["769"],"id":"1729","language":"en","name":"scenario 55","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["758"],"id":"1724","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["760"],"id":"1725","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["762"],"id":"1726","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["764"],"id":"1727","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["768"],"id":"1728","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["783"],"id":"1735","language":"en","name":"scenario 56","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["772"],"id":"1730","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["774"],"id":"1731","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["776"],"id":"1732","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["778"],"id":"1733","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["782"],"id":"1734","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["797"],"id":"1741","language":"en","name":"scenario 57","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["786"],"id":"1736","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["788"],"id":"1737","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["790"],"id":"1738","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["792"],"id":"1739","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["796"],"id":"1740","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["811"],"id":"1747","language":"en","name":"scenario 58","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["800"],"id":"1742","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["802"],"id":"1743","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["804"],"id":"1744","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["806"],"id":"1745","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["810"],"id":"1746","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["825"],"id":"1753","language":"en","name":"scenario 59","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["814"],"id":"1748","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["816"],"id":"1749","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["818"],"id":"1750","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["820"],"id":"1751","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["824"],"id":"1752","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["839"],"id":"1759","language":"en","name":"scenario 60","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["828"],"id":"1754","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["830"],"id":"1755","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["832"],"id":"1756","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["834"],"id":"1757","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["838"],"id":"1758","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["853"],"id":"1765","language":"en","name":"scenario 61","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["842"],"id":"1760","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["844"],"id":"1761","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["846"],"id":"1762","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["848"],"id":"1763","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["852"],"id":"1764","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["867"],"id":"1771","language":"en","name":"scenario 62","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["856"],"id":"1766","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["858"],"id":"1767","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["860"],"id":"1768","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["862"],"id":"1769","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["866"],"id":"1770","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["881"],"id":"1777","language":"en","name":"scenario 63","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["870"],"id":"1772","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["872"],"id":"1773","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["874"],"id":"1774","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["876"],"id":"1775","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["880"],"id":"1776","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["895"],"id":"1783","language":"en","name":"scenario 64","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["884"],"id":"1778","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["886"],"id":"1779","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["888"],"id":"1780","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["890"],"id":"1781","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["894"],"id":"1782","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["909"],"id":"1789","language":"en","name":"scenario 65","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["898"],"id":"1784","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["900"],"id":"1785","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["902"],"id":"1786","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["904"],"id":"1787","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["908"],"id":"1788","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["923"],"id":"1795","language":"en","name":"scenario 66","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["912"],"id":"1790","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["914"],"id":"1791","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["916"],"id":"1792","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["918"],"id":"1793","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["922"],"id":"1794","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["937"],"id":"1801","language":"en","name":"scenario 67","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["926"],"id":"1796","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["928"],"id":"1797","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["930"],"id":"1798","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["932"],"id":"1799","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["936"],"id":"1800","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["951"],"id":"1807","language":"en","name":"scenario 68","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["940"],"id":"1802","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["942"],"id":"1803","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["944"],"id":"1804","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["946"],"id":"1805","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["950"],"id":"1806","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["965"],"id":"1813","language":"en","name":"scenario 69","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["954"],"id":"1808","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["956"],"id":"1809","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["958"],"id":"1810","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["960"],"id":"1811","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["964"],"id":"1812","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["979"],"id":"1819","language":"en","name":"scenario 70","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["968"],"id":"1814","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["970"],"id":"1815","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["972"],"id":"1816","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["974"],"id":"1817","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["978"],"id":"1818","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["993"],"id":"1825","language":"en","name":"scenario 71","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["982"],"id":"1820","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["984"],"id":"1821","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["986"],"id":"1822","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["988"],"id":"1823","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["992"],"id":"1824","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1007"],"id":"1831","language":"en","name":"scenario 72","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["996"],"id":"1826","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["998"],"id":"1827","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1000"],"id":"1828","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1002"],"id":"1829","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1006"],"id":"1830","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1021"],"id":"1837","language":"en","name":"scenario 73","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1010"],"id":"1832","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1012"],"id":"1833","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1014"],"id":"1834","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1016"],"id":"1835","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1020"],"id":"1836","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1035"],"id":"1843","language":"en","name":"scenario 74","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1024"],"id":"1838","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1026"],"id":"1839","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1028"],"id":"1840","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1030"],"id":"1841","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1034"],"id":"1842","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1049"],"id":"1849","language":"en","name":"scenario 75","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1038"],"id":"1844","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1040"],"id":"1845","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1042"],"id":"1846","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1044"],"id":"1847","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1048"],"id":"1848","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1063"],"id":"1855","language":"en","name":"scenario 76","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1052"],"id":"1850","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1054"],"id":"1851","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1056"],"id":"1852","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1058"],"id":"1853","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1062"],"id":"1854","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1077"],"id":"1861","language":"en","name":"scenario 77","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1066"],"id":"1856","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1068"],"id":"1857","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1070"],"id":"1858","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1072"],"id":"1859","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1076"],"id":"1860","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1091"],"id":"1867","language":"en","name":"scenario 78","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1080"],"id":"1862","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1082"],"id":"1863","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1084"],"id":"1864","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1086"],"id":"1865","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1090"],"id":"1866","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1105"],"id":"1873","language":"en","name":"scenario 79","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1094"],"id":"1868","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1096"],"id":"1869","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1098"],"id":"1870","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1100"],"id":"1871","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1104"],"id":"1872","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1119"],"id":"1879","language":"en","name":"scenario 80","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1108"],"id":"1874","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1110"],"id":"1875","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1112"],"id":"1876","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1114"],"id":"1877","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1118"],"id":"1878","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1133"],"id":"1885","language":"en","name":"scenario 81","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1122"],"id":"1880","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1124"],"id":"1881","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1126"],"id":"1882","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1128"],"id":"1883","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1132"],"id":"1884","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1147"],"id":"1891","language":"en","name":"scenario 82","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1136"],"id":"1886","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1138"],"id":"1887","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1140"],"id":"1888","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1142"],"id":"1889","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1146"],"id":"1890","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1161"],"id":"1897","language":"en","name":"scenario 83","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1150"],"id":"1892","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1152"],"id":"1893","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1154"],"id":"1894","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1156"],"id":"1895","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1160"],"id":"1896","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1175"],"id":"1903","language":"en","name":"scenario 84","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1164"],"id":"1898","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1166"],"id":"1899","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1168"],"id":"1900","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1170"],"id":"1901","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1174"],"id":"1902","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1189"],"id":"1909","language":"en","name":"scenario 85","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1178"],"id":"1904","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1180"],"id":"1905","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1182"],"id":"1906","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1184"],"id":"1907","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1188"],"id":"1908","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1203"],"id":"1915","language":"en","name":"scenario 86","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1192"],"id":"1910","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1194"],"id":"1911","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1196"],"id":"1912","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1198"],"id":"1913","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1202"],"id":"1914","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1217"],"id":"1921","language":"en","name":"scenario 87","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1206"],"id":"1916","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1208"],"id":"1917","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1210"],"id":"1918","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1212"],"id":"1919","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1216"],"id":"1920","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1231"],"id":"1927","language":"en","name":"scenario 88","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1220"],"id":"1922","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1222"],"id":"1923","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1224"],"id":"1924","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1226"],"id":"1925","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1230"],"id":"1926","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1245"],"id":"1933","language":"en","name":"scenario 89","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1234"],"id":"1928","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1236"],"id":"1929","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1238"],"id":"1930","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1240"],"id":"1931","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1244"],"id":"1932","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1259"],"id":"1939","language":"en","name":"scenario 90","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1248"],"id":"1934","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1250"],"id":"1935","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1252"],"id":"1936","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1254"],"id":"1937","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1258"],"id":"1938","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1273"],"id":"1945","language":"en","name":"scenario 91","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1262"],"id":"1940","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1264"],"id":"1941","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1266"],"id":"1942","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1268"],"id":"1943","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1272"],"id":"1944","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1287"],"id":"1951","language":"en","name":"scenario 92","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1276"],"id":"1946","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1278"],"id":"1947","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1280"],"id":"1948","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1282"],"id":"1949","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1286"],"id":"1950","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1301"],"id":"1957","language":"en","name":"scenario 93","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1290"],"id":"1952","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1292"],"id":"1953","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1294"],"id":"1954","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1296"],"id":"1955","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1300"],"id":"1956","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1315"],"id":"1963","language":"en","name":"scenario 94","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1304"],"id":"1958","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1306"],"id":"1959","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1308"],"id":"1960","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1310"],"id":"1961","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1314"],"id":"1962","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1329"],"id":"1969","language":"en","name":"scenario 95","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1318"],"id":"1964","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1320"],"id":"1965","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1322"],"id":"1966","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1324"],"id":"1967","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1328"],"id":"1968","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1343"],"id":"1975","language":"en","name":"scenario 96","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1332"],"id":"1970","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1334"],"id":"1971","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1336"],"id":"1972","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1338"],"id":"1973","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1342"],"id":"1974","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1357"],"id":"1981","language":"en","name":"scenario 97","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1346"],"id":"1976","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1348"],"id":"1977","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1350"],"id":"1978","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1352"],"id":"1979","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1356"],"id":"1980","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1371"],"id":"1987","language":"en","name":"scenario 98","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1360"],"id":"1982","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1362"],"id":"1983","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1364"],"id":"1984","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1366"],"id":"1985","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1370"],"id":"1986","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1385"],"id":"1993","language":"en","name":"scenario 99","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1374"],"id":"1988","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1376"],"id":"1989","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1378"],"id":"1990","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1380"],"id":"1991","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1384"],"id":"1992","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} -{"pickle":{"astNodeIds":["1399"],"id":"1999","language":"en","name":"scenario 100","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1388"],"id":"1994","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1390"],"id":"1995","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1392"],"id":"1996","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1394"],"id":"1997","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1398"],"id":"1998","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["13"],"id":"1405","language":"en","location":{"column":3,"line":4},"name":"scenario 01","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["2"],"id":"1400","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["4"],"id":"1401","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["6"],"id":"1402","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["8"],"id":"1403","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["12"],"id":"1404","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["27"],"id":"1411","language":"en","location":{"column":3,"line":21},"name":"scenario 02","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["16"],"id":"1406","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["18"],"id":"1407","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["20"],"id":"1408","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["22"],"id":"1409","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["26"],"id":"1410","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["41"],"id":"1417","language":"en","location":{"column":3,"line":38},"name":"scenario 03","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["30"],"id":"1412","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["32"],"id":"1413","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["34"],"id":"1414","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["36"],"id":"1415","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["40"],"id":"1416","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["55"],"id":"1423","language":"en","location":{"column":3,"line":55},"name":"scenario 04","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["44"],"id":"1418","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["46"],"id":"1419","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["48"],"id":"1420","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["50"],"id":"1421","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["54"],"id":"1422","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["69"],"id":"1429","language":"en","location":{"column":3,"line":72},"name":"scenario 05","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["58"],"id":"1424","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["60"],"id":"1425","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["62"],"id":"1426","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["64"],"id":"1427","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["68"],"id":"1428","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["83"],"id":"1435","language":"en","location":{"column":3,"line":89},"name":"scenario 06","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["72"],"id":"1430","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["74"],"id":"1431","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["76"],"id":"1432","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["78"],"id":"1433","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["82"],"id":"1434","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["97"],"id":"1441","language":"en","location":{"column":3,"line":106},"name":"scenario 07","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["86"],"id":"1436","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["88"],"id":"1437","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["90"],"id":"1438","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["92"],"id":"1439","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["96"],"id":"1440","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["111"],"id":"1447","language":"en","location":{"column":3,"line":123},"name":"scenario 08","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["100"],"id":"1442","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["102"],"id":"1443","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["104"],"id":"1444","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["106"],"id":"1445","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["110"],"id":"1446","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["125"],"id":"1453","language":"en","location":{"column":3,"line":140},"name":"scenario 09","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["114"],"id":"1448","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["116"],"id":"1449","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["118"],"id":"1450","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["120"],"id":"1451","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["124"],"id":"1452","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["139"],"id":"1459","language":"en","location":{"column":3,"line":157},"name":"scenario 10","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["128"],"id":"1454","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["130"],"id":"1455","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["132"],"id":"1456","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["134"],"id":"1457","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["138"],"id":"1458","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["153"],"id":"1465","language":"en","location":{"column":3,"line":174},"name":"scenario 11","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["142"],"id":"1460","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["144"],"id":"1461","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["146"],"id":"1462","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["148"],"id":"1463","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["152"],"id":"1464","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["167"],"id":"1471","language":"en","location":{"column":3,"line":191},"name":"scenario 12","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["156"],"id":"1466","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["158"],"id":"1467","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["160"],"id":"1468","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["162"],"id":"1469","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["166"],"id":"1470","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["181"],"id":"1477","language":"en","location":{"column":3,"line":208},"name":"scenario 13","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["170"],"id":"1472","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["172"],"id":"1473","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["174"],"id":"1474","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["176"],"id":"1475","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["180"],"id":"1476","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["195"],"id":"1483","language":"en","location":{"column":3,"line":225},"name":"scenario 14","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["184"],"id":"1478","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["186"],"id":"1479","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["188"],"id":"1480","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["190"],"id":"1481","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["194"],"id":"1482","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["209"],"id":"1489","language":"en","location":{"column":3,"line":242},"name":"scenario 15","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["198"],"id":"1484","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["200"],"id":"1485","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["202"],"id":"1486","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["204"],"id":"1487","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["208"],"id":"1488","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["223"],"id":"1495","language":"en","location":{"column":3,"line":259},"name":"scenario 16","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["212"],"id":"1490","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["214"],"id":"1491","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["216"],"id":"1492","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["218"],"id":"1493","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["222"],"id":"1494","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["237"],"id":"1501","language":"en","location":{"column":3,"line":276},"name":"scenario 17","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["226"],"id":"1496","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["228"],"id":"1497","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["230"],"id":"1498","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["232"],"id":"1499","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["236"],"id":"1500","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["251"],"id":"1507","language":"en","location":{"column":3,"line":293},"name":"scenario 18","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["240"],"id":"1502","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["242"],"id":"1503","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["244"],"id":"1504","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["246"],"id":"1505","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["250"],"id":"1506","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["265"],"id":"1513","language":"en","location":{"column":3,"line":310},"name":"scenario 19","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["254"],"id":"1508","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["256"],"id":"1509","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["258"],"id":"1510","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["260"],"id":"1511","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["264"],"id":"1512","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["279"],"id":"1519","language":"en","location":{"column":3,"line":327},"name":"scenario 20","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["268"],"id":"1514","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["270"],"id":"1515","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["272"],"id":"1516","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["274"],"id":"1517","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["278"],"id":"1518","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["293"],"id":"1525","language":"en","location":{"column":3,"line":344},"name":"scenario 21","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["282"],"id":"1520","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["284"],"id":"1521","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["286"],"id":"1522","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["288"],"id":"1523","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["292"],"id":"1524","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["307"],"id":"1531","language":"en","location":{"column":3,"line":361},"name":"scenario 22","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["296"],"id":"1526","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["298"],"id":"1527","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["300"],"id":"1528","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["302"],"id":"1529","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["306"],"id":"1530","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["321"],"id":"1537","language":"en","location":{"column":3,"line":378},"name":"scenario 23","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["310"],"id":"1532","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["312"],"id":"1533","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["314"],"id":"1534","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["316"],"id":"1535","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["320"],"id":"1536","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["335"],"id":"1543","language":"en","location":{"column":3,"line":395},"name":"scenario 24","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["324"],"id":"1538","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["326"],"id":"1539","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["328"],"id":"1540","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["330"],"id":"1541","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["334"],"id":"1542","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["349"],"id":"1549","language":"en","location":{"column":3,"line":412},"name":"scenario 25","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["338"],"id":"1544","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["340"],"id":"1545","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["342"],"id":"1546","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["344"],"id":"1547","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["348"],"id":"1548","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["363"],"id":"1555","language":"en","location":{"column":3,"line":429},"name":"scenario 26","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["352"],"id":"1550","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["354"],"id":"1551","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["356"],"id":"1552","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["358"],"id":"1553","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["362"],"id":"1554","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["377"],"id":"1561","language":"en","location":{"column":3,"line":446},"name":"scenario 27","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["366"],"id":"1556","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["368"],"id":"1557","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["370"],"id":"1558","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["372"],"id":"1559","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["376"],"id":"1560","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["391"],"id":"1567","language":"en","location":{"column":3,"line":463},"name":"scenario 28","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["380"],"id":"1562","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["382"],"id":"1563","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["384"],"id":"1564","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["386"],"id":"1565","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["390"],"id":"1566","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["405"],"id":"1573","language":"en","location":{"column":3,"line":480},"name":"scenario 29","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["394"],"id":"1568","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["396"],"id":"1569","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["398"],"id":"1570","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["400"],"id":"1571","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["404"],"id":"1572","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["419"],"id":"1579","language":"en","location":{"column":3,"line":497},"name":"scenario 30","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["408"],"id":"1574","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["410"],"id":"1575","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["412"],"id":"1576","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["414"],"id":"1577","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["418"],"id":"1578","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["433"],"id":"1585","language":"en","location":{"column":3,"line":514},"name":"scenario 31","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["422"],"id":"1580","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["424"],"id":"1581","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["426"],"id":"1582","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["428"],"id":"1583","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["432"],"id":"1584","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["447"],"id":"1591","language":"en","location":{"column":3,"line":531},"name":"scenario 32","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["436"],"id":"1586","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["438"],"id":"1587","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["440"],"id":"1588","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["442"],"id":"1589","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["446"],"id":"1590","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["461"],"id":"1597","language":"en","location":{"column":3,"line":548},"name":"scenario 33","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["450"],"id":"1592","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["452"],"id":"1593","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["454"],"id":"1594","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["456"],"id":"1595","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["460"],"id":"1596","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["475"],"id":"1603","language":"en","location":{"column":3,"line":565},"name":"scenario 34","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["464"],"id":"1598","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["466"],"id":"1599","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["468"],"id":"1600","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["470"],"id":"1601","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["474"],"id":"1602","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["489"],"id":"1609","language":"en","location":{"column":3,"line":582},"name":"scenario 35","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["478"],"id":"1604","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["480"],"id":"1605","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["482"],"id":"1606","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["484"],"id":"1607","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["488"],"id":"1608","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["503"],"id":"1615","language":"en","location":{"column":3,"line":599},"name":"scenario 36","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["492"],"id":"1610","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["494"],"id":"1611","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["496"],"id":"1612","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["498"],"id":"1613","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["502"],"id":"1614","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["517"],"id":"1621","language":"en","location":{"column":3,"line":616},"name":"scenario 37","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["506"],"id":"1616","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["508"],"id":"1617","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["510"],"id":"1618","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["512"],"id":"1619","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["516"],"id":"1620","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["531"],"id":"1627","language":"en","location":{"column":3,"line":633},"name":"scenario 38","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["520"],"id":"1622","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["522"],"id":"1623","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["524"],"id":"1624","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["526"],"id":"1625","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["530"],"id":"1626","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["545"],"id":"1633","language":"en","location":{"column":3,"line":650},"name":"scenario 39","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["534"],"id":"1628","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["536"],"id":"1629","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["538"],"id":"1630","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["540"],"id":"1631","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["544"],"id":"1632","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["559"],"id":"1639","language":"en","location":{"column":3,"line":667},"name":"scenario 40","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["548"],"id":"1634","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["550"],"id":"1635","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["552"],"id":"1636","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["554"],"id":"1637","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["558"],"id":"1638","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["573"],"id":"1645","language":"en","location":{"column":3,"line":684},"name":"scenario 41","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["562"],"id":"1640","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["564"],"id":"1641","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["566"],"id":"1642","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["568"],"id":"1643","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["572"],"id":"1644","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["587"],"id":"1651","language":"en","location":{"column":3,"line":701},"name":"scenario 42","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["576"],"id":"1646","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["578"],"id":"1647","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["580"],"id":"1648","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["582"],"id":"1649","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["586"],"id":"1650","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["601"],"id":"1657","language":"en","location":{"column":3,"line":718},"name":"scenario 43","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["590"],"id":"1652","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["592"],"id":"1653","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["594"],"id":"1654","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["596"],"id":"1655","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["600"],"id":"1656","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["615"],"id":"1663","language":"en","location":{"column":3,"line":735},"name":"scenario 44","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["604"],"id":"1658","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["606"],"id":"1659","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["608"],"id":"1660","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["610"],"id":"1661","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["614"],"id":"1662","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["629"],"id":"1669","language":"en","location":{"column":3,"line":752},"name":"scenario 45","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["618"],"id":"1664","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["620"],"id":"1665","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["622"],"id":"1666","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["624"],"id":"1667","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["628"],"id":"1668","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["643"],"id":"1675","language":"en","location":{"column":3,"line":769},"name":"scenario 46","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["632"],"id":"1670","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["634"],"id":"1671","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["636"],"id":"1672","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["638"],"id":"1673","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["642"],"id":"1674","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["657"],"id":"1681","language":"en","location":{"column":3,"line":786},"name":"scenario 47","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["646"],"id":"1676","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["648"],"id":"1677","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["650"],"id":"1678","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["652"],"id":"1679","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["656"],"id":"1680","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["671"],"id":"1687","language":"en","location":{"column":3,"line":803},"name":"scenario 48","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["660"],"id":"1682","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["662"],"id":"1683","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["664"],"id":"1684","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["666"],"id":"1685","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["670"],"id":"1686","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["685"],"id":"1693","language":"en","location":{"column":3,"line":820},"name":"scenario 49","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["674"],"id":"1688","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["676"],"id":"1689","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["678"],"id":"1690","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["680"],"id":"1691","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["684"],"id":"1692","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["699"],"id":"1699","language":"en","location":{"column":3,"line":837},"name":"scenario 50","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["688"],"id":"1694","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["690"],"id":"1695","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["692"],"id":"1696","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["694"],"id":"1697","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["698"],"id":"1698","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["713"],"id":"1705","language":"en","location":{"column":3,"line":854},"name":"scenario 51","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["702"],"id":"1700","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["704"],"id":"1701","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["706"],"id":"1702","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["708"],"id":"1703","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["712"],"id":"1704","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["727"],"id":"1711","language":"en","location":{"column":3,"line":871},"name":"scenario 52","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["716"],"id":"1706","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["718"],"id":"1707","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["720"],"id":"1708","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["722"],"id":"1709","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["726"],"id":"1710","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["741"],"id":"1717","language":"en","location":{"column":3,"line":888},"name":"scenario 53","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["730"],"id":"1712","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["732"],"id":"1713","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["734"],"id":"1714","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["736"],"id":"1715","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["740"],"id":"1716","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["755"],"id":"1723","language":"en","location":{"column":3,"line":905},"name":"scenario 54","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["744"],"id":"1718","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["746"],"id":"1719","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["748"],"id":"1720","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["750"],"id":"1721","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["754"],"id":"1722","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["769"],"id":"1729","language":"en","location":{"column":3,"line":922},"name":"scenario 55","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["758"],"id":"1724","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["760"],"id":"1725","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["762"],"id":"1726","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["764"],"id":"1727","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["768"],"id":"1728","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["783"],"id":"1735","language":"en","location":{"column":3,"line":939},"name":"scenario 56","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["772"],"id":"1730","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["774"],"id":"1731","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["776"],"id":"1732","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["778"],"id":"1733","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["782"],"id":"1734","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["797"],"id":"1741","language":"en","location":{"column":3,"line":956},"name":"scenario 57","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["786"],"id":"1736","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["788"],"id":"1737","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["790"],"id":"1738","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["792"],"id":"1739","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["796"],"id":"1740","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["811"],"id":"1747","language":"en","location":{"column":3,"line":973},"name":"scenario 58","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["800"],"id":"1742","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["802"],"id":"1743","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["804"],"id":"1744","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["806"],"id":"1745","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["810"],"id":"1746","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["825"],"id":"1753","language":"en","location":{"column":3,"line":990},"name":"scenario 59","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["814"],"id":"1748","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["816"],"id":"1749","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["818"],"id":"1750","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["820"],"id":"1751","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["824"],"id":"1752","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["839"],"id":"1759","language":"en","location":{"column":3,"line":1007},"name":"scenario 60","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["828"],"id":"1754","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["830"],"id":"1755","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["832"],"id":"1756","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["834"],"id":"1757","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["838"],"id":"1758","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["853"],"id":"1765","language":"en","location":{"column":3,"line":1024},"name":"scenario 61","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["842"],"id":"1760","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["844"],"id":"1761","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["846"],"id":"1762","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["848"],"id":"1763","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["852"],"id":"1764","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["867"],"id":"1771","language":"en","location":{"column":3,"line":1041},"name":"scenario 62","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["856"],"id":"1766","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["858"],"id":"1767","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["860"],"id":"1768","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["862"],"id":"1769","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["866"],"id":"1770","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["881"],"id":"1777","language":"en","location":{"column":3,"line":1058},"name":"scenario 63","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["870"],"id":"1772","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["872"],"id":"1773","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["874"],"id":"1774","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["876"],"id":"1775","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["880"],"id":"1776","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["895"],"id":"1783","language":"en","location":{"column":3,"line":1075},"name":"scenario 64","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["884"],"id":"1778","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["886"],"id":"1779","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["888"],"id":"1780","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["890"],"id":"1781","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["894"],"id":"1782","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["909"],"id":"1789","language":"en","location":{"column":3,"line":1092},"name":"scenario 65","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["898"],"id":"1784","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["900"],"id":"1785","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["902"],"id":"1786","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["904"],"id":"1787","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["908"],"id":"1788","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["923"],"id":"1795","language":"en","location":{"column":3,"line":1109},"name":"scenario 66","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["912"],"id":"1790","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["914"],"id":"1791","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["916"],"id":"1792","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["918"],"id":"1793","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["922"],"id":"1794","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["937"],"id":"1801","language":"en","location":{"column":3,"line":1126},"name":"scenario 67","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["926"],"id":"1796","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["928"],"id":"1797","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["930"],"id":"1798","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["932"],"id":"1799","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["936"],"id":"1800","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["951"],"id":"1807","language":"en","location":{"column":3,"line":1143},"name":"scenario 68","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["940"],"id":"1802","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["942"],"id":"1803","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["944"],"id":"1804","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["946"],"id":"1805","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["950"],"id":"1806","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["965"],"id":"1813","language":"en","location":{"column":3,"line":1160},"name":"scenario 69","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["954"],"id":"1808","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["956"],"id":"1809","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["958"],"id":"1810","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["960"],"id":"1811","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["964"],"id":"1812","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["979"],"id":"1819","language":"en","location":{"column":3,"line":1177},"name":"scenario 70","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["968"],"id":"1814","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["970"],"id":"1815","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["972"],"id":"1816","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["974"],"id":"1817","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["978"],"id":"1818","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["993"],"id":"1825","language":"en","location":{"column":3,"line":1194},"name":"scenario 71","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["982"],"id":"1820","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["984"],"id":"1821","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["986"],"id":"1822","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["988"],"id":"1823","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["992"],"id":"1824","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1007"],"id":"1831","language":"en","location":{"column":3,"line":1211},"name":"scenario 72","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["996"],"id":"1826","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["998"],"id":"1827","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1000"],"id":"1828","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1002"],"id":"1829","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1006"],"id":"1830","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1021"],"id":"1837","language":"en","location":{"column":3,"line":1228},"name":"scenario 73","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1010"],"id":"1832","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1012"],"id":"1833","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1014"],"id":"1834","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1016"],"id":"1835","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1020"],"id":"1836","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1035"],"id":"1843","language":"en","location":{"column":3,"line":1245},"name":"scenario 74","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1024"],"id":"1838","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1026"],"id":"1839","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1028"],"id":"1840","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1030"],"id":"1841","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1034"],"id":"1842","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1049"],"id":"1849","language":"en","location":{"column":3,"line":1262},"name":"scenario 75","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1038"],"id":"1844","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1040"],"id":"1845","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1042"],"id":"1846","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1044"],"id":"1847","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1048"],"id":"1848","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1063"],"id":"1855","language":"en","location":{"column":3,"line":1279},"name":"scenario 76","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1052"],"id":"1850","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1054"],"id":"1851","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1056"],"id":"1852","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1058"],"id":"1853","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1062"],"id":"1854","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1077"],"id":"1861","language":"en","location":{"column":3,"line":1296},"name":"scenario 77","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1066"],"id":"1856","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1068"],"id":"1857","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1070"],"id":"1858","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1072"],"id":"1859","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1076"],"id":"1860","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1091"],"id":"1867","language":"en","location":{"column":3,"line":1313},"name":"scenario 78","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1080"],"id":"1862","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1082"],"id":"1863","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1084"],"id":"1864","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1086"],"id":"1865","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1090"],"id":"1866","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1105"],"id":"1873","language":"en","location":{"column":3,"line":1330},"name":"scenario 79","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1094"],"id":"1868","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1096"],"id":"1869","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1098"],"id":"1870","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1100"],"id":"1871","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1104"],"id":"1872","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1119"],"id":"1879","language":"en","location":{"column":3,"line":1347},"name":"scenario 80","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1108"],"id":"1874","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1110"],"id":"1875","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1112"],"id":"1876","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1114"],"id":"1877","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1118"],"id":"1878","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1133"],"id":"1885","language":"en","location":{"column":3,"line":1364},"name":"scenario 81","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1122"],"id":"1880","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1124"],"id":"1881","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1126"],"id":"1882","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1128"],"id":"1883","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1132"],"id":"1884","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1147"],"id":"1891","language":"en","location":{"column":3,"line":1381},"name":"scenario 82","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1136"],"id":"1886","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1138"],"id":"1887","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1140"],"id":"1888","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1142"],"id":"1889","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1146"],"id":"1890","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1161"],"id":"1897","language":"en","location":{"column":3,"line":1398},"name":"scenario 83","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1150"],"id":"1892","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1152"],"id":"1893","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1154"],"id":"1894","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1156"],"id":"1895","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1160"],"id":"1896","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1175"],"id":"1903","language":"en","location":{"column":3,"line":1415},"name":"scenario 84","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1164"],"id":"1898","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1166"],"id":"1899","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1168"],"id":"1900","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1170"],"id":"1901","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1174"],"id":"1902","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1189"],"id":"1909","language":"en","location":{"column":3,"line":1432},"name":"scenario 85","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1178"],"id":"1904","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1180"],"id":"1905","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1182"],"id":"1906","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1184"],"id":"1907","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1188"],"id":"1908","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1203"],"id":"1915","language":"en","location":{"column":3,"line":1449},"name":"scenario 86","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1192"],"id":"1910","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1194"],"id":"1911","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1196"],"id":"1912","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1198"],"id":"1913","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1202"],"id":"1914","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1217"],"id":"1921","language":"en","location":{"column":3,"line":1466},"name":"scenario 87","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1206"],"id":"1916","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1208"],"id":"1917","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1210"],"id":"1918","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1212"],"id":"1919","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1216"],"id":"1920","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1231"],"id":"1927","language":"en","location":{"column":3,"line":1483},"name":"scenario 88","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1220"],"id":"1922","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1222"],"id":"1923","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1224"],"id":"1924","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1226"],"id":"1925","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1230"],"id":"1926","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1245"],"id":"1933","language":"en","location":{"column":3,"line":1500},"name":"scenario 89","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1234"],"id":"1928","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1236"],"id":"1929","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1238"],"id":"1930","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1240"],"id":"1931","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1244"],"id":"1932","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1259"],"id":"1939","language":"en","location":{"column":3,"line":1517},"name":"scenario 90","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1248"],"id":"1934","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1250"],"id":"1935","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1252"],"id":"1936","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1254"],"id":"1937","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1258"],"id":"1938","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1273"],"id":"1945","language":"en","location":{"column":3,"line":1534},"name":"scenario 91","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1262"],"id":"1940","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1264"],"id":"1941","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1266"],"id":"1942","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1268"],"id":"1943","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1272"],"id":"1944","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1287"],"id":"1951","language":"en","location":{"column":3,"line":1551},"name":"scenario 92","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1276"],"id":"1946","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1278"],"id":"1947","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1280"],"id":"1948","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1282"],"id":"1949","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1286"],"id":"1950","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1301"],"id":"1957","language":"en","location":{"column":3,"line":1568},"name":"scenario 93","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1290"],"id":"1952","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1292"],"id":"1953","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1294"],"id":"1954","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1296"],"id":"1955","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1300"],"id":"1956","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1315"],"id":"1963","language":"en","location":{"column":3,"line":1585},"name":"scenario 94","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1304"],"id":"1958","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1306"],"id":"1959","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1308"],"id":"1960","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1310"],"id":"1961","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1314"],"id":"1962","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1329"],"id":"1969","language":"en","location":{"column":3,"line":1602},"name":"scenario 95","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1318"],"id":"1964","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1320"],"id":"1965","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1322"],"id":"1966","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1324"],"id":"1967","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1328"],"id":"1968","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1343"],"id":"1975","language":"en","location":{"column":3,"line":1619},"name":"scenario 96","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1332"],"id":"1970","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1334"],"id":"1971","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1336"],"id":"1972","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1338"],"id":"1973","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1342"],"id":"1974","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1357"],"id":"1981","language":"en","location":{"column":3,"line":1636},"name":"scenario 97","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1346"],"id":"1976","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1348"],"id":"1977","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1350"],"id":"1978","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1352"],"id":"1979","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1356"],"id":"1980","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1371"],"id":"1987","language":"en","location":{"column":3,"line":1653},"name":"scenario 98","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1360"],"id":"1982","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1362"],"id":"1983","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1364"],"id":"1984","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1366"],"id":"1985","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1370"],"id":"1986","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1385"],"id":"1993","language":"en","location":{"column":3,"line":1670},"name":"scenario 99","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1374"],"id":"1988","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1376"],"id":"1989","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1378"],"id":"1990","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1380"],"id":"1991","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1384"],"id":"1992","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} +{"pickle":{"astNodeIds":["1399"],"id":"1999","language":"en","location":{"column":3,"line":1687},"name":"scenario 100","steps":[{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]}]}},"astNodeIds":["1388"],"id":"1994","text":"a simple data table","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"}]}]}},"astNodeIds":["1390"],"id":"1995","text":"a data table with a single cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"},{"value":"boz"}]}]}},"astNodeIds":["1392"],"id":"1996","text":"a data table with different fromatting","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":""},{"value":"boz"}]}]}},"astNodeIds":["1394"],"id":"1997","text":"a data table with an empty cell","type":"Context"},{"argument":{"dataTable":{"rows":[{"cells":[{"value":"foo"},{"value":"bar"}]},{"cells":[{"value":"boz"},{"value":"boo"}]},{"cells":[{"value":"boz2"},{"value":"boo2"}]}]}},"astNodeIds":["1398"],"id":"1998","text":"a data table with comments and newlines inside","type":"Context"}],"tags":[],"uri":"../testdata/good/very_long.feature"}} From 0c5d0de517bef123439a5a1d98c15fe7375639ab Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Nov 2025 19:18:27 +0100 Subject: [PATCH 02/15] Use Java 17 --- java/.mvn/jvm.config | 10 + java/gherkin-java.razor | 22 +- java/pom.xml | 4 +- .../cucumber/gherkin/dialects}/Generate.java | 2 + .../dialects}/GenerateGherkinDialects.java | 2 + .../dialects}/GenerateKeywordMatchers.java | 52 ++-- .../gherkin/dialects/package-info.java | 4 + .../templates/gherkin-dialects.java.ftl | 0 .../templates/keyword-matchers.java.ftl | 0 .../java/io/cucumber/gherkin/AstNode.java | 7 +- .../io/cucumber/gherkin/GherkinDialect.java | 3 +- .../gherkin/GherkinDocumentBuilder.java | 115 ++++---- .../io/cucumber/gherkin/GherkinParser.java | 8 +- .../main/java/io/cucumber/gherkin/Parser.java | 278 ++++++------------ .../io/cucumber/gherkin/ParserException.java | 15 +- .../io/cucumber/gherkin/PickleCompiler.java | 25 +- .../main/java/io/cucumber/gherkin/Token.java | 40 ++- .../io/cucumber/gherkin/package-info.java | 4 + 18 files changed, 281 insertions(+), 310 deletions(-) create mode 100644 java/.mvn/jvm.config rename java/src/codegen/java/{ => io/cucumber/gherkin/dialects}/Generate.java (91%) rename java/src/codegen/java/{ => io/cucumber/gherkin/dialects}/GenerateGherkinDialects.java (98%) rename java/src/codegen/java/{ => io/cucumber/gherkin/dialects}/GenerateKeywordMatchers.java (83%) create mode 100644 java/src/codegen/java/io/cucumber/gherkin/dialects/package-info.java rename java/src/codegen/resources/{ => io/cucumber/gherkin/dialects}/templates/gherkin-dialects.java.ftl (100%) rename java/src/codegen/resources/{ => io/cucumber/gherkin/dialects}/templates/keyword-matchers.java.ftl (100%) create mode 100644 java/src/main/java/io/cucumber/gherkin/package-info.java diff --git a/java/.mvn/jvm.config b/java/.mvn/jvm.config new file mode 100644 index 000000000..32599cefe --- /dev/null +++ b/java/.mvn/jvm.config @@ -0,0 +1,10 @@ +--add-exports jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.model=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.processing=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED +--add-exports jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED +--add-opens jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED diff --git a/java/gherkin-java.razor b/java/gherkin-java.razor index 675175ba7..ff208ed3c 100644 --- a/java/gherkin-java.razor +++ b/java/gherkin-java.razor @@ -30,8 +30,8 @@ package io.cucumber.gherkin; import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.function.BiConsumer; import java.util.function.BiPredicate; @@ -104,7 +104,7 @@ final class @Model.ParserClassName { ParserContext context = new ParserContext( tokenScanner, tokenMatcher, - new LinkedList<>(), + new ArrayDeque<>(), new ArrayList<>() ); @@ -128,7 +128,7 @@ final class @Model.ParserClassName { private void addError(ParserContext context, ParserException error) { String newErrorMessage = error.getMessage(); for (ParserException e : context.errors) { - if (e.getMessage().equals(newErrorMessage)) { + if (Objects.equals(e.getMessage(), newErrorMessage)) { return; } } @@ -191,17 +191,15 @@ final class @Model.ParserClassName { } private int matchToken(int state, Token token, ParserContext context) { - int newState; - switch (state) { + int newState = switch (state) { @foreach(var state in Model.States.Values.Where(s => !s.IsEndState)) { - @:case @state.Id: - @:newState = matchTokenAt_@(state.Id)(token, context); - @:break; + @:case @state.Id -> matchTokenAt_@(state.Id)(token, context); } - default: + default -> { throw new IllegalStateException("Unknown state: " + state); - } + } + }; return newState; } @foreach(var state in Model.States.Values.Where(s => !s.IsEndState)) @@ -215,7 +213,7 @@ final class @Model.ParserClassName { @:{ if (transition.LookAheadHint != null) { - @:if (lookahead_@(transition.LookAheadHint.Id)(context, token)) + @:if (lookahead_@(transition.LookAheadHint.Id)(context)) @:{ } foreach(var production in transition.Productions) @@ -237,7 +235,7 @@ final class @Model.ParserClassName { @foreach(var lookAheadHint in Model.RuleSet.LookAheadHints) { - private boolean lookahead_@(lookAheadHint.Id)(ParserContext context, Token currentToken) { + private boolean lookahead_@(lookAheadHint.Id)(ParserContext context) { Token token; Queue queue = new ArrayDeque(); boolean match = false; diff --git a/java/pom.xml b/java/pom.xml index 1ff7488c4..da9be30d7 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -5,7 +5,7 @@ io.cucumber cucumber-parent - 4.5.0 + 5.0.0-SNAPSHOT gherkin 36.1.1-SNAPSHOT @@ -191,7 +191,7 @@ ${project.build.directory}/codegen-classes - Generate + io.cucumber.gherkin.dialects.Generate ${project.build.directory}/generated-sources/gherkin io/cucumber/gherkin diff --git a/java/src/codegen/java/Generate.java b/java/src/codegen/java/io/cucumber/gherkin/dialects/Generate.java similarity index 91% rename from java/src/codegen/java/Generate.java rename to java/src/codegen/java/io/cucumber/gherkin/dialects/Generate.java index 7e302cf1d..db76fa914 100644 --- a/java/src/codegen/java/Generate.java +++ b/java/src/codegen/java/io/cucumber/gherkin/dialects/Generate.java @@ -1,3 +1,5 @@ +package io.cucumber.gherkin.dialects; + public class Generate { public static void main(String[] args) throws Exception { diff --git a/java/src/codegen/java/GenerateGherkinDialects.java b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateGherkinDialects.java similarity index 98% rename from java/src/codegen/java/GenerateGherkinDialects.java rename to java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateGherkinDialects.java index bae73c1b5..81b013c77 100644 --- a/java/src/codegen/java/GenerateGherkinDialects.java +++ b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateGherkinDialects.java @@ -1,3 +1,5 @@ +package io.cucumber.gherkin.dialects; + import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import freemarker.template.Configuration; diff --git a/java/src/codegen/java/GenerateKeywordMatchers.java b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateKeywordMatchers.java similarity index 83% rename from java/src/codegen/java/GenerateKeywordMatchers.java rename to java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateKeywordMatchers.java index 723ab0c9f..aaf638334 100644 --- a/java/src/codegen/java/GenerateKeywordMatchers.java +++ b/java/src/codegen/java/io/cucumber/gherkin/dialects/GenerateKeywordMatchers.java @@ -1,3 +1,5 @@ +package io.cucumber.gherkin.dialects; + import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import freemarker.template.Configuration; @@ -21,7 +23,6 @@ import java.util.Map; import java.util.Set; import java.util.TreeMap; -import java.util.function.BinaryOperator; import java.util.stream.Collectors; import static io.cucumber.messages.types.StepKeywordType.ACTION; @@ -35,6 +36,7 @@ import static java.nio.file.StandardOpenOption.TRUNCATE_EXISTING; import static java.util.Comparator.naturalOrder; import static java.util.Map.Entry.comparingByKey; +import static java.util.Objects.requireNonNull; /* * This class generates the KeywordMatchers class using the FreeMarker @@ -74,7 +76,7 @@ private static Template readTemplate() throws IOException { private static Map readGherkinLanguages() throws IOException { ObjectMapper objectMapper = new ObjectMapper(); - TypeReference> mapObjectType = new TypeReference>() { + TypeReference> mapObjectType = new TypeReference<>() { }; try (Reader reader = newBufferedReader(Paths.get("../gherkin-languages.json"))) { Map sorted = new TreeMap<>(naturalOrder()); @@ -92,15 +94,13 @@ private static Map createMatcherModels(Map diale Map.Entry::getKey, entry -> matcherModel( entry.getKey(), (Map) entry.getValue()), - uniqueKeyCondition(), + GenerateKeywordMatchers::requireUniqueKeys, LinkedHashMap::new )); } - private static BinaryOperator uniqueKeyCondition() { - return (a, b) -> { - throw new IllegalStateException("Duplicate keys " + a + " and " + b); - }; + private static boolean requireUniqueKeys(Object a, Object b) { + throw new IllegalStateException("Duplicate keys " + a + " and " + b); } @SuppressWarnings("unchecked") @@ -110,7 +110,7 @@ private static Map matcherModel(String language, Map featureKeywords = distinctSortedKeywords( - (List) dialect.get("feature") + (List) requireNonNull(dialect.get("feature")) ); model.put("features", featureKeywords.stream().map(keyword -> { Map entry = new HashMap<>(); @@ -120,7 +120,7 @@ private static Map matcherModel(String language, Map backgroundKeywords = distinctSortedKeywords( - (List) dialect.get("background") + (List) requireNonNull(dialect.get("background")) ); model.put("backgrounds", backgroundKeywords.stream().map(keyword -> { Map entry = new HashMap<>(); @@ -130,7 +130,7 @@ private static Map matcherModel(String language, Map ruleKeywords = distinctSortedKeywords( - (List) dialect.get("rule") + (List) requireNonNull(dialect.get("rule")) ); model.put("rules", ruleKeywords.stream().map(keyword -> { Map entry = new HashMap<>(); @@ -140,8 +140,8 @@ private static Map matcherModel(String language, Map scenarioKeywords = distinctSortedKeywords( - (List) dialect.get("scenario"), - (List) dialect.get("scenarioOutline") + (List) requireNonNull(dialect.get("scenario")), + (List) requireNonNull(dialect.get("scenarioOutline")) ); model.put("scenarios", scenarioKeywords.stream().map(keyword -> { Map entry = new HashMap<>(); @@ -151,7 +151,7 @@ private static Map matcherModel(String language, Map exampleKeywords = distinctSortedKeywords( - (List) dialect.get("examples") + (List) requireNonNull(dialect.get("examples")) ); model.put("examples", exampleKeywords.stream().map(keyword -> { Map entry = new HashMap<>(); @@ -161,24 +161,24 @@ private static Map matcherModel(String language, Map aggregateKeywordTypes = aggregateKeywordTypes( - (List) dialect.get("given"), - (List) dialect.get("when"), - (List) dialect.get("then"), - (List) dialect.get("and"), - (List) dialect.get("but") + (List) requireNonNull(dialect.get("given")), + (List) requireNonNull(dialect.get("when")), + (List) requireNonNull(dialect.get("then")), + (List) requireNonNull(dialect.get("and")), + (List) requireNonNull(dialect.get("but")) ); List stepKeywords = distinctSortedKeywords( - (List) dialect.get("given"), - (List) dialect.get("when"), - (List) dialect.get("then"), - (List) dialect.get("and"), - (List) dialect.get("but") + (List) requireNonNull(dialect.get("given")), + (List) requireNonNull(dialect.get("when")), + (List) requireNonNull(dialect.get("then")), + (List) requireNonNull(dialect.get("and")), + (List) requireNonNull(dialect.get("but")) ); model.put("steps", stepKeywords.stream().map(keyword -> { Map entry = new HashMap<>(); entry.put("keyword", keyword); entry.put("length", keyword.length()); - entry.put("keywordType", aggregateKeywordTypes.get(keyword).name()); + entry.put("keywordType", requireNonNull(aggregateKeywordTypes.get(keyword)).name()); return entry; }).collect(Collectors.toList())); @@ -186,11 +186,11 @@ private static Map matcherModel(String language, Map T getSingle(RuleType ruleType, T defaultResult) { return items == null ? defaultResult : items.get(0); } - @SuppressWarnings("unchecked") - T getSingle(RuleType ruleType) { + @SuppressWarnings({"unchecked", "TypeParameterUnusedInFormals"}) + @Nullable T getSingle(RuleType ruleType) { // if not null, then at least one item is present because // the list was created in add(), so no need to check isEmpty() List items = (List) subItems.get(ruleType); return items == null ? null : items.get(0); } + @SuppressWarnings("TypeParameterUnusedInFormals") T getRequiredSingle(RuleType ruleType) { return requireNonNull(getSingle(ruleType)); } diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java b/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java index e4eea412b..7022375ee 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java @@ -1,6 +1,7 @@ package io.cucumber.gherkin; import io.cucumber.messages.types.StepKeywordType; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Comparator; @@ -154,7 +155,7 @@ public List getStepKeywords() { * @deprecated use {{@link #getStepKeywordTypesSet(String)}} instead. */ @Deprecated - public List getStepKeywordTypes(String keyword) { + public @Nullable List getStepKeywordTypes(String keyword) { Set stepKeywordTypes = stepKeywordsTypes.get(keyword); if (stepKeywordTypes == null) { return null; diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java b/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java index b9f764211..0a0d944ca 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java @@ -22,12 +22,14 @@ import java.util.Collections; import java.util.Deque; import java.util.List; +import java.util.Objects; import static io.cucumber.gherkin.GherkinParser.FEATURE_FILE_AVERAGE_LINE_LENGTH; import static io.cucumber.gherkin.Locations.atColumn; import static io.cucumber.gherkin.Parser.Builder; import static io.cucumber.gherkin.Parser.RuleType; import static io.cucumber.gherkin.Parser.TokenType; +import static java.util.Objects.requireNonNull; final class GherkinDocumentBuilder implements Builder { private final List comments = new ArrayList<>(); @@ -48,17 +50,17 @@ public void reset(String uri) { stack.push(new AstNode(RuleType.None)); } - private AstNode currentNode() { - return stack.peek(); + private AstNode requiredCurrentNode() { + return requireNonNull(stack.peek()); } @Override public void build(Token token) { if (token.matchedType == TokenType.Comment) { - Comment comment = new Comment(token.location, token.matchedText); + Comment comment = new Comment(token.location, token.getRequiredMatchedText()); comments.add(comment); } else { - currentNode().add(token.matchedType.ruleType, token); + requiredCurrentNode().add(token.getRequiredMatchedType().ruleType, token); } } @@ -71,66 +73,67 @@ public void startRule(RuleType ruleType) { public void endRule(RuleType ruleType) { AstNode node = stack.pop(); Object transformedNode = getTransformedNode(node); - currentNode().add(node.ruleType, transformedNode); + requiredCurrentNode().add(node.ruleType, transformedNode); } private Object getTransformedNode(AstNode node) { - switch (node.ruleType) { - case Step: { + return switch (node.ruleType) { + case Step -> { Token stepLine = node.getToken(TokenType.StepLine); - return new Step( + yield new Step( stepLine.location, - stepLine.matchedKeyword, + stepLine.getRequiredMatchedKeyword(), stepLine.keywordType, - stepLine.matchedText, + stepLine.getRequiredMatchedText(), node.getSingle(RuleType.DocString), node.getSingle(RuleType.DataTable), idGenerator.newId() ); } - case DocString: { + case DocString -> { Token separatorToken = node.getTokens(TokenType.DocStringSeparator).get(0); - String mediaType = separatorToken.matchedText.isEmpty() ? null : separatorToken.matchedText; + String matchedText = separatorToken.getRequiredMatchedText(); + String mediaType = matchedText.isEmpty() ? null : matchedText; List lineTokens = node.getTokens(TokenType.Other); String content = joinMatchedText(lineTokens, lineTokens.size()); - return new DocString( + yield new DocString( separatorToken.location, mediaType, content, - separatorToken.matchedKeyword + separatorToken.getRequiredMatchedKeyword() ); } - case DataTable: { + case DataTable -> { List rows = getTableRows(node); - return new DataTable(rows.get(0).getLocation(), rows); + yield new DataTable(rows.get(0).getLocation(), rows); } - case Background: { + case Background -> { Token backgroundLine = node.getToken(TokenType.BackgroundLine); - return new Background( + yield new Background( backgroundLine.location, - backgroundLine.matchedKeyword, - backgroundLine.matchedText, + backgroundLine.getRequiredMatchedKeyword(), + backgroundLine.getRequiredMatchedText(), getDescription(node), getSteps(node), idGenerator.newId() ); } - case ScenarioDefinition: { + case ScenarioDefinition -> { AstNode scenarioNode = node.getRequiredSingle(RuleType.Scenario); Token scenarioLine = scenarioNode.getToken(TokenType.ScenarioLine); - return new Scenario( + yield new Scenario( scenarioLine.location, getTags(node), - scenarioLine.matchedKeyword, - scenarioLine.matchedText, + scenarioLine.getRequiredMatchedKeyword(), + scenarioLine.getRequiredMatchedText(), getDescription(scenarioNode), getSteps(scenarioNode), scenarioNode.getItems(RuleType.ExamplesDefinition), idGenerator.newId() ); } - case ExamplesDefinition: { + case ExamplesDefinition -> { AstNode examplesNode = node.getRequiredSingle(RuleType.Examples); Token examplesLine = examplesNode.getToken(TokenType.ExamplesLine); // rows is null when a Scenario Outline has no Examples table @@ -145,30 +148,28 @@ private Object getTransformedNode(AstNode node) { tableBody = Collections.emptyList(); } - return new Examples( + yield new Examples( examplesLine.location, getTags(node), - examplesLine.matchedKeyword, - examplesLine.matchedText, + examplesLine.getRequiredMatchedKeyword(), + examplesLine.getRequiredMatchedText(), getDescription(examplesNode), tableHeader, tableBody, idGenerator.newId() ); } - case ExamplesTable: { - return getTableRows(node); - } - case Description: { + case ExamplesTable -> getTableRows(node); + case Description -> { List lineTokens = node.getTokens(TokenType.Other); // Trim trailing empty lines int toIndex = lineTokens.size(); - while (toIndex > 0 && lineTokens.get(toIndex - 1).line.isEmpty()) { + while (toIndex > 0 && lineTokens.get(toIndex - 1).getRequiredLine().isEmpty()) { toIndex--; } - return joinMatchedText(lineTokens, toIndex); + yield joinMatchedText(lineTokens, toIndex); } - case Feature: { + case Feature -> { AstNode header = node.getRequiredSingle(RuleType.FeatureHeader); List tags = getTags(header); Token featureLine = header.getToken(TokenType.FeatureLine); @@ -186,17 +187,17 @@ private Object getTransformedNode(AstNode node) { children.add(new FeatureChild(rule, null, null)); } - return new Feature( + yield new Feature( featureLine.location, tags, - featureLine.matchedLanguage, - featureLine.matchedKeyword, - featureLine.matchedText, + featureLine.getRequiredMatchedLanguage(), + featureLine.getRequiredMatchedKeyword(), + featureLine.getRequiredMatchedText(), getDescription(header), children ); } - case Rule: { + case Rule -> { AstNode header = node.getRequiredSingle(RuleType.RuleHeader); Token ruleLine = header.getToken(TokenType.RuleLine); @@ -213,32 +214,32 @@ private Object getTransformedNode(AstNode node) { children.add(new RuleChild(null, scenario)); } - return new Rule( + yield new Rule( ruleLine.location, tags, - ruleLine.matchedKeyword, - ruleLine.matchedText, + ruleLine.getRequiredMatchedKeyword(), + ruleLine.getRequiredMatchedText(), getDescription(header), children, idGenerator.newId() ); - } - case GherkinDocument: { + case GherkinDocument -> { Feature feature = node.getSingle(RuleType.Feature); // feature is null when the file is empty or contains only comments/whitespace, or no Cucumber feature - return new GherkinDocument(uri, feature, comments); + yield new GherkinDocument(uri, feature, comments); } - - } - return node; + // Do nothing. + default -> node; + }; } private static String joinMatchedText(List lineTokens, int toIndex) { StringBuilder content = new StringBuilder(FEATURE_FILE_AVERAGE_LINE_LENGTH * lineTokens.size()); for (int i = 0; i < toIndex; i++) { Token lineToken = lineTokens.get(i); - content.append(lineToken.matchedText).append('\n'); + String matchedText = lineToken.getRequiredMatchedText(); + content.append(matchedText).append('\n'); } int contentLength = content.length(); if (contentLength > 0) { @@ -277,6 +278,9 @@ private void ensureCellCount(List rows) { @SuppressWarnings("ForLoopReplaceableByForEach") // classic 'for' loop is ~2x faster than 'for-each' private List getCells(Token token) { List matchedItems = token.matchedItems; + if (matchedItems == null) { + return new ArrayList<>(0); + } int itemSize = matchedItems.size(); List cells = new ArrayList<>(itemSize); for (int i = 0; i < itemSize; i++) { @@ -301,14 +305,17 @@ private String getDescription(AstNode node) { private List getTags(AstNode node) { AstNode tagsNode = node.getSingle(RuleType.Tags); if (tagsNode == null) {// tags are optional - return Collections.emptyList(); + return new ArrayList<>(0); } List tokens = tagsNode.getTokens(TokenType.TagLine); List tags = new ArrayList<>(); for (Token token : tokens) { - for (LineSpan tagItem : token.matchedItems) { - tags.add(new Tag(atColumn(token.location, tagItem.column), tagItem.text, idGenerator.newId())); + List matchedItems = token.matchedItems; + if (matchedItems != null) { + for (LineSpan tagItem : matchedItems) { + tags.add(new Tag(atColumn(token.location, tagItem.column), tagItem.text, idGenerator.newId())); + } } } return tags; @@ -316,7 +323,7 @@ private List getTags(AstNode node) { @Override public GherkinDocument getResult() { - return currentNode().getSingle(RuleType.GherkinDocument); + return requiredCurrentNode().getRequiredSingle(RuleType.GherkinDocument); } } diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinParser.java b/java/src/main/java/io/cucumber/gherkin/GherkinParser.java index 522f74d9b..55615514f 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinParser.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinParser.java @@ -22,6 +22,7 @@ import static io.cucumber.messages.types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN; import static java.util.Objects.requireNonNull; import static java.util.stream.Collectors.toCollection; +import static java.util.stream.Collectors.toList; /** * Main entry point for the Gherkin library @@ -160,9 +161,9 @@ private List parse(String uri, String data) { } } } catch (CompositeParserException composite) { - composite.errors.stream() + messages.addAll(composite.errors.stream() .map(error -> createParseError(error, uri)) - .collect(toCollection(() -> messages)); + .collect(toList())); } catch (ParserException error) { messages.add(createParseError(error, uri)); } @@ -177,7 +178,8 @@ private Envelope createParseError(ParserException e, String uri) { null, e.location ), - e.getMessage() + // ParserException always has a message + requireNonNull(e.getMessage()) )); } diff --git a/java/src/main/java/io/cucumber/gherkin/Parser.java b/java/src/main/java/io/cucumber/gherkin/Parser.java index 0d3057392..c51c87735 100644 --- a/java/src/main/java/io/cucumber/gherkin/Parser.java +++ b/java/src/main/java/io/cucumber/gherkin/Parser.java @@ -2,8 +2,8 @@ import java.util.ArrayDeque; import java.util.ArrayList; -import java.util.LinkedList; import java.util.List; +import java.util.Objects; import java.util.Queue; import java.util.function.BiConsumer; import java.util.function.BiPredicate; @@ -118,7 +118,7 @@ T parse(TokenScanner tokenScanner, TokenMatcher tokenMatcher, String uri) { ParserContext context = new ParserContext( tokenScanner, tokenMatcher, - new LinkedList<>(), + new ArrayDeque<>(), new ArrayList<>() ); @@ -142,7 +142,7 @@ T parse(TokenScanner tokenScanner, TokenMatcher tokenMatcher, String uri) { private void addError(ParserContext context, ParserException error) { String newErrorMessage = error.getMessage(); for (ParserException e : context.errors) { - if (e.getMessage().equals(newErrorMessage)) { + if (Objects.equals(e.getMessage(), newErrorMessage)) { return; } } @@ -263,137 +263,53 @@ private boolean match_Other(final ParserContext context, final Token token) { } private int matchToken(int state, Token token, ParserContext context) { - int newState; - switch (state) { - case 0: - newState = matchTokenAt_0(token, context); - break; - case 1: - newState = matchTokenAt_1(token, context); - break; - case 2: - newState = matchTokenAt_2(token, context); - break; - case 3: - newState = matchTokenAt_3(token, context); - break; - case 4: - newState = matchTokenAt_4(token, context); - break; - case 5: - newState = matchTokenAt_5(token, context); - break; - case 6: - newState = matchTokenAt_6(token, context); - break; - case 7: - newState = matchTokenAt_7(token, context); - break; - case 8: - newState = matchTokenAt_8(token, context); - break; - case 9: - newState = matchTokenAt_9(token, context); - break; - case 10: - newState = matchTokenAt_10(token, context); - break; - case 11: - newState = matchTokenAt_11(token, context); - break; - case 12: - newState = matchTokenAt_12(token, context); - break; - case 13: - newState = matchTokenAt_13(token, context); - break; - case 14: - newState = matchTokenAt_14(token, context); - break; - case 15: - newState = matchTokenAt_15(token, context); - break; - case 16: - newState = matchTokenAt_16(token, context); - break; - case 17: - newState = matchTokenAt_17(token, context); - break; - case 18: - newState = matchTokenAt_18(token, context); - break; - case 19: - newState = matchTokenAt_19(token, context); - break; - case 20: - newState = matchTokenAt_20(token, context); - break; - case 21: - newState = matchTokenAt_21(token, context); - break; - case 22: - newState = matchTokenAt_22(token, context); - break; - case 23: - newState = matchTokenAt_23(token, context); - break; - case 24: - newState = matchTokenAt_24(token, context); - break; - case 25: - newState = matchTokenAt_25(token, context); - break; - case 26: - newState = matchTokenAt_26(token, context); - break; - case 27: - newState = matchTokenAt_27(token, context); - break; - case 28: - newState = matchTokenAt_28(token, context); - break; - case 29: - newState = matchTokenAt_29(token, context); - break; - case 30: - newState = matchTokenAt_30(token, context); - break; - case 31: - newState = matchTokenAt_31(token, context); - break; - case 32: - newState = matchTokenAt_32(token, context); - break; - case 33: - newState = matchTokenAt_33(token, context); - break; - case 35: - newState = matchTokenAt_35(token, context); - break; - case 36: - newState = matchTokenAt_36(token, context); - break; - case 37: - newState = matchTokenAt_37(token, context); - break; - case 38: - newState = matchTokenAt_38(token, context); - break; - case 39: - newState = matchTokenAt_39(token, context); - break; - case 40: - newState = matchTokenAt_40(token, context); - break; - case 41: - newState = matchTokenAt_41(token, context); - break; - case 42: - newState = matchTokenAt_42(token, context); - break; - default: + int newState = switch (state) { + case 0 -> matchTokenAt_0(token, context); + case 1 -> matchTokenAt_1(token, context); + case 2 -> matchTokenAt_2(token, context); + case 3 -> matchTokenAt_3(token, context); + case 4 -> matchTokenAt_4(token, context); + case 5 -> matchTokenAt_5(token, context); + case 6 -> matchTokenAt_6(token, context); + case 7 -> matchTokenAt_7(token, context); + case 8 -> matchTokenAt_8(token, context); + case 9 -> matchTokenAt_9(token, context); + case 10 -> matchTokenAt_10(token, context); + case 11 -> matchTokenAt_11(token, context); + case 12 -> matchTokenAt_12(token, context); + case 13 -> matchTokenAt_13(token, context); + case 14 -> matchTokenAt_14(token, context); + case 15 -> matchTokenAt_15(token, context); + case 16 -> matchTokenAt_16(token, context); + case 17 -> matchTokenAt_17(token, context); + case 18 -> matchTokenAt_18(token, context); + case 19 -> matchTokenAt_19(token, context); + case 20 -> matchTokenAt_20(token, context); + case 21 -> matchTokenAt_21(token, context); + case 22 -> matchTokenAt_22(token, context); + case 23 -> matchTokenAt_23(token, context); + case 24 -> matchTokenAt_24(token, context); + case 25 -> matchTokenAt_25(token, context); + case 26 -> matchTokenAt_26(token, context); + case 27 -> matchTokenAt_27(token, context); + case 28 -> matchTokenAt_28(token, context); + case 29 -> matchTokenAt_29(token, context); + case 30 -> matchTokenAt_30(token, context); + case 31 -> matchTokenAt_31(token, context); + case 32 -> matchTokenAt_32(token, context); + case 33 -> matchTokenAt_33(token, context); + case 35 -> matchTokenAt_35(token, context); + case 36 -> matchTokenAt_36(token, context); + case 37 -> matchTokenAt_37(token, context); + case 38 -> matchTokenAt_38(token, context); + case 39 -> matchTokenAt_39(token, context); + case 40 -> matchTokenAt_40(token, context); + case 41 -> matchTokenAt_41(token, context); + case 42 -> matchTokenAt_42(token, context); + default -> { throw new IllegalStateException("Unknown state: " + state); - } + } + }; return newState; } @@ -544,7 +460,7 @@ private int matchTokenAt_3(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.FeatureHeader); startRule(context, RuleType.ScenarioDefinition); @@ -620,7 +536,7 @@ private int matchTokenAt_4(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.FeatureHeader); @@ -702,7 +618,7 @@ private int matchTokenAt_5(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Background); startRule(context, RuleType.ScenarioDefinition); @@ -777,7 +693,7 @@ private int matchTokenAt_6(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Background); @@ -862,7 +778,7 @@ private int matchTokenAt_7(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Step); endRule(context, RuleType.Background); @@ -947,7 +863,7 @@ private int matchTokenAt_8(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DataTable); endRule(context, RuleType.Step); @@ -1074,7 +990,7 @@ private int matchTokenAt_10(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { startRule(context, RuleType.ExamplesDefinition); startRule(context, RuleType.Tags); @@ -1084,7 +1000,7 @@ private int matchTokenAt_10(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Scenario); endRule(context, RuleType.ScenarioDefinition); @@ -1171,7 +1087,7 @@ private int matchTokenAt_11(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Description); startRule(context, RuleType.ExamplesDefinition); @@ -1182,7 +1098,7 @@ private int matchTokenAt_11(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Scenario); @@ -1280,7 +1196,7 @@ private int matchTokenAt_12(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Step); startRule(context, RuleType.ExamplesDefinition); @@ -1291,7 +1207,7 @@ private int matchTokenAt_12(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Step); endRule(context, RuleType.Scenario); @@ -1389,7 +1305,7 @@ private int matchTokenAt_13(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.DataTable); endRule(context, RuleType.Step); @@ -1401,7 +1317,7 @@ private int matchTokenAt_13(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DataTable); endRule(context, RuleType.Step); @@ -1543,7 +1459,7 @@ private int matchTokenAt_15(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Examples); endRule(context, RuleType.ExamplesDefinition); @@ -1555,7 +1471,7 @@ private int matchTokenAt_15(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Examples); endRule(context, RuleType.ExamplesDefinition); @@ -1654,7 +1570,7 @@ private int matchTokenAt_16(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Examples); @@ -1667,7 +1583,7 @@ private int matchTokenAt_16(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Examples); @@ -1763,7 +1679,7 @@ private int matchTokenAt_17(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.ExamplesTable); endRule(context, RuleType.Examples); @@ -1776,7 +1692,7 @@ private int matchTokenAt_17(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.ExamplesTable); endRule(context, RuleType.Examples); @@ -1921,7 +1837,7 @@ private int matchTokenAt_19(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.RuleHeader); startRule(context, RuleType.ScenarioDefinition); @@ -2000,7 +1916,7 @@ private int matchTokenAt_20(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.RuleHeader); @@ -2085,7 +2001,7 @@ private int matchTokenAt_21(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Background); startRule(context, RuleType.ScenarioDefinition); @@ -2163,7 +2079,7 @@ private int matchTokenAt_22(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Background); @@ -2251,7 +2167,7 @@ private int matchTokenAt_23(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Step); endRule(context, RuleType.Background); @@ -2339,7 +2255,7 @@ private int matchTokenAt_24(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DataTable); endRule(context, RuleType.Step); @@ -2469,7 +2385,7 @@ private int matchTokenAt_26(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { startRule(context, RuleType.ExamplesDefinition); startRule(context, RuleType.Tags); @@ -2479,7 +2395,7 @@ private int matchTokenAt_26(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Scenario); endRule(context, RuleType.ScenarioDefinition); @@ -2569,7 +2485,7 @@ private int matchTokenAt_27(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Description); startRule(context, RuleType.ExamplesDefinition); @@ -2580,7 +2496,7 @@ private int matchTokenAt_27(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Scenario); @@ -2681,7 +2597,7 @@ private int matchTokenAt_28(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Step); startRule(context, RuleType.ExamplesDefinition); @@ -2692,7 +2608,7 @@ private int matchTokenAt_28(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Step); endRule(context, RuleType.Scenario); @@ -2793,7 +2709,7 @@ private int matchTokenAt_29(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.DataTable); endRule(context, RuleType.Step); @@ -2805,7 +2721,7 @@ private int matchTokenAt_29(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DataTable); endRule(context, RuleType.Step); @@ -2950,7 +2866,7 @@ private int matchTokenAt_31(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Examples); endRule(context, RuleType.ExamplesDefinition); @@ -2962,7 +2878,7 @@ private int matchTokenAt_31(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Examples); endRule(context, RuleType.ExamplesDefinition); @@ -3064,7 +2980,7 @@ private int matchTokenAt_32(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Examples); @@ -3077,7 +2993,7 @@ private int matchTokenAt_32(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.Description); endRule(context, RuleType.Examples); @@ -3176,7 +3092,7 @@ private int matchTokenAt_33(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.ExamplesTable); endRule(context, RuleType.Examples); @@ -3189,7 +3105,7 @@ private int matchTokenAt_33(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.ExamplesTable); endRule(context, RuleType.Examples); @@ -3318,7 +3234,7 @@ private int matchTokenAt_36(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.DocString); endRule(context, RuleType.Step); @@ -3330,7 +3246,7 @@ private int matchTokenAt_36(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DocString); endRule(context, RuleType.Step); @@ -3453,7 +3369,7 @@ private int matchTokenAt_38(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DocString); endRule(context, RuleType.Step); @@ -3563,7 +3479,7 @@ private int matchTokenAt_40(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_1(context, token)) + if (lookahead_1(context)) { endRule(context, RuleType.DocString); endRule(context, RuleType.Step); @@ -3575,7 +3491,7 @@ private int matchTokenAt_40(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DocString); endRule(context, RuleType.Step); @@ -3695,7 +3611,7 @@ private int matchTokenAt_42(Token token, ParserContext context) { } if (match_TagLine(context, token)) { - if (lookahead_0(context, token)) + if (lookahead_0(context)) { endRule(context, RuleType.DocString); endRule(context, RuleType.Step); @@ -3759,7 +3675,7 @@ private int matchTokenAt_42(Token token, ParserContext context) { } - private boolean lookahead_0(ParserContext context, Token currentToken) { + private boolean lookahead_0(ParserContext context) { Token token; Queue queue = new ArrayDeque(); boolean match = false; @@ -3786,7 +3702,7 @@ private boolean lookahead_0(ParserContext context, Token currentToken) { return match; } - private boolean lookahead_1(ParserContext context, Token currentToken) { + private boolean lookahead_1(ParserContext context) { Token token; Queue queue = new ArrayDeque(); boolean match = false; diff --git a/java/src/main/java/io/cucumber/gherkin/ParserException.java b/java/src/main/java/io/cucumber/gherkin/ParserException.java index 21322154e..5a3941095 100644 --- a/java/src/main/java/io/cucumber/gherkin/ParserException.java +++ b/java/src/main/java/io/cucumber/gherkin/ParserException.java @@ -2,27 +2,31 @@ import java.util.Collections; import java.util.List; +import java.util.Objects; import java.util.stream.Collectors; import io.cucumber.messages.types.Location; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import static io.cucumber.gherkin.Locations.COLUMN_OFFSET; import static io.cucumber.gherkin.Locations.atColumn; +import static java.util.Objects.requireNonNull; class ParserException extends RuntimeException { - final Location location; + final @Nullable Location location; protected ParserException(String message) { super(message); location = null; } - protected ParserException(String message, Location location) { + protected ParserException(String message, @Nullable Location location) { super(createMessage(message, location)); this.location = location; } - private static String createMessage(String message, Location location) { + private static String createMessage(String message, @Nullable Location location) { if (location == null) { return String.format("(-1,0): %s", message); } @@ -38,7 +42,7 @@ static final class AstBuilderException extends ParserException { } static final class NoSuchLanguageException extends ParserException { - NoSuchLanguageException(String language, Location location) { + NoSuchLanguageException(String language, @Nullable Location location) { super("Language not supported: " + language, location); } } @@ -67,7 +71,7 @@ private static Location getLocation(Token receivedToken) { if (receivedToken.location.getColumn().isPresent()) { return receivedToken.location; } - int column = COLUMN_OFFSET + receivedToken.line.getIndent(); + int column = COLUMN_OFFSET + requireNonNull(receivedToken.line).getIndent(); return atColumn(receivedToken.location, column); } } @@ -97,7 +101,6 @@ static final class CompositeParserException extends ParserException { } private static String getMessage(List errors) { - if (errors == null) throw new NullPointerException("errors"); return "Parser errors:\n" + errors.stream() .map(Throwable::getMessage) .collect(Collectors.joining("\n")); diff --git a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java index 5bd207cef..a19fe930c 100644 --- a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java +++ b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java @@ -24,6 +24,7 @@ import io.cucumber.messages.types.TableCell; import io.cucumber.messages.types.TableRow; import io.cucumber.messages.types.Tag; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -129,10 +130,10 @@ private List compileTags(List parentTags, List scenarioTags) { return tags; } - private List compilePickleSteps(List backgroundSteps, List scenarioSteps, List variableCells, TableRow valuesRow) { + private List compilePickleSteps(List backgroundSteps, List scenarioSteps, List variableCells, @Nullable TableRow valuesRow) { if (scenarioSteps.isEmpty()) { // usually, a scenario has at least one step, but that's not mandatory - return emptyList(); + return new ArrayList<>(0); } List steps = new ArrayList<>(backgroundSteps.size() + scenarioSteps.size()); StepKeywordType lastKeywordType = UNKNOWN; @@ -203,7 +204,7 @@ private PickleDocString pickleDocString(DocString docString, List var ); } - private PickleStep pickleStep(Step step, List variableCells, TableRow valuesRow, StepKeywordType keywordType) { + private PickleStep pickleStep(Step step, List variableCells, @Nullable TableRow valuesRow, StepKeywordType keywordType) { List valueCells = valuesRow == null ? emptyList() : valuesRow.getCells(); String stepText = interpolate(step.getText(), variableCells, valueCells); @@ -235,16 +236,12 @@ private PickleStep pickleStep(Step step, List variableCells, TableRow } private static PickleStepType pickleStepType(StepKeywordType keywordType) { - switch (keywordType) { - case CONTEXT: - return PickleStepType.CONTEXT; - case ACTION: - return PickleStepType.ACTION; - case OUTCOME: - return PickleStepType.OUTCOME; - default: - return PickleStepType.UNKNOWN; - } + return switch (keywordType) { + case CONTEXT -> PickleStepType.CONTEXT; + case ACTION -> PickleStepType.ACTION; + case OUTCOME -> PickleStepType.OUTCOME; + default -> PickleStepType.UNKNOWN; + }; } private PickleStep pickleBackgroundStep(Step step, StepKeywordType keywordType) { @@ -265,7 +262,7 @@ private String interpolate(String name, List variableCells, List pickleTags(List tags) { if (tags.isEmpty()) { - return emptyList(); + return new ArrayList<>(0); } List result = new ArrayList<>(); for (Tag tag : tags) { diff --git a/java/src/main/java/io/cucumber/gherkin/Token.java b/java/src/main/java/io/cucumber/gherkin/Token.java index a01c6414a..cc13f790b 100644 --- a/java/src/main/java/io/cucumber/gherkin/Token.java +++ b/java/src/main/java/io/cucumber/gherkin/Token.java @@ -2,24 +2,26 @@ import io.cucumber.messages.types.Location; import io.cucumber.messages.types.StepKeywordType; +import org.jspecify.annotations.NonNull; +import org.jspecify.annotations.Nullable; import java.util.List; import static java.util.Objects.requireNonNull; final class Token { - final Line line; + final @Nullable Line line; final boolean eof; - Parser.TokenType matchedType; - String matchedKeyword; - String matchedText; - List matchedItems; + Parser.@Nullable TokenType matchedType; + @Nullable String matchedKeyword; + @Nullable String matchedText; + @Nullable List matchedItems; int matchedIndent; - String matchedLanguage; - StepKeywordType keywordType; + @Nullable String matchedLanguage; + @Nullable StepKeywordType keywordType; Location location; - private Token(Line line, Location location) { + private Token(@Nullable Line line, Location location) { this.line = line; this.location = location; this.eof = line == null; @@ -41,11 +43,31 @@ boolean isEOF() { } String getTokenValue() { - return isEOF() ? "EOF" : line.getText(); + return line == null ? "EOF" : line.getText(); } @Override public String toString() { return String.format("%s: %s/%s", matchedType, matchedKeyword, matchedText); } + + String getRequiredMatchedKeyword() { + return requireNonNull(matchedKeyword); + } + + String getRequiredMatchedText() { + return requireNonNull(matchedText); + } + + String getRequiredMatchedLanguage() { + return requireNonNull(matchedLanguage); + } + + Parser.TokenType getRequiredMatchedType() { + return requireNonNull(matchedType); + } + + Line getRequiredLine() { + return requireNonNull(line); + } } diff --git a/java/src/main/java/io/cucumber/gherkin/package-info.java b/java/src/main/java/io/cucumber/gherkin/package-info.java new file mode 100644 index 000000000..40a09e6d0 --- /dev/null +++ b/java/src/main/java/io/cucumber/gherkin/package-info.java @@ -0,0 +1,4 @@ +@NullMarked +package io.cucumber.gherkin; + +import org.jspecify.annotations.NullMarked; \ No newline at end of file From 17a72a655413b9371e5a9a2b4d9254a628ba1aa2 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Nov 2025 19:41:04 +0100 Subject: [PATCH 03/15] Add EOLs --- .../codegen/java/io/cucumber/gherkin/dialects/package-info.java | 2 +- java/src/main/java/io/cucumber/gherkin/package-info.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/java/src/codegen/java/io/cucumber/gherkin/dialects/package-info.java b/java/src/codegen/java/io/cucumber/gherkin/dialects/package-info.java index 1e7cd2d32..b961c6790 100644 --- a/java/src/codegen/java/io/cucumber/gherkin/dialects/package-info.java +++ b/java/src/codegen/java/io/cucumber/gherkin/dialects/package-info.java @@ -1,4 +1,4 @@ @NullMarked package io.cucumber.gherkin.dialects; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/java/src/main/java/io/cucumber/gherkin/package-info.java b/java/src/main/java/io/cucumber/gherkin/package-info.java index 40a09e6d0..d26b85f8d 100644 --- a/java/src/main/java/io/cucumber/gherkin/package-info.java +++ b/java/src/main/java/io/cucumber/gherkin/package-info.java @@ -1,4 +1,4 @@ @NullMarked package io.cucumber.gherkin; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; From 269f7cf3ec2e8ae2565d05f417a27fcc0c7cb5db Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Nov 2025 20:20:24 +0100 Subject: [PATCH 04/15] More nullaway --- .../templates/keyword-matchers.java.ftl | 19 +++-- .../cucumber/gherkin/GherkinTokenMatcher.java | 72 +++++++++------- .../io/cucumber/gherkin/KeywordMatcher.java | 13 +-- .../io/cucumber/gherkin/TableRowLine.java | 19 ++--- .../java/io/cucumber/gherkin/ExampleTest.java | 14 +-- .../cucumber/gherkin/GherkinDialectTest.java | 6 -- .../gherkin/GherkinDocumentBuilderTest.java | 85 ++++++++++--------- .../cucumber/gherkin/GherkinParserTest.java | 28 +++--- .../cucumber/gherkin/KeywordMatchersTest.java | 52 ++++++------ .../test/java/io/cucumber/gherkin/Main.java | 32 +++---- .../io/cucumber/gherkin/TableRowLineTest.java | 27 +++--- .../io/cucumber/gherkin/TestDataTest.java | 32 ------- .../io/cucumber/gherkin/TokenFormatter.java | 4 +- 13 files changed, 197 insertions(+), 206 deletions(-) delete mode 100644 java/src/test/java/io/cucumber/gherkin/TestDataTest.java diff --git a/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/keyword-matchers.java.ftl b/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/keyword-matchers.java.ftl index 007c1c719..56f8f79fb 100644 --- a/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/keyword-matchers.java.ftl +++ b/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/keyword-matchers.java.ftl @@ -1,5 +1,7 @@ package io.cucumber.gherkin; +import org.jspecify.annotations.Nullable; + import java.util.Objects; import static io.cucumber.messages.types.StepKeywordType.ACTION; @@ -15,20 +17,20 @@ import static io.cucumber.gherkin.Constants.TITLE_KEYWORD_SEPARATOR_LENGTH; */ final class KeywordMatchers { + @Nullable static KeywordMatcher of(String language) { Objects.requireNonNull(language); - switch (language){ + return switch (language){ <#list matchers as name, matcher> - case "${name}": - return new ${matcher.className}(); + case "${name}" -> new ${matcher.className}(); - default: - return null; - } + default -> null; + }; } <#list matchers as name, matcher> private static final class ${matcher.className} implements KeywordMatcher { @Override + @Nullable public Match matchFeatureKeyword(Line line) { <#list matcher.features as feature> if (line.startsWithTitleKeyword("${feature.keyword}")) { @@ -38,6 +40,7 @@ final class KeywordMatchers { return null; } @Override + @Nullable public Match matchBackgroundKeyword(Line line) { <#list matcher.backgrounds as background> if (line.startsWithTitleKeyword("${background.keyword}")) { @@ -47,6 +50,7 @@ final class KeywordMatchers { return null; } @Override + @Nullable public Match matchRuleKeyword(Line line) { <#list matcher.rules as rule> if (line.startsWithTitleKeyword("${rule.keyword}")) { @@ -56,6 +60,7 @@ final class KeywordMatchers { return null; } @Override + @Nullable public Match matchScenarioKeyword(Line line) { <#list matcher.scenarios as scenario> if (line.startsWithTitleKeyword("${scenario.keyword}")) { @@ -65,6 +70,7 @@ final class KeywordMatchers { return null; } @Override + @Nullable public Match matchExampleKeyword(Line line) { <#list matcher.examples as example> if (line.startsWithTitleKeyword("${example.keyword}")) { @@ -74,6 +80,7 @@ final class KeywordMatchers { return null; } @Override + @Nullable public StepMatch matchStepKeyword(Line line) { <#list matcher.steps as step> if (line.startsWith("${step.keyword}")) { diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java b/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java index bba76eac0..c059ed3dd 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java @@ -3,6 +3,7 @@ import io.cucumber.gherkin.Parser.TokenMatcher; import io.cucumber.messages.types.Location; import io.cucumber.messages.types.StepKeywordType; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.List; @@ -27,13 +28,14 @@ final class GherkinTokenMatcher implements TokenMatcher { private final String defaultLanguage; // Expect at most two languages, the default language and one other private final Map activeKeywordMatchers = new HashMap<>(2); - private String currentLanguage; + private @Nullable String currentLanguage; private KeywordMatcher currentKeywordMatcher; - private String activeDocStringSeparator = null; + private @Nullable String activeDocStringSeparator = null; private int indentToRemove = 0; GherkinTokenMatcher(String defaultLanguage) { this.defaultLanguage = defaultLanguage; + this.currentKeywordMatcher = activeKeywordMatchers.computeIfAbsent(defaultLanguage, KeywordMatchers::of); reset(); } @@ -49,7 +51,7 @@ public void reset() { setLanguageMatched(defaultLanguage, null); } - private void setLanguageMatched(String language, Location location) { + private void setLanguageMatched(String language, @Nullable Location location) { if (language.equals(currentLanguage)) { return; } @@ -61,7 +63,7 @@ private void setLanguageMatched(String language, Location location) { currentKeywordMatcher = keywordMatcher; } - private void setTokenMatched(Token token, TokenType matchedType, String text, String keyword, int indent, StepKeywordType keywordType, List items) { + private void setTokenMatched(Token token, TokenType matchedType, @Nullable String text, @Nullable String keyword, int indent, @Nullable StepKeywordType keywordType, @Nullable List items) { token.matchedType = matchedType; token.matchedKeyword = keyword; token.keywordType = keywordType; @@ -90,7 +92,7 @@ public boolean match_Other(Token token) { @Override public boolean match_Empty(Token token) { - if (!token.line.isEmpty()) { + if (!token.getRequiredLine().isEmpty()) { return false; } setTokenMatched(token, TokenType.Empty, null, null, 0, null, null); @@ -99,36 +101,39 @@ public boolean match_Empty(Token token) { @Override public boolean match_Comment(Token token) { - if (!token.line.startsWith(COMMENT_PREFIX_CHAR)) { + Line line = token.getRequiredLine(); + if (!line.startsWith(COMMENT_PREFIX_CHAR)) { return false; } - String text = token.line.getRawText(); + String text = line.getRawText(); setTokenMatched(token, TokenType.Comment, text, null, 0, null, null); return true; } @Override public boolean match_Language(Token token) { - if (!token.line.startsWith(COMMENT_PREFIX_CHAR)) { + Line line = token.getRequiredLine(); + if (!line.startsWith(COMMENT_PREFIX_CHAR)) { return false; } - Matcher matcher = LANGUAGE_PATTERN.matcher(token.line.getText()); + Matcher matcher = LANGUAGE_PATTERN.matcher(line.getText()); if (!matcher.matches()) { return false; } String language = matcher.group(1); - setTokenMatched(token, TokenType.Language, language, null, token.line.getIndent(), null, null); + setTokenMatched(token, TokenType.Language, language, null, line.getIndent(), null, null); setLanguageMatched(language, token.location); return true; } @Override public boolean match_TagLine(Token token) { - if (!token.line.startsWith(TAG_PREFIX_CHAR)) { + Line line = token.getRequiredLine(); + if (!line.startsWith(TAG_PREFIX_CHAR)) { return false; } - List tags = TagLine.parse(token.line.getIndent(), token.line.getText(), token.location); - setTokenMatched(token, TokenType.TagLine, null, null, token.line.getIndent(), null, tags); + List tags = TagLine.parse(line.getIndent(), line.getText(), token.location); + setTokenMatched(token, TokenType.TagLine, null, null, line.getIndent(), null, tags); return true; } @@ -157,15 +162,16 @@ public boolean match_ExamplesLine(Token token) { return matchTitleLine(token, TokenType.ExamplesLine, currentKeywordMatcher::matchExampleKeyword); } - private boolean matchTitleLine(Token token, TokenType tokenType, Function matcher) { - KeywordMatcher.Match match = matcher.apply(token.line); + private boolean matchTitleLine(Token token, TokenType tokenType, Function matcher) { + Line line = token.getRequiredLine(); + KeywordMatcher.Match match = matcher.apply(line); if (match == null) { return false; } String keyword = match.getKeyword(); int keywordLength = match.getKeywordLength(); - String title = token.line.substringTrimmed(keywordLength); - setTokenMatched(token, tokenType, title, keyword, token.line.getIndent(), null, null); + String title = line.substringTrimmed(keywordLength); + setTokenMatched(token, tokenType, title, keyword, line.getIndent(), null, null); return true; } @@ -180,56 +186,60 @@ public boolean match_DocStringSeparator(Token token) { } private boolean match_DocStringSeparator(Token token, String separator, boolean isOpen) { - if (!token.line.startsWith(separator)) { + Line line = token.getRequiredLine(); + if (!line.startsWith(separator)) { return false; } String mediaType = null; if (isOpen) { - mediaType = token.line.substringTrimmed(separator.length()); + mediaType = line.substringTrimmed(separator.length()); activeDocStringSeparator = separator; - indentToRemove = token.line.getIndent(); + indentToRemove = line.getIndent(); } else { activeDocStringSeparator = null; indentToRemove = 0; } - setTokenMatched(token, TokenType.DocStringSeparator, mediaType, separator, token.line.getIndent(), null, null); + setTokenMatched(token, TokenType.DocStringSeparator, mediaType, separator, line.getIndent(), null, null); return true; } @Override public boolean match_StepLine(Token token) { - KeywordMatcher.StepMatch match = currentKeywordMatcher.matchStepKeyword(token.line); + Line line = token.getRequiredLine(); + KeywordMatcher.StepMatch match = currentKeywordMatcher.matchStepKeyword(line); if (match == null) { return false; } String keyword = match.getKeyword(); int keywordLength = match.getKeywordLength(); StepKeywordType keywordType = match.getKeywordType(); - String stepText = token.line.substringTrimmed(keywordLength); - setTokenMatched(token, TokenType.StepLine, stepText, keyword, token.line.getIndent(), keywordType, null); + String stepText = line.substringTrimmed(keywordLength); + setTokenMatched(token, TokenType.StepLine, stepText, keyword, line.getIndent(), keywordType, null); return true; } @Override public boolean match_TableRow(Token token) { - if (!token.line.startsWith(TABLE_CELL_SEPARATOR)) { + Line line = token.getRequiredLine(); + if (!line.startsWith(TABLE_CELL_SEPARATOR)) { return false; } - List tableCells = TableRowLine.parse(token.line.getIndent(), token.line.getText()); - setTokenMatched(token, TokenType.TableRow, null, null, token.line.getIndent(), null, tableCells); + List tableCells = TableRowLine.parse(line.getIndent(), line.getText()); + setTokenMatched(token, TokenType.TableRow, null, null, line.getIndent(), null, tableCells); return true; } private String removeDocStringIndent(Token token) { + Line line = token.getRequiredLine(); if (activeDocStringSeparator == null) { - return token.line.getRawText(); + return line.getRawText(); } - if (indentToRemove > token.line.getIndent()) { + if (indentToRemove > line.getIndent()) { // BUG: Removes trailing whitespace! - return token.line.getText(); + return line.getText(); } - return token.line.getRawTextSubstring(indentToRemove); + return line.getRawTextSubstring(indentToRemove); } private String unescapeDocString(String text) { diff --git a/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java b/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java index 004a06383..b0a819efd 100644 --- a/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java +++ b/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java @@ -1,15 +1,16 @@ package io.cucumber.gherkin; import io.cucumber.messages.types.StepKeywordType; +import org.jspecify.annotations.Nullable; interface KeywordMatcher { - Match matchFeatureKeyword(Line line); - Match matchBackgroundKeyword(Line line); - Match matchRuleKeyword(Line line); - Match matchScenarioKeyword(Line line); - Match matchExampleKeyword(Line line); - StepMatch matchStepKeyword(Line line); + @Nullable Match matchFeatureKeyword(Line line); + @Nullable Match matchBackgroundKeyword(Line line); + @Nullable Match matchRuleKeyword(Line line); + @Nullable Match matchScenarioKeyword(Line line); + @Nullable Match matchExampleKeyword(Line line); + @Nullable StepMatch matchStepKeyword(Line line); final class StepMatch { private final String keyword; diff --git a/java/src/main/java/io/cucumber/gherkin/TableRowLine.java b/java/src/main/java/io/cucumber/gherkin/TableRowLine.java index 98ad01900..e06e10bcf 100644 --- a/java/src/main/java/io/cucumber/gherkin/TableRowLine.java +++ b/java/src/main/java/io/cucumber/gherkin/TableRowLine.java @@ -21,20 +21,11 @@ static List parse(int indent, String text) { int c = iterator.next(); if (escape) { switch (c) { - case 'n': - cellBuilder.append('\n'); - break; - case '\\': - cellBuilder.append('\\'); - break; - case '|': - cellBuilder.append('|'); - break; - default: - // Invalid escape. We'll just ignore it. - cellBuilder.append("\\"); - cellBuilder.appendCodePoint(c); - break; + case 'n' -> cellBuilder.append('\n'); + case '\\' -> cellBuilder.append('\\'); + case '|' -> cellBuilder.append('|'); + // Invalid escape. We'll just ignore it. + default -> cellBuilder.append("\\").appendCodePoint(c); } escape = false; } else { diff --git a/java/src/test/java/io/cucumber/gherkin/ExampleTest.java b/java/src/test/java/io/cucumber/gherkin/ExampleTest.java index a662475bb..a20a627f2 100644 --- a/java/src/test/java/io/cucumber/gherkin/ExampleTest.java +++ b/java/src/test/java/io/cucumber/gherkin/ExampleTest.java @@ -10,12 +10,14 @@ class ExampleTest { @Test void test(){ - String feature = "Feature: Feature 2\n" + - " # some comment\n" + - " some description\n" + - "\n" + - " Scenario: Scenario 1\n" + - " * Wait 3s"; + String feature = """ + Feature: Feature 2 + # some comment + some description + + Scenario: Scenario 1 + * Wait 3s + """; GherkinParser parser = GherkinParser.builder().build(); diff --git a/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java b/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java index 65ae76224..a26abe2d6 100644 --- a/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java +++ b/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java @@ -31,12 +31,6 @@ void getDistinctStepKeywordTypes_Given_has_multiple_stepKeywordTypes() { // Then multiple types are possible assertEquals(1, stepKeywordTypes.size()); } - - @Test - void getDistinctStepKeywordTypes_null_throws() { - // When I get the step keyword types - assertThrows(NullPointerException.class, () -> dialect.getStepKeywordTypesSet(null)); - } @Test void getDistinctStepKeywordTypes_unknown_throws() { diff --git a/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java b/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java index 45fd49c28..7628f666f 100644 --- a/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java +++ b/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java @@ -7,6 +7,7 @@ import io.cucumber.messages.types.Location; import io.cucumber.messages.types.Pickle; import io.cucumber.messages.types.TableRow; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.Test; import java.util.List; @@ -20,7 +21,7 @@ class GherkinDocumentBuilderTest { @Test void is_reusable() { - Parser parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); + var parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); GherkinTokenMatcher matcher = new GherkinTokenMatcher(); GherkinDocument d1 = parser.parse("Feature: 1", matcher, "1.feature"); @@ -32,27 +33,28 @@ void is_reusable() { @Test void parses_rules() { - Parser parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); - String data = "" + - "Feature: Some rules\n" + - "\n" + - " Background:\n" + - " Given fb\n" + - "\n" + - " Rule: A\n" + - " The rule A description\n" + - "\n" + - " Background:\n" + - " Given ab\n" + - "\n" + - " Example: Example A\n" + - " Given a\n" + - "\n" + - " Rule: B\n" + - " The rule B description\n" + - "\n" + - " Example: Example B\n" + - " Given b\n"; + var parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); + String data = """ + Feature: Some rules + + Background: + Given fb + + Rule: A + The rule A description + + Background: + Given ab + + Example: Example A + Given a + + Rule: B + The rule B description + + Example: Example B + Given b + """; GherkinDocument doc = parser.parse(data, "test.feature"); List children = doc.getFeature().get().getChildren(); @@ -71,7 +73,7 @@ void parses_rules() { @Test void parses_just_comments() { - Parser parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); + var parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); GherkinDocument doc = parser.parse("# Just a comment", "test.feature"); List children = doc.getComments(); assertEquals(1, children.size()); @@ -79,12 +81,13 @@ void parses_just_comments() { @Test void sets_empty_table_cells() { - Parser parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); - GherkinDocument doc = parser.parse("" + - "Feature:\n" + - " Scenario:\n" + - " Given a table\n" + - " |a||b|", + var parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); + GherkinDocument doc = parser.parse(""" + Feature: + Scenario: + Given a table + |a||b| + """, "test.feature" ); List children = doc.getFeature().get().getChildren(); @@ -98,23 +101,25 @@ void sets_empty_table_cells() { @Test void table_cells_with_different_size_throws_exception() { // Given - Parser parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); + var parser = new Parser<>(new GherkinDocumentBuilder(idGenerator, "test.feature")); // When - ParserException.CompositeParserException compositeParserException = assertThrows(ParserException.CompositeParserException.class, () -> parser.parse("" + - "Feature:\n" + - " Scenario:\n" + - " Given a table\n" + - " |a|b|\n" + - " |c|d|e|", + ParserException.CompositeParserException compositeParserException = assertThrows(ParserException.CompositeParserException.class, () -> parser.parse(""" + Feature: + Scenario: + Given a table + |a|b| + |c|d|e| + """, "test.feature" )); // Then - assertTrue(compositeParserException.getMessage().contains("inconsistent cell count within the table")); - Location location = compositeParserException.errors.get(0).location; - assertEquals(5, location.getLine()); - assertEquals(7, location.getColumn().get()); + Assertions.assertThat(compositeParserException).hasMessageContaining("inconsistent cell count within the table"); + Assertions.assertThat(compositeParserException.errors) + .singleElement() + .extracting(e -> e.location) + .isEqualTo(new Location(5L, 7L)); } } diff --git a/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java b/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java index 929cadd83..16650fd10 100644 --- a/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java +++ b/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java @@ -25,10 +25,12 @@ class GherkinParserTest { - final String feature = "Feature: Minimal\n" + - "\n" + - " Scenario: minimalistic\n" + - " Given the minimalism\n"; + final String feature = """ + Feature: Minimal + + Scenario: minimalistic + Given the minimalism + """; final Envelope envelope = Envelope.of(new Source("minimal.feature", feature, TEXT_X_CUCUMBER_GHERKIN_PLAIN)); @Test @@ -45,7 +47,7 @@ void can_parse_streams() throws IOException { .includeSource(false) .includeGherkinDocument(false) .build(); - List pickles = parser.parse("minimal.feature", is).collect(toList()); + List pickles = parser.parse("minimal.feature", is).toList(); assertTrue(pickles.get(0).getPickle().isPresent()); } @@ -102,13 +104,15 @@ void parses_supplied_source() { @Test void parser_always_includes_errors() { Envelope singleParseError = Envelope.of(new Source("single_parser_error.feature", - "\n" + - "invalid line here\n" + - "\n" + - "Feature: Single parser error\n" + - "\n" + - " Scenario: minimalistic\n" + - " Given the minimalism\n", + """ + + invalid line here + + Feature: Single parser error + + Scenario: minimalistic + Given the minimalism + """, TEXT_X_CUCUMBER_GHERKIN_PLAIN)); Optional parseError = GherkinParser.builder() .includeSource(false) diff --git a/java/src/test/java/io/cucumber/gherkin/KeywordMatchersTest.java b/java/src/test/java/io/cucumber/gherkin/KeywordMatchersTest.java index 1548d2308..18d6fadad 100644 --- a/java/src/test/java/io/cucumber/gherkin/KeywordMatchersTest.java +++ b/java/src/test/java/io/cucumber/gherkin/KeywordMatchersTest.java @@ -6,6 +6,7 @@ import org.junit.jupiter.params.provider.MethodSource; import java.util.Collection; +import java.util.Objects; import java.util.Set; import static io.cucumber.gherkin.Constants.TITLE_KEYWORD_SEPARATOR_LENGTH; @@ -18,18 +19,21 @@ static Collection languages() { return GherkinDialects.getDialects(); } + private static KeywordMatcher requiredMatcher(GherkinDialect dialect) { + return Objects.requireNonNull(KeywordMatchers.of(dialect.getLanguage())); + } + @ParameterizedTest @MethodSource("languages") void featureKeywordsAreConsistent(GherkinDialect dialect) { - KeywordMatcher matcher = KeywordMatchers.of(dialect.getLanguage()); - assertThat(matcher).isNotNull(); + KeywordMatcher matcher = requiredMatcher(dialect); for (String keyword : dialect.getFeatureKeywords()) { Line line = new Line(keyword + ": some text"); KeywordMatcher.Match match = matcher.matchFeatureKeyword(line); assertAll( - () -> assertThat(match.getKeyword()).isEqualTo(keyword), - () -> assertThat(match.getKeywordLength()).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeyword).isEqualTo(keyword), + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeywordLength).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) ); } } @@ -37,15 +41,15 @@ void featureKeywordsAreConsistent(GherkinDialect dialect) { @ParameterizedTest @MethodSource("languages") void backgroundKeywordsAreConsistent(GherkinDialect dialect) { - KeywordMatcher matcher = KeywordMatchers.of(dialect.getLanguage()); + KeywordMatcher matcher = requiredMatcher(dialect); assertThat(matcher).isNotNull(); for (String keyword : dialect.getBackgroundKeywords()) { Line line = new Line(keyword + ": some text"); KeywordMatcher.Match match = matcher.matchBackgroundKeyword(line); assertAll( - () -> assertThat(match.getKeyword()).isEqualTo(keyword), - () -> assertThat(match.getKeywordLength()).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeyword).isEqualTo(keyword), + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeywordLength).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) ); } } @@ -53,15 +57,15 @@ void backgroundKeywordsAreConsistent(GherkinDialect dialect) { @ParameterizedTest @MethodSource("languages") void ruleKeywordsAreConsistent(GherkinDialect dialect) { - KeywordMatcher matcher = KeywordMatchers.of(dialect.getLanguage()); + KeywordMatcher matcher = requiredMatcher(dialect); assertThat(matcher).isNotNull(); for (String keyword : dialect.getRuleKeywords()) { Line line = new Line(keyword + ": some text"); KeywordMatcher.Match match = matcher.matchRuleKeyword(line); assertAll( - () -> assertThat(match.getKeyword()).isEqualTo(keyword), - () -> assertThat(match.getKeywordLength()).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeyword).isEqualTo(keyword), + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeywordLength).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) ); } } @@ -69,23 +73,23 @@ void ruleKeywordsAreConsistent(GherkinDialect dialect) { @ParameterizedTest @MethodSource("languages") void scenarioKeywordsAreConsistent(GherkinDialect dialect) { - KeywordMatcher matcher = KeywordMatchers.of(dialect.getLanguage()); + KeywordMatcher matcher = requiredMatcher(dialect); assertThat(matcher).isNotNull(); for (String keyword : dialect.getScenarioKeywords()) { Line line = new Line(keyword + ": some text"); KeywordMatcher.Match match = matcher.matchScenarioKeyword(line); assertAll( - () -> assertThat(match.getKeyword()).isEqualTo(keyword), - () -> assertThat(match.getKeywordLength()).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeyword).isEqualTo(keyword), + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeywordLength).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) ); } for (String keyword : dialect.getScenarioOutlineKeywords()) { Line line = new Line(keyword + ": some text"); KeywordMatcher.Match match = matcher.matchScenarioKeyword(line); assertAll( - () -> assertThat(match.getKeyword()).isEqualTo(keyword), - () -> assertThat(match.getKeywordLength()).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeyword).isEqualTo(keyword), + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeywordLength).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) ); } } @@ -93,15 +97,15 @@ void scenarioKeywordsAreConsistent(GherkinDialect dialect) { @ParameterizedTest @MethodSource("languages") void exampleKeywordsAreConsistent(GherkinDialect dialect) { - KeywordMatcher matcher = KeywordMatchers.of(dialect.getLanguage()); + KeywordMatcher matcher = requiredMatcher(dialect); assertThat(matcher).isNotNull(); for (String keyword : dialect.getExamplesKeywords()) { Line line = new Line(keyword + ": some text"); KeywordMatcher.Match match = matcher.matchExampleKeyword(line); assertAll( - () -> assertThat(match.getKeyword()).isEqualTo(keyword), - () -> assertThat(match.getKeywordLength()).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeyword).isEqualTo(keyword), + () -> assertThat(match).extracting(KeywordMatcher.Match::getKeywordLength).isEqualTo(keyword.length() + TITLE_KEYWORD_SEPARATOR_LENGTH) ); } } @@ -109,21 +113,21 @@ void exampleKeywordsAreConsistent(GherkinDialect dialect) { @ParameterizedTest @MethodSource("languages") void stepKeywordsAreConsistent(GherkinDialect dialect) { - KeywordMatcher matcher = KeywordMatchers.of(dialect.getLanguage()); + KeywordMatcher matcher = requiredMatcher(dialect); assertThat(matcher).isNotNull(); for (String keyword : dialect.getStepKeywords()) { Line line = new Line(keyword + "some text"); StepMatch match = matcher.matchStepKeyword(line); - assertAll( - () -> assertThat(match.getKeyword()).isEqualTo(keyword), - () -> assertThat(match.getKeywordLength()).isEqualTo(keyword.length()), + () -> assertThat(match).extracting(StepMatch::getKeyword).isEqualTo(keyword), + () -> assertThat(match).extracting(StepMatch::getKeywordLength).isEqualTo(keyword.length()), () -> { Set stepKeywordTypesSet = dialect.getStepKeywordTypesSet(keyword); StepKeywordType expected = stepKeywordTypesSet.size() != 1 ? StepKeywordType.UNKNOWN : stepKeywordTypesSet.iterator().next(); - assertThat(match.getKeywordType()).isEqualTo(expected); - }); + assertThat(match).extracting(StepMatch::getKeywordType).isEqualTo(expected); + } + ); } } } diff --git a/java/src/test/java/io/cucumber/gherkin/Main.java b/java/src/test/java/io/cucumber/gherkin/Main.java index 5d33c6ff8..6710ad5d2 100644 --- a/java/src/test/java/io/cucumber/gherkin/Main.java +++ b/java/src/test/java/io/cucumber/gherkin/Main.java @@ -5,6 +5,8 @@ import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; +import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -25,26 +27,17 @@ public static void main(String[] argv) throws IOException { String arg = args.remove(0).trim(); switch (arg) { - case "--no-source": - builder.includeSource(false); - break; - case "--no-ast": - builder.includeGherkinDocument(false); - break; - case "--no-pickles": - builder.includePickles(false); - break; - case "--predictable-ids": - builder.idGenerator(new IncrementingIdGenerator()); - break; - default: - paths.add(arg); + case "--no-source" -> builder.includeSource(false); + case "--no-ast" -> builder.includeGherkinDocument(false); + case "--no-pickles" -> builder.includePickles(false); + case "--predictable-ids" -> builder.idGenerator(new IncrementingIdGenerator()); + default -> paths.add(arg); } } GherkinParser parser = builder.build(); - try (MessageToNdjsonWriter writer = new MessageToNdjsonWriter(System.out, OBJECT_MAPPER::writeValue)) { + try (MessageToNdjsonWriter writer = new MessageToNdjsonWriter(nonClosableSystemOut(), OBJECT_MAPPER::writeValue)) { for (String path : paths) { try (InputStream fis = Files.newInputStream(Paths.get(path))) { // Don't use parser.parse(Path). The test suite uses relative paths. @@ -55,6 +48,15 @@ public static void main(String[] argv) throws IOException { } } + private static OutputStream nonClosableSystemOut() { + return new OutputStream() { + @Override + public void write(int b) { + System.out.write(b); + } + }; + } + private static void printMessage(MessageToNdjsonWriter writer, Envelope envelope) { try { writer.write(envelope); diff --git a/java/src/test/java/io/cucumber/gherkin/TableRowLineTest.java b/java/src/test/java/io/cucumber/gherkin/TableRowLineTest.java index 7f1aca41b..7b25a6946 100644 --- a/java/src/test/java/io/cucumber/gherkin/TableRowLineTest.java +++ b/java/src/test/java/io/cucumber/gherkin/TableRowLineTest.java @@ -6,11 +6,11 @@ import java.util.stream.Collectors; import static io.cucumber.gherkin.TableRowLine.parse; -import static java.util.Arrays.asList; import static org.junit.jupiter.api.Assertions.assertEquals; class TableRowLineTest { + @SuppressWarnings({"UnnecessaryUnicodeEscape", "UnicodeEscape"}) @Test void finds_table_cells() { // The cells below has the following whitespace characters on each side: @@ -42,18 +42,19 @@ void finds_table_cells() { void finds_escaped_table_cells() { List tableCells = parse(6, "| \\|æ\\\\n | \\o\\no\\ | \\\\\\|a\\\\\\\\n | ø\\\\\\nø\\\\|"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("|æ\\n", "\\o\no\\", "\\|a\\\\n", "ø\\\nø\\"), texts); + assertEquals(List.of("|æ\\n", "\\o\no\\", "\\|a\\\\n", "ø\\\nø\\"), texts); } @Test void preserve_escaped_new_lines_at_start_and_end() { List tableCells = parse(6, "| \nraindrops--\nher last kiss\ngoodbye.\n |"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("" + - "\n" + - "raindrops--\n" + - "her last kiss\n" + - "goodbye.\n" + assertEquals(List.of(""" + + raindrops-- + her last kiss + goodbye. + """ ), texts); } @@ -61,41 +62,41 @@ void preserve_escaped_new_lines_at_start_and_end() { void escapes_backslash() { List tableCells = parse(0, "|\\\\o\\no\\||"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("\\o\no|"), texts); + assertEquals(List.of("\\o\no|"), texts); } @Test void throws_on_illegal_escapes_backslash() { List tableCells = parse(0, "|\\o\\no\\||"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("\\o\no|"), texts); + assertEquals(List.of("\\o\no|"), texts); } @Test void correctly_trims_white_spaces_before_cell_content() { List tableCells = parse(0, "| \t spaces before|"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("spaces before"), texts); + assertEquals(List.of("spaces before"), texts); } @Test void correctly_trims_white_spaces_after_cell_content() { List tableCells = parse(0, "|spaces after |"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("spaces after"), texts); + assertEquals(List.of("spaces after"), texts); } @Test void correctly_trims_white_spaces_around_cell_content() { List tableCells = parse(0, "| \t spaces everywhere \t|"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("spaces everywhere"), texts); + assertEquals(List.of("spaces everywhere"), texts); } @Test void does_not_drop_white_spaces_inside_a_cell() { List tableCells = parse(0, "| foo()\n bar\nbaz |"); List texts = tableCells.stream().map(span -> span.text).collect(Collectors.toList()); - assertEquals(asList("foo()\n bar\nbaz"), texts); + assertEquals(List.of("foo()\n bar\nbaz"), texts); } } diff --git a/java/src/test/java/io/cucumber/gherkin/TestDataTest.java b/java/src/test/java/io/cucumber/gherkin/TestDataTest.java deleted file mode 100644 index e5f0c844b..000000000 --- a/java/src/test/java/io/cucumber/gherkin/TestDataTest.java +++ /dev/null @@ -1,32 +0,0 @@ -package io.cucumber.gherkin; - -import org.junit.jupiter.api.Test; - -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.stream.Stream; - -public class TestDataTest { - @Test - void testdata_features_are_parsed_without_NPE() throws IOException { - GherkinParser gherkinParser = GherkinParser.builder() - .idGenerator(new IncrementingIdGenerator()) - .build(); - try (Stream list = Stream.of( - Files.list(Paths.get("../testdata/good/")), - Files.list(Paths.get("../testdata/bad/"))) - .flatMap(s -> s)) { - list - .filter(path -> path.toString().endsWith(".feature")) - .forEach(source -> { - try { - gherkinParser.parse(source); - } catch (IOException e) { - throw new RuntimeException(e); - } - }); - } - } -} diff --git a/java/src/test/java/io/cucumber/gherkin/TokenFormatter.java b/java/src/test/java/io/cucumber/gherkin/TokenFormatter.java index 2dc691a61..76d03a794 100644 --- a/java/src/test/java/io/cucumber/gherkin/TokenFormatter.java +++ b/java/src/test/java/io/cucumber/gherkin/TokenFormatter.java @@ -1,5 +1,7 @@ package io.cucumber.gherkin; +import org.jspecify.annotations.Nullable; + import static java.util.stream.Collectors.joining; class TokenFormatter { @@ -22,7 +24,7 @@ String formatToken(Token token) { ); } - private String toString(Object o) { + private String toString(@Nullable Object o) { return o == null ? "" : o.toString(); } } From 6c3a441c63e3851eae0f72eb9ff918e7cc443677 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Nov 2025 20:33:52 +0100 Subject: [PATCH 05/15] Use String.lines(source).iterator() --- .../io/cucumber/gherkin/TokenScanner.java | 24 +++++++------------ 1 file changed, 9 insertions(+), 15 deletions(-) diff --git a/java/src/main/java/io/cucumber/gherkin/TokenScanner.java b/java/src/main/java/io/cucumber/gherkin/TokenScanner.java index d4c2a774d..1a3c9ba49 100644 --- a/java/src/main/java/io/cucumber/gherkin/TokenScanner.java +++ b/java/src/main/java/io/cucumber/gherkin/TokenScanner.java @@ -1,10 +1,9 @@ package io.cucumber.gherkin; import io.cucumber.messages.types.Location; +import org.jspecify.annotations.Nullable; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; +import java.util.Iterator; import static io.cucumber.gherkin.Token.createEOF; import static io.cucumber.gherkin.Token.createGherkinLine; @@ -16,26 +15,21 @@ */ final class TokenScanner { - private final BufferedReader reader; + private final Iterator reader; private int lineNumber; TokenScanner(String source) { - // TODO performance: replace BufferedReader by Java 11 String.lines(source).iterator() : 25-50% faster - this.reader = new BufferedReader(new StringReader(source)); + this.reader = source.lines().iterator(); } Token read() { - try { - String rawText = reader.readLine(); - if (rawText == null) { - // Don't optimistically increment the line number - Location location = Locations.atLine(++lineNumber); - return createEOF(location); - } + if (reader.hasNext()) { + String rawText = reader.next(); Location location = Locations.atLine(++lineNumber); return createGherkinLine(rawText, location); - } catch (IOException e) { - throw new RuntimeException(e); } + // Don't optimistically increment the line number + Location location = Locations.atLine(++lineNumber); + return createEOF(location); } } From 73bed23f35d148f46ac545fc220307ca1511fb1e Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Nov 2025 20:44:51 +0100 Subject: [PATCH 06/15] Use String.lines(source).iterator() --- .../main/java/io/cucumber/gherkin/EncodingParser.java | 10 ++++------ .../java/io/cucumber/gherkin/GherkinTokenMatcher.java | 3 ++- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/java/src/main/java/io/cucumber/gherkin/EncodingParser.java b/java/src/main/java/io/cucumber/gherkin/EncodingParser.java index af378f039..81658f275 100644 --- a/java/src/main/java/io/cucumber/gherkin/EncodingParser.java +++ b/java/src/main/java/io/cucumber/gherkin/EncodingParser.java @@ -2,6 +2,7 @@ import java.nio.charset.Charset; import java.util.Arrays; +import java.util.Iterator; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -18,7 +19,6 @@ final class EncodingParser { private static final Pattern COMMENT_OR_EMPTY_LINE_PATTERN = Pattern.compile("^\\s*#|^\\s*$"); private static final Pattern ENCODING_PATTERN = Pattern.compile("^\\s*#\\s*encoding\\s*:\\s*([0-9a-zA-Z\\-]+)", CASE_INSENSITIVE); - private static final Pattern LINE_SPLIT_PATTERN = Pattern.compile("([^\\n\\r]+)[\\n\\r]"); static String readWithEncodingFromSource(byte[] source) { byte[] bomFreeSource = removeByteOrderMarker(source); @@ -42,11 +42,9 @@ private static byte[] removeByteOrderMarker(byte[] source) { } private static Optional parseEncodingPragma(String source) { - // TODO performance: replace Pattern.matcher by Java 11 Iterator lines = source.lines().iterator() : to be about 2x faster - // Optimization: search for lines instead of splitting - Matcher m2 = LINE_SPLIT_PATTERN.matcher(source); - while (m2.find()) { - String line = m2.group(1); + var lines = source.lines().iterator(); + while (lines.hasNext()) { + String line = lines.next(); if (!COMMENT_OR_EMPTY_LINE_PATTERN.matcher(line).find()) { return Optional.empty(); } diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java b/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java index c059ed3dd..a36d5eb08 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java @@ -45,7 +45,8 @@ final class GherkinTokenMatcher implements TokenMatcher { @Override public void reset() { - // TODO performance: reset() is called once in the constructor and once for each file (Parser.parse()). It could be called only once, but there is no measurable impact with the profiler + // TODO performance: reset() is called once in the constructor and once for each file (Parser.parse()). + // It could be called only once, but there is no measurable impact with the profiler activeDocStringSeparator = null; indentToRemove = 0; setLanguageMatched(defaultLanguage, null); From 4f31b19446eb3e4d50f4f2b1e2a000030914b2bd Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Nov 2025 20:50:40 +0100 Subject: [PATCH 07/15] use List.of --- java/gherkin-java.razor | 4 +- .../io/cucumber/gherkin/GherkinDialect.java | 6 +- .../main/java/io/cucumber/gherkin/Parser.java | 86 +++++++++---------- .../io/cucumber/gherkin/ParserException.java | 2 +- .../io/cucumber/gherkin/PickleCompiler.java | 10 +-- 5 files changed, 49 insertions(+), 59 deletions(-) diff --git a/java/gherkin-java.razor b/java/gherkin-java.razor index ff208ed3c..601b8e687 100644 --- a/java/gherkin-java.razor +++ b/java/gherkin-java.razor @@ -16,7 +16,7 @@ @helper HandleParserError(IEnumerable expectedTokens, State state) { final String stateComment = "State: @state.Id - @Raw(state.Comment)"; - List expectedTokens = asList("@Raw(string.Join("\", \"", expectedTokens))"); + List expectedTokens = List.of("@Raw(string.Join("\", \"", expectedTokens))"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -36,8 +36,6 @@ import java.util.Queue; import java.util.function.BiConsumer; import java.util.function.BiPredicate; -import static java.util.Arrays.asList; - /** * This class was generated by Berp. *

diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java b/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java index 7022375ee..cbb497d64 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinDialect.java @@ -17,8 +17,6 @@ import static io.cucumber.messages.types.StepKeywordType.CONJUNCTION; import static io.cucumber.messages.types.StepKeywordType.CONTEXT; import static io.cucumber.messages.types.StepKeywordType.OUTCOME; -import static java.util.Collections.unmodifiableList; -import static java.util.Collections.unmodifiableSet; import static java.util.Objects.requireNonNull; /** @@ -88,7 +86,7 @@ private static List distinctKeywords(List... keywords) { } List sortedKeywords = new ArrayList<>(uniqueKeywords); sortedKeywords.sort(LONGEST_TO_SHORTEST_COMPARATOR); - return unmodifiableList(sortedKeywords); + return List.copyOf(sortedKeywords); } private static Map> aggregateKeywordTypes( @@ -103,7 +101,7 @@ private static Map> aggregateKeywordTypes( addStepKeywordsTypes(stepKeywordsTypes, ACTION, whenKeywords); addStepKeywordsTypes(stepKeywordsTypes, OUTCOME, thenKeywords); addStepKeywordsTypes(stepKeywordsTypes, CONJUNCTION, distinctKeywords(andKeywords, butKeywords)); - stepKeywordsTypes.replaceAll((keyword, stepKeywordTypes) -> unmodifiableSet(stepKeywordTypes)); + stepKeywordsTypes.replaceAll((keyword, stepKeywordTypes) -> Set.copyOf(stepKeywordTypes)); return stepKeywordsTypes; } diff --git a/java/src/main/java/io/cucumber/gherkin/Parser.java b/java/src/main/java/io/cucumber/gherkin/Parser.java index c51c87735..9b3761a6d 100644 --- a/java/src/main/java/io/cucumber/gherkin/Parser.java +++ b/java/src/main/java/io/cucumber/gherkin/Parser.java @@ -8,8 +8,6 @@ import java.util.function.BiConsumer; import java.util.function.BiPredicate; -import static java.util.Arrays.asList; - /** * This class was generated by Berp. *

@@ -354,7 +352,7 @@ private int matchTokenAt_0(Token token, ParserContext context) { } final String stateComment = "State: 0 - Start"; - List expectedTokens = asList("#EOF", "#Language", "#TagLine", "#FeatureLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#Language", "#TagLine", "#FeatureLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -388,7 +386,7 @@ private int matchTokenAt_1(Token token, ParserContext context) { } final String stateComment = "State: 1 - GherkinDocument:0>Feature:0>FeatureHeader:0>#Language:0"; - List expectedTokens = asList("#TagLine", "#FeatureLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#TagLine", "#FeatureLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -422,7 +420,7 @@ private int matchTokenAt_2(Token token, ParserContext context) { } final String stateComment = "State: 2 - GherkinDocument:0>Feature:0>FeatureHeader:1>Tags:0>#TagLine:0"; - List expectedTokens = asList("#TagLine", "#FeatureLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#TagLine", "#FeatureLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -502,7 +500,7 @@ private int matchTokenAt_3(Token token, ParserContext context) { } final String stateComment = "State: 3 - GherkinDocument:0>Feature:0>FeatureHeader:2>#FeatureLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -581,7 +579,7 @@ private int matchTokenAt_4(Token token, ParserContext context) { } final String stateComment = "State: 4 - GherkinDocument:0>Feature:0>FeatureHeader:3>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -660,7 +658,7 @@ private int matchTokenAt_5(Token token, ParserContext context) { } final String stateComment = "State: 5 - GherkinDocument:0>Feature:1>Background:0>#BackgroundLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -738,7 +736,7 @@ private int matchTokenAt_6(Token token, ParserContext context) { } final String stateComment = "State: 6 - GherkinDocument:0>Feature:1>Background:1>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -828,7 +826,7 @@ private int matchTokenAt_7(Token token, ParserContext context) { } final String stateComment = "State: 7 - GherkinDocument:0>Feature:1>Background:2>Step:0>#StepLine:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -917,7 +915,7 @@ private int matchTokenAt_8(Token token, ParserContext context) { } final String stateComment = "State: 8 - GherkinDocument:0>Feature:1>Background:2>Step:1>StepArg:0>__alt0:0>DataTable:0>#TableRow:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -952,7 +950,7 @@ private int matchTokenAt_9(Token token, ParserContext context) { } final String stateComment = "State: 9 - GherkinDocument:0>Feature:2>ScenarioDefinition:0>Tags:0>#TagLine:0"; - List expectedTokens = asList("#TagLine", "#ScenarioLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#TagLine", "#ScenarioLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1053,7 +1051,7 @@ private int matchTokenAt_10(Token token, ParserContext context) { } final String stateComment = "State: 10 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:0>#ScenarioLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1155,7 +1153,7 @@ private int matchTokenAt_11(Token token, ParserContext context) { } final String stateComment = "State: 11 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:1>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1269,7 +1267,7 @@ private int matchTokenAt_12(Token token, ParserContext context) { } final String stateComment = "State: 12 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:2>Step:0>#StepLine:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1384,7 +1382,7 @@ private int matchTokenAt_13(Token token, ParserContext context) { } final String stateComment = "State: 13 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:2>Step:1>StepArg:0>__alt0:0>DataTable:0>#TableRow:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1419,7 +1417,7 @@ private int matchTokenAt_14(Token token, ParserContext context) { } final String stateComment = "State: 14 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:0>Tags:0>#TagLine:0"; - List expectedTokens = asList("#TagLine", "#ExamplesLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#TagLine", "#ExamplesLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1534,7 +1532,7 @@ private int matchTokenAt_15(Token token, ParserContext context) { } final String stateComment = "State: 15 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:1>Examples:0>#ExamplesLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1650,7 +1648,7 @@ private int matchTokenAt_16(Token token, ParserContext context) { } final String stateComment = "State: 16 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:1>Examples:1>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1764,7 +1762,7 @@ private int matchTokenAt_17(Token token, ParserContext context) { } final String stateComment = "State: 17 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:1>Examples:2>ExamplesTable:0>#TableRow:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1798,7 +1796,7 @@ private int matchTokenAt_18(Token token, ParserContext context) { } final String stateComment = "State: 18 - GherkinDocument:0>Feature:3>Rule:0>RuleHeader:0>Tags:0>#TagLine:0"; - List expectedTokens = asList("#TagLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#TagLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1881,7 +1879,7 @@ private int matchTokenAt_19(Token token, ParserContext context) { } final String stateComment = "State: 19 - GherkinDocument:0>Feature:3>Rule:0>RuleHeader:1>#RuleLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -1963,7 +1961,7 @@ private int matchTokenAt_20(Token token, ParserContext context) { } final String stateComment = "State: 20 - GherkinDocument:0>Feature:3>Rule:0>RuleHeader:2>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#BackgroundLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2045,7 +2043,7 @@ private int matchTokenAt_21(Token token, ParserContext context) { } final String stateComment = "State: 21 - GherkinDocument:0>Feature:3>Rule:1>Background:0>#BackgroundLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2126,7 +2124,7 @@ private int matchTokenAt_22(Token token, ParserContext context) { } final String stateComment = "State: 22 - GherkinDocument:0>Feature:3>Rule:1>Background:1>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2219,7 +2217,7 @@ private int matchTokenAt_23(Token token, ParserContext context) { } final String stateComment = "State: 23 - GherkinDocument:0>Feature:3>Rule:1>Background:2>Step:0>#StepLine:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2311,7 +2309,7 @@ private int matchTokenAt_24(Token token, ParserContext context) { } final String stateComment = "State: 24 - GherkinDocument:0>Feature:3>Rule:1>Background:2>Step:1>StepArg:0>__alt0:0>DataTable:0>#TableRow:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2346,7 +2344,7 @@ private int matchTokenAt_25(Token token, ParserContext context) { } final String stateComment = "State: 25 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:0>Tags:0>#TagLine:0"; - List expectedTokens = asList("#TagLine", "#ScenarioLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#TagLine", "#ScenarioLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2450,7 +2448,7 @@ private int matchTokenAt_26(Token token, ParserContext context) { } final String stateComment = "State: 26 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:0>#ScenarioLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2555,7 +2553,7 @@ private int matchTokenAt_27(Token token, ParserContext context) { } final String stateComment = "State: 27 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:1>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2672,7 +2670,7 @@ private int matchTokenAt_28(Token token, ParserContext context) { } final String stateComment = "State: 28 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:2>Step:0>#StepLine:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#DocStringSeparator", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2790,7 +2788,7 @@ private int matchTokenAt_29(Token token, ParserContext context) { } final String stateComment = "State: 29 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:2>Step:1>StepArg:0>__alt0:0>DataTable:0>#TableRow:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2825,7 +2823,7 @@ private int matchTokenAt_30(Token token, ParserContext context) { } final String stateComment = "State: 30 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:0>Tags:0>#TagLine:0"; - List expectedTokens = asList("#TagLine", "#ExamplesLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#TagLine", "#ExamplesLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -2943,7 +2941,7 @@ private int matchTokenAt_31(Token token, ParserContext context) { } final String stateComment = "State: 31 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:1>Examples:0>#ExamplesLine:0"; - List expectedTokens = asList("#EOF", "#Empty", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Empty", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3062,7 +3060,7 @@ private int matchTokenAt_32(Token token, ParserContext context) { } final String stateComment = "State: 32 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:1>Examples:1>DescriptionHelper:1>Description:0>__alt1:0>#Other:0"; - List expectedTokens = asList("#EOF", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); + List expectedTokens = List.of("#EOF", "#Comment", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3179,7 +3177,7 @@ private int matchTokenAt_33(Token token, ParserContext context) { } final String stateComment = "State: 33 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:3>ExamplesDefinition:1>Examples:2>ExamplesTable:0>#TableRow:0"; - List expectedTokens = asList("#EOF", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#TableRow", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3202,7 +3200,7 @@ private int matchTokenAt_35(Token token, ParserContext context) { } final String stateComment = "State: 35 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:2>Step:1>StepArg:0>__alt0:1>DocString:0>#DocStringSeparator:0"; - List expectedTokens = asList("#DocStringSeparator", "#Other"); + List expectedTokens = List.of("#DocStringSeparator", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3315,7 +3313,7 @@ private int matchTokenAt_36(Token token, ParserContext context) { } final String stateComment = "State: 36 - GherkinDocument:0>Feature:3>Rule:2>ScenarioDefinition:1>Scenario:2>Step:1>StepArg:0>__alt0:1>DocString:2>#DocStringSeparator:0"; - List expectedTokens = asList("#EOF", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3338,7 +3336,7 @@ private int matchTokenAt_37(Token token, ParserContext context) { } final String stateComment = "State: 37 - GherkinDocument:0>Feature:3>Rule:1>Background:2>Step:1>StepArg:0>__alt0:1>DocString:0>#DocStringSeparator:0"; - List expectedTokens = asList("#DocStringSeparator", "#Other"); + List expectedTokens = List.of("#DocStringSeparator", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3425,7 +3423,7 @@ private int matchTokenAt_38(Token token, ParserContext context) { } final String stateComment = "State: 38 - GherkinDocument:0>Feature:3>Rule:1>Background:2>Step:1>StepArg:0>__alt0:1>DocString:2>#DocStringSeparator:0"; - List expectedTokens = asList("#EOF", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3448,7 +3446,7 @@ private int matchTokenAt_39(Token token, ParserContext context) { } final String stateComment = "State: 39 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:2>Step:1>StepArg:0>__alt0:1>DocString:0>#DocStringSeparator:0"; - List expectedTokens = asList("#DocStringSeparator", "#Other"); + List expectedTokens = List.of("#DocStringSeparator", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3558,7 +3556,7 @@ private int matchTokenAt_40(Token token, ParserContext context) { } final String stateComment = "State: 40 - GherkinDocument:0>Feature:2>ScenarioDefinition:1>Scenario:2>Step:1>StepArg:0>__alt0:1>DocString:2>#DocStringSeparator:0"; - List expectedTokens = asList("#EOF", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#StepLine", "#TagLine", "#ExamplesLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3581,7 +3579,7 @@ private int matchTokenAt_41(Token token, ParserContext context) { } final String stateComment = "State: 41 - GherkinDocument:0>Feature:1>Background:2>Step:1>StepArg:0>__alt0:1>DocString:0>#DocStringSeparator:0"; - List expectedTokens = asList("#DocStringSeparator", "#Other"); + List expectedTokens = List.of("#DocStringSeparator", "#Other"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); @@ -3665,7 +3663,7 @@ private int matchTokenAt_42(Token token, ParserContext context) { } final String stateComment = "State: 42 - GherkinDocument:0>Feature:1>Background:2>Step:1>StepArg:0>__alt0:1>DocString:2>#DocStringSeparator:0"; - List expectedTokens = asList("#EOF", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); + List expectedTokens = List.of("#EOF", "#StepLine", "#TagLine", "#ScenarioLine", "#RuleLine", "#Comment", "#Empty"); ParserException error = token.isEOF() ? new ParserException.UnexpectedEOFException(token, expectedTokens, stateComment) : new ParserException.UnexpectedTokenException(token, expectedTokens, stateComment); diff --git a/java/src/main/java/io/cucumber/gherkin/ParserException.java b/java/src/main/java/io/cucumber/gherkin/ParserException.java index 5a3941095..38b419513 100644 --- a/java/src/main/java/io/cucumber/gherkin/ParserException.java +++ b/java/src/main/java/io/cucumber/gherkin/ParserException.java @@ -97,7 +97,7 @@ static final class CompositeParserException extends ParserException { CompositeParserException(List errors) { super(getMessage(errors)); - this.errors = Collections.unmodifiableList(errors); + this.errors = List.copyOf(errors); } private static String getMessage(List errors) { diff --git a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java index a19fe930c..bd790febd 100644 --- a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java +++ b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java @@ -27,15 +27,11 @@ import org.jspecify.annotations.Nullable; import java.util.ArrayList; -import java.util.Arrays; -import java.util.EnumMap; import java.util.List; -import java.util.Map; import java.util.Optional; import static io.cucumber.messages.types.StepKeywordType.CONJUNCTION; import static io.cucumber.messages.types.StepKeywordType.UNKNOWN; -import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.singletonList; @@ -162,7 +158,7 @@ private void compileScenarioOutline(List pickles, Scenario scenario, Lis for (final TableRow valuesRow : examples.getTableBody()) { List steps = compilePickleSteps(backgroundSteps, scenario.getSteps(), variableCells, valuesRow); List tags = compileTags(scenarioTags, examples.getTags()); - List sourceIds = asList(scenario.getId(), valuesRow.getId()); + List sourceIds = List.of(scenario.getId(), valuesRow.getId()); Pickle pickle = new Pickle( idGenerator.newId(), uri, @@ -220,10 +216,10 @@ private PickleStep pickleStep(Step step, List variableCells, @Nullabl List astNodeIds; if (valuesRow != null) { - astNodeIds = Arrays.asList(step.getId(), valuesRow.getId()); + astNodeIds = List.of(step.getId(), valuesRow.getId()); } else { - astNodeIds = singletonList(step.getId()); + astNodeIds = List.of(step.getId()); } return new PickleStep( From c0e2e624bcc5c1af5d71b64e5b73cda4546743d7 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sun, 9 Nov 2025 20:56:56 +0100 Subject: [PATCH 08/15] Require Keyword matcher --- .../java/io/cucumber/gherkin/GherkinTokenMatcher.java | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java b/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java index a36d5eb08..b306a2a7c 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinTokenMatcher.java @@ -35,7 +35,7 @@ final class GherkinTokenMatcher implements TokenMatcher { GherkinTokenMatcher(String defaultLanguage) { this.defaultLanguage = defaultLanguage; - this.currentKeywordMatcher = activeKeywordMatchers.computeIfAbsent(defaultLanguage, KeywordMatchers::of); + this.currentKeywordMatcher = requireKeywordMatcher(defaultLanguage, new Location(0L, 0L)); reset(); } @@ -56,12 +56,17 @@ private void setLanguageMatched(String language, @Nullable Location location) { if (language.equals(currentLanguage)) { return; } + KeywordMatcher keywordMatcher = requireKeywordMatcher(language, location); + currentLanguage = language; + currentKeywordMatcher = keywordMatcher; + } + + private KeywordMatcher requireKeywordMatcher(String language, @Nullable Location location) { KeywordMatcher keywordMatcher = activeKeywordMatchers.computeIfAbsent(language, KeywordMatchers::of); if (keywordMatcher == null) { throw new ParserException.NoSuchLanguageException(language, location); } - currentLanguage = language; - currentKeywordMatcher = keywordMatcher; + return keywordMatcher; } private void setTokenMatched(Token token, TokenType matchedType, @Nullable String text, @Nullable String keyword, int indent, @Nullable StepKeywordType keywordType, @Nullable List items) { From b6b8f498b8aafbefabb343b69d2aa17d1e9d2db2 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Mon, 10 Nov 2025 16:24:14 +0100 Subject: [PATCH 09/15] Use Java 17 messages --- java/pom.xml | 2 +- .../java/io/cucumber/gherkin/Locations.java | 18 +++++++++--------- .../io/cucumber/gherkin/ParserException.java | 4 ++-- .../io/cucumber/gherkin/PickleCompiler.java | 8 ++++---- .../io/cucumber/gherkin/TokenFormatter.java | 2 +- .../io/cucumber/gherkin/LocationsTest.java | 6 +++--- 6 files changed, 20 insertions(+), 20 deletions(-) diff --git a/java/pom.xml b/java/pom.xml index 411eece7f..26efbf496 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -49,7 +49,7 @@ io.cucumber messages - [28.0.1-SNAPSHOT,29.0.0) + [30.1.1-SNAPSHOT,31.0.0) diff --git a/java/src/main/java/io/cucumber/gherkin/Locations.java b/java/src/main/java/io/cucumber/gherkin/Locations.java index db1705039..7d58d022b 100644 --- a/java/src/main/java/io/cucumber/gherkin/Locations.java +++ b/java/src/main/java/io/cucumber/gherkin/Locations.java @@ -17,15 +17,15 @@ class Locations { * We can't use Long.valueOf() because it caches only the first 128 * values, and typical feature files have much more lines. */ - private static final Long[] longs = new Long[4096]; + private static final Integer[] ints = new Integer[4096]; static { - for (int i = 0; i < longs.length; i++) { - longs[i] = (long) i; + for (int i = 0; i < ints.length; i++) { + ints[i] = i; } } - private static Long getLong(int i) { + private static Integer getInteger(int i) { // JMH benchmark shows that this implementation is the // fastest when i<4096 (and about 20% slower than // Long.valueOf() when i>=4096). @@ -39,10 +39,10 @@ private static Long getLong(int i) { // 1024/2048/4096 initial size // - dynamic lazy initialized cache with 256 // initialized size - if (i >= longs.length) { - return (long) i; + if (i >= ints.length) { + return i; } - return longs[i]; + return ints[i]; } static Location atColumn(Location location, int column) { @@ -50,14 +50,14 @@ static Location atColumn(Location location, int column) { if (column <= 0) { throw new IllegalArgumentException("Columns are index-1 based"); } - return new Location(location.getLine(), getLong(column)); + return new Location(location.getLine(), getInteger(column)); } static Location atLine(int line) { if (line < 0) { throw new IllegalArgumentException("Lines are index-0 based"); } - return new Location(getLong(line), null); + return new Location(getInteger(line), null); } } diff --git a/java/src/main/java/io/cucumber/gherkin/ParserException.java b/java/src/main/java/io/cucumber/gherkin/ParserException.java index 4c9c5fddd..ccc0776c9 100644 --- a/java/src/main/java/io/cucumber/gherkin/ParserException.java +++ b/java/src/main/java/io/cucumber/gherkin/ParserException.java @@ -26,8 +26,8 @@ private static String createMessage(String message, Location location) { if (location == null) { return String.format("(-1,0): %s", message); } - Long line = location.getLine(); - Long column = location.getColumn().orElse(0L); + Integer line = location.getLine(); + Integer column = location.getColumn().orElse(0); return String.format("(%s:%s): %s", line, column, message); } diff --git a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java index d33d4ae0c..543bfc4f1 100644 --- a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java +++ b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java @@ -122,12 +122,12 @@ private void compileScenario(List pickles, Scenario scenario, List Pickle pickle = new Pickle( idGenerator.newId(), uri, + scenario.getLocation(), scenario.getName(), language, steps, pickleTags(scenarioTags), - sourceIds, - scenario.getLocation() + sourceIds ); pickles.add(pickle); } @@ -171,12 +171,12 @@ private void compileScenarioOutline(List pickles, Scenario scenario, Lis Pickle pickle = new Pickle( idGenerator.newId(), uri, + valuesRow.getLocation(), interpolate(scenario.getName(), variableCells, valueCells), language, steps, pickleTags(tags), - sourceIds, - valuesRow.getLocation() + sourceIds ); pickles.add(pickle); diff --git a/java/src/main/java/io/cucumber/gherkin/TokenFormatter.java b/java/src/main/java/io/cucumber/gherkin/TokenFormatter.java index 2dc691a61..0f91d1ec1 100644 --- a/java/src/main/java/io/cucumber/gherkin/TokenFormatter.java +++ b/java/src/main/java/io/cucumber/gherkin/TokenFormatter.java @@ -10,7 +10,7 @@ String formatToken(Token token) { return String.format("(%s:%s)%s:%s/%s/%s", toString(token.location.getLine()), - toString(token.location.getColumn().orElse(0L)), + toString(token.location.getColumn().orElse(0)), toString(token.matchedType), token.matchedKeyword == null ? "" : String.format("(%s)%s", toString(token.keywordType), diff --git a/java/src/test/java/io/cucumber/gherkin/LocationsTest.java b/java/src/test/java/io/cucumber/gherkin/LocationsTest.java index fbb8ec4d4..8643ba8a5 100644 --- a/java/src/test/java/io/cucumber/gherkin/LocationsTest.java +++ b/java/src/test/java/io/cucumber/gherkin/LocationsTest.java @@ -13,10 +13,10 @@ class LocationsTest { void atLine() { // random integer conversion that is far after the cache upper bound works Location location = Locations.atLine(12000); - assertEquals(Long.valueOf(12000L), location.getLine()); + assertEquals(Integer.valueOf(12000), location.getLine()); // sequential integer conversion works (the cache has no hole) for (int i = 0; i < 12000; i++) { - Long expectedLine = (long) i; + Integer expectedLine = i; Location actual = Locations.atLine(i); assertEquals(expectedLine, actual.getLine()); } @@ -37,7 +37,7 @@ void atLine_multithreaded_does_not_raise_exception() { for (int i = 0; i < numberOfThreads; i++) { threads[i] = new Thread(() -> { for (int j = 500; j < numberOfIterations; j *= 2) { - Long expectedLine = (long) j; + Integer expectedLine = j; Location actual = Locations.atLine(j); assertEquals(expectedLine, actual.getLine()); } From 912b1b28190d49cd76261205fae525f986d8526c Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 14 Nov 2025 00:44:17 +0100 Subject: [PATCH 10/15] Refactor output stream --- .../test/java/io/cucumber/gherkin/Main.java | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/java/src/test/java/io/cucumber/gherkin/Main.java b/java/src/test/java/io/cucumber/gherkin/Main.java index 6710ad5d2..ce01830ea 100644 --- a/java/src/test/java/io/cucumber/gherkin/Main.java +++ b/java/src/test/java/io/cucumber/gherkin/Main.java @@ -6,7 +6,6 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; -import java.io.PrintStream; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -37,7 +36,8 @@ public static void main(String[] argv) throws IOException { GherkinParser parser = builder.build(); - try (MessageToNdjsonWriter writer = new MessageToNdjsonWriter(nonClosableSystemOut(), OBJECT_MAPPER::writeValue)) { + OutputStream out = new NonClosableOutputStream(System.out); + try (MessageToNdjsonWriter writer = new MessageToNdjsonWriter(out, OBJECT_MAPPER::writeValue)) { for (String path : paths) { try (InputStream fis = Files.newInputStream(Paths.get(path))) { // Don't use parser.parse(Path). The test suite uses relative paths. @@ -48,15 +48,6 @@ public static void main(String[] argv) throws IOException { } } - private static OutputStream nonClosableSystemOut() { - return new OutputStream() { - @Override - public void write(int b) { - System.out.write(b); - } - }; - } - private static void printMessage(MessageToNdjsonWriter writer, Envelope envelope) { try { writer.write(envelope); @@ -65,4 +56,21 @@ private static void printMessage(MessageToNdjsonWriter writer, Envelope envelope } } + private static class NonClosableOutputStream extends OutputStream { + private final OutputStream delegate; + + private NonClosableOutputStream(OutputStream delegate) { + this.delegate = delegate; + } + + @Override + public void write(int b) throws IOException { + delegate.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + delegate.write(b, off, len); + } + } } From c3b66372ae07407f2ad261ea23e230cef28114f9 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 14 Nov 2025 01:06:05 +0100 Subject: [PATCH 11/15] Use snapshot versions for messages and query --- java/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/pom.xml b/java/pom.xml index ca0cff2ff..4f5556cde 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -56,7 +56,7 @@ io.cucumber messages - [30.1.1-SNAPSHOT,31.0.0) + [31.0.0-SNAPSHOT,32.0.0) From 5459a03e020bcf3d1e222d6bd3b2e78fc21a29c6 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 14 Nov 2025 01:16:42 +0100 Subject: [PATCH 12/15] Setup parent pom and checkstyle --- java/pom.xml | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/java/pom.xml b/java/pom.xml index 4f5556cde..d48e83f68 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -1,5 +1,6 @@ - + 4.0.0 @@ -102,7 +103,7 @@ 1.37 test - + org.openjdk.jmh jmh-generator-annprocess @@ -218,6 +219,19 @@ + + org.apache.maven.plugins + maven-checkstyle-plugin + + + validate + validate + + check + + + + From 399b5222e778abc41e033ea0cd0354b8fd2d058a Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Fri, 14 Nov 2025 02:33:36 +0100 Subject: [PATCH 13/15] Enable checkstyle --- java/checkstyle-suppressions.xml | 9 + java/gherkin-java.razor | 74 ++++--- java/pom.xml | 3 + .../java/io/cucumber/gherkin/Constants.java | 4 + .../io/cucumber/gherkin/EncodingParser.java | 5 +- .../gherkin/GherkinDocumentBuilder.java | 16 +- .../io/cucumber/gherkin/GherkinParser.java | 81 ++++--- .../io/cucumber/gherkin/InputStreams.java | 24 --- .../io/cucumber/gherkin/KeywordMatcher.java | 9 +- .../java/io/cucumber/gherkin/LineSpan.java | 4 +- .../java/io/cucumber/gherkin/Locations.java | 4 + .../main/java/io/cucumber/gherkin/Parser.java | 201 +++++++++++------- .../io/cucumber/gherkin/ParserException.java | 5 +- .../io/cucumber/gherkin/PickleCompiler.java | 5 +- .../java/io/cucumber/gherkin/StringUtils.java | 5 + .../io/cucumber/gherkin/TableRowLine.java | 7 +- .../java/io/cucumber/gherkin/TagLine.java | 8 +- .../main/java/io/cucumber/gherkin/Token.java | 1 - .../io/cucumber/gherkin/TokenScanner.java | 3 +- .../java/io/cucumber/gherkin/AstNodeTest.java | 4 +- .../cucumber/gherkin/EncodingParserTest.java | 3 + .../io/cucumber/gherkin/GenerateTokens.java | 44 +++- .../cucumber/gherkin/GherkinDialectTest.java | 4 +- .../gherkin/GherkinDocumentBuilderTest.java | 1 - .../gherkin/GherkinParserBenchmarkTest.java | 5 +- .../cucumber/gherkin/GherkinParserTest.java | 1 - .../io/cucumber/gherkin/InputStreamsTest.java | 4 +- .../gherkin/IsWhiteSpaceBenchmarkTest.java | 4 +- .../java/io/cucumber/gherkin/LineTest.java | 9 +- .../io/cucumber/gherkin/LocationsTest.java | 4 +- .../test/java/io/cucumber/gherkin/Main.java | 8 +- .../test/java/io/cucumber/gherkin/Stdio.java | 13 -- 32 files changed, 340 insertions(+), 232 deletions(-) create mode 100644 java/checkstyle-suppressions.xml delete mode 100644 java/src/main/java/io/cucumber/gherkin/InputStreams.java delete mode 100644 java/src/test/java/io/cucumber/gherkin/Stdio.java diff --git a/java/checkstyle-suppressions.xml b/java/checkstyle-suppressions.xml new file mode 100644 index 000000000..aae028f2a --- /dev/null +++ b/java/checkstyle-suppressions.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/java/gherkin-java.razor b/java/gherkin-java.razor index 601b8e687..7602a3644 100644 --- a/java/gherkin-java.razor +++ b/java/gherkin-java.razor @@ -42,43 +42,9 @@ import java.util.function.BiPredicate; * Changes to this class will be lost if the code is regenerated. */ final class @Model.ParserClassName { - enum TokenType { - None(RuleType.None), - @foreach(var rule in Model.RuleSet.TokenRules) - { @(rule.Name.Replace("#", ""))(RuleType.@(rule.Name.Replace("#", "_"))), -} ; - - final RuleType ruleType; - - TokenType(RuleType ruleType) { - this.ruleType = ruleType; - } - } - - enum RuleType { - None, - @foreach(var rule in Model.RuleSet.Where(r => !r.TempRule)) - { @rule.Name.Replace("#", "_"), // @rule.ToString(true) -} ; - - } private final Builder builder; - static final class ParserContext { - final TokenScanner tokenScanner; - final TokenMatcher tokenMatcher; - final Queue tokenQueue; - final List errors; - - ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue tokenQueue, List errors) { - this.tokenScanner = tokenScanner; - this.tokenMatcher = tokenMatcher; - this.tokenQueue = tokenQueue; - this.errors = errors; - } - } - Parser(Builder builder) { this.builder = builder; } @@ -268,9 +234,13 @@ final class @Model.ParserClassName { interface Builder { void build(Token token); + void startRule(RuleType ruleType); + void endRule(RuleType ruleType); + T getResult(); + void reset(String uri); } @@ -278,7 +248,43 @@ final class @Model.ParserClassName { @foreach(var rule in Model.RuleSet.TokenRules) { @:boolean match_@(rule.Name.Replace("#", ""))(Token token); + @: } void reset(); } + + static final class ParserContext { + final TokenScanner tokenScanner; + final TokenMatcher tokenMatcher; + final Queue tokenQueue; + final List errors; + + ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue tokenQueue, List errors) { + this.tokenScanner = tokenScanner; + this.tokenMatcher = tokenMatcher; + this.tokenQueue = tokenQueue; + this.errors = errors; + } + } + + enum TokenType { + None(RuleType.None), + @foreach(var rule in Model.RuleSet.TokenRules) + { @(rule.Name.Replace("#", ""))(RuleType.@(rule.Name.Replace("#", "_"))), +} ; + + final RuleType ruleType; + + TokenType(RuleType ruleType) { + this.ruleType = ruleType; + } + } + + enum RuleType { + None, + @foreach(var rule in Model.RuleSet.Where(r => !r.TempRule)) + { /** @rule.ToString(true) **/ + @rule.Name.Replace("#", "_"), +} + } } diff --git a/java/pom.xml b/java/pom.xml index d48e83f68..85387b064 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -229,6 +229,9 @@ check + + checkstyle-suppressions.xml + diff --git a/java/src/main/java/io/cucumber/gherkin/Constants.java b/java/src/main/java/io/cucumber/gherkin/Constants.java index 889391eec..8152b3a91 100644 --- a/java/src/main/java/io/cucumber/gherkin/Constants.java +++ b/java/src/main/java/io/cucumber/gherkin/Constants.java @@ -2,6 +2,10 @@ final class Constants { + private Constants(){ + // utility class + } + static final char TAG_PREFIX_CHAR = '@'; static final char COMMENT_PREFIX_CHAR = '#'; static final char TITLE_KEYWORD_SEPARATOR = ':'; diff --git a/java/src/main/java/io/cucumber/gherkin/EncodingParser.java b/java/src/main/java/io/cucumber/gherkin/EncodingParser.java index 81658f275..cb2f6c993 100644 --- a/java/src/main/java/io/cucumber/gherkin/EncodingParser.java +++ b/java/src/main/java/io/cucumber/gherkin/EncodingParser.java @@ -2,7 +2,6 @@ import java.nio.charset.Charset; import java.util.Arrays; -import java.util.Iterator; import java.util.Optional; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -19,6 +18,10 @@ final class EncodingParser { private static final Pattern COMMENT_OR_EMPTY_LINE_PATTERN = Pattern.compile("^\\s*#|^\\s*$"); private static final Pattern ENCODING_PATTERN = Pattern.compile("^\\s*#\\s*encoding\\s*:\\s*([0-9a-zA-Z\\-]+)", CASE_INSENSITIVE); + + private EncodingParser(){ + // utility class + } static String readWithEncodingFromSource(byte[] source) { byte[] bomFreeSource = removeByteOrderMarker(source); diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java b/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java index 0a0d944ca..5b0da6f24 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinDocumentBuilder.java @@ -22,7 +22,6 @@ import java.util.Collections; import java.util.Deque; import java.util.List; -import java.util.Objects; import static io.cucumber.gherkin.GherkinParser.FEATURE_FILE_AVERAGE_LINE_LENGTH; import static io.cucumber.gherkin.Locations.atColumn; @@ -243,16 +242,18 @@ private static String joinMatchedText(List lineTokens, int toIndex) { } int contentLength = content.length(); if (contentLength > 0) { - content.setLength(contentLength - 1); // Remove the last \n + // Remove the last \n + content.setLength(contentLength - 1); } return content.toString(); } - @SuppressWarnings("ForLoopReplaceableByForEach") // classic 'for' loop is ~2x faster than 'for-each' + @SuppressWarnings("ForLoopReplaceableByForEach") private List getTableRows(AstNode node) { List tokens = node.getTokens(TokenType.TableRow); int tokenSize = tokens.size(); List rows = new ArrayList<>(tokenSize); + // classic 'for' loop is ~2x faster than 'for-each' for (int i = 0; i < tokenSize; i++) { Token token = tokens.get(i); rows.add(new TableRow(token.location, getCells(token), idGenerator.newId())); @@ -261,12 +262,13 @@ private List getTableRows(AstNode node) { return rows; } - @SuppressWarnings("ForLoopReplaceableByForEach") // classic 'for' loop is ~2x faster than 'for-each' + @SuppressWarnings("ForLoopReplaceableByForEach") private void ensureCellCount(List rows) { if (rows.isEmpty()) return; int firstRowCellsSize = rows.get(0).getCells().size(); + // classic 'for' loop is ~2x faster than 'for-each' for (int i = 0, rowsSize = rows.size(); i < rowsSize; i++) { TableRow row = rows.get(i); if (row.getCells().size() != firstRowCellsSize) { @@ -275,7 +277,7 @@ private void ensureCellCount(List rows) { } } - @SuppressWarnings("ForLoopReplaceableByForEach") // classic 'for' loop is ~2x faster than 'for-each' + @SuppressWarnings("ForLoopReplaceableByForEach") private List getCells(Token token) { List matchedItems = token.matchedItems; if (matchedItems == null) { @@ -283,6 +285,7 @@ private List getCells(Token token) { } int itemSize = matchedItems.size(); List cells = new ArrayList<>(itemSize); + // classic 'for' loop is ~2x faster than 'for-each' for (int i = 0; i < itemSize; i++) { LineSpan cellItem = matchedItems.get(i); TableCell tableCell = new TableCell( @@ -304,7 +307,8 @@ private String getDescription(AstNode node) { private List getTags(AstNode node) { AstNode tagsNode = node.getSingle(RuleType.Tags); - if (tagsNode == null) {// tags are optional + // tags are optional + if (tagsNode == null) { return new ArrayList<>(0); } diff --git a/java/src/main/java/io/cucumber/gherkin/GherkinParser.java b/java/src/main/java/io/cucumber/gherkin/GherkinParser.java index 55615514f..d89c5086d 100644 --- a/java/src/main/java/io/cucumber/gherkin/GherkinParser.java +++ b/java/src/main/java/io/cucumber/gherkin/GherkinParser.java @@ -21,7 +21,6 @@ import static io.cucumber.gherkin.EncodingParser.readWithEncodingFromSource; import static io.cucumber.messages.types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN; import static java.util.Objects.requireNonNull; -import static java.util.stream.Collectors.toCollection; import static java.util.stream.Collectors.toList; /** @@ -33,7 +32,7 @@ public final class GherkinParser { * Estimate of the average line length in a feature file. */ static final int FEATURE_FILE_AVERAGE_LINE_LENGTH = 100; - + /** * Estimate of the average number of lines in a feature file. */ @@ -44,42 +43,6 @@ public final class GherkinParser { */ static final int FEATURE_FILE_AVERAGE_SIZE = FEATURE_FILE_AVERAGE_LINE_LENGTH * FEATURE_FILE_AVERAGE_LINE_COUNT; - public static final class Builder { - private boolean includeSource = true; - private boolean includeGherkinDocument = true; - private boolean includePickles = true; - private IdGenerator idGenerator = () -> UUID.randomUUID().toString(); - - private Builder() { - - } - - public Builder includeSource(boolean includeSource) { - this.includeSource = includeSource; - return this; - } - - public Builder includeGherkinDocument(boolean includeGherkinDocument) { - this.includeGherkinDocument = includeGherkinDocument; - return this; - } - - public Builder includePickles(boolean includePickles) { - this.includePickles = includePickles; - return this; - } - - public Builder idGenerator(IdGenerator idGenerator) { - this.idGenerator = requireNonNull(idGenerator); - return this; - } - - public GherkinParser build() { - return new GherkinParser(includeSource, includeGherkinDocument, includePickles, idGenerator); - } - - } - private final boolean includeSource; private final boolean includeGherkinDocument; private final boolean includePickles; @@ -87,7 +50,7 @@ public GherkinParser build() { private final PickleCompiler pickleCompiler; private GherkinParser(boolean includeSource, boolean includeGherkinDocument, boolean includePickles, - IdGenerator idGenerator) { + IdGenerator idGenerator) { this.includeSource = includeSource; this.includeGherkinDocument = includeGherkinDocument; this.includePickles = includePickles; @@ -108,7 +71,7 @@ public Stream parse(Path source) throws IOException { public Stream parse(String uri, InputStream source) throws IOException { requireNonNull(uri); requireNonNull(source); - return parse(uri, InputStreams.readAllBytes(source)); + return parse(uri, source.readAllBytes()); } public Stream parse(String uri, byte[] source) { @@ -142,7 +105,7 @@ private List parse(Source source) { return parse(source.getUri(), source.getData()); } - @SuppressWarnings("ForLoopReplaceableByForEach") // classic 'for' loop is ~2x faster than 'for-each' + @SuppressWarnings("ForLoopReplaceableByForEach") private List parse(String uri, String data) { List messages = new ArrayList<>(); GherkinDocumentBuilder documentBuilder = new GherkinDocumentBuilder(idGenerator, uri); @@ -155,6 +118,7 @@ private List parse(String uri, String data) { } if (includePickles) { List compile = pickleCompiler.compile(gherkinDocument, uri); + // classic 'for' loop is ~2x faster than 'for-each' for (int i = 0, compileSize = compile.size(); i < compileSize; i++) { Pickle pickle = compile.get(i); messages.add(Envelope.of(pickle)); @@ -183,4 +147,39 @@ private Envelope createParseError(ParserException e, String uri) { )); } + public static final class Builder { + private boolean includeSource = true; + private boolean includeGherkinDocument = true; + private boolean includePickles = true; + private IdGenerator idGenerator = () -> UUID.randomUUID().toString(); + + private Builder() { + + } + + public Builder includeSource(boolean includeSource) { + this.includeSource = includeSource; + return this; + } + + public Builder includeGherkinDocument(boolean includeGherkinDocument) { + this.includeGherkinDocument = includeGherkinDocument; + return this; + } + + public Builder includePickles(boolean includePickles) { + this.includePickles = includePickles; + return this; + } + + public Builder idGenerator(IdGenerator idGenerator) { + this.idGenerator = requireNonNull(idGenerator); + return this; + } + + public GherkinParser build() { + return new GherkinParser(includeSource, includeGherkinDocument, includePickles, idGenerator); + } + + } } diff --git a/java/src/main/java/io/cucumber/gherkin/InputStreams.java b/java/src/main/java/io/cucumber/gherkin/InputStreams.java deleted file mode 100644 index 4d896bc4a..000000000 --- a/java/src/main/java/io/cucumber/gherkin/InputStreams.java +++ /dev/null @@ -1,24 +0,0 @@ -package io.cucumber.gherkin; - -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; - -final class InputStreams { - - /** - * Shim for InputStream.readAllBytes - */ - static byte[] readAllBytes(InputStream source) throws IOException { - final byte[] buffer = new byte[2 * 1024]; // 2KB - int read; - // The BAOS initial capacity is guessed from the average line count - // and average line length, to avoid resizing the underlying array. - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(GherkinParser.FEATURE_FILE_AVERAGE_SIZE); - while (-1 != (read = source.read(buffer, 0, buffer.length))) { - outputStream.write(buffer, 0, read); - } - return outputStream.toByteArray(); - } - -} diff --git a/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java b/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java index b0a819efd..f364c7522 100644 --- a/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java +++ b/java/src/main/java/io/cucumber/gherkin/KeywordMatcher.java @@ -6,10 +6,15 @@ interface KeywordMatcher { @Nullable Match matchFeatureKeyword(Line line); + @Nullable Match matchBackgroundKeyword(Line line); + @Nullable Match matchRuleKeyword(Line line); + @Nullable Match matchScenarioKeyword(Line line); + @Nullable Match matchExampleKeyword(Line line); + @Nullable StepMatch matchStepKeyword(Line line); final class StepMatch { @@ -30,13 +35,13 @@ String getKeyword() { int getKeywordLength() { return keywordLength; } - + StepKeywordType getKeywordType() { return keywordType; } } - + final class Match { private final String keyword; private final int keywordLength; diff --git a/java/src/main/java/io/cucumber/gherkin/LineSpan.java b/java/src/main/java/io/cucumber/gherkin/LineSpan.java index 406240488..4352a3f82 100644 --- a/java/src/main/java/io/cucumber/gherkin/LineSpan.java +++ b/java/src/main/java/io/cucumber/gherkin/LineSpan.java @@ -3,11 +3,11 @@ final class LineSpan { /** * Index-1 based position in codepoints. - */ + */ final int column; /** - * Text part of the line + * Text part of the line */ final String text; diff --git a/java/src/main/java/io/cucumber/gherkin/Locations.java b/java/src/main/java/io/cucumber/gherkin/Locations.java index 461a8a85b..c50665913 100644 --- a/java/src/main/java/io/cucumber/gherkin/Locations.java +++ b/java/src/main/java/io/cucumber/gherkin/Locations.java @@ -22,6 +22,10 @@ final class Locations { ints[i] = i; } } + + private Locations(){ + // utility class + } private static Integer getInteger(int i) { // JMH benchmark shows that this implementation is the diff --git a/java/src/main/java/io/cucumber/gherkin/Parser.java b/java/src/main/java/io/cucumber/gherkin/Parser.java index 9b3761a6d..f599623ef 100644 --- a/java/src/main/java/io/cucumber/gherkin/Parser.java +++ b/java/src/main/java/io/cucumber/gherkin/Parser.java @@ -14,85 +14,9 @@ * Changes to this class will be lost if the code is regenerated. */ final class Parser { - enum TokenType { - None(RuleType.None), - EOF(RuleType._EOF), - Empty(RuleType._Empty), - Comment(RuleType._Comment), - TagLine(RuleType._TagLine), - FeatureLine(RuleType._FeatureLine), - RuleLine(RuleType._RuleLine), - BackgroundLine(RuleType._BackgroundLine), - ScenarioLine(RuleType._ScenarioLine), - ExamplesLine(RuleType._ExamplesLine), - StepLine(RuleType._StepLine), - DocStringSeparator(RuleType._DocStringSeparator), - TableRow(RuleType._TableRow), - Language(RuleType._Language), - Other(RuleType._Other), - ; - - final RuleType ruleType; - - TokenType(RuleType ruleType) { - this.ruleType = ruleType; - } - } - - enum RuleType { - None, - _EOF, // #EOF - _Empty, // #Empty - _Comment, // #Comment - _TagLine, // #TagLine - _FeatureLine, // #FeatureLine - _RuleLine, // #RuleLine - _BackgroundLine, // #BackgroundLine - _ScenarioLine, // #ScenarioLine - _ExamplesLine, // #ExamplesLine - _StepLine, // #StepLine - _DocStringSeparator, // #DocStringSeparator - _TableRow, // #TableRow - _Language, // #Language - _Other, // #Other - GherkinDocument, // GherkinDocument! := Feature? - Feature, // Feature! := FeatureHeader Background? ScenarioDefinition* Rule* - FeatureHeader, // FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper - Rule, // Rule! := RuleHeader Background? ScenarioDefinition* - RuleHeader, // RuleHeader! := Tags? #RuleLine DescriptionHelper - Background, // Background! := #BackgroundLine DescriptionHelper Step* - ScenarioDefinition, // ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine] := Tags? Scenario - Scenario, // Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* - ExamplesDefinition, // ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine] := Tags? Examples - Examples, // Examples! := #ExamplesLine DescriptionHelper ExamplesTable? - ExamplesTable, // ExamplesTable! := #TableRow #TableRow* - Step, // Step! := #StepLine StepArg? - StepArg, // StepArg := (DataTable | DocString) - DataTable, // DataTable! := #TableRow+ - DocString, // DocString! := #DocStringSeparator #Other* #DocStringSeparator - Tags, // Tags! := #TagLine+ - DescriptionHelper, // DescriptionHelper := #Empty* Description? - Description, // Description! := (#Other | #Comment)+ - ; - - } private final Builder builder; - static final class ParserContext { - final TokenScanner tokenScanner; - final TokenMatcher tokenMatcher; - final Queue tokenQueue; - final List errors; - - ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue tokenQueue, List errors) { - this.tokenScanner = tokenScanner; - this.tokenMatcher = tokenMatcher; - this.tokenQueue = tokenQueue; - this.errors = errors; - } - } - Parser(Builder builder) { this.builder = builder; } @@ -3729,27 +3653,152 @@ private boolean lookahead_1(ParserContext context) { interface Builder { void build(Token token); + void startRule(RuleType ruleType); + void endRule(RuleType ruleType); + T getResult(); + void reset(String uri); } interface TokenMatcher { boolean match_EOF(Token token); + boolean match_Empty(Token token); + boolean match_Comment(Token token); + boolean match_TagLine(Token token); + boolean match_FeatureLine(Token token); + boolean match_RuleLine(Token token); + boolean match_BackgroundLine(Token token); + boolean match_ScenarioLine(Token token); + boolean match_ExamplesLine(Token token); + boolean match_StepLine(Token token); + boolean match_DocStringSeparator(Token token); + boolean match_TableRow(Token token); + boolean match_Language(Token token); + boolean match_Other(Token token); + void reset(); } + + static final class ParserContext { + final TokenScanner tokenScanner; + final TokenMatcher tokenMatcher; + final Queue tokenQueue; + final List errors; + + ParserContext(TokenScanner tokenScanner, TokenMatcher tokenMatcher, Queue tokenQueue, List errors) { + this.tokenScanner = tokenScanner; + this.tokenMatcher = tokenMatcher; + this.tokenQueue = tokenQueue; + this.errors = errors; + } + } + + enum TokenType { + None(RuleType.None), + EOF(RuleType._EOF), + Empty(RuleType._Empty), + Comment(RuleType._Comment), + TagLine(RuleType._TagLine), + FeatureLine(RuleType._FeatureLine), + RuleLine(RuleType._RuleLine), + BackgroundLine(RuleType._BackgroundLine), + ScenarioLine(RuleType._ScenarioLine), + ExamplesLine(RuleType._ExamplesLine), + StepLine(RuleType._StepLine), + DocStringSeparator(RuleType._DocStringSeparator), + TableRow(RuleType._TableRow), + Language(RuleType._Language), + Other(RuleType._Other), + ; + + final RuleType ruleType; + + TokenType(RuleType ruleType) { + this.ruleType = ruleType; + } + } + + enum RuleType { + None, + /** #EOF **/ + _EOF, + /** #Empty **/ + _Empty, + /** #Comment **/ + _Comment, + /** #TagLine **/ + _TagLine, + /** #FeatureLine **/ + _FeatureLine, + /** #RuleLine **/ + _RuleLine, + /** #BackgroundLine **/ + _BackgroundLine, + /** #ScenarioLine **/ + _ScenarioLine, + /** #ExamplesLine **/ + _ExamplesLine, + /** #StepLine **/ + _StepLine, + /** #DocStringSeparator **/ + _DocStringSeparator, + /** #TableRow **/ + _TableRow, + /** #Language **/ + _Language, + /** #Other **/ + _Other, + /** GherkinDocument! := Feature? **/ + GherkinDocument, + /** Feature! := FeatureHeader Background? ScenarioDefinition* Rule* **/ + Feature, + /** FeatureHeader! := #Language? Tags? #FeatureLine DescriptionHelper **/ + FeatureHeader, + /** Rule! := RuleHeader Background? ScenarioDefinition* **/ + Rule, + /** RuleHeader! := Tags? #RuleLine DescriptionHelper **/ + RuleHeader, + /** Background! := #BackgroundLine DescriptionHelper Step* **/ + Background, + /** ScenarioDefinition! [#Empty|#Comment|#TagLine->#ScenarioLine] := Tags? Scenario **/ + ScenarioDefinition, + /** Scenario! := #ScenarioLine DescriptionHelper Step* ExamplesDefinition* **/ + Scenario, + /** ExamplesDefinition! [#Empty|#Comment|#TagLine->#ExamplesLine] := Tags? Examples **/ + ExamplesDefinition, + /** Examples! := #ExamplesLine DescriptionHelper ExamplesTable? **/ + Examples, + /** ExamplesTable! := #TableRow #TableRow* **/ + ExamplesTable, + /** Step! := #StepLine StepArg? **/ + Step, + /** StepArg := (DataTable | DocString) **/ + StepArg, + /** DataTable! := #TableRow+ **/ + DataTable, + /** DocString! := #DocStringSeparator #Other* #DocStringSeparator **/ + DocString, + /** Tags! := #TagLine+ **/ + Tags, + /** DescriptionHelper := #Empty* Description? **/ + DescriptionHelper, + /** Description! := (#Other | #Comment)+ **/ + Description, + } } diff --git a/java/src/main/java/io/cucumber/gherkin/ParserException.java b/java/src/main/java/io/cucumber/gherkin/ParserException.java index 4630b2227..a4366d513 100644 --- a/java/src/main/java/io/cucumber/gherkin/ParserException.java +++ b/java/src/main/java/io/cucumber/gherkin/ParserException.java @@ -1,12 +1,9 @@ package io.cucumber.gherkin; -import java.util.Collections; import java.util.List; -import java.util.Objects; import java.util.stream.Collectors; import io.cucumber.messages.types.Location; -import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import static io.cucumber.gherkin.Locations.COLUMN_OFFSET; @@ -48,10 +45,10 @@ static final class NoSuchLanguageException extends ParserException { } static final class UnexpectedTokenException extends ParserException { - String stateComment; final Token receivedToken; final List expectedTokenTypes; + final String stateComment; UnexpectedTokenException(Token receivedToken, List expectedTokenTypes, String stateComment) { super(getMessage(receivedToken, expectedTokenTypes), getLocation(receivedToken)); diff --git a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java index 9a0688020..9fe09cd24 100644 --- a/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java +++ b/java/src/main/java/io/cucumber/gherkin/PickleCompiler.java @@ -175,12 +175,13 @@ private void compileScenarioOutline(List pickles, Scenario scenario, Lis } } } - - @SuppressWarnings("ForLoopReplaceableByForEach") // classic 'for' loop is ~2x faster than 'for-each' + + @SuppressWarnings("ForLoopReplaceableByForEach") private PickleTable pickleDataTable(DataTable dataTable, List variableCells, List valueCells) { List rows = dataTable.getRows(); int rowCount = rows.size(); List newRows = new ArrayList<>(rowCount); + // classic 'for' loop is ~2x faster than 'for-each' for (int i = 0; i < rowCount; i++) { TableRow row = rows.get(i); List cells = row.getCells(); diff --git a/java/src/main/java/io/cucumber/gherkin/StringUtils.java b/java/src/main/java/io/cucumber/gherkin/StringUtils.java index 154016421..12801c2ab 100644 --- a/java/src/main/java/io/cucumber/gherkin/StringUtils.java +++ b/java/src/main/java/io/cucumber/gherkin/StringUtils.java @@ -3,6 +3,10 @@ final class StringUtils { + private StringUtils(){ + // utility class + } + /** * An extended definition of Whitespace minus new lines. * @@ -24,6 +28,7 @@ static boolean isWhitespaceExcludingNewLine(char c) { * @param c character to test * @return true iff the {@code c} is whitespace. */ + @SuppressWarnings("UnnecessaryParentheses") static boolean isWhitespace(char c) { // This method is about twice faster than `isWhiteSpaceSlow(c)`. // It has been optimized based on the expected use-case of diff --git a/java/src/main/java/io/cucumber/gherkin/TableRowLine.java b/java/src/main/java/io/cucumber/gherkin/TableRowLine.java index e06e10bcf..956aa198b 100644 --- a/java/src/main/java/io/cucumber/gherkin/TableRowLine.java +++ b/java/src/main/java/io/cucumber/gherkin/TableRowLine.java @@ -9,6 +9,10 @@ final class TableRowLine { + private TableRowLine(){ + // utility class + } + static List parse(int indent, String text) { List lineSpans = new ArrayList<>(); StringBuilder cellBuilder = new StringBuilder(); @@ -40,7 +44,8 @@ static List parse(int indent, String text) { int column = indent + cellStart + trimmedCellIndent.getIndent() + COLUMN_OFFSET; lineSpans.add(new LineSpan(column, trimmedCellIndent.getText())); } - cellBuilder.setLength(0);// reuse instance rather than creating a new one is faster + // reuse instance rather than creating a new one is faster + cellBuilder.setLength(0); cellStart = col + 1; } else { cellBuilder.appendCodePoint(c); diff --git a/java/src/main/java/io/cucumber/gherkin/TagLine.java b/java/src/main/java/io/cucumber/gherkin/TagLine.java index c8e445bf0..27d6b3482 100644 --- a/java/src/main/java/io/cucumber/gherkin/TagLine.java +++ b/java/src/main/java/io/cucumber/gherkin/TagLine.java @@ -13,6 +13,10 @@ final class TagLine { + private TagLine() { + + } + static List parse(int indent, String text, Location location) { int textLength = text.length(); // parseTags is guarded by token.line.startsWith(TAG_PREFIX_CHAR) @@ -44,9 +48,9 @@ static List parse(int indent, String text, Location location) { if (indexEndCurrentTag > indexStartCurrentTag + 1) { // non-empty tag found, check that the tag does not contain whitespace characters - + // totalCodePointCount is updated incrementally - totalCodePointCount += text.codePointCount(indexStartPreviousTag, indexStartCurrentTag); + totalCodePointCount += text.codePointCount(indexStartPreviousTag, indexStartCurrentTag); indexStartPreviousTag = indexStartCurrentTag; int column = indent + totalCodePointCount + COLUMN_OFFSET; if (containsWhitespace(text, indexStartCurrentTag + 1, indexEndCurrentTag)) { diff --git a/java/src/main/java/io/cucumber/gherkin/Token.java b/java/src/main/java/io/cucumber/gherkin/Token.java index cc13f790b..0cce9f017 100644 --- a/java/src/main/java/io/cucumber/gherkin/Token.java +++ b/java/src/main/java/io/cucumber/gherkin/Token.java @@ -2,7 +2,6 @@ import io.cucumber.messages.types.Location; import io.cucumber.messages.types.StepKeywordType; -import org.jspecify.annotations.NonNull; import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/java/src/main/java/io/cucumber/gherkin/TokenScanner.java b/java/src/main/java/io/cucumber/gherkin/TokenScanner.java index 1a3c9ba49..f8e02ebce 100644 --- a/java/src/main/java/io/cucumber/gherkin/TokenScanner.java +++ b/java/src/main/java/io/cucumber/gherkin/TokenScanner.java @@ -1,7 +1,6 @@ package io.cucumber.gherkin; import io.cucumber.messages.types.Location; -import org.jspecify.annotations.Nullable; import java.util.Iterator; @@ -11,7 +10,7 @@ /** * The scanner reads a gherkin doc (typically read from a .feature file) and * creates a token for each line. The tokens are passed to the parser, which - * outputs an AST (Abstract Syntax Tree).

+ * outputs an AST (Abstract Syntax Tree). */ final class TokenScanner { diff --git a/java/src/test/java/io/cucumber/gherkin/AstNodeTest.java b/java/src/test/java/io/cucumber/gherkin/AstNodeTest.java index 20f628a32..3afab31e7 100644 --- a/java/src/test/java/io/cucumber/gherkin/AstNodeTest.java +++ b/java/src/test/java/io/cucumber/gherkin/AstNodeTest.java @@ -2,7 +2,9 @@ import org.junit.jupiter.api.Test; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; class AstNodeTest { diff --git a/java/src/test/java/io/cucumber/gherkin/EncodingParserTest.java b/java/src/test/java/io/cucumber/gherkin/EncodingParserTest.java index 62b34208c..744dab791 100644 --- a/java/src/test/java/io/cucumber/gherkin/EncodingParserTest.java +++ b/java/src/test/java/io/cucumber/gherkin/EncodingParserTest.java @@ -15,12 +15,14 @@ void empty() throws RuntimeException { String parsed = readWithEncodingFromSource(utf_8(feature)); assertEquals(feature, parsed); } + @Test void nearly_empty() throws RuntimeException { String feature = "\n"; String parsed = readWithEncodingFromSource(utf_8(feature)); assertEquals(feature, parsed); } + @Test void only_comment() throws RuntimeException { String feature = "#Sample comment\n"; @@ -45,6 +47,7 @@ void single_scenario() throws RuntimeException { String parsed = readWithEncodingFromSource(utf_8(feature)); assertEquals(feature, parsed); } + @Test void reads_with_encoding_from_pragma() throws RuntimeException { String feature = "" + diff --git a/java/src/test/java/io/cucumber/gherkin/GenerateTokens.java b/java/src/test/java/io/cucumber/gherkin/GenerateTokens.java index 95b3948ca..22801a7e9 100644 --- a/java/src/test/java/io/cucumber/gherkin/GenerateTokens.java +++ b/java/src/test/java/io/cucumber/gherkin/GenerateTokens.java @@ -1,21 +1,53 @@ package io.cucumber.gherkin; +import org.jspecify.annotations.NullMarked; + import java.io.IOException; +import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; import java.nio.file.Paths; import static java.nio.charset.StandardCharsets.UTF_8; -import static java.nio.file.Files.readAllBytes; +import static java.nio.file.Files.readString; public final class GenerateTokens { + + private GenerateTokens() { + // main class + } + public static void main(String[] args) throws IOException { TokenFormatterBuilder builder = new TokenFormatterBuilder(); Parser parser = new Parser<>(builder); GherkinTokenMatcher matcher = new GherkinTokenMatcher(); - for (String fileName : args) { - byte[] bytes = readAllBytes(Paths.get(fileName)); - String result = parser.parse(new String(bytes, UTF_8), matcher, fileName); - Stdio.out.print(result); - Stdio.out.flush(); // print doesn't autoflush + OutputStream out = new NonClosableOutputStream(System.out); + try (PrintWriter writer = new PrintWriter(new OutputStreamWriter(out, UTF_8))) { + for (String fileName : args) { + String bytes = readString(Paths.get(fileName), UTF_8); + String result = parser.parse(bytes, matcher, fileName); + writer.print(result); + } + } + } + + @NullMarked + private static class NonClosableOutputStream extends OutputStream { + + private final OutputStream delegate; + + NonClosableOutputStream(OutputStream delegate) { + this.delegate = delegate; + } + + @Override + public void write(int b) throws IOException { + delegate.write(b); + } + + @Override + public void write(byte[] b, int off, int len) throws IOException { + delegate.write(b, off, len); } } } diff --git a/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java b/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java index a26abe2d6..4fd9613e9 100644 --- a/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java +++ b/java/src/test/java/io/cucumber/gherkin/GherkinDialectTest.java @@ -7,7 +7,9 @@ import java.util.NoSuchElementException; import java.util.Set; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; class GherkinDialectTest { diff --git a/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java b/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java index e3ce95552..4603c4b59 100644 --- a/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java +++ b/java/src/test/java/io/cucumber/gherkin/GherkinDocumentBuilderTest.java @@ -14,7 +14,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; class GherkinDocumentBuilderTest { private final IdGenerator idGenerator = new IncrementingIdGenerator(); diff --git a/java/src/test/java/io/cucumber/gherkin/GherkinParserBenchmarkTest.java b/java/src/test/java/io/cucumber/gherkin/GherkinParserBenchmarkTest.java index 5054d9363..127d1b41a 100644 --- a/java/src/test/java/io/cucumber/gherkin/GherkinParserBenchmarkTest.java +++ b/java/src/test/java/io/cucumber/gherkin/GherkinParserBenchmarkTest.java @@ -13,9 +13,10 @@ import java.nio.file.Paths; import java.util.stream.Stream; -public class GherkinParserBenchmarkTest { - +public final class GherkinParserBenchmarkTest { + @Benchmark + @SuppressWarnings("UnusedReturnValue") public Stream benchmark() throws IOException { GherkinParser gherkinParser = GherkinParser.builder() .idGenerator(new IncrementingIdGenerator()) diff --git a/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java b/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java index 16650fd10..2c629f9ef 100644 --- a/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java +++ b/java/src/test/java/io/cucumber/gherkin/GherkinParserTest.java @@ -19,7 +19,6 @@ import java.util.stream.Stream; import static io.cucumber.messages.types.SourceMediaType.TEXT_X_CUCUMBER_GHERKIN_PLAIN; -import static java.util.stream.Collectors.toList; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; diff --git a/java/src/test/java/io/cucumber/gherkin/InputStreamsTest.java b/java/src/test/java/io/cucumber/gherkin/InputStreamsTest.java index 386e8ad3e..9a031566f 100644 --- a/java/src/test/java/io/cucumber/gherkin/InputStreamsTest.java +++ b/java/src/test/java/io/cucumber/gherkin/InputStreamsTest.java @@ -15,7 +15,7 @@ class InputStreamsTest { void readsAllBytes() throws IOException { byte[] input = "# sample comment".getBytes(StandardCharsets.UTF_8); try (InputStream is = new ByteArrayInputStream(input)) { - assertArrayEquals(input, InputStreams.readAllBytes(is)); + assertArrayEquals(input, is.readAllBytes()); } } @@ -27,7 +27,7 @@ void readsALotOfBytes() throws IOException { } byte[] input = builder.toString().getBytes(StandardCharsets.UTF_8); try (InputStream is = new ByteArrayInputStream(input)) { - assertArrayEquals(input, InputStreams.readAllBytes(is)); + assertArrayEquals(input, is.readAllBytes()); } } diff --git a/java/src/test/java/io/cucumber/gherkin/IsWhiteSpaceBenchmarkTest.java b/java/src/test/java/io/cucumber/gherkin/IsWhiteSpaceBenchmarkTest.java index 15666778e..b6af1a90d 100644 --- a/java/src/test/java/io/cucumber/gherkin/IsWhiteSpaceBenchmarkTest.java +++ b/java/src/test/java/io/cucumber/gherkin/IsWhiteSpaceBenchmarkTest.java @@ -14,7 +14,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; -public class IsWhiteSpaceBenchmarkTest { +public final class IsWhiteSpaceBenchmarkTest { private static final char[] featureFileLinePrefixes = createLinePrefixes(); @@ -48,6 +48,7 @@ private static char[] createLinePrefixes() { } @Benchmark + @SuppressWarnings("UnusedReturnValue") public boolean benchmarkIsWhiteSpace() { boolean hasWhitespace = false; for (char c : featureFileLinePrefixes) { @@ -57,6 +58,7 @@ public boolean benchmarkIsWhiteSpace() { } @Benchmark + @SuppressWarnings("UnusedReturnValue") public boolean benchmarkIsWhiteSpaceSlow() { boolean hasWhitespace = false; for (char c : featureFileLinePrefixes) { diff --git a/java/src/test/java/io/cucumber/gherkin/LineTest.java b/java/src/test/java/io/cucumber/gherkin/LineTest.java index 06b2f9fa9..7da42564d 100644 --- a/java/src/test/java/io/cucumber/gherkin/LineTest.java +++ b/java/src/test/java/io/cucumber/gherkin/LineTest.java @@ -25,9 +25,12 @@ void startsWithTitleKeyword_non_corresponding_keyword_does_not_match() { Line gherkinLine = new Line("Rule: X"); // When/Then - assertFalse(gherkinLine.startsWithTitleKeyword("Background")); // not the same keyword - assertFalse(gherkinLine.startsWithTitleKeyword("Rule: X")); // same keyword but with colon - assertFalse(gherkinLine.startsWithTitleKeyword("Rul")); // shorter than keyword + // not the same keyword + assertFalse(gherkinLine.startsWithTitleKeyword("Background")); + // same keyword but with colon + assertFalse(gherkinLine.startsWithTitleKeyword("Rule: X")); + // shorter than keyword + assertFalse(gherkinLine.startsWithTitleKeyword("Rul")); } @Test diff --git a/java/src/test/java/io/cucumber/gherkin/LocationsTest.java b/java/src/test/java/io/cucumber/gherkin/LocationsTest.java index 0cb715d43..03b68339d 100644 --- a/java/src/test/java/io/cucumber/gherkin/LocationsTest.java +++ b/java/src/test/java/io/cucumber/gherkin/LocationsTest.java @@ -5,7 +5,9 @@ import java.util.concurrent.atomic.AtomicInteger; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; class LocationsTest { diff --git a/java/src/test/java/io/cucumber/gherkin/Main.java b/java/src/test/java/io/cucumber/gherkin/Main.java index ce01830ea..1a84e8c4a 100644 --- a/java/src/test/java/io/cucumber/gherkin/Main.java +++ b/java/src/test/java/io/cucumber/gherkin/Main.java @@ -14,8 +14,12 @@ import static io.cucumber.gherkin.Jackson.OBJECT_MAPPER; import static java.util.Arrays.asList; -public class Main { +public final class Main { + private Main(){ + // main class + } + public static void main(String[] argv) throws IOException { List args = new ArrayList<>(asList(argv)); List paths = new ArrayList<>(); @@ -56,7 +60,7 @@ private static void printMessage(MessageToNdjsonWriter writer, Envelope envelope } } - private static class NonClosableOutputStream extends OutputStream { + private static final class NonClosableOutputStream extends OutputStream { private final OutputStream delegate; private NonClosableOutputStream(OutputStream delegate) { diff --git a/java/src/test/java/io/cucumber/gherkin/Stdio.java b/java/src/test/java/io/cucumber/gherkin/Stdio.java deleted file mode 100644 index 2f9762639..000000000 --- a/java/src/test/java/io/cucumber/gherkin/Stdio.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.cucumber.gherkin; - -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.nio.charset.StandardCharsets; - -class Stdio { - /** - * UTF-8 STDOUT - */ - public static final PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out, StandardCharsets.UTF_8), true); - -} From 7de5692d06019cc66ef92b381493f488aaefe73a Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Sat, 15 Nov 2025 00:27:12 +0100 Subject: [PATCH 14/15] Update versions and polish --- java/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/pom.xml b/java/pom.xml index 85387b064..2ef3d5e82 100644 --- a/java/pom.xml +++ b/java/pom.xml @@ -9,7 +9,7 @@ 5.0.0-SNAPSHOT gherkin - 36.1.1-SNAPSHOT + 37.0.0-SNAPSHOT jar Gherkin Gherkin parser From 4c531c7ad66f729d283ccdb3457fa0b278b253a3 Mon Sep 17 00:00:00 2001 From: "M.P. Korstanje" Date: Tue, 25 Nov 2025 21:17:50 +0100 Subject: [PATCH 15/15] WIP --- .../gherkin/dialects/templates/gherkin-dialects.java.ftl | 2 +- java/src/main/java/io/cucumber/gherkin/Constants.java | 2 +- java/src/main/java/io/cucumber/gherkin/EncodingParser.java | 2 +- java/src/main/java/io/cucumber/gherkin/Locations.java | 2 +- java/src/main/java/io/cucumber/gherkin/StringUtils.java | 2 +- java/src/main/java/io/cucumber/gherkin/TableRowLine.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/gherkin-dialects.java.ftl b/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/gherkin-dialects.java.ftl index 33c2f57e1..becaee00c 100644 --- a/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/gherkin-dialects.java.ftl +++ b/java/src/codegen/resources/io/cucumber/gherkin/dialects/templates/gherkin-dialects.java.ftl @@ -19,7 +19,7 @@ public final class GherkinDialects { private static final Map DIALECTS; private GherkinDialects() { - // Utility class + /* no-op */ } public static Set getLanguages() { diff --git a/java/src/main/java/io/cucumber/gherkin/Constants.java b/java/src/main/java/io/cucumber/gherkin/Constants.java index 8152b3a91..909ecce01 100644 --- a/java/src/main/java/io/cucumber/gherkin/Constants.java +++ b/java/src/main/java/io/cucumber/gherkin/Constants.java @@ -3,7 +3,7 @@ final class Constants { private Constants(){ - // utility class + /* no-op */ } static final char TAG_PREFIX_CHAR = '@'; diff --git a/java/src/main/java/io/cucumber/gherkin/EncodingParser.java b/java/src/main/java/io/cucumber/gherkin/EncodingParser.java index cb2f6c993..1d2ae3813 100644 --- a/java/src/main/java/io/cucumber/gherkin/EncodingParser.java +++ b/java/src/main/java/io/cucumber/gherkin/EncodingParser.java @@ -20,7 +20,7 @@ final class EncodingParser { CASE_INSENSITIVE); private EncodingParser(){ - // utility class + /* no-op */ } static String readWithEncodingFromSource(byte[] source) { diff --git a/java/src/main/java/io/cucumber/gherkin/Locations.java b/java/src/main/java/io/cucumber/gherkin/Locations.java index c50665913..1601d993f 100644 --- a/java/src/main/java/io/cucumber/gherkin/Locations.java +++ b/java/src/main/java/io/cucumber/gherkin/Locations.java @@ -24,7 +24,7 @@ final class Locations { } private Locations(){ - // utility class + /* no-op */ } private static Integer getInteger(int i) { diff --git a/java/src/main/java/io/cucumber/gherkin/StringUtils.java b/java/src/main/java/io/cucumber/gherkin/StringUtils.java index 12801c2ab..ff8c8e4ca 100644 --- a/java/src/main/java/io/cucumber/gherkin/StringUtils.java +++ b/java/src/main/java/io/cucumber/gherkin/StringUtils.java @@ -4,7 +4,7 @@ final class StringUtils { private StringUtils(){ - // utility class + /* no-op */ } /** diff --git a/java/src/main/java/io/cucumber/gherkin/TableRowLine.java b/java/src/main/java/io/cucumber/gherkin/TableRowLine.java index 956aa198b..abc26530e 100644 --- a/java/src/main/java/io/cucumber/gherkin/TableRowLine.java +++ b/java/src/main/java/io/cucumber/gherkin/TableRowLine.java @@ -10,7 +10,7 @@ final class TableRowLine { private TableRowLine(){ - // utility class + /* no-op */ } static List parse(int indent, String text) {