diff --git a/CHANGELOG.md b/CHANGELOG.md index 95243b92..007ea3f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Single line breaks in descriptions are rendered less surprisingly ([#227](https://github.com/cucumber/react-components/pull/227)) +### Fixed +- Omit filtered-out pickles from counts, filters ([#273](https://github.com/cucumber/react-components/pull/273)) + ## [20.1.0] - 2022-05-27 ### Changed - Allow showing detail of every example, simplify examples table ([#159](https://github.com/cucumber/react-components/pull/159)) diff --git a/src/EnvelopesQueryContext.ts b/src/EnvelopesQueryContext.ts index 06bb6c32..f8972e13 100644 --- a/src/EnvelopesQueryContext.ts +++ b/src/EnvelopesQueryContext.ts @@ -27,6 +27,11 @@ export class EnvelopesQuery { public getTestRunFinished(): messages.TestRunFinished | undefined { return this.find((envelope) => !!envelope.testRunFinished)?.testRunFinished } + + // TODO add to cucumber query + public hasTestCase(pickleId: string): boolean { + return !!this.find((envelope) => envelope.testCase?.pickleId === pickleId) + } } export default React.createContext(new EnvelopesQuery()) diff --git a/src/components/app/FilteredResults.tsx b/src/components/app/FilteredResults.tsx index 88e07a8c..f0388bd0 100644 --- a/src/components/app/FilteredResults.tsx +++ b/src/components/app/FilteredResults.tsx @@ -23,7 +23,7 @@ export const FilteredResults: React.FunctionComponent = ({ className }) const allDocuments = gherkinQuery.getGherkinDocuments() const { scenarioCountByStatus, statusesWithScenarios, totalScenarioCount } = - countScenariosByStatuses(gherkinQuery, cucumberQuery) + countScenariosByStatuses(gherkinQuery, cucumberQuery, envelopesQuery) const search = new Search(gherkinQuery) for (const gherkinDocument of allDocuments) { diff --git a/src/countScenariosByStatuses.spec.ts b/src/countScenariosByStatuses.spec.ts index 044eb7cd..f68b7120 100644 --- a/src/countScenariosByStatuses.spec.ts +++ b/src/countScenariosByStatuses.spec.ts @@ -1,17 +1,21 @@ import { SupportCode } from '@cucumber/fake-cucumber' import { Query as GherkinQuery } from '@cucumber/gherkin-utils' import * as messages from '@cucumber/messages' -import { SourceReference, TestStepResultStatus } from '@cucumber/messages' +import { Envelope, SourceReference, TestStepResultStatus } from '@cucumber/messages' import { Query as CucumberQuery } from '@cucumber/query' +import fs from 'fs' +import path from 'path' import { runFeature } from '../test-utils' import countScenariosByStatuses from './countScenariosByStatuses' +import { EnvelopesQuery } from './EnvelopesQueryContext' const sourceReference: SourceReference = {} describe('countScenariosByStatuses', () => { let gherkinQuery: GherkinQuery let cucumberQuery: CucumberQuery + let envelopesQuery: EnvelopesQuery let supportCode: SupportCode jest.setTimeout(3000) @@ -19,6 +23,7 @@ describe('countScenariosByStatuses', () => { beforeEach(() => { gherkinQuery = new GherkinQuery() cucumberQuery = new CucumberQuery() + envelopesQuery = new EnvelopesQuery() supportCode = new SupportCode() supportCode.defineStepDefinition(sourceReference, 'a passed step', () => null) supportCode.defineStepDefinition(sourceReference, 'a failed step', () => { @@ -45,10 +50,11 @@ Feature: statuses const envelopes = await runFeature(feature, gherkinQuery, supportCode) for (const envelope of envelopes) { cucumberQuery.update(envelope) + envelopesQuery.update(envelope) } const { scenarioCountByStatus, statusesWithScenarios, totalScenarioCount } = - countScenariosByStatuses(gherkinQuery, cucumberQuery) + countScenariosByStatuses(gherkinQuery, cucumberQuery, envelopesQuery) expect(scenarioCountByStatus[messages.TestStepResultStatus.PASSED]).toEqual(2) expect(scenarioCountByStatus[messages.TestStepResultStatus.FAILED]).toEqual(1) @@ -79,10 +85,11 @@ Feature: statuses const envelopes = await runFeature(feature, gherkinQuery, supportCode) for (const envelope of envelopes) { cucumberQuery.update(envelope) + envelopesQuery.update(envelope) } const { scenarioCountByStatus, statusesWithScenarios, totalScenarioCount } = - countScenariosByStatuses(gherkinQuery, cucumberQuery) + countScenariosByStatuses(gherkinQuery, cucumberQuery, envelopesQuery) expect(scenarioCountByStatus[messages.TestStepResultStatus.PASSED]).toEqual(1) expect(scenarioCountByStatus[messages.TestStepResultStatus.FAILED]).toEqual(1) @@ -94,4 +101,29 @@ Feature: statuses ]) expect(totalScenarioCount).toEqual(3) }) + + it('only includes pickles that were slated for execution as test cases', () => { + const raw = fs.readFileSync( + path.join(__dirname, '../test-utils/messages/filtered-pickles.ndjson'), + { + encoding: 'utf-8', + } + ) + const envelopes: Envelope[] = JSON.parse('[' + raw.trim().split('\n').join(',') + ']') + const gherkinQuery = new GherkinQuery() + const cucumberQuery = new CucumberQuery() + envelopes.forEach((envelope) => { + gherkinQuery.update(envelope) + cucumberQuery.update(envelope) + envelopesQuery.update(envelope) + }) + + const { totalScenarioCount } = countScenariosByStatuses( + gherkinQuery, + cucumberQuery, + envelopesQuery + ) + + expect(totalScenarioCount).toEqual(1) + }) }) diff --git a/src/countScenariosByStatuses.ts b/src/countScenariosByStatuses.ts index c99d6108..c964cb3e 100644 --- a/src/countScenariosByStatuses.ts +++ b/src/countScenariosByStatuses.ts @@ -2,6 +2,8 @@ import { GherkinDocumentWalker, Query as GherkinQuery } from '@cucumber/gherkin- import { getWorstTestStepResult, TestStepResultStatus } from '@cucumber/messages' import { Query as CucumberQuery } from '@cucumber/query' +import { EnvelopesQuery } from './EnvelopesQueryContext' + export function makeEmptyScenarioCountsByStatus(): Record { return { [TestStepResultStatus.UNKNOWN]: 0, @@ -16,7 +18,8 @@ export function makeEmptyScenarioCountsByStatus(): Record statusesWithScenarios: readonly TestStepResultStatus[] @@ -33,11 +36,13 @@ export default function countScenariosByStatuses( const pickleIds = gherkinQuery.getPickleIds(gherkinDocument.uri, scenario.id) pickleIds.forEach((pickleId) => { - const status = getWorstTestStepResult( - cucumberQuery.getPickleTestStepResults([pickleId]) - ).status - - scenarioCountByStatus[status] = scenarioCountByStatus[status] + 1 + // if no test case then this pickle was omitted by filtering e.g. tags + if (envelopesQuery.hasTestCase(pickleId)) { + const status = getWorstTestStepResult( + cucumberQuery.getPickleTestStepResults([pickleId]) + ).status + scenarioCountByStatus[status] = scenarioCountByStatus[status] + 1 + } }) }, } diff --git a/test-utils/messages/filtered-pickles.ndjson b/test-utils/messages/filtered-pickles.ndjson new file mode 100644 index 00000000..5adf8637 --- /dev/null +++ b/test-utils/messages/filtered-pickles.ndjson @@ -0,0 +1,40 @@ +{"meta":{"protocolVersion":"19.1.2","implementation":{"version":"8.5.1","name":"cucumber-js"},"cpu":{"name":"x64"},"os":{"name":"darwin","version":"21.5.0"},"runtime":{"name":"node.js","version":"16.13.2"}}} +{"source":{"data":"Feature: Adding todos\n\n Scenario: Several todos can be added and are shown in order added\n Given an empty todo list\n When I add the todo \"buy some cheese\"\n Then the todos are:\n | buy some cheese |\n When I add the todo \"buy some milk\"\n Then the todos are:\n | buy some cheese |\n | buy some milk |\n\n Scenario: Input is cleared and focused after adding a todo\n Given an empty todo list\n When I add the todo \"buy some cheese\"\n Then the todo input is empty\n And my cursor is ready to create a todo\n\n Scenario: Extra space is trimmed from entered todos\n Given an empty todo list\n When I add the todo \" buy some cheese \"\n Then the todos are:\n | buy some cheese |\n","uri":"features/adding.feature","mediaType":"text/x.cucumber.gherkin+plain"}} +{"gherkinDocument":{"feature":{"tags":[],"location":{"line":1,"column":1},"language":"en","keyword":"Feature","name":"Adding todos","description":"","children":[{"scenario":{"id":"83ee4125-592b-410e-8b57-008e09cb7d9c","tags":[],"location":{"line":3,"column":3},"keyword":"Scenario","name":"Several todos can be added and are shown in order added","description":"","steps":[{"id":"be7ca07e-040d-4946-b37b-b63f49f7ec11","location":{"line":4,"column":5},"keyword":"Given ","keywordType":"Context","text":"an empty todo list"},{"id":"6d46fa1a-d2a9-4149-8e0b-fd9100b6066f","location":{"line":5,"column":5},"keyword":"When ","keywordType":"Action","text":"I add the todo \"buy some cheese\""},{"id":"25e1abd1-af14-48b2-bba4-6b999719b585","location":{"line":6,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"the todos are:","dataTable":{"location":{"line":7,"column":7},"rows":[{"id":"9f21abb8-7f84-4679-931c-4f4009669563","location":{"line":7,"column":7},"cells":[{"location":{"line":7,"column":9},"value":"buy some cheese"}]}]}},{"id":"6da9ce72-60f7-4165-9e86-4985aac945ad","location":{"line":8,"column":5},"keyword":"When ","keywordType":"Action","text":"I add the todo \"buy some milk\""},{"id":"67a7a76f-5ba8-4406-ba30-2a9c92840e82","location":{"line":9,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"the todos are:","dataTable":{"location":{"line":10,"column":7},"rows":[{"id":"72fac04b-eccf-494a-bb34-178ca7dcb635","location":{"line":10,"column":7},"cells":[{"location":{"line":10,"column":9},"value":"buy some cheese"}]},{"id":"98177bde-bca0-4038-8e9e-9361ebdde2d3","location":{"line":11,"column":7},"cells":[{"location":{"line":11,"column":9},"value":"buy some milk"}]}]}}],"examples":[]}},{"scenario":{"id":"fe6f822c-8efc-4523-b60a-853b123cb8a7","tags":[],"location":{"line":13,"column":3},"keyword":"Scenario","name":"Input is cleared and focused after adding a todo","description":"","steps":[{"id":"7a7f028d-28ec-4383-9285-b0e590b15ad8","location":{"line":14,"column":5},"keyword":"Given ","keywordType":"Context","text":"an empty todo list"},{"id":"99021f84-4628-4227-8106-f90079d3dfa3","location":{"line":15,"column":5},"keyword":"When ","keywordType":"Action","text":"I add the todo \"buy some cheese\""},{"id":"5e336ce5-efdd-4fef-9a58-05ca5a190cae","location":{"line":16,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"the todo input is empty"},{"id":"794af2e7-cbfe-4854-94cf-a76802638065","location":{"line":17,"column":5},"keyword":"And ","keywordType":"Conjunction","text":"my cursor is ready to create a todo"}],"examples":[]}},{"scenario":{"id":"41410b56-f316-4691-b977-c3995397b5f3","tags":[],"location":{"line":19,"column":3},"keyword":"Scenario","name":"Extra space is trimmed from entered todos","description":"","steps":[{"id":"a2f61293-a79a-4b19-884d-44fc04bb2a8e","location":{"line":20,"column":5},"keyword":"Given ","keywordType":"Context","text":"an empty todo list"},{"id":"6a934f9c-6541-4d8c-a2f1-ff45e9060ec3","location":{"line":21,"column":5},"keyword":"When ","keywordType":"Action","text":"I add the todo \" buy some cheese \""},{"id":"edac3756-1766-4fb2-bf0f-4d56cc5e6e34","location":{"line":22,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"the todos are:","dataTable":{"location":{"line":23,"column":7},"rows":[{"id":"fbe0e807-d3d6-4307-b252-019c22715907","location":{"line":23,"column":7},"cells":[{"location":{"line":23,"column":9},"value":"buy some cheese"}]}]}}],"examples":[]}}]},"comments":[],"uri":"features/adding.feature"}} +{"pickle":{"id":"62bbb17b-1299-433c-94fb-78f18d86257d","uri":"features/adding.feature","astNodeIds":["83ee4125-592b-410e-8b57-008e09cb7d9c"],"tags":[],"name":"Several todos can be added and are shown in order added","language":"en","steps":[{"id":"bae3fafc-c480-4b57-aae4-dbfb887186fa","text":"an empty todo list","type":"Context","astNodeIds":["be7ca07e-040d-4946-b37b-b63f49f7ec11"]},{"id":"cdfb38da-c02f-4c27-95ce-d28c69558d6c","text":"I add the todo \"buy some cheese\"","type":"Action","astNodeIds":["6d46fa1a-d2a9-4149-8e0b-fd9100b6066f"]},{"id":"84426a0c-8d0d-44e8-b59b-b73260f4673d","text":"the todos are:","type":"Outcome","argument":{"dataTable":{"rows":[{"cells":[{"value":"buy some cheese"}]}]}},"astNodeIds":["25e1abd1-af14-48b2-bba4-6b999719b585"]},{"id":"b0b4db8a-9016-4a73-957a-cf271a010851","text":"I add the todo \"buy some milk\"","type":"Action","astNodeIds":["6da9ce72-60f7-4165-9e86-4985aac945ad"]},{"id":"dbb75209-224d-437d-ace3-6c3af6bbd927","text":"the todos are:","type":"Outcome","argument":{"dataTable":{"rows":[{"cells":[{"value":"buy some cheese"}]},{"cells":[{"value":"buy some milk"}]}]}},"astNodeIds":["67a7a76f-5ba8-4406-ba30-2a9c92840e82"]}]}} +{"pickle":{"id":"0a6f0ca3-4827-4091-9041-53269691723a","uri":"features/adding.feature","astNodeIds":["fe6f822c-8efc-4523-b60a-853b123cb8a7"],"tags":[],"name":"Input is cleared and focused after adding a todo","language":"en","steps":[{"id":"f60c73dd-6e6b-461c-8587-6531f0820ea8","text":"an empty todo list","type":"Context","astNodeIds":["7a7f028d-28ec-4383-9285-b0e590b15ad8"]},{"id":"813733ad-cf6e-48c6-9fd6-2e43364d0f37","text":"I add the todo \"buy some cheese\"","type":"Action","astNodeIds":["99021f84-4628-4227-8106-f90079d3dfa3"]},{"id":"5f891368-66f2-4af0-88e8-137d32adf4f2","text":"the todo input is empty","type":"Outcome","astNodeIds":["5e336ce5-efdd-4fef-9a58-05ca5a190cae"]},{"id":"e778746a-c374-4c00-8017-f6b36b802f64","text":"my cursor is ready to create a todo","type":"Outcome","astNodeIds":["794af2e7-cbfe-4854-94cf-a76802638065"]}]}} +{"pickle":{"id":"6618b778-834c-4137-bc4b-4c5cc7930b6b","uri":"features/adding.feature","astNodeIds":["41410b56-f316-4691-b977-c3995397b5f3"],"tags":[],"name":"Extra space is trimmed from entered todos","language":"en","steps":[{"id":"fe08c12e-f035-4304-9ad0-5e93a977ec2d","text":"an empty todo list","type":"Context","astNodeIds":["a2f61293-a79a-4b19-884d-44fc04bb2a8e"]},{"id":"ed9ca4fd-f5fc-439a-8913-236e75cd2564","text":"I add the todo \" buy some cheese \"","type":"Action","astNodeIds":["6a934f9c-6541-4d8c-a2f1-ff45e9060ec3"]},{"id":"8018b4cf-78e5-46d7-b467-659a8c27d06a","text":"the todos are:","type":"Outcome","argument":{"dataTable":{"rows":[{"cells":[{"value":"buy some cheese"}]}]}},"astNodeIds":["edac3756-1766-4fb2-bf0f-4d56cc5e6e34"]}]}} +{"source":{"data":"Feature: Editing todos\n\n Background:\n Given a todo list with items:\n | buy some cheese |\n | buy some milk |\n\n Scenario: Editing the text of an existing todo\n When I edit the todo \"buy some milk\" to \"buy some sausages\"\n Then the todos are:\n | buy some cheese |\n | buy some sausages |\n\n Scenario: Editing the text to an empty string removes the todo\n When I edit the todo \"buy some milk\" to \"\"\n Then the todos are:\n | buy some cheese |\n","uri":"features/editing.feature","mediaType":"text/x.cucumber.gherkin+plain"}} +{"gherkinDocument":{"feature":{"tags":[],"location":{"line":1,"column":1},"language":"en","keyword":"Feature","name":"Editing todos","description":"","children":[{"background":{"id":"0d4f5e85-2934-47f8-8830-721ea2e78f02","location":{"line":3,"column":3},"keyword":"Background","name":"","description":"","steps":[{"id":"8bf339e3-40de-412c-b95f-f794563b500f","location":{"line":4,"column":5},"keyword":"Given ","keywordType":"Context","text":"a todo list with items:","dataTable":{"location":{"line":5,"column":7},"rows":[{"id":"97741f96-cdb8-4a53-b858-440214983de4","location":{"line":5,"column":7},"cells":[{"location":{"line":5,"column":9},"value":"buy some cheese"}]},{"id":"8b6fc675-45da-4118-97c9-4360c0afc105","location":{"line":6,"column":7},"cells":[{"location":{"line":6,"column":9},"value":"buy some milk"}]}]}}]}},{"scenario":{"id":"52088127-813e-46c2-9bf1-d7c8412921e8","tags":[],"location":{"line":8,"column":3},"keyword":"Scenario","name":"Editing the text of an existing todo","description":"","steps":[{"id":"76e7926a-6438-4a7b-8aef-772723f22f22","location":{"line":9,"column":5},"keyword":"When ","keywordType":"Action","text":"I edit the todo \"buy some milk\" to \"buy some sausages\""},{"id":"62333791-c961-4b8d-af5d-475d7795315a","location":{"line":10,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"the todos are:","dataTable":{"location":{"line":11,"column":7},"rows":[{"id":"cfec4c2f-d303-4edd-a386-9d23d9824370","location":{"line":11,"column":7},"cells":[{"location":{"line":11,"column":9},"value":"buy some cheese"}]},{"id":"d37d0050-05e9-4a29-a7c2-5dc1c723703b","location":{"line":12,"column":7},"cells":[{"location":{"line":12,"column":9},"value":"buy some sausages"}]}]}}],"examples":[]}},{"scenario":{"id":"f3a20814-c4f5-4df0-87d2-b769f3496386","tags":[],"location":{"line":14,"column":3},"keyword":"Scenario","name":"Editing the text to an empty string removes the todo","description":"","steps":[{"id":"94e5bc6d-5b94-4f09-bc4a-45c8c11481ae","location":{"line":15,"column":5},"keyword":"When ","keywordType":"Action","text":"I edit the todo \"buy some milk\" to \"\""},{"id":"32356eef-70e2-4076-8623-244e5a68f389","location":{"line":16,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"the todos are:","dataTable":{"location":{"line":17,"column":7},"rows":[{"id":"7eb097b5-fa31-480d-932f-f81c03bd8520","location":{"line":17,"column":7},"cells":[{"location":{"line":17,"column":9},"value":"buy some cheese"}]}]}}],"examples":[]}}]},"comments":[],"uri":"features/editing.feature"}} +{"pickle":{"id":"e890f7cc-6703-44cf-859d-fde22c6112ec","uri":"features/editing.feature","astNodeIds":["52088127-813e-46c2-9bf1-d7c8412921e8"],"tags":[],"name":"Editing the text of an existing todo","language":"en","steps":[{"id":"989657ef-b010-49bc-8eed-aca1703f2b85","text":"a todo list with items:","type":"Context","argument":{"dataTable":{"rows":[{"cells":[{"value":"buy some cheese"}]},{"cells":[{"value":"buy some milk"}]}]}},"astNodeIds":["8bf339e3-40de-412c-b95f-f794563b500f"]},{"id":"00fc025e-e14d-4348-b2d1-1aff614cd464","text":"I edit the todo \"buy some milk\" to \"buy some sausages\"","type":"Action","astNodeIds":["76e7926a-6438-4a7b-8aef-772723f22f22"]},{"id":"35eb91f4-5f3d-4a6c-a386-57365689c634","text":"the todos are:","type":"Outcome","argument":{"dataTable":{"rows":[{"cells":[{"value":"buy some cheese"}]},{"cells":[{"value":"buy some sausages"}]}]}},"astNodeIds":["62333791-c961-4b8d-af5d-475d7795315a"]}]}} +{"pickle":{"id":"187cdea3-b204-46ee-8743-33b4f79d0d42","uri":"features/editing.feature","astNodeIds":["f3a20814-c4f5-4df0-87d2-b769f3496386"],"tags":[],"name":"Editing the text to an empty string removes the todo","language":"en","steps":[{"id":"ac624e1c-9922-487a-b9f0-cf6989f324ce","text":"a todo list with items:","type":"Context","argument":{"dataTable":{"rows":[{"cells":[{"value":"buy some cheese"}]},{"cells":[{"value":"buy some milk"}]}]}},"astNodeIds":["8bf339e3-40de-412c-b95f-f794563b500f"]},{"id":"31195fc7-eaa8-4daa-8077-409f71acb4ef","text":"I edit the todo \"buy some milk\" to \"\"","type":"Action","astNodeIds":["94e5bc6d-5b94-4f09-bc4a-45c8c11481ae"]},{"id":"f284fbf5-10f0-4498-b5f3-eba1e8767bb6","text":"the todos are:","type":"Outcome","argument":{"dataTable":{"rows":[{"cells":[{"value":"buy some cheese"}]}]}},"astNodeIds":["32356eef-70e2-4076-8623-244e5a68f389"]}]}} +{"source":{"data":"Feature: Empty\n\n Scenario: simpler ui\n Given an empty todo list\n Then no todos are listed\n And unnecessary controls are hidden\n\n Scenario: autofocus\n Given an empty todo list\n Then my cursor is ready to create a todo\n","uri":"features/empty.feature","mediaType":"text/x.cucumber.gherkin+plain"}} +{"gherkinDocument":{"feature":{"tags":[],"location":{"line":1,"column":1},"language":"en","keyword":"Feature","name":"Empty","description":"","children":[{"scenario":{"id":"f801455a-e0b6-4507-9556-ba26ee3d139e","tags":[],"location":{"line":3,"column":3},"keyword":"Scenario","name":"simpler ui","description":"","steps":[{"id":"0cdd7435-950c-47db-9396-130ac0f575f1","location":{"line":4,"column":5},"keyword":"Given ","keywordType":"Context","text":"an empty todo list"},{"id":"fa78d9f8-2095-4795-a1d4-e3ac8ec6fabb","location":{"line":5,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"no todos are listed"},{"id":"5bbfd931-6ca1-4306-b92d-6c2e78d53d92","location":{"line":6,"column":5},"keyword":"And ","keywordType":"Conjunction","text":"unnecessary controls are hidden"}],"examples":[]}},{"scenario":{"id":"b65859e4-8c51-4c6c-867c-c51d222168dd","tags":[],"location":{"line":8,"column":3},"keyword":"Scenario","name":"autofocus","description":"","steps":[{"id":"75597487-c293-42fe-b4bf-a75d30844b95","location":{"line":9,"column":5},"keyword":"Given ","keywordType":"Context","text":"an empty todo list"},{"id":"bc903d85-aea4-4b9d-b9bb-1d1bc8cecce9","location":{"line":10,"column":5},"keyword":"Then ","keywordType":"Outcome","text":"my cursor is ready to create a todo"}],"examples":[]}}]},"comments":[],"uri":"features/empty.feature"}} +{"pickle":{"id":"10842a15-dbc4-4923-914b-1f99d2e6cdc6","uri":"features/empty.feature","astNodeIds":["f801455a-e0b6-4507-9556-ba26ee3d139e"],"tags":[],"name":"simpler ui","language":"en","steps":[{"id":"5ccceb83-2cd7-43c6-915f-8bdb772b6f5f","text":"an empty todo list","type":"Context","astNodeIds":["0cdd7435-950c-47db-9396-130ac0f575f1"]},{"id":"ca3c4b50-00ed-4dd1-8889-4e58668049c8","text":"no todos are listed","type":"Outcome","astNodeIds":["fa78d9f8-2095-4795-a1d4-e3ac8ec6fabb"]},{"id":"3e01cb4f-de41-4c08-ba55-c61822e55d99","text":"unnecessary controls are hidden","type":"Outcome","astNodeIds":["5bbfd931-6ca1-4306-b92d-6c2e78d53d92"]}]}} +{"pickle":{"id":"8f78d578-09e0-41ce-b492-454785af00bb","uri":"features/empty.feature","astNodeIds":["b65859e4-8c51-4c6c-867c-c51d222168dd"],"tags":[],"name":"autofocus","language":"en","steps":[{"id":"ca60ec78-c8dc-4728-b8f5-78882af1cb9a","text":"an empty todo list","type":"Context","astNodeIds":["75597487-c293-42fe-b4bf-a75d30844b95"]},{"id":"4163a554-b9dd-4bf4-9579-3f9e3d91da3b","text":"my cursor is ready to create a todo","type":"Outcome","astNodeIds":["bc903d85-aea4-4b9d-b9bb-1d1bc8cecce9"]}]}} +{"stepDefinition":{"id":"207cc9a7-9475-4478-b243-1a42c80b718b","pattern":{"source":"an empty todo list","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":6}}}} +{"stepDefinition":{"id":"0c1ec8b4-6ca0-42b2-9970-1b8242076811","pattern":{"source":"a todo list with items:","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":9}}}} +{"stepDefinition":{"id":"08c09fcf-f226-4fe3-af3b-516d30f725f8","pattern":{"source":"I add the todo {string}","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":16}}}} +{"stepDefinition":{"id":"e8396a9b-9389-4f61-8130-feeb2b5b71d8","pattern":{"source":"no todos are listed","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":20}}}} +{"stepDefinition":{"id":"e70a3c21-4def-43cb-a781-5cb438371830","pattern":{"source":"unnecessary controls are hidden","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":25}}}} +{"stepDefinition":{"id":"5015714f-238a-4bb0-85ad-593957b0f126","pattern":{"source":"the todos are:","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":30}}}} +{"stepDefinition":{"id":"31118cf7-2792-467f-81e8-9bf5e4769088","pattern":{"source":"the todo input is empty","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":35}}}} +{"stepDefinition":{"id":"7eba5fb9-192f-4e15-9d16-74858ffb45bf","pattern":{"source":"my cursor is ready to create a todo","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":40}}}} +{"stepDefinition":{"id":"630ca29e-138c-4ca4-b057-6c0319bf9959","pattern":{"source":"I edit the todo {string} to {string}","type":"CUCUMBER_EXPRESSION"},"sourceReference":{"uri":"support/steps/steps.ts","location":{"line":45}}}} +{"hook":{"id":"c7f27e4e-d33a-47c6-a72a-75a165536dad","sourceReference":{"uri":"support/hooks.ts","location":{"line":4}}}} +{"hook":{"id":"2fda5250-a2eb-4218-9a68-5f6498c749fd","sourceReference":{"uri":"support/hooks.ts","location":{"line":7}}}} +{"testRunStarted":{"timestamp":{"seconds":1661324802,"nanos":52000000}}} +{"testCase":{"pickleId":"6618b778-834c-4137-bc4b-4c5cc7930b6b","id":"dbd7d9ac-a23c-42f9-bf9f-ed9a45c550d6","testSteps":[{"id":"41669714-83b5-4e96-b87f-d5f85a14375a","hookId":"c7f27e4e-d33a-47c6-a72a-75a165536dad"},{"id":"ba40a9d6-1c23-42a0-9083-f05a68d0180d","pickleStepId":"fe08c12e-f035-4304-9ad0-5e93a977ec2d","stepDefinitionIds":["207cc9a7-9475-4478-b243-1a42c80b718b"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"bdb616b8-1c6c-4dd5-acb8-e3504ceb142a","pickleStepId":"ed9ca4fd-f5fc-439a-8913-236e75cd2564","stepDefinitionIds":["08c09fcf-f226-4fe3-af3b-516d30f725f8"],"stepMatchArgumentsLists":[{"stepMatchArguments":[{"group":{"start":15,"value":"\" buy some cheese \"","children":[{"start":16,"value":" buy some cheese ","children":[{"children":[]}]},{"children":[{"children":[]}]}]},"parameterTypeName":"string"}]}]},{"id":"6bfdcda1-301a-4296-9f73-bce2f59f319d","pickleStepId":"8018b4cf-78e5-46d7-b467-659a8c27d06a","stepDefinitionIds":["5015714f-238a-4bb0-85ad-593957b0f126"],"stepMatchArgumentsLists":[{"stepMatchArguments":[]}]},{"id":"6152424b-7b80-41a0-8b12-b63c880d3788","hookId":"2fda5250-a2eb-4218-9a68-5f6498c749fd"}]}} +{"testCaseStarted":{"attempt":0,"testCaseId":"dbd7d9ac-a23c-42f9-bf9f-ed9a45c550d6","id":"944a3af0-317d-452f-9c8d-38e988b18105","timestamp":{"seconds":1661324802,"nanos":63000000}}} +{"testStepStarted":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"41669714-83b5-4e96-b87f-d5f85a14375a","timestamp":{"seconds":1661324802,"nanos":63000000}}} +{"testStepFinished":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"41669714-83b5-4e96-b87f-d5f85a14375a","testStepResult":{"duration":{"seconds":2,"nanos":494892120},"status":"PASSED"},"timestamp":{"seconds":1661324804,"nanos":559000000}}} +{"testStepStarted":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"ba40a9d6-1c23-42a0-9083-f05a68d0180d","timestamp":{"seconds":1661324804,"nanos":559000000}}} +{"testStepFinished":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"ba40a9d6-1c23-42a0-9083-f05a68d0180d","testStepResult":{"duration":{"seconds":0,"nanos":683842391},"status":"PASSED"},"timestamp":{"seconds":1661324805,"nanos":244000000}}} +{"testStepStarted":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"bdb616b8-1c6c-4dd5-acb8-e3504ceb142a","timestamp":{"seconds":1661324805,"nanos":244000000}}} +{"testStepFinished":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"bdb616b8-1c6c-4dd5-acb8-e3504ceb142a","testStepResult":{"duration":{"seconds":0,"nanos":352047682},"status":"PASSED"},"timestamp":{"seconds":1661324805,"nanos":596000000}}} +{"testStepStarted":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"6bfdcda1-301a-4296-9f73-bce2f59f319d","timestamp":{"seconds":1661324805,"nanos":597000000}}} +{"testStepFinished":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"6bfdcda1-301a-4296-9f73-bce2f59f319d","testStepResult":{"duration":{"seconds":0,"nanos":10285611},"status":"PASSED"},"timestamp":{"seconds":1661324805,"nanos":607000000}}} +{"testStepStarted":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"6152424b-7b80-41a0-8b12-b63c880d3788","timestamp":{"seconds":1661324805,"nanos":607000000}}} +{"testStepFinished":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","testStepId":"6152424b-7b80-41a0-8b12-b63c880d3788","testStepResult":{"duration":{"seconds":0,"nanos":62011596},"status":"PASSED"},"timestamp":{"seconds":1661324805,"nanos":670000000}}} +{"testCaseFinished":{"testCaseStartedId":"944a3af0-317d-452f-9c8d-38e988b18105","timestamp":{"seconds":1661324805,"nanos":670000000},"willBeRetried":false}} +{"testRunFinished":{"timestamp":{"seconds":1661324805,"nanos":670000000},"success":true}}