diff --git a/.gitignore b/.gitignore index b7f412460..ea2bf8070 100644 --- a/.gitignore +++ b/.gitignore @@ -63,7 +63,7 @@ reports/ merged/ test/ Documentation-*/ -Output/ +#Output/ #nCrunch files *.crunchproject.local.xml diff --git a/CHANGELOG.md b/CHANGELOG.md index df7e609d6..c5f72b0f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,19 +14,63 @@ Features in Experimental are subject to change and removal without being conside This document is formatted according to the principles of [Keep A CHANGELOG](http://keepachangelog.com). -## Unreleased +## [2.21.0] - 2020-07-14 ### Added +- First Draft of the MarkDown output format. Expect some rough edges here. ([237](https://github.com/picklesdoc/pickles/issues/237)) (by [@darrencomeau](https://github.com/darrencomeau)) + +### Fixed + +- Improve performance of VS Test results file parsing ([586](https://github.com/picklesdoc/pickles/pull/586)) (by [@tlecomte](https://github.com/tlecomte)) +- Fix matching of scenario outline with duplicate values with VsTest ([542](https://github.com/picklesdoc/pickles/pull/542)) (by [@rik-smeets](https://github.com/rik-smeets) and [@jvandertil](https://github.com/jvandertil)) + +## [2.20.1] - 2018-10-17 + +### Fixed + +- Javascript error in dhtml doc ([553](https://github.com/picklesdoc/pickles/issues/553)) (by [@dirkrombauts](https://github.com/dirkrombauts)) + +## [2.20.0] - 2018-10-09 + +### Added + +- Pickles GUI: Generate equivalent PowerShell or Windows Console command line ([90](https://github.com/picklesdoc/pickles/issues/90)) (by [@magicmonty](https://github.com/magicmonty)) + +### Fixed + +- Inconclusive marker shown when generating doc without test results ([545](https://github.com/picklesdoc/pickles/issues/545)) (by [@dirkrombauts](https://github.com/dirkrombauts)) +- Remove requirement for hardcoded 'Index.html' in featureSearch.js ([541](https://github.com/picklesdoc/pickles/pull/541)) (by [@szaliszali](https://github.com/szaliszali)) +- Exception in XUnit2ScenarioOutlineExampleMatcher ([548](https://github.com/picklesdoc/pickles/issues/548)) (by [@magicmonty](https://github.com/magicmonty)) + +## [2.19.0] - 2018-07-20 + +### Added + +- Hide Tags from Living Documentation ([516](https://github.com/picklesdoc/pickles/pull/516)) (by [@spacehole1](https://github.com/spacehole1)) +- Exclude Feature Files that have no included scenarios ([453](https://github.com/picklesdoc/pickles/issues/453)) (by [@janosmagyar](https://github.com/janosmagyar)) + +### Fixed + +- Scenario Outline special characters workaround ([509](https://github.com/picklesdoc/pickles/pull/509)) (by [@DominikBaran](https://github.com/DominikBaran)) +- Fix example matching for VSTest ([528](https://github.com/picklesdoc/pickles/pull/528)) (by [@jvandertil](https://github.com/jvandertil)) + +## [2.18.2] - 2018-04-28 + ### Changed -### Deprecated +- Updated several external libraries -### Removed +### Fixed + +- Problem with Chocolatey Deployment + +## [2.18.1] - 2018-04-20 ### Fixed -### Security +- More robust scenario outline example mapping by using code from SpecFlow ([519](https://github.com/picklesdoc/pickles/pull/519)) (by [@dirkrombauts](https://github.com/dirkrombauts), based on an idea by [@janosmagyar](https://github.com/janosmagyar)) +- Only the table of the examples in a scenario outline should have test results ([515](https://github.com/picklesdoc/pickles/pull/515)) (by [@spacehole1](https://github.com/spacehole1)) ## [2.20.1] - 2018-10-17 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0f8085734..32f389b30 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -8,11 +8,11 @@ Pickles is a volunteer effort. We encourage you to pitch in! - Fork the `Pickles` repository - Create your code -- Send a pull request. +- Send a pull request -### To Contribute to the Test Results Providers +### To Contribute to the Test Result Providers -If you find a bug in a Test Result Provider and want to contribute towards fixing it, start of by adding a scenario or feature file that shows off the bug to the test harness solution in the `test-harness` directory.. Add the scenario to the projects of each test result provider: it is quite likely that the same bug will occur across several test result providers. Don't forget the Cucumber and CucumberJS providers: it's easy to overlook them because they are not in the visual studio solution. +If you find a bug in a test result provider and want to contribute towards fixing it, start of by adding a scenario or feature file that shows off the bug to the test harness solution in the `test-harness` directory. Add the scenario to the projects of each test result provider: it is quite likely that the same bug will occur across several test result providers. Don't forget the Cucumber and CucumberJS providers: it's easy to overlook them because they are not in the visual studio solution. Implement the automation layer in .NET, Ruby and JS if you are able. If you create your scenarios so that they use only steps from the other feature files, then you will most likely not need this step. @@ -26,7 +26,7 @@ Once you're done, send a pull request. #### Setting up the Test Harness -the `test-harness` directory contains the scenarios from which test results are derived to test the parsing of test results in Pickles +The `test-harness` directory contains the scenarios from which test results are derived to test the parsing of test results in Pickles. ##### .NET Code @@ -34,7 +34,7 @@ The .NET code is found in `./TestHarness/TestHarness.sln` solution. You will nee ##### Cucumber/Ruby Code -In order to generate the thest output of the Cucumber features, you need to install the following software: +In order to generate the test output of the Cucumber features, you need to install the following software: - [Ruby](http://rubyinstaller.org/downloads): use the stable 2.2.x version - Install Cucumber by opening an admin-enabled command line window in the directory where you cloned this repository, and running these gem commands: @@ -61,14 +61,14 @@ In order to generate the test output of the CucumberJS features, you need to ins ## To Request a Feature -- Create an issue. +- Create an issue ## To Ask a Question -- Create an issue. +- Create an issue ## To Report a Bug - Create an issue - Describe steps to reproduce the bug -- If at all possible, attach feature file(s) that cause the bug. In most cases you can remove the steps from the scenarios in order to protect your intellectual property. +- If at all possible, attach feature file(s) that cause the bug. In most cases you can remove the steps from the scenarios in order to protect your intellectual property diff --git a/CreateTestResults.ps1 b/CreateTestResults.ps1 index 46ef8e590..cfed67235 100644 --- a/CreateTestResults.ps1 +++ b/CreateTestResults.ps1 @@ -1,13 +1,13 @@ Write-Host "Remember to build the solution first!" # NUnit2 -Start-Process -FilePath "$PSScriptRoot\test-harness\packages\NUnit.Runners.2.6.4\tools\nunit-console.exe" -ArgumentList "$PSScriptRoot\test-harness\nunit\bin\Debug\nunitHarness.dll", "/result=$PSScriptRoot\results-example-nunit.xml" -NoNewWindow -Wait +Start-Process -FilePath "$PSScriptRoot\test-harness\packages\NUnit.Runners.2.7.0\tools\nunit-console.exe" -ArgumentList "$PSScriptRoot\test-harness\nunit\bin\Debug\nunitHarness.dll", "/result=$PSScriptRoot\results-example-nunit.xml" -NoNewWindow -Wait # NUnit 2 with NUnit3 runner -Start-Process -FilePath "$PSScriptRoot\test-harness\packages\NUnit.ConsoleRunner.3.6.0\tools\nunit3-console.exe" -ArgumentList "$PSScriptRoot\test-harness\nunit\bin\Debug\nunitHarness.dll", "/result=$PSScriptRoot\results-example-nunit2-with-nunit3-runner.xml" -NoNewWindow -Wait +Start-Process -FilePath "$PSScriptRoot\test-harness\packages\NUnit.ConsoleRunner.3.9.0\tools\nunit3-console.exe" -ArgumentList "$PSScriptRoot\test-harness\nunit\bin\Debug\nunitHarness.dll", "/result=$PSScriptRoot\results-example-nunit2-with-nunit3-runner.xml" -NoNewWindow -Wait # NUnit 3 -Start-Process -FilePath "$PSScriptRoot\test-harness\packages\NUnit.ConsoleRunner.3.6.0\tools\nunit3-console.exe" -ArgumentList "$PSScriptRoot\test-harness\nunit3\bin\Debug\nunit3Harness.dll", "/result=$PSScriptRoot\results-example-nunit3.xml" -NoNewWindow -Wait +Start-Process -FilePath "$PSScriptRoot\test-harness\packages\NUnit.ConsoleRunner.3.9.0\tools\nunit3-console.exe" -ArgumentList "$PSScriptRoot\test-harness\nunit3\bin\Debug\nunit3Harness.dll", "/result=$PSScriptRoot\results-example-nunit3.xml" -NoNewWindow -Wait # SpecRun Start-Process -FilePath "$PSScriptRoot\test-harness\packages\SpecRun.Runner.1.2.0\tools\specrun.exe" -ArgumentList "run default.srprofile", "/baseFolder:$PSScriptRoot\test-harness\SpecRun\bin\Debug", "/log:specrun.log", "/report:$PSScriptRoot\results-example-specrun.html" -NoNewWindow -Wait @@ -16,7 +16,7 @@ Start-Process -FilePath "$PSScriptRoot\test-harness\packages\SpecRun.Runner.1.2. Start-Process -FilePath "$PSScriptRoot\test-harness\packagesNonNuget\xunit.runner\xunit.console.clr4.exe" -ArgumentList "$PSScriptRoot\test-harness\xunit\bin\Debug\xunitHarness.dll", "/xml $PSScriptRoot\results-example-xunit.xml" -NoNewWindow -Wait # XUnit 2 -Start-Process -FilePath "$PSScriptRoot\test-harness\packages\xunit.runner.console.2.1.0\tools\xunit.console.exe" -ArgumentList "$PSScriptRoot\test-harness\xunit2\bin\Debug\xunit2Harness.dll", "-xml $PSScriptRoot\results-example-xunit2.xml", "-parallel none" -NoNewWindow -Wait +Start-Process -FilePath "$PSScriptRoot\test-harness\packages\xunit.runner.console.2.4.0\tools\net452\xunit.console.exe" -ArgumentList "$PSScriptRoot\test-harness\xunit2\bin\Debug\xunit2Harness.dll", "-xml $PSScriptRoot\results-example-xunit2.xml", "-parallel none" -NoNewWindow -Wait # MSTest $MSTest = Get-ChildItem -Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio\2017" -Recurse | Where-Object { $_.Name -eq "MSTest.exe" } | Select-Object -First 1 @@ -35,6 +35,8 @@ Set-Location $PSScriptRoot # CucumberJS Set-Location -Path "$PSScriptRoot\test-harness\CucumberJS" & "$PSScriptRoot\node_modules\.bin\cucumber-js" --format json:"$PSScriptRoot\results-example-cucumberjs-json.json" +Write-Host "Waiting for CucumberJS to finish. You might need to increase the sleep time as the test suite increases." +Start-Sleep -s 2 Set-Location $PSScriptRoot # VSTest diff --git a/Output/Cucumber/cucumberResult.json b/Output/Cucumber/cucumberResult.json new file mode 100644 index 000000000..0ec000752 --- /dev/null +++ b/Output/Cucumber/cucumberResult.json @@ -0,0 +1,2370 @@ +[ + { + "keyword": "Feature", + "name": "Showing basic gherkin syntax", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Simple GWT", + "line": 8, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "the initial state of the application is Running", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I ask what the application state is", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "I should see Running as the answer", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Using And and But", + "line": 13, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "the initial state of the application is Running", + "line": 14, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have authorization to ask application state", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I ask what the application state is", + "line": 16, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "I should see Running as the answer", + "line": 17, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I should see the time of the application", + "line": 18, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "But", + "name": "the state of the application should not be Stopped", + "line": 19, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "The test runner is not (very) important", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "A couple of simple steps", + "line": 6, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I have step defintions in place", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I call a step", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the step should have been called", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Addition", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Hooking into pre conditions for Test Runs in SpecFlow", + "line": 6, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "the scenario is running", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the BeforeTestRun hook should have been executed", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Hooking into pre conditions for Features in SpecFlow", + "line": 10, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "the scenario is running", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the BeforeFeature hook should have been executed", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Hooking into pre conditions for Scenarios in SpecFlow", + "line": 14, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "the scenario is running", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the BeforeScenario hook should have been executed", + "line": 16, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Hooking into pre conditions for ScenarioBlocks in SpecFlow", + "line": 18, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "the scenario is running", + "line": 19, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the BeforeScenarioBlock hook should have been executed", + "line": 20, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Hooking into pre conditions for Steps in SpecFlow", + "line": 22, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "the scenario is running", + "line": 23, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the BeforeStep hook should have been executed", + "line": 24, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Tag demonstrator", + "tags": [ + { + "name": "@allAboutTags" + }, + { + "name": "@important" + } + ], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Ignored scenario", + "line": 8, + "type": "scenario", + "tags": [ + { + "name": "@ignore" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "that my scenario has the @ignore tag", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run the scenario", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the scenario is ignored", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "the missing step definitions are not reported", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "A scenario without tags", + "line": 14, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "that my scenario has 0 tags", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run the scenario", + "line": 16, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "before scenario hook with '' is run", + "line": 17, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "A scenario with 1 tag", + "line": 20, + "type": "scenario", + "tags": [ + { + "name": "@testTag1" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "that my scenario has 1 tags", + "line": 21, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run the scenario", + "line": 22, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "before scenario hook with 'testTag1' is run", + "line": 23, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "A scenario with 3 tags", + "line": 26, + "type": "scenario", + "tags": [ + { + "name": "@testTag1" + }, + { + "name": "@testTag2" + }, + { + "name": "@testTag3" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "that my scenario has 3 tags", + "line": 27, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run the scenario", + "line": 28, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "before scenario hook with 'testTag1, testTag2, testTag3' is run", + "line": 29, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "A scenario with 2 tags", + "line": 32, + "type": "scenario", + "tags": [ + { + "name": "@testTag1" + }, + { + "name": "@testTag3" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "that my scenario has 2 tags", + "line": 33, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run the scenario", + "line": 34, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "before scenario hook with 'testTag1, testTag3' is run", + "line": 35, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Scenario outline", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario Outline", + "name": "Add two positive numbers with many examples", + "line": 8, + "type": "scenario_outline", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I enter into the calculator", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I enter into the calculator", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I perform add", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be ", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario Outline", + "name": "Add two negative numbers with many examples", + "line": 28, + "type": "scenario_outline", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I enter into the calculator", + "line": 29, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I enter into the calculator", + "line": 30, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I perform add", + "line": 31, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be ", + "line": 32, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Scenario Context features", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Store and retrive Person Marcus from ScenarioContext", + "line": 6, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "When", + "name": "I store a person called Marcus in the Current ScenarioContext", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "a person called Marcus can easily be retrieved", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Showing information of the scenario", + "line": 11, + "type": "scenario", + "tags": [ + { + "name": "@showUpInScenarioInfo" + }, + { + "name": "@andThisToo" + } + ], + "steps": [ + { + "keyword": "When", + "name": "I execute any scenario", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the ScenarioInfo contains the following information", + "line": 13, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Show the type of step we're currently on", + "line": 18, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I have a Given step", + "line": 19, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have another Given step", + "line": 20, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I have a When step", + "line": 21, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "I have a Then step", + "line": 22, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Display error information in AfterScenario", + "line": 27, + "type": "scenario", + "tags": [ + { + "name": "@ignore" + }, + { + "name": "@showingErrorHandling" + } + ], + "steps": [ + { + "keyword": "When", + "name": "an error occurs in a step", + "line": 28, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Pending step", + "line": 30, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "When", + "name": "I set the ScenarioContext.Current to pending", + "line": 31, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "this step will not even be executed", + "line": 32, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "FeatureContext features", + "tags": [ + { + "name": "@showUpInScenarioInfo" + }, + { + "name": "@andThisToo" + } + ], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Store and retrive Person Marcus from FeatureContext Current", + "line": 7, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "When", + "name": "I store a person called Marcus in the current FeatureContext", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "a person called Marcus can easily be retrieved from the current FeatureContext", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Showing information of the feature", + "line": 11, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "When", + "name": "I execute any scenario in the feature", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the FeatureInfo contains the following information", + "line": 13, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Show the use of background", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Add 1 to the sum", + "line": 10, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "When", + "name": "I add 1 to the Sum-variable", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the total sum should be 2", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Add 2 to the sum", + "line": 14, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "When", + "name": "I add 2 to the Sum-variable", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the total sum should be 3", + "line": 16, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Showing table usage", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Using tables", + "line": 6, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I have the following persons", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I search for Jocke", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the following person should be returned", + "line": 13, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Using tables with SpecFlow Assist", + "line": 17, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I have the following persons using assist", + "line": 18, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I search for Jocke", + "line": 23, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the following person should be returned using assist", + "line": 24, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Creating a entity from field value", + "line": 28, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "When", + "name": "I fill out the form like this", + "line": 29, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the following person should be returned using assist", + "line": 35, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Example of a wide table", + "line": 39, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "this wide table", + "line": 40, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Show the compare to feature", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "CompareToInstance", + "line": 8, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I have the following person", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "CompareToInstance should match this guy", + "line": 14, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "CompareToInstance should match this guy", + "line": 19, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "But", + "name": "CompareToInstance should not match this guy", + "line": 23, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "CompareToSet", + "line": 31, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I have the following persons using assist", + "line": 32, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "CompareToSet should match this", + "line": 37, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "But", + "name": "CompareToSet should not match this", + "line": 42, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Svenska - Summering", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Summera 5 och 7 ska vara 12", + "line": 9, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "att jag har knappat in 5", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "att jag har knappat in 7", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "jag summerar", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "ska resultatet vara 12", + "line": 13, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Test de Cultuur in het Vlaams", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Het Scenario", + "line": 4, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "dat ik 50 ingeef", + "line": 5, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "dat ik 70 ingeef", + "line": 6, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "ik plus druk", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "moet het resultaat 120 zijn", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Attribute overloading", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Checking number for evenness", + "line": 6, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I have this simple step", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "this simple step", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "also this step", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I do something", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "I could validate that the number 2 is even", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "that the number 4 is even", + "line": 12, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "But", + "name": "the number 3 is odd", + "line": 13, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Calling Steps from StepDefinitions", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Log in", + "line": 6, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I am on the index page", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I enter my unsername nad password", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I click the login button", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the welcome page should be displayed", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Do something meaningful", + "line": 12, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "I am logged in", + "line": 13, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I dosomething meaningful", + "line": 14, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "I should get rewarded", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Step Argument Transformations", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Steps with non-string arguments", + "line": 6, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "Dan has been registered at date 2003/03/13", + "line": 7, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "Aslak has been registered at terminal 2", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "I should be able to see Aslak at terminal 2", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Injecting context into step specifications", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Feature with no context", + "line": 8, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "a feature which requires no context", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "everything is dandy", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Feature with a single context", + "line": 12, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "a feature which requires a single context", + "line": 13, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the context is set", + "line": 14, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Feature with multiple contexts", + "line": 16, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "a feature which requires multiple contexts", + "line": 17, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the contexts are set", + "line": 18, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Feature with recursive contexts", + "line": 20, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "a feature which requires a recursive context", + "line": 21, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the context is set", + "line": 22, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "its sub-context is set", + "line": 23, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Feature with a dependent context", + "line": 25, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "a feature which requires a single context", + "line": 26, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the context is set", + "line": 27, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "the context was created by the feature with a single context scenario", + "line": 28, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Nested Folder Example", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Nested - Add two numbers", + "line": 7, + "type": "scenario", + "tags": [ + { + "name": "@nestedFolders" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 50 into the calculator", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have entered 70 into the calculator", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press add", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be 120 on the screen", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Multiline Feature Example", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Mutliline Output", + "line": 7, + "type": "scenario", + "tags": [ + { + "name": "@mytag" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have read in some text from the user", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I process this input", + "line": 14, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result will be saved to the multiline text data store", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Sample Markdown Feature", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Sample Markdown Scenario Example", + "line": 44, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "this", + "line": 62, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "that", + "line": 63, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario Outline", + "name": "Sample Markdown Scenario Outline Example", + "line": 66, + "type": "scenario_outline", + "tags": [ + { + "name": "@AddingATag" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "this: ", + "line": 72, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "that: ", + "line": 73, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Interactive DHTML View", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Scenario with large data table", + "line": 7, + "type": "scenario", + "tags": [], + "steps": [ + { + "keyword": "Given", + "name": "a feature with a large table of data:", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I click on the table heading", + "line": 32, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the table body should collapse", + "line": 33, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Kinds of verification", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Verified automatically", + "line": 8, + "type": "scenario", + "tags": [ + { + "name": "@automated" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "a feature that is verified automatically", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run pickles", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "it appears in the @automated summary", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Verified manually", + "line": 14, + "type": "scenario", + "tags": [ + { + "name": "@manual" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "a feature that is verified manually", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run pickles", + "line": 16, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "it appears in the @manual summary", + "line": 17, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Verified automatically", + "line": 20, + "type": "scenario", + "tags": [ + { + "name": "@notTested_waitingForAutomation" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "a feature that is not verified", + "line": 21, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I run pickles", + "line": 22, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "it appears in the @notTested summary", + "line": 23, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Arithmetic", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Add two numbers", + "line": 10, + "type": "scenario", + "tags": [ + { + "name": "@arithmetic" + }, + { + "name": "@fast" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 50 into the calculator", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have entered 70 into the calculator", + "line": 16, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press add", + "line": 17, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be 120 on the screen", + "line": 18, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Subtract two numbers", + "line": 21, + "type": "scenario", + "tags": [ + { + "name": "@arithmetic" + }, + { + "name": "@fast" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 50 into the calculator", + "line": 22, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have entered 70 into the calculator", + "line": 23, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press subtract", + "line": 24, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be -20 on the screen", + "line": 25, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Multiply two numbers", + "line": 28, + "type": "scenario", + "tags": [ + { + "name": "@arithmetic" + }, + { + "name": "@fast" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 50 into the calculator", + "line": 29, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have entered 70 into the calculator", + "line": 30, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press multiply", + "line": 31, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be 3500 on the screen", + "line": 32, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Divide two numbers", + "line": 35, + "type": "scenario", + "tags": [ + { + "name": "@arithmetic" + }, + { + "name": "@fast" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 50 into the calculator", + "line": 36, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have entered 2 into the calculator", + "line": 37, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press divide", + "line": 38, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be 25 on the screen", + "line": 39, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Trigonometry", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Sine", + "line": 7, + "type": "scenario", + "tags": [ + { + "name": "@trigonometric" + }, + { + "name": "@fast" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 90 into the calculator", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press sin", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be 1 on the screen", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Cosine", + "line": 13, + "type": "scenario", + "tags": [ + { + "name": "@trigonometric" + }, + { + "name": "@fast" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 0 into the calculator", + "line": 14, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press cos", + "line": 15, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be 1 on the screen", + "line": 16, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + }, + { + "keyword": "Scenario", + "name": "Tangent", + "line": 19, + "type": "scenario", + "tags": [ + { + "name": "@trigonometric" + }, + { + "name": "@fast" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 45 into the calculator", + "line": 20, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press tan", + "line": 21, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the result should be 1 on the screen", + "line": 22, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + }, + { + "keyword": "Feature", + "name": "Clearing Screen", + "tags": [], + "line": 1, + "elements": [ + { + "keyword": "Scenario", + "name": "Clear the screen", + "line": 7, + "type": "scenario", + "tags": [ + { + "name": "@workflow" + }, + { + "name": "@slow" + } + ], + "steps": [ + { + "keyword": "Given", + "name": "I have entered 50 into the calculator", + "line": 8, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "And", + "name": "I have entered 70 into the calculator", + "line": 9, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "When", + "name": "I press C", + "line": 10, + "result": { + "status": "inconclusive", + "duration": 1 + } + }, + { + "keyword": "Then", + "name": "the screen should be empty", + "line": 11, + "result": { + "status": "inconclusive", + "duration": 1 + } + } + ] + } + ] + } +] \ No newline at end of file diff --git a/Output/Dhtml/Index.html b/Output/Dhtml/Index.html new file mode 100644 index 000000000..6bc691b98 --- /dev/null +++ b/Output/Dhtml/Index.html @@ -0,0 +1,554 @@ + + + + + + Features + + + + + + + + + + + + + + +
+ Loading... +
+ + + + + + + + + + + + +
+
+
+
+
+
+
+
+ +
+ + +
+ +
Generated on:
+
+
+
+ +
+
+
+
+ + + + +
+

+
+
+ +
+
+
+

Background:

+
+
    +
    +
    + +
    +
    + + + + + +
    + +
    +
    + +
    +

    +
    +
    + +
    + +
      + +
        +
      • +
        + + + + + + +
        +
        + : +
        +
        +
        +
      • +
      + +
      + + + Get Link for Scenario + +
      +
      +
      + + +
      + + +
      +
      + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Output/Dhtml/css/bootstrap.min.css b/Output/Dhtml/css/bootstrap.min.css new file mode 100644 index 000000000..02629e412 --- /dev/null +++ b/Output/Dhtml/css/bootstrap.min.css @@ -0,0 +1,965 @@ +/*! + * Bootstrap v2.2.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;} +.clearfix:after{clear:both;} +.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} +.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} +#map_canvas img,.google-maps img{max-width:none;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;} +input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:20px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover{color:#005580;text-decoration:underline;} +.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);} +.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} +.row:after{clear:both;} +[class*="span"]{float:left;min-height:1px;margin-left:20px;} +.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} +.span12{width:940px;} +.span11{width:860px;} +.span10{width:780px;} +.span9{width:700px;} +.span8{width:620px;} +.span7{width:540px;} +.span6{width:460px;} +.span5{width:380px;} +.span4{width:300px;} +.span3{width:220px;} +.span2{width:140px;} +.span1{width:60px;} +.offset12{margin-left:980px;} +.offset11{margin-left:900px;} +.offset10{margin-left:820px;} +.offset9{margin-left:740px;} +.offset8{margin-left:660px;} +.offset7{margin-left:580px;} +.offset6{margin-left:500px;} +.offset5{margin-left:420px;} +.offset4{margin-left:340px;} +.offset3{margin-left:260px;} +.offset2{margin-left:180px;} +.offset1{margin-left:100px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} +.row-fluid:after{clear:both;} +.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} +.row-fluid [class*="span"]:first-child{margin-left:0;} +.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;} +.row-fluid .span12{width:100%;*width:99.94680851063829%;} +.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} +.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} +.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} +.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} +.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} +.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} +.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} +.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} +.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} +.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} +.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} +.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} +.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} +.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} +.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} +.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} +.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} +.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} +.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} +.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} +.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} +.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} +.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} +.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} +.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} +.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} +.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} +.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} +.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} +.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} +.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} +.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} +.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} +.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} +.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} +[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;} +[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;} +.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;} +.container:after{clear:both;} +.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;} +.container-fluid:after{clear:both;} +p{margin:0 0 10px;} +.lead{margin-bottom:20px;font-size:21px;font-weight:200;line-height:30px;} +small{font-size:85%;} +strong{font-weight:bold;} +em{font-style:italic;} +cite{font-style:normal;} +.muted{color:#999999;} +.text-warning{color:#c09853;} +a.text-warning:hover{color:#a47e3c;} +.text-error{color:#b94a48;} +a.text-error:hover{color:#953b39;} +.text-info{color:#3a87ad;} +a.text-info:hover{color:#2d6987;} +.text-success{color:#468847;} +a.text-success:hover{color:#356635;} +h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;} +h1,h2,h3{line-height:40px;} +h1{font-size:38.5px;} +h2{font-size:31.5px;} +h3{font-size:24.5px;} +h4{font-size:17.5px;} +h5{font-size:14px;} +h6{font-size:11.9px;} +h1 small{font-size:24.5px;} +h2 small{font-size:17.5px;} +h3 small{font-size:14px;} +h4 small{font-size:14px;} +.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} +ul,ol{padding:0;margin:0 0 10px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +li{line-height:20px;} +ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} +dl{margin-bottom:20px;} +dt,dd{line-height:20px;} +dt{font-weight:bold;} +dd{margin-left:10px;} +.dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;} +.dl-horizontal:after{clear:both;} +.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.dl-horizontal dd{margin-left:180px;} +hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} +abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;} +abbr.initialism{font-size:90%;text-transform:uppercase;} +blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16px;font-weight:300;line-height:25px;} +blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +blockquote.pull-right small:before{content:'';} +blockquote.pull-right small:after{content:'\00A0 \2014';} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} +code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:12px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;} +pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;} +pre code{padding:0;color:inherit;background-color:transparent;border:0;} +.pre-scrollable{max-height:340px;overflow-y:scroll;} +.label,.badge{display:inline-block;padding:2px 4px;font-size:11.844px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} +.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} +a.label:hover,a.badge:hover{color:#ffffff;text-decoration:none;cursor:pointer;} +.label-important,.badge-important{background-color:#b94a48;} +.label-important[href],.badge-important[href]{background-color:#953b39;} +.label-warning,.badge-warning{background-color:#f89406;} +.label-warning[href],.badge-warning[href]{background-color:#c67605;} +.label-success,.badge-success{background-color:#468847;} +.label-success[href],.badge-success[href]{background-color:#356635;} +.label-info,.badge-info{background-color:#3a87ad;} +.label-info[href],.badge-info[href]{background-color:#2d6987;} +.label-inverse,.badge-inverse{background-color:#333333;} +.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} +.btn .label,.btn .badge{position:relative;top:-1px;} +.btn-mini .label,.btn-mini .badge{top:0;} +table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} +.table th{font-weight:bold;} +.table thead th{vertical-align:bottom;} +.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} +.table tbody+tbody{border-top:2px solid #dddddd;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} +.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child th:first-child,.table-bordered tbody:first-child tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} +.table-bordered thead:first-child tr:first-child th:last-child,.table-bordered tbody:first-child tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} +.table-bordered thead:last-child tr:last-child th:first-child,.table-bordered tbody:last-child tr:last-child td:first-child,.table-bordered tfoot:last-child tr:last-child td:first-child{-webkit-border-radius:0 0 0 4px;-moz-border-radius:0 0 0 4px;border-radius:0 0 0 4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;} +.table-bordered thead:last-child tr:last-child th:last-child,.table-bordered tbody:last-child tr:last-child td:last-child,.table-bordered tfoot:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;} +.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topleft:4px;} +.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;border-top-right-radius:4px;-moz-border-radius-topright:4px;} +.table-striped tbody tr:nth-child(odd) td,.table-striped tbody tr:nth-child(odd) th{background-color:#f9f9f9;} +.table-hover tbody tr:hover td,.table-hover tbody tr:hover th{background-color:#f5f5f5;} +table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;} +.table td.span1,.table th.span1{float:none;width:44px;margin-left:0;} +.table td.span2,.table th.span2{float:none;width:124px;margin-left:0;} +.table td.span3,.table th.span3{float:none;width:204px;margin-left:0;} +.table td.span4,.table th.span4{float:none;width:284px;margin-left:0;} +.table td.span5,.table th.span5{float:none;width:364px;margin-left:0;} +.table td.span6,.table th.span6{float:none;width:444px;margin-left:0;} +.table td.span7,.table th.span7{float:none;width:524px;margin-left:0;} +.table td.span8,.table th.span8{float:none;width:604px;margin-left:0;} +.table td.span9,.table th.span9{float:none;width:684px;margin-left:0;} +.table td.span10,.table th.span10{float:none;width:764px;margin-left:0;} +.table td.span11,.table th.span11{float:none;width:844px;margin-left:0;} +.table td.span12,.table th.span12{float:none;width:924px;margin-left:0;} +.table tbody tr.success td{background-color:#dff0d8;} +.table tbody tr.error td{background-color:#f2dede;} +.table tbody tr.warning td{background-color:#fcf8e3;} +.table tbody tr.info td{background-color:#d9edf7;} +.table-hover tbody tr.success:hover td{background-color:#d0e9c6;} +.table-hover tbody tr.error:hover td{background-color:#ebcccc;} +.table-hover tbody tr.warning:hover td{background-color:#faf2cc;} +.table-hover tbody tr.info:hover td{background-color:#c4e3f3;} +form{margin:0 0 20px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;} +label,input,button,select,textarea{font-size:14px;font-weight:normal;line-height:20px;} +input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} +label{display:block;margin-bottom:5px;} +select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:14px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;} +input,textarea,.uneditable-input{width:206px;} +textarea{height:auto;} +textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);} +input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;cursor:pointer;} +input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;} +select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} +select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +.uneditable-input{overflow:hidden;white-space:nowrap;} +.uneditable-textarea{width:auto;height:auto;} +input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;} +input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;} +input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;} +.radio,.checkbox{min-height:20px;padding-left:20px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} +.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;} +input,textarea,.uneditable-input{margin-left:0;} +.controls-row [class*="span"]+[class*="span"]{margin-left:20px;} +input.span12, textarea.span12, .uneditable-input.span12{width:926px;} +input.span11, textarea.span11, .uneditable-input.span11{width:846px;} +input.span10, textarea.span10, .uneditable-input.span10{width:766px;} +input.span9, textarea.span9, .uneditable-input.span9{width:686px;} +input.span8, textarea.span8, .uneditable-input.span8{width:606px;} +input.span7, textarea.span7, .uneditable-input.span7{width:526px;} +input.span6, textarea.span6, .uneditable-input.span6{width:446px;} +input.span5, textarea.span5, .uneditable-input.span5{width:366px;} +input.span4, textarea.span4, .uneditable-input.span4{width:286px;} +input.span3, textarea.span3, .uneditable-input.span3{width:206px;} +input.span2, textarea.span2, .uneditable-input.span2{width:126px;} +input.span1, textarea.span1, .uneditable-input.span1{width:46px;} +.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;} +.controls-row:after{clear:both;} +.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;} +.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} +input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} +.control-group.warning>label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error>label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success>label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +.control-group.info>label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;} +.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;} +.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;} +.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} +input:focus:required:invalid,textarea:focus:required:invalid,select:focus:required:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:required:invalid:focus,textarea:focus:required:invalid:focus,select:focus:required:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;} +.form-actions:after{clear:both;} +.help-block,.help-inline{color:#595959;} +.help-block{display:block;margin-bottom:10px;} +.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} +.input-append,.input-prepend{margin-bottom:5px;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu{font-size:14px;} +.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;} +.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:14px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} +.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} +.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn,.input-append select+.btn-group .btn,.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;} +.input-append .add-on:last-child,.input-append .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append .btn-group:first-child{margin-left:0;} +input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} +.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} +.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} +.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} +.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} +.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;} +.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} +.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} +.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} +.control-group{margin-bottom:10px;} +legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} +.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;} +.form-horizontal .help-block{margin-bottom:0;} +.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block{margin-top:10px;} +.form-horizontal .form-actions{padding-left:180px;} +.btn{display:inline-block;*border-bottom: 0 none #a2a2a2; + display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:14px;line-height:20px;*line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*-webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .2), 0 1px 2px rgba(0, 0, 0, .05); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); +**border-left-style: none; + border-left-color: inherit; + border-left-width: 0; + border-right-style: none; + border-right-color: inherit; + border-right-width: 0; + border-top-style: none; + border-top-color: inherit; + border-top-width: 0; +}.btn:hover,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} +.btn:active,.btn.active{background-color:#cccccc \9;} +.btn:first-child{*margin-left:0;} +.btn:hover{color:#333333;text-decoration:none;background-color:#e6e6e6;*background-color:#d9d9d9;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-color:#e6e6e6;background-color:#d9d9d9 \9;background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} +.btn.disabled,.btn[disabled]{cursor:default;background-color:#e6e6e6;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:11px 19px;font-size:17.5px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:2px;} +.btn-small{padding:2px 10px;font-size:11.9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;} +.btn-mini{padding:1px 6px;font-size:10.5px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} +.btn-block+.btn-block{margin-top:5px;} +input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} +.btn{border-color:#c5c5c5;border-color:rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);} +.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #0088cc, #0044cc); + border-left-color: #0044cc; + border-right-color: #0044cc; + border-top-color: #0044cc; + border-bottom-color: #002a80; +}.btn-primary:hover,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #fbb450, #f89406); + border-left-color: #f89406; + border-right-color: #f89406; + border-top-color: #f89406; + border-bottom-color: #ad6704; +}.btn-warning:hover,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + border-left-color: #bd362f; + border-right-color: #bd362f; + border-top-color: #bd362f; + border-bottom-color: #802420; +}.btn-danger:hover,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #62c462, #51a351); + border-left-color: #51a351; + border-right-color: #51a351; + border-top-color: #51a351; + border-bottom-color: #387038; +}.btn-success:hover,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + border-left-color: #2f96b4; + border-right-color: #2f96b4; + border-top-color: #2f96b4; + border-bottom-color: #1f6377; +}.btn-info:hover,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #444444, #222222); + border-left-color: #222222; + border-right-color: #222222; + border-top-color: #222222; + border-bottom-color: #000000; +}.btn-inverse:hover,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} +.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} +button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} +button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} +button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} +.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-link:hover{color:#005580;text-decoration:underline;background-color:transparent;} +.btn-link[disabled]:hover{color:#333333;text-decoration:none;} +[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;} +.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;width:16px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;} +.icon-folder-open{background-position:-408px -120px;width:16px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.icon-hdd{background-position:0 -144px;} +.icon-bullhorn{background-position:-24px -144px;} +.icon-bell{background-position:-48px -144px;} +.icon-certificate{background-position:-72px -144px;} +.icon-thumbs-up{background-position:-96px -144px;} +.icon-thumbs-down{background-position:-120px -144px;} +.icon-hand-right{background-position:-144px -144px;} +.icon-hand-left{background-position:-168px -144px;} +.icon-hand-up{background-position:-192px -144px;} +.icon-hand-down{background-position:-216px -144px;} +.icon-circle-arrow-right{background-position:-240px -144px;} +.icon-circle-arrow-left{background-position:-264px -144px;} +.icon-circle-arrow-up{background-position:-288px -144px;} +.icon-circle-arrow-down{background-position:-312px -144px;} +.icon-globe{background-position:-336px -144px;} +.icon-wrench{background-position:-360px -144px;} +.icon-tasks{background-position:-384px -144px;} +.icon-filter{background-position:-408px -144px;} +.icon-briefcase{background-position:-432px -144px;} +.icon-fullscreen{background-position:-456px -144px;} +.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar .btn+.btn,.btn-toolbar .btn-group+.btn,.btn-toolbar .btn+.btn-group{margin-left:5px;} +.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group>.btn+.btn{margin-left:-1px;} +.btn-group>.btn,.btn-group>.dropdown-menu{font-size:14px;} +.btn-group>.btn-mini{font-size:11px;} +.btn-group>.btn-small{font-size:12px;} +.btn-group>.btn-large{font-size:16px;} +.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} +.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} +.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} +.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} +.btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} +.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} +.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} +.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} +.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} +.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} +.btn .caret{margin-top:8px;margin-left:0;} +.btn-mini .caret,.btn-small .caret,.btn-large .caret{margin-top:6px;} +.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} +.dropup .btn-large .caret{border-bottom-width:5px;} +.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} +.btn-group-vertical .btn{display:block;float:none;width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group-vertical .btn+.btn{margin-left:0;margin-top:-1px;} +.btn-group-vertical .btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.btn-group-vertical .btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.btn-group-vertical .btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;} +.btn-group-vertical .btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} +.nav{margin-left:0;margin-bottom:20px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover{text-decoration:none;background-color:#eeeeee;} +.nav>.pull-right{float:right;} +.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} +.nav li+.nav-header{margin-top:9px;} +.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list>li>a{padding:3px 15px;} +.nav-list>.active>a,.nav-list>.active>a:hover{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;} +.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills>.active>a,.nav-pills>.active>a:hover{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.nav-tabs.nav-stacked>li>a:hover{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} +.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} +.nav .dropdown-toggle:hover .caret{border-top-color:#005580;border-bottom-color:#005580;} +.nav-tabs .dropdown-toggle .caret{margin-top:8px;} +.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} +.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} +.nav>.dropdown.active>a:hover{cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;} +.tabbable:after{clear:both;} +.tab-content{overflow:auto;} +.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below>.nav-tabs{border-top:1px solid #ddd;} +.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover{border-color:transparent #ddd #ddd #ddd;} +.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} +.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left>.nav-tabs>li>a:hover{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right>.nav-tabs>li>a:hover{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.nav>.disabled>a{color:#999999;} +.nav>.disabled>a:hover{text-decoration:none;background-color:transparent;cursor:default;} +.navbar{overflow:visible;margin-bottom:20px;color:#777777;*position:relative;*z-index:2;} +.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-repeat: repeat-x; + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + zoom: 1; + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); +}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;} +.navbar-inner:after{clear:both;} +.navbar .container{width:auto;} +.nav-collapse.collapse{height:auto;overflow:visible;} +.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover{text-decoration:none;} +.navbar-text{margin-bottom:0;line-height:40px;} +.navbar-link{color:#777777;}.navbar-link:hover{color:#333333;} +.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-form .input-append,.navbar-form .input-prepend{margin-top:6px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} +.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} +.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;} +.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} +.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} +.navbar-fixed-top{top:0;} +.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);} +.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;margin-right:0;} +.navbar .nav>li{float:left;} +.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} +.navbar .nav .dropdown-toggle .caret{margin-top:8px;} +.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} +.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} +.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .075); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + border-left-color: #e5e5e5; + border-right-color: #e5e5e5; + border-top-color: #e5e5e5; + border-bottom-color: #bfbfbf; +}.navbar .btn-navbar:hover,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} +.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;} +.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} +.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} +.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} +.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} +.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} +.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} +.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} +.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} +.navbar-inverse{color:#999999;}.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-repeat: repeat-x; + border-color: #252525; + background-image: linear-gradient(to bottom, #222222, #111111); +} +.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover{color:#ffffff;} +.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} +.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} +.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover{color:#ffffff;} +.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} +.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-repeat:repeat-x;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-image: linear-gradient(to bottom, #151515, #040404); + border-left-color: #040404; + border-right-color: #040404; + border-top-color: #040404; + border-bottom-color: #000000; +}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} +.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;} +.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;} +.breadcrumb .divider{padding:0 5px;color:#ccc;} +.breadcrumb .active{color:#999999;} +.pagination{margin:20px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination ul>li{display:inline;} +.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} +.pagination ul>li>a:hover,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;} +.pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;} +.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover{color:#999999;background-color:transparent;cursor:default;} +.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:17.5px;} +.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;} +.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;} +.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.9px;} +.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:1px 6px;font-size:10.5px;} +.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager li>a:hover{text-decoration:none;background-color:#f5f5f5;} +.pager .next>a,.pager .next>span{float:right;} +.pager .previous>a,.pager .previous>span{float:left;} +.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;} +.thumbnails:after{clear:both;} +.row-fluid .thumbnails{margin-left:0;} +.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} +.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} +a.thumbnail:hover{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;color:#555555;} +.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;color:#c09853;} +.alert h4{margin:0;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-repeat: repeat-x; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); +} +.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-repeat: repeat-x; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; + background-image: linear-gradient(to bottom, #149bdf, #0480be); +} +.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);} +.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); +} +.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #62c462, #57a957); +} +.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); +} +.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #fbb450, #f89406); +} +.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} +.hero-unit li{line-height:30px;} +.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} +.media,.media .media{margin-top:15px;} +.media:first-child{margin-top:0;} +.media-object{display:block;} +.media-heading{margin:0 0 5px;} +.media .pull-left{margin-right:10px;} +.media .pull-right{margin-left:10px;} +.media-list{margin-left:0;list-style:none;} +.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;padding:5px;font-size:11px;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-3px;} +.tooltip.right{margin-left:3px;} +.tooltip.bottom{margin-top:3px;} +.tooltip.left{margin-left:-3px;} +.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;width:236px;padding:1px;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);}.popover.top{margin-top:-10px;} +.popover.right{margin-left:10px;} +.popover.bottom{margin-top:10px;} +.popover.left{margin-left:-10px;} +.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;} +.popover-content{padding:9px 14px;}.popover-content p,.popover-content ul,.popover-content ol{margin-bottom:0;} +.popover .arrow,.popover .arrow:after{position:absolute;display:inline-block;width:0;height:0;border-color:transparent;border-style:solid;} +.popover .arrow:after{content:"";z-index:-1;} +.popover.top .arrow{bottom:-10px;left:50%;margin-left:-10px;border-width:10px 10px 0;border-top-color:#ffffff;}.popover.top .arrow:after{border-width:11px 11px 0;border-top-color:rgba(0, 0, 0, 0.25);bottom:-1px;left:-11px;} +.popover.right .arrow{top:50%;left:-10px;margin-top:-10px;border-width:10px 10px 10px 0;border-right-color:#ffffff;}.popover.right .arrow:after{border-width:11px 11px 11px 0;border-right-color:rgba(0, 0, 0, 0.25);bottom:-11px;left:-1px;} +.popover.bottom .arrow{top:-10px;left:50%;margin-left:-10px;border-width:0 10px 10px;border-bottom-color:#ffffff;}.popover.bottom .arrow:after{border-width:0 11px 11px;border-bottom-color:rgba(0, 0, 0, 0.25);top:-1px;left:-11px;} +.popover.left .arrow{top:50%;right:-10px;margin-top:-10px;border-width:10px 0 10px 10px;border-left-color:#ffffff;}.popover.left .arrow:after{border-width:11px 0 11px 11px;border-left-color:rgba(0, 0, 0, 0.25);bottom:-11px;right:-1px;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:50%;left:50%;z-index:1050;width:560px;margin:-250px 0 0 -280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:50%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-header h3{margin:0;line-height:30px;} +.modal-body{overflow-y:auto;max-height:400px;padding:15px;} +.modal-form{margin-bottom:0;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;} +.modal-footer:after{clear:both;} +.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} +.modal-footer .btn-group .btn+.btn{margin-left:-1px;} +.modal-footer .btn-block+.btn-block{margin-left:0;} +.dropup,.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;} +.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} +.dropdown-menu li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;} +.dropdown-menu li>a:hover,.dropdown-menu li>a:focus,.dropdown-submenu:hover>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #0088cc, #0077b3); +} +.dropdown-menu .active>a,.dropdown-menu .active>a:hover{color:#333333;text-decoration:none;outline:0;background-color:#0081c2;background-repeat: repeat-x; + background-image: linear-gradient(to bottom, #0088cc, #0077b3); +} +.dropdown-menu .disabled>a,.dropdown-menu .disabled>a:hover{color:#999999;} +.dropdown-menu .disabled>a:hover{text-decoration:none;background-color:transparent;background-image:none;cursor:default;} +.open{*z-index:1000;}.open >.dropdown-menu{display:block;} +.pull-right>.dropdown-menu{right:0;left:auto;} +.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";} +.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} +.dropdown-submenu{position:relative;} +.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} +.dropdown-submenu:hover>.dropdown-menu{display:block;} +.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;} +.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} +.dropdown-submenu:hover>a:after{border-left-color:#ffffff;} +.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} +.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;} +.typeahead{margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion{margin-bottom:20px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-toggle{cursor:pointer;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:20px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel .item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;} +.carousel .item>img{display:block;line-height:1;} +.carousel .active,.carousel .next,.carousel .prev{display:block;} +.carousel .active{left:0;} +.carousel .next,.carousel .prev{position:absolute;top:0;width:100%;} +.carousel .next{left:100%;} +.carousel .prev{left:-100%;} +.carousel .next.left,.carousel .prev.right{left:0;} +.carousel .active.left{left:-100%;} +.carousel .active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;} +.carousel-caption h4{margin:0 0 5px;} +.carousel-caption p{margin-bottom:0;} +.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} +.media,.media .media{margin-top:15px;} +.media:first-child{margin-top:0;} +.media-object{display:block;} +.media-heading{margin:0 0 5px;} +.media .pull-left{margin-right:10px;} +.media .pull-right{margin-left:10px;} +.media-list{margin-left:0;list-style:none;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} +button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} +.affix{position:fixed;} +.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;} +.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} +.hidden{display:none;visibility:hidden;} +.visible-phone{display:none !important;} +.visible-tablet{display:none !important;} +.hidden-desktop{display:none !important;} +.visible-desktop{display:inherit !important;} +@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12, textarea.span12, .uneditable-input.span12{width:710px;} input.span11, textarea.span11, .uneditable-input.span11{width:648px;} input.span10, textarea.span10, .uneditable-input.span10{width:586px;} input.span9, textarea.span9, .uneditable-input.span9{width:524px;} input.span8, textarea.span8, .uneditable-input.span8{width:462px;} input.span7, textarea.span7, .uneditable-input.span7{width:400px;} input.span6, textarea.span6, .uneditable-input.span6{width:338px;} input.span5, textarea.span5, .uneditable-input.span5{width:276px;} input.span4, textarea.span4, .uneditable-input.span4{width:214px;} input.span3, textarea.span3, .uneditable-input.span3{width:152px;} input.span2, textarea.span2, .uneditable-input.span2{width:90px;} input.span1, textarea.span1, .uneditable-input.span1{width:28px;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12, textarea.span12, .uneditable-input.span12{width:1156px;} input.span11, textarea.span11, .uneditable-input.span11{width:1056px;} input.span10, textarea.span10, .uneditable-input.span10{width:956px;} input.span9, textarea.span9, .uneditable-input.span9{width:856px;} input.span8, textarea.span8, .uneditable-input.span8{width:756px;} input.span7, textarea.span7, .uneditable-input.span7{width:656px;} input.span6, textarea.span6, .uneditable-input.span6{width:556px;} input.span5, textarea.span5, .uneditable-input.span5{width:456px;} input.span4, textarea.span4, .uneditable-input.span4{width:356px;} input.span3, textarea.span3, .uneditable-input.span3{width:256px;} input.span2, textarea.span2, .uneditable-input.span2{width:156px;} input.span1, textarea.span1, .uneditable-input.span1{width:56px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;} .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .dropdown-menu a:hover{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:hover{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}} diff --git a/Output/Dhtml/css/print.css b/Output/Dhtml/css/print.css new file mode 100644 index 000000000..50feea3f4 --- /dev/null +++ b/Output/Dhtml/css/print.css @@ -0,0 +1 @@ +#FolderNav, #TopNav { display: none !important; } diff --git a/Output/Dhtml/css/styles.css b/Output/Dhtml/css/styles.css new file mode 100644 index 000000000..deebb6966 --- /dev/null +++ b/Output/Dhtml/css/styles.css @@ -0,0 +1,302 @@ +body { + padding-top: 60px; + padding-bottom: 40px; +} + +.sidebar-nav { + padding: 9px 0; +} + +#featureDetails .description { + font-size: larger; +} + +.feature-folder-header { + font-size: small; + font-weight: bolder; + margin-top: 5px; +} + + .feature-folder-header span { + cursor: pointer; + } + +.feature-folder-contents { + margin-left: 15px; +} + +.navbar .overview { + padding-top: 8px; + font-weight: bolder; +} + +.navbar-below { + margin-top: -1px; + margin-left: 10px; + border-top: 0; + -ms-border-bottom-left-radius: 10px; + border-bottom-left-radius: 10px; + -ms-border-bottom-right-radius: 10px; + border-bottom-right-radius: 10px; + width: 180px; + background-color: black; + color: rgb(173, 173, 173); + -webkit-transition: height 400ms; + transition: height 400ms; + overflow: hidden; +} + + .navbar-below div { + display: inline-block; + padding-left: 8px; + padding-right: 8px; + cursor: pointer; + } + +#scenarios, .steps { + list-style-type: none; + margin: 0; + padding: 0; +} + +.scenario { + transition: border-color 1s ease; + background-color: #F5F5F5; + border: 1px solid #D0D0D0; + margin: 6px 0px 28px 0px; + padding: 6px; +} + +.scenario-name { + font-weight: bolder; + font-size: 1.1em; +} + +.scenario-active { + border-color: #B21515; +} + +#clipboardText { + width: 100%; + padding: 0; + border: none; + outline: none; + box-shadow: none; + background: transparent; + cursor: pointer; + text-decoration: underline; + color: blue; +} + +.scenario a.scenario-link { + float: right; + margin-top: -25px; + width: 32px; +} + +li.step { + list-style-type: none; + margin: 6px 0px 6px 0px; + padding: 0; +} + +.comment { + font-weight: bold; + color: #0088CC; +} + +.keyword { + font-weight: bold; + color: #0000FF; +} + +.tags { + color: #44546a; + font-style: italic; + font-weight: normal; +} + +.steps table { + margin-bottom: 0px; +} + + .steps table td { + color: #B21515; + } + + .steps table th { + font-style: italic; + } + +#SearchButton { + margin-top: 0; +} + +.nav .nav-tabs .nav-stacked .active { + background-color: #0088CC; + color: white; +} + +#FolderNav { + border-right: 1px lightgrey solid; +} + + #FolderNav a:hover { + background-color: #EEEEEE; + color: #1A668C; + text-decoration: none; + } + +.feature { + padding: 5px; +} + + .feature:hover { + background-color: #EEEEEE; + cursor: pointer; + color: #1A668C; + } + +.canHighlight { +} + +.highlight { + background-color: yellow; +} + +.inconclusive, .failed, .passed { + font-size: 300%; +} + +.pre { + border-color: #fff; + margin: 0; + padding: 0; + overflow: auto; + white-space: pre-wrap; + font-style: italic; + font-family: Monaco,Menlo,Consolas,"Courier New",monospace; +} + +.selected { + text-decoration: underline; +} + +#Content { + margin: 0px 0px 0px 10px; +} + +#HideIt { + float: right; + position: relative; + left: 0px; + top: 0px; + cursor: pointer; +} + +#ShowIt { + float: left; + position: absolute; + left: 0px; + top: 60px; + cursor: pointer; +} + +#SutInfo { + margin-top: 30px; + border-top: 1px lightgrey solid; +} + +.clickable { + cursor: pointer; +} + +.table { + width: auto; + max-width: 90%; +} + +.table-condensed th, +.table-condensed td { + padding: 5px 8px; +} + +/* Overview Styles */ +.modal-host { + display: block; + width: 100%; +} + +.modal-overlay { + margin-top: 40px; + background: white; + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; + z-index: -1; + opacity: 0; + overflow: hidden; + -ms-transform: scale(0.5); + transform: scale(0.5); + -webkit-transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); + overflow-y: auto; +} + +.modal-overlay-visible { + opacity: 1; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + -webkit-transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); + transition: all 0.75s cubic-bezier(0.19, 1, 0.22, 1); + z-index: 10; +} + +.modal-box { + padding: 1em .75em; + position: relative; + margin: 1em auto; + width: 95%; +} + +.modal-dialog .btn { + background-image: none !important; +} + +#overallCompleteCanvas-container, #overallCompleteSummary { + width: 50%; +} + +#overallCompleteSummary ul { + font-size: 1.3em; + list-style: none; +} + +#overallCompleteSummary ul * { + vertical-align: middle; +} + +#overallCompleteSummary span { + display: inline-block; + margin: 5px; + text-align: center; +} + +#overallCompleteSummary .color-key { + background-color: lightyellow; + display: inline-block; + padding: 0px 10px; + min-width: 25px; + line-height: 42px; +} + +h3.header { + text-align: center; + margin: 20px 0px 5px 0px; + line-height: 32px; +} + + diff --git a/Output/Dhtml/default.htm b/Output/Dhtml/default.htm new file mode 100644 index 000000000..3e777c9dc --- /dev/null +++ b/Output/Dhtml/default.htm @@ -0,0 +1,554 @@ + + + + + + Features + + + + + + + + + + + + + + +
      + Loading... +
      + + + + + + + + + + + + +
      +
      +
      +
      +
      +
      +
      +
      + +
      + + +
      + +
      Generated on:
      +
      +
      +
      + +
      +
      +
      +
      + + + + +
      +

      +
      +
      + +
      +
      +
      +

      Background:

      +
      +
        +
        +
        + +
        +
        + + + + + +
        + +
        +
        + +
        +

        +
        +
        + +
        + +
          + +
            +
          • +
            + + + + + + +
            +
            + : +
            +
            +
            +
          • +
          + +
          + + + Get Link for Scenario + +
          +
          +
          + + +
          + + +
          +
          + + + +
          + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Output/Dhtml/image.png b/Output/Dhtml/image.png new file mode 100644 index 000000000..44c4d7209 Binary files /dev/null and b/Output/Dhtml/image.png differ diff --git a/Output/Dhtml/img/glyphicons-halflings-white.png b/Output/Dhtml/img/glyphicons-halflings-white.png new file mode 100644 index 000000000..a001c35f8 Binary files /dev/null and b/Output/Dhtml/img/glyphicons-halflings-white.png differ diff --git a/Output/Dhtml/img/glyphicons-halflings.png b/Output/Dhtml/img/glyphicons-halflings.png new file mode 100644 index 000000000..f15c257ee Binary files /dev/null and b/Output/Dhtml/img/glyphicons-halflings.png differ diff --git a/Output/Dhtml/img/link.png b/Output/Dhtml/img/link.png new file mode 100644 index 000000000..68fc43b7c Binary files /dev/null and b/Output/Dhtml/img/link.png differ diff --git a/Output/Dhtml/js/Chart.StackedBar.js b/Output/Dhtml/js/Chart.StackedBar.js new file mode 100644 index 000000000..a452f04a2 --- /dev/null +++ b/Output/Dhtml/js/Chart.StackedBar.js @@ -0,0 +1,556 @@ +(function (factory) { + "use strict"; + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['chart.js'], factory); + } else if (typeof exports === 'object') { + // Node/CommonJS + module.exports = factory(require('chart.js')); + } else { + // Global browser + factory(Chart); + } +}(function (Chart) { + "use strict"; + + var helpers = Chart.helpers; + + var defaultConfig = { + scaleBeginAtZero : true, + + //Boolean - Whether grid lines are shown across the chart + scaleShowGridLines : true, + + //String - Colour of the grid lines + scaleGridLineColor : "rgba(0,0,0,.05)", + + //Number - Width of the grid lines + scaleGridLineWidth : 1, + + //Boolean - Whether to show horizontal lines (except X axis) + scaleShowHorizontalLines: true, + + //Boolean - Whether to show vertical lines (except Y axis) + scaleShowVerticalLines: true, + + //Boolean - If there is a stroke on each bar + barShowStroke : true, + + //Number - Pixel width of the bar stroke + barStrokeWidth : 2, + + //Number - Spacing between each of the X value sets + barValueSpacing : 5, + + //Boolean - Whether bars should be rendered on a percentage base + relativeBars : false, + + //String - A legend template + legendTemplate : "
            -legend\"><% for (var i=0; i
          • \"><%if(datasets[i].label){%><%=datasets[i].label%><%}%>
          • <%}%>
          ", + + //Boolean - Show total legend + showTotal: false, + + //String - Color of total legend + totalColor: '#fff', + + //String - Total Label + totalLabel: 'Total', + + //Boolean - Hide labels with value set to 0 + tooltipHideZero: false + }; + + Chart.Type.extend({ + name: "StackedBar", + defaults : defaultConfig, + initialize: function(data){ + //Expose options as a scope variable here so we can access it in the ScaleClass + var options = this.options; + + // Save data as a source for updating of values & methods + this.data = data; + + this.ScaleClass = Chart.Scale.extend({ + offsetGridLines : true, + calculateBarX : function(barIndex){ + return this.calculateX(barIndex); + }, + calculateBarY : function(datasets, dsIndex, barIndex, value){ + var offset = 0, + sum = 0; + + for(var i = 0; i < datasets.length; i++) { + sum += datasets[i].bars[barIndex].value; + } + for(i = dsIndex; i < datasets.length; i++) { + if(i === dsIndex && value) { + offset += value; + } else { + offset = +offset + +datasets[i].bars[barIndex].value; + } + } + + if(options.relativeBars) { + offset = offset / sum * 100; + } + + return this.calculateY(offset); + }, + calculateBaseWidth : function(){ + return (this.calculateX(1) - this.calculateX(0)) - (2*options.barValueSpacing); + }, + calculateBaseHeight : function(){ + return (this.calculateY(1) - this.calculateY(0)); + }, + calculateBarWidth : function(datasetCount){ + //The padding between datasets is to the right of each bar, providing that there are more than 1 dataset + return this.calculateBaseWidth(); + }, + calculateBarHeight : function(datasets, dsIndex, barIndex, value) { + var sum = 0; + + for(var i = 0; i < datasets.length; i++) { + sum += datasets[i].bars[barIndex].value; + } + + if(!value) { + value = datasets[dsIndex].bars[barIndex].value; + } + + if(options.relativeBars) { + value = value / sum * 100; + } + + return this.calculateY(value); + } + }); + + this.datasets = []; + + //Set up tooltip events on the chart + if (this.options.showTooltips){ + helpers.bindEvents(this, this.options.tooltipEvents, function(evt){ + var activeBars = (evt.type !== 'mouseout') ? this.getBarsAtEvent(evt) : []; + + this.eachBars(function(bar){ + bar.restore(['fillColor', 'strokeColor']); + }); + helpers.each(activeBars, function(activeBar){ + activeBar.fillColor = activeBar.highlightFill; + activeBar.strokeColor = activeBar.highlightStroke; + }); + this.showTooltip(activeBars); + }); + } + + //Declare the extension of the default point, to cater for the options passed in to the constructor + this.BarClass = Chart.Rectangle.extend({ + strokeWidth : this.options.barStrokeWidth, + showStroke : this.options.barShowStroke, + ctx : this.chart.ctx + }); + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(data.datasets,function(dataset,datasetIndex){ + + var datasetObject = { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + bars : [] + }; + + this.datasets.push(datasetObject); + + helpers.each(dataset.data,function(dataPoint,index){ + if(!helpers.isNumber(dataPoint)){ + dataPoint = 0; + } + //Add a new point for each piece of data, passing any required data to draw. + //Add 0 as value if !isNumber (e.g. empty values are useful when 0 values should be hidden in tooltip) + datasetObject.bars.push(new this.BarClass({ + value : dataPoint, + label : data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.strokeColor, + fillColor : dataset.fillColor, + highlightFill : dataset.highlightFill || dataset.fillColor, + highlightStroke : dataset.highlightStroke || dataset.strokeColor + })); + },this); + + },this); + + this.buildScale(data.labels); + + this.eachBars(function(bar, index, datasetIndex){ + helpers.extend(bar, { + base: this.scale.endPoint, + height: 0, + width : this.scale.calculateBarWidth(this.datasets.length), + x: this.scale.calculateBarX(index), + y: this.scale.endPoint + }); + bar.save(); + }, this); + + this.render(); + }, + showTooltip : function(ChartElements, forceRedraw){ + // Only redraw the chart if we've actually changed what we're hovering on. + if (typeof this.activeElements === 'undefined') this.activeElements = []; + + helpers = Chart.helpers; + + var isChanged = (function(Elements){ + var changed = false; + + if (Elements.length !== this.activeElements.length){ + changed = true; + return changed; + } + + helpers.each(Elements, function(element, index){ + if (element !== this.activeElements[index]){ + changed = true; + } + }, this); + return changed; + }).call(this, ChartElements); + + if (!isChanged && !forceRedraw){ + return; + } + else{ + this.activeElements = ChartElements; + } + this.draw(); + if(this.options.customTooltips){ + this.options.customTooltips(false); + } + if (ChartElements.length > 0){ + // If we have multiple datasets, show a MultiTooltip for all of the data points at that index + if (this.datasets && this.datasets.length > 1) { + var dataArray, + dataIndex; + + for (var i = this.datasets.length - 1; i >= 0; i--) { + dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments; + dataIndex = helpers.indexOf(dataArray, ChartElements[0]); + if (dataIndex !== -1){ + break; + } + } + var tooltipLabels = [], + tooltipColors = [], + medianPosition = (function(index) { + + // Get all the points at that particular index + var Elements = [], + dataCollection, + xPositions = [], + yPositions = [], + xMax, + yMax, + xMin, + yMin; + helpers.each(this.datasets, function(dataset){ + dataCollection = dataset.points || dataset.bars || dataset.segments; + if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue()){ + Elements.push(dataCollection[dataIndex]); + } + }); + + var total = { + datasetLabel: this.options.totalLabel, + value: 0, + fillColor: this.options.totalColor, + strokeColor: this.options.totalColor + }; + + helpers.each(Elements, function(element) { + if (this.options.tooltipHideZero && element.value === 0) { + return; + } + + xPositions.push(element.x); + yPositions.push(element.y); + + total.value += element.value; + + //Include any colour information about the element + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element)); + tooltipColors.push({ + fill: element._saved.fillColor || element.fillColor, + stroke: element._saved.strokeColor || element.strokeColor + }); + + }, this); + + if (this.options.showTotal) { + tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, total)); + tooltipColors.push({ + fill: total.fillColor, + stroke: total.strokeColor + }); + } + + yMin = helpers.min(yPositions); + yMax = helpers.max(yPositions); + + xMin = helpers.min(xPositions); + xMax = helpers.max(xPositions); + + return { + x: (xMin > this.chart.width/2) ? xMin : xMax, + y: (yMin + yMax)/2 + }; + }).call(this, dataIndex); + + new Chart.MultiTooltip({ + x: medianPosition.x, + y: medianPosition.y, + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + xOffset: this.options.tooltipXOffset, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + titleTextColor: this.options.tooltipTitleFontColor, + titleFontFamily: this.options.tooltipTitleFontFamily, + titleFontStyle: this.options.tooltipTitleFontStyle, + titleFontSize: this.options.tooltipTitleFontSize, + cornerRadius: this.options.tooltipCornerRadius, + labels: tooltipLabels, + legendColors: tooltipColors, + legendColorBackground : this.options.multiTooltipKeyBackground, + title: ChartElements[0].label, + chart: this.chart, + ctx: this.chart.ctx, + custom: this.options.customTooltips + }).draw(); + + } else { + helpers.each(ChartElements, function(Element) { + var tooltipPosition = Element.tooltipPosition(); + new Chart.Tooltip({ + x: Math.round(tooltipPosition.x), + y: Math.round(tooltipPosition.y), + xPadding: this.options.tooltipXPadding, + yPadding: this.options.tooltipYPadding, + fillColor: this.options.tooltipFillColor, + textColor: this.options.tooltipFontColor, + fontFamily: this.options.tooltipFontFamily, + fontStyle: this.options.tooltipFontStyle, + fontSize: this.options.tooltipFontSize, + caretHeight: this.options.tooltipCaretSize, + cornerRadius: this.options.tooltipCornerRadius, + text: helpers.template(this.options.tooltipTemplate, Element), + chart: this.chart, + custom: this.options.customTooltips + }).draw(); + }, this); + } + } + return this; + }, + update : function(){ + + //Iterate through each of the datasets, and build this into a property of the chart + helpers.each(this.datasets,function(dataset,datasetIndex){ + + helpers.extend(this.datasets[datasetIndex], { + label : dataset.label || null, + fillColor : dataset.fillColor, + strokeColor : dataset.strokeColor, + }); + + helpers.each(dataset.data,function(dataPoint,index){ + helpers.extend(this.datasets[datasetIndex].bars[index], { + value : dataPoint, + label : this.data.labels[index], + datasetLabel: dataset.label, + strokeColor : dataset.strokeColor, + fillColor : dataset.fillColor, + highlightFill : dataset.highlightFill || dataset.fillColor, + highlightStroke : dataset.highlightStroke || dataset.strokeColor + }); + },this); + + },this); + + + this.scale.update(); + // Reset any highlight colours before updating. + helpers.each(this.activeElements, function(activeElement){ + activeElement.restore(['fillColor', 'strokeColor']); + }); + + this.eachBars(function(bar){ + bar.save(); + }); + this.render(); + }, + eachBars : function(callback){ + helpers.each(this.datasets,function(dataset, datasetIndex){ + helpers.each(dataset.bars, callback, this, datasetIndex); + },this); + }, + getBarsAtEvent : function(e){ + var barsArray = [], + eventPosition = helpers.getRelativePosition(e), + datasetIterator = function(dataset){ + barsArray.push(dataset.bars[barIndex]); + }, + barIndex; + + for (var datasetIndex = 0; datasetIndex < this.datasets.length; datasetIndex++) { + for (barIndex = 0; barIndex < this.datasets[datasetIndex].bars.length; barIndex++) { + if (this.datasets[datasetIndex].bars[barIndex].inRange(eventPosition.x,eventPosition.y)){ + helpers.each(this.datasets, datasetIterator); + return barsArray; + } + } + } + + return barsArray; + }, + buildScale : function(labels){ + var self = this; + + var dataTotal = function(){ + var values = []; + helpers.each(self.datasets, function(dataset) { + helpers.each(dataset.bars, function(bar, barIndex) { + if(!values[barIndex]) values[barIndex] = 0; + if(self.options.relativeBars) { + values[barIndex] = 100; + } else { + values[barIndex] = +values[barIndex] + +bar.value; + } + }); + }); + return values; + }; + + var scaleOptions = { + templateString : this.options.scaleLabel, + height : this.chart.height, + width : this.chart.width, + ctx : this.chart.ctx, + textColor : this.options.scaleFontColor, + fontSize : this.options.scaleFontSize, + fontStyle : this.options.scaleFontStyle, + fontFamily : this.options.scaleFontFamily, + valuesCount : labels.length, + beginAtZero : this.options.scaleBeginAtZero, + integersOnly : this.options.scaleIntegersOnly, + calculateYRange: function(currentHeight){ + var updatedRanges = helpers.calculateScaleRange( + dataTotal(), + currentHeight, + this.fontSize, + this.beginAtZero, + this.integersOnly + ); + helpers.extend(this, updatedRanges); + }, + xLabels : this.options.xLabels || labels, + font : helpers.fontString(this.options.scaleFontSize, this.options.scaleFontStyle, this.options.scaleFontFamily), + lineWidth : this.options.scaleLineWidth, + lineColor : this.options.scaleLineColor, + gridLineWidth : (this.options.scaleShowGridLines) ? this.options.scaleGridLineWidth : 0, + gridLineColor : (this.options.scaleShowGridLines) ? this.options.scaleGridLineColor : "rgba(0,0,0,0)", + showHorizontalLines : this.options.scaleShowHorizontalLines, + showVerticalLines : this.options.scaleShowVerticalLines, + padding : (this.options.showScale) ? 0 : (this.options.barShowStroke) ? this.options.barStrokeWidth : 0, + showLabels : this.options.scaleShowLabels, + display : this.options.showScale + }; + + if (this.options.scaleOverride){ + helpers.extend(scaleOptions, { + calculateYRange: helpers.noop, + steps: this.options.scaleSteps, + stepValue: this.options.scaleStepWidth, + min: this.options.scaleStartValue, + max: this.options.scaleStartValue + (this.options.scaleSteps * this.options.scaleStepWidth) + }); + } + + this.scale = new this.ScaleClass(scaleOptions); + }, + addData : function(valuesArray,label){ + //Map the values array for each of the datasets + helpers.each(valuesArray,function(value,datasetIndex){ + if (helpers.isNumber(value)){ + //Add a new point for each piece of data, passing any required data to draw. + //Add 0 as value if !isNumber (e.g. empty values are useful when 0 values should be hidden in tooltip) + this.datasets[datasetIndex].bars.push(new this.BarClass({ + value : helpers.isNumber(value)?value:0, + label : label, + x: this.scale.calculateBarX(this.scale.valuesCount+1), + y: this.scale.endPoint, + width : this.scale.calculateBarWidth(this.datasets.length), + base : this.scale.endPoint, + strokeColor : this.datasets[datasetIndex].strokeColor, + fillColor : this.datasets[datasetIndex].fillColor + })); + } + },this); + + this.scale.addXLabel(label); + //Then re-render the chart. + this.update(); + }, + removeData : function(){ + this.scale.removeXLabel(); + //Then re-render the chart. + helpers.each(this.datasets,function(dataset){ + dataset.bars.shift(); + },this); + this.update(); + }, + reflow : function(){ + helpers.extend(this.BarClass.prototype,{ + y: this.scale.endPoint, + base : this.scale.endPoint + }); + var newScaleProps = helpers.extend({ + height : this.chart.height, + width : this.chart.width + }); + this.scale.update(newScaleProps); + }, + draw : function(ease){ + var easingDecimal = ease || 1; + this.clear(); + + var ctx = this.chart.ctx; + + this.scale.draw(easingDecimal); + + //Draw all the bars for each dataset + helpers.each(this.datasets,function(dataset,datasetIndex){ + helpers.each(dataset.bars,function(bar,index){ + var y = this.scale.calculateBarY(this.datasets, datasetIndex, index, bar.value), + height = this.scale.calculateBarHeight(this.datasets, datasetIndex, index, bar.value); + + //Transition then draw + if(bar.value > 0) { + bar.transition({ + base : this.scale.endPoint - (Math.abs(height) - Math.abs(y)), + x : this.scale.calculateBarX(index), + y : Math.abs(y), + height : Math.abs(height), + width : this.scale.calculateBarWidth(this.datasets.length) + }, easingDecimal).draw(); + } + },this); + },this); + } + }); +})); diff --git a/Output/Dhtml/js/Chart.min.js b/Output/Dhtml/js/Chart.min.js new file mode 100644 index 000000000..bde9b0668 --- /dev/null +++ b/Output/Dhtml/js/Chart.min.js @@ -0,0 +1,11 @@ +/*! + * Chart.js + * http://chartjs.org/ + * Version: 1.0.2 + * + * Copyright 2015 Nick Downie + * Released under the MIT license + * https://github.com/nnnick/Chart.js/blob/master/LICENSE.md + */ +(function(){"use strict";var t=this,i=t.Chart,e=function(t){this.canvas=t.canvas,this.ctx=t;var i=function(t,i){return t["offset"+i]?t["offset"+i]:document.defaultView.getComputedStyle(t).getPropertyValue(i)},e=this.width=i(t.canvas,"Width")||t.canvas.width,n=this.height=i(t.canvas,"Height")||t.canvas.height;return e=this.width=t.canvas.width,n=this.height=t.canvas.height,this.aspectRatio=this.width/this.height,s.retinaScale(this),this};e.defaults={global:{animation:!0,animationSteps:60,animationEasing:"easeOutQuart",showScale:!0,scaleOverride:!1,scaleSteps:null,scaleStepWidth:null,scaleStartValue:null,scaleLineColor:"rgba(0,0,0,.1)",scaleLineWidth:1,scaleShowLabels:!0,scaleLabel:"<%=value%>",scaleIntegersOnly:!0,scaleBeginAtZero:!1,scaleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",scaleFontSize:12,scaleFontStyle:"normal",scaleFontColor:"#666",responsive:!1,maintainAspectRatio:!0,showTooltips:!0,customTooltips:!1,tooltipEvents:["mousemove","touchstart","touchmove","mouseout"],tooltipFillColor:"rgba(0,0,0,0.8)",tooltipFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipFontSize:14,tooltipFontStyle:"normal",tooltipFontColor:"#fff",tooltipTitleFontFamily:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",tooltipTitleFontSize:14,tooltipTitleFontStyle:"bold",tooltipTitleFontColor:"#fff",tooltipTitleTemplate:"<%= label%>",tooltipYPadding:6,tooltipXPadding:6,tooltipCaretSize:8,tooltipCornerRadius:6,tooltipXOffset:10,tooltipTemplate:"<%if (label){%><%=label%>: <%}%><%= value %>",multiTooltipTemplate:"<%= datasetLabel %>: <%= value %>",multiTooltipKeyBackground:"#fff",segmentColorDefault:["#A6CEE3","#1F78B4","#B2DF8A","#33A02C","#FB9A99","#E31A1C","#FDBF6F","#FF7F00","#CAB2D6","#6A3D9A","#B4B482","#B15928"],segmentHighlightColorDefaults:["#CEF6FF","#47A0DC","#DAFFB2","#5BC854","#FFC2C1","#FF4244","#FFE797","#FFA728","#F2DAFE","#9265C2","#DCDCAA","#D98150"],onAnimationProgress:function(){},onAnimationComplete:function(){}}},e.types={};var s=e.helpers={},n=s.each=function(t,i,e){var s=Array.prototype.slice.call(arguments,3);if(t)if(t.length===+t.length){var n;for(n=0;n=0;s--){var n=t[s];if(i(n))return n}},s.inherits=function(t){var i=this,e=t&&t.hasOwnProperty("constructor")?t.constructor:function(){return i.apply(this,arguments)},s=function(){this.constructor=e};return s.prototype=i.prototype,e.prototype=new s,e.extend=r,t&&a(e.prototype,t),e.__super__=i.prototype,e}),c=s.noop=function(){},u=s.uid=function(){var t=0;return function(){return"chart-"+t++}}(),d=s.warn=function(t){window.console&&"function"==typeof window.console.warn&&console.warn(t)},p=s.amd="function"==typeof define&&define.amd,f=s.isNumber=function(t){return!isNaN(parseFloat(t))&&isFinite(t)},g=s.max=function(t){return Math.max.apply(Math,t)},m=s.min=function(t){return Math.min.apply(Math,t)},v=(s.cap=function(t,i,e){if(f(i)){if(t>i)return i}else if(f(e)&&e>t)return e;return t},s.getDecimalPlaces=function(t){if(t%1!==0&&f(t)){var i=t.toString();if(i.indexOf("e-")<0)return i.split(".")[1].length;if(i.indexOf(".")<0)return parseInt(i.split("e-")[1]);var e=i.split(".")[1].split("e-");return e[0].length+parseInt(e[1])}return 0}),S=s.radians=function(t){return t*(Math.PI/180)},x=(s.getAngleFromPoint=function(t,i){var e=i.x-t.x,s=i.y-t.y,n=Math.sqrt(e*e+s*s),o=2*Math.PI+Math.atan2(s,e);return 0>e&&0>s&&(o+=2*Math.PI),{angle:o,distance:n}},s.aliasPixel=function(t){return t%2===0?0:.5}),y=(s.splineCurve=function(t,i,e,s){var n=Math.sqrt(Math.pow(i.x-t.x,2)+Math.pow(i.y-t.y,2)),o=Math.sqrt(Math.pow(e.x-i.x,2)+Math.pow(e.y-i.y,2)),a=s*n/(n+o),h=s*o/(n+o);return{inner:{x:i.x-a*(e.x-t.x),y:i.y-a*(e.y-t.y)},outer:{x:i.x+h*(e.x-t.x),y:i.y+h*(e.y-t.y)}}},s.calculateOrderOfMagnitude=function(t){return Math.floor(Math.log(t)/Math.LN10)}),C=(s.calculateScaleRange=function(t,i,e,s,o){var a=2,h=Math.floor(i/(1.5*e)),l=a>=h,r=[];n(t,function(t){null==t||r.push(t)});var c=m(r),u=g(r);u===c&&(u+=.5,c>=.5&&!s?c-=.5:u+=.5);for(var d=Math.abs(u-c),p=y(d),f=Math.ceil(u/(1*Math.pow(10,p)))*Math.pow(10,p),v=s?0:Math.floor(c/(1*Math.pow(10,p)))*Math.pow(10,p),S=f-v,x=Math.pow(10,p),C=Math.round(S/x);(C>h||h>2*C)&&!l;)if(C>h)x*=2,C=Math.round(S/x),C%1!==0&&(l=!0);else if(o&&p>=0){if(x/2%1!==0)break;x/=2,C=Math.round(S/x)}else x/=2,C=Math.round(S/x);return l&&(C=a,x=S/C),{steps:C,stepValue:x,min:v,max:v+C*x}},s.template=function(t,i){function e(t,i){var e=/\W/.test(t)?new Function("obj","var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('"+t.replace(/[\r\t\n]/g," ").split("<%").join(" ").replace(/((^|%>)[^\t]*)'/g,"$1\r").replace(/\t=(.*?)%>/g,"',$1,'").split(" ").join("');").split("%>").join("p.push('").split("\r").join("\\'")+"');}return p.join('');"):s[t]=s[t];return i?e(i):e}if(t instanceof Function)return t(i);var s={};return e(t,i)}),b=(s.generateLabels=function(t,i,e,s){var o=new Array(i);return t&&n(o,function(i,n){o[n]=C(t,{value:e+s*(n+1)})}),o},s.easingEffects={linear:function(t){return t},easeInQuad:function(t){return t*t},easeOutQuad:function(t){return-1*t*(t-2)},easeInOutQuad:function(t){return(t/=.5)<1?.5*t*t:-0.5*(--t*(t-2)-1)},easeInCubic:function(t){return t*t*t},easeOutCubic:function(t){return 1*((t=t/1-1)*t*t+1)},easeInOutCubic:function(t){return(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},easeInQuart:function(t){return t*t*t*t},easeOutQuart:function(t){return-1*((t=t/1-1)*t*t*t-1)},easeInOutQuart:function(t){return(t/=.5)<1?.5*t*t*t*t:-0.5*((t-=2)*t*t*t-2)},easeInQuint:function(t){return 1*(t/=1)*t*t*t*t},easeOutQuint:function(t){return 1*((t=t/1-1)*t*t*t*t+1)},easeInOutQuint:function(t){return(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},easeInSine:function(t){return-1*Math.cos(t/1*(Math.PI/2))+1},easeOutSine:function(t){return 1*Math.sin(t/1*(Math.PI/2))},easeInOutSine:function(t){return-0.5*(Math.cos(Math.PI*t/1)-1)},easeInExpo:function(t){return 0===t?1:1*Math.pow(2,10*(t/1-1))},easeOutExpo:function(t){return 1===t?1:1*(-Math.pow(2,-10*t/1)+1)},easeInOutExpo:function(t){return 0===t?0:1===t?1:(t/=.5)<1?.5*Math.pow(2,10*(t-1)):.5*(-Math.pow(2,-10*--t)+2)},easeInCirc:function(t){return t>=1?t:-1*(Math.sqrt(1-(t/=1)*t)-1)},easeOutCirc:function(t){return 1*Math.sqrt(1-(t=t/1-1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-0.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){var i=1.70158,e=0,s=1;return 0===t?0:1==(t/=1)?1:(e||(e=.3),st?-.5*(s*Math.pow(2,10*(t-=1))*Math.sin((1*t-i)*(2*Math.PI)/e)):s*Math.pow(2,-10*(t-=1))*Math.sin((1*t-i)*(2*Math.PI)/e)*.5+1)},easeInBack:function(t){var i=1.70158;return 1*(t/=1)*t*((i+1)*t-i)},easeOutBack:function(t){var i=1.70158;return 1*((t=t/1-1)*t*((i+1)*t+i)+1)},easeInOutBack:function(t){var i=1.70158;return(t/=.5)<1?.5*(t*t*(((i*=1.525)+1)*t-i)):.5*((t-=2)*t*(((i*=1.525)+1)*t+i)+2)},easeInBounce:function(t){return 1-b.easeOutBounce(1-t)},easeOutBounce:function(t){return(t/=1)<1/2.75?1*(7.5625*t*t):2/2.75>t?1*(7.5625*(t-=1.5/2.75)*t+.75):2.5/2.75>t?1*(7.5625*(t-=2.25/2.75)*t+.9375):1*(7.5625*(t-=2.625/2.75)*t+.984375)},easeInOutBounce:function(t){return.5>t?.5*b.easeInBounce(2*t):.5*b.easeOutBounce(2*t-1)+.5}}),w=s.requestAnimFrame=function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(t){return window.setTimeout(t,1e3/60)}}(),P=(s.cancelAnimFrame=function(){return window.cancelAnimationFrame||window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||window.oCancelAnimationFrame||window.msCancelAnimationFrame||function(t){return window.clearTimeout(t,1e3/60)}}(),s.animationLoop=function(t,i,e,s,n,o){var a=0,h=b[e]||b.linear,l=function(){a++;var e=a/i,r=h(e);t.call(o,r,e,a),s.call(o,r,e),i>a?o.animationFrame=w(l):n.apply(o)};w(l)},s.getRelativePosition=function(t){var i,e,s=t.originalEvent||t,n=t.currentTarget||t.srcElement,o=n.getBoundingClientRect();return s.touches?(i=s.touches[0].clientX-o.left,e=s.touches[0].clientY-o.top):(i=s.clientX-o.left,e=s.clientY-o.top),{x:i,y:e}},s.addEvent=function(t,i,e){t.addEventListener?t.addEventListener(i,e):t.attachEvent?t.attachEvent("on"+i,e):t["on"+i]=e}),L=s.removeEvent=function(t,i,e){t.removeEventListener?t.removeEventListener(i,e,!1):t.detachEvent?t.detachEvent("on"+i,e):t["on"+i]=c},k=(s.bindEvents=function(t,i,e){t.events||(t.events={}),n(i,function(i){t.events[i]=function(){e.apply(t,arguments)},P(t.chart.canvas,i,t.events[i])})},s.unbindEvents=function(t,i){n(i,function(i,e){L(t.chart.canvas,e,i)})}),F=s.getMaximumWidth=function(t){var i=t.parentNode,e=parseInt(R(i,"padding-left"))+parseInt(R(i,"padding-right"));return i?i.clientWidth-e:0},A=s.getMaximumHeight=function(t){var i=t.parentNode,e=parseInt(R(i,"padding-bottom"))+parseInt(R(i,"padding-top"));return i?i.clientHeight-e:0},R=s.getStyle=function(t,i){return t.currentStyle?t.currentStyle[i]:document.defaultView.getComputedStyle(t,null).getPropertyValue(i)},T=(s.getMaximumSize=s.getMaximumWidth,s.retinaScale=function(t){var i=t.ctx,e=t.canvas.width,s=t.canvas.height;window.devicePixelRatio&&(i.canvas.style.width=e+"px",i.canvas.style.height=s+"px",i.canvas.height=s*window.devicePixelRatio,i.canvas.width=e*window.devicePixelRatio,i.scale(window.devicePixelRatio,window.devicePixelRatio))}),M=s.clear=function(t){t.ctx.clearRect(0,0,t.width,t.height)},W=s.fontString=function(t,i,e){return i+" "+t+"px "+e},z=s.longestText=function(t,i,e){t.font=i;var s=0;return n(e,function(i){var e=t.measureText(i).width;s=e>s?e:s}),s},B=s.drawRoundedRectangle=function(t,i,e,s,n,o){t.beginPath(),t.moveTo(i+o,e),t.lineTo(i+s-o,e),t.quadraticCurveTo(i+s,e,i+s,e+o),t.lineTo(i+s,e+n-o),t.quadraticCurveTo(i+s,e+n,i+s-o,e+n),t.lineTo(i+o,e+n),t.quadraticCurveTo(i,e+n,i,e+n-o),t.lineTo(i,e+o),t.quadraticCurveTo(i,e,i+o,e),t.closePath()};e.instances={},e.Type=function(t,i,s){this.options=i,this.chart=s,this.id=u(),e.instances[this.id]=this,i.responsive&&this.resize(),this.initialize.call(this,t)},a(e.Type.prototype,{initialize:function(){return this},clear:function(){return M(this.chart),this},stop:function(){return e.animationService.cancelAnimation(this),this},resize:function(t){this.stop();var i=this.chart.canvas,e=F(this.chart.canvas),s=this.options.maintainAspectRatio?e/this.chart.aspectRatio:A(this.chart.canvas);return i.width=this.chart.width=e,i.height=this.chart.height=s,T(this.chart),"function"==typeof t&&t.apply(this,Array.prototype.slice.call(arguments,1)),this},reflow:c,render:function(t){if(t&&this.reflow(),this.options.animation&&!t){var i=new e.Animation;i.numSteps=this.options.animationSteps,i.easing=this.options.animationEasing,i.render=function(t,i){var e=s.easingEffects[i.easing],n=i.currentStep/i.numSteps,o=e(n);t.draw(o,n,i.currentStep)},i.onAnimationProgress=this.options.onAnimationProgress,i.onAnimationComplete=this.options.onAnimationComplete,e.animationService.addAnimation(this,i)}else this.draw(),this.options.onAnimationComplete.call(this);return this},generateLegend:function(){return C(this.options.legendTemplate,this)},destroy:function(){this.clear(),k(this,this.events);var t=this.chart.canvas;t.width=this.chart.width,t.height=this.chart.height,t.style.removeProperty?(t.style.removeProperty("width"),t.style.removeProperty("height")):(t.style.removeAttribute("width"),t.style.removeAttribute("height")),delete e.instances[this.id]},showTooltip:function(t,i){"undefined"==typeof this.activeElements&&(this.activeElements=[]);var o=function(t){var i=!1;return t.length!==this.activeElements.length?i=!0:(n(t,function(t,e){t!==this.activeElements[e]&&(i=!0)},this),i)}.call(this,t);if(o||i){if(this.activeElements=t,this.draw(),this.options.customTooltips&&this.options.customTooltips(!1),t.length>0)if(this.datasets&&this.datasets.length>1){for(var a,h,r=this.datasets.length-1;r>=0&&(a=this.datasets[r].points||this.datasets[r].bars||this.datasets[r].segments,h=l(a,t[0]),-1===h);r--);var c=[],u=[],d=function(t){var i,e,n,o,a,l=[],r=[],d=[];return s.each(this.datasets,function(t){i=t.points||t.bars||t.segments,i[h]&&i[h].hasValue()&&l.push(i[h])}),s.each(l,function(t){r.push(t.x),d.push(t.y),c.push(s.template(this.options.multiTooltipTemplate,t)),u.push({fill:t._saved.fillColor||t.fillColor,stroke:t._saved.strokeColor||t.strokeColor})},this),a=m(d),n=g(d),o=m(r),e=g(r),{x:o>this.chart.width/2?o:e,y:(a+n)/2}}.call(this,h);new e.MultiTooltip({x:d.x,y:d.y,xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,xOffset:this.options.tooltipXOffset,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,titleTextColor:this.options.tooltipTitleFontColor,titleFontFamily:this.options.tooltipTitleFontFamily,titleFontStyle:this.options.tooltipTitleFontStyle,titleFontSize:this.options.tooltipTitleFontSize,cornerRadius:this.options.tooltipCornerRadius,labels:c,legendColors:u,legendColorBackground:this.options.multiTooltipKeyBackground,title:C(this.options.tooltipTitleTemplate,t[0]),chart:this.chart,ctx:this.chart.ctx,custom:this.options.customTooltips}).draw()}else n(t,function(t){var i=t.tooltipPosition();new e.Tooltip({x:Math.round(i.x),y:Math.round(i.y),xPadding:this.options.tooltipXPadding,yPadding:this.options.tooltipYPadding,fillColor:this.options.tooltipFillColor,textColor:this.options.tooltipFontColor,fontFamily:this.options.tooltipFontFamily,fontStyle:this.options.tooltipFontStyle,fontSize:this.options.tooltipFontSize,caretHeight:this.options.tooltipCaretSize,cornerRadius:this.options.tooltipCornerRadius,text:C(this.options.tooltipTemplate,t),chart:this.chart,custom:this.options.customTooltips}).draw()},this);return this}},toBase64Image:function(){return this.chart.canvas.toDataURL.apply(this.chart.canvas,arguments)}}),e.Type.extend=function(t){var i=this,s=function(){return i.apply(this,arguments)};if(s.prototype=o(i.prototype),a(s.prototype,t),s.extend=e.Type.extend,t.name||i.prototype.name){var n=t.name||i.prototype.name,l=e.defaults[i.prototype.name]?o(e.defaults[i.prototype.name]):{};e.defaults[n]=a(l,t.defaults),e.types[n]=s,e.prototype[n]=function(t,i){var o=h(e.defaults.global,e.defaults[n],i||{});return new s(t,o,this)}}else d("Name not provided for this chart, so it hasn't been registered");return i},e.Element=function(t){a(this,t),this.initialize.apply(this,arguments),this.save()},a(e.Element.prototype,{initialize:function(){},restore:function(t){return t?n(t,function(t){this[t]=this._saved[t]},this):a(this,this._saved),this},save:function(){return this._saved=o(this),delete this._saved._saved,this},update:function(t){return n(t,function(t,i){this._saved[i]=this[i],this[i]=t},this),this},transition:function(t,i){return n(t,function(t,e){this[e]=(t-this._saved[e])*i+this._saved[e]},this),this},tooltipPosition:function(){return{x:this.x,y:this.y}},hasValue:function(){return f(this.value)}}),e.Element.extend=r,e.Point=e.Element.extend({display:!0,inRange:function(t,i){var e=this.hitDetectionRadius+this.radius;return Math.pow(t-this.x,2)+Math.pow(i-this.y,2)a?a>=n||n>=o:n>=o&&a>=n,l=e.distance>=this.innerRadius&&e.distance<=this.outerRadius;return h&&l},tooltipPosition:function(){var t=this.startAngle+(this.endAngle-this.startAngle)/2,i=(this.outerRadius-this.innerRadius)/2+this.innerRadius;return{x:this.x+Math.cos(t)*i,y:this.y+Math.sin(t)*i}},draw:function(t){var i=this.ctx;i.beginPath(),i.arc(this.x,this.y,this.outerRadius<0?0:this.outerRadius,this.startAngle,this.endAngle),i.arc(this.x,this.y,this.innerRadius<0?0:this.innerRadius,this.endAngle,this.startAngle,!0),i.closePath(),i.strokeStyle=this.strokeColor,i.lineWidth=this.strokeWidth,i.fillStyle=this.fillColor,i.fill(),i.lineJoin="bevel",this.showStroke&&i.stroke()}}),e.Rectangle=e.Element.extend({draw:function(){var t=this.ctx,i=this.width/2,e=this.x-i,s=this.x+i,n=this.base-(this.base-this.y),o=this.strokeWidth/2;this.showStroke&&(e+=o,s-=o,n+=o),t.beginPath(),t.fillStyle=this.fillColor,t.strokeStyle=this.strokeColor,t.lineWidth=this.strokeWidth,t.moveTo(e,this.base),t.lineTo(e,n),t.lineTo(s,n),t.lineTo(s,this.base),t.fill(),this.showStroke&&t.stroke()},height:function(){return this.base-this.y},inRange:function(t,i){return t>=this.x-this.width/2&&t<=this.x+this.width/2&&i>=this.y&&i<=this.base}}),e.Animation=e.Element.extend({currentStep:null,numSteps:60,easing:"",render:null,onAnimationProgress:null,onAnimationComplete:null}),e.Tooltip=e.Element.extend({draw:function(){var t=this.chart.ctx;t.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.xAlign="center",this.yAlign="above";var i=this.caretPadding=2,e=t.measureText(this.text).width+2*this.xPadding,s=this.fontSize+2*this.yPadding,n=s+this.caretHeight+i;this.x+e/2>this.chart.width?this.xAlign="left":this.x-e/2<0&&(this.xAlign="right"),this.y-n<0&&(this.yAlign="below");var o=this.x-e/2,a=this.y-n;if(t.fillStyle=this.fillColor,this.custom)this.custom(this);else{switch(this.yAlign){case"above":t.beginPath(),t.moveTo(this.x,this.y-i),t.lineTo(this.x+this.caretHeight,this.y-(i+this.caretHeight)),t.lineTo(this.x-this.caretHeight,this.y-(i+this.caretHeight)),t.closePath(),t.fill();break;case"below":a=this.y+i+this.caretHeight,t.beginPath(),t.moveTo(this.x,this.y+i),t.lineTo(this.x+this.caretHeight,this.y+i+this.caretHeight),t.lineTo(this.x-this.caretHeight,this.y+i+this.caretHeight),t.closePath(),t.fill()}switch(this.xAlign){case"left":o=this.x-e+(this.cornerRadius+this.caretHeight);break;case"right":o=this.x-(this.cornerRadius+this.caretHeight)}B(t,o,a,e,s,this.cornerRadius),t.fill(),t.fillStyle=this.textColor,t.textAlign="center",t.textBaseline="middle",t.fillText(this.text,o+e/2,a+s/2)}}}),e.MultiTooltip=e.Element.extend({initialize:function(){this.font=W(this.fontSize,this.fontStyle,this.fontFamily),this.titleFont=W(this.titleFontSize,this.titleFontStyle,this.titleFontFamily),this.titleHeight=this.title?1.5*this.titleFontSize:0,this.height=this.labels.length*this.fontSize+(this.labels.length-1)*(this.fontSize/2)+2*this.yPadding+this.titleHeight,this.ctx.font=this.titleFont;var t=this.ctx.measureText(this.title).width,i=z(this.ctx,this.font,this.labels)+this.fontSize+3,e=g([i,t]);this.width=e+2*this.xPadding;var s=this.height/2;this.y-s<0?this.y=s:this.y+s>this.chart.height&&(this.y=this.chart.height-s),this.x>this.chart.width/2?this.x-=this.xOffset+this.width:this.x+=this.xOffset},getLineHeight:function(t){var i=this.y-this.height/2+this.yPadding,e=t-1;return 0===t?i+this.titleHeight/3:i+(1.5*this.fontSize*e+this.fontSize/2)+this.titleHeight},draw:function(){if(this.custom)this.custom(this);else{B(this.ctx,this.x,this.y-this.height/2,this.width,this.height,this.cornerRadius);var t=this.ctx;t.fillStyle=this.fillColor,t.fill(),t.closePath(),t.textAlign="left",t.textBaseline="middle",t.fillStyle=this.titleTextColor,t.font=this.titleFont,t.fillText(this.title,this.x+this.xPadding,this.getLineHeight(0)),t.font=this.font,s.each(this.labels,function(i,e){t.fillStyle=this.textColor,t.fillText(i,this.x+this.xPadding+this.fontSize+3,this.getLineHeight(e+1)),t.fillStyle=this.legendColorBackground,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize),t.fillStyle=this.legendColors[e].fill,t.fillRect(this.x+this.xPadding,this.getLineHeight(e+1)-this.fontSize/2,this.fontSize,this.fontSize)},this)}}}),e.Scale=e.Element.extend({initialize:function(){this.fit()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}));this.yLabelWidth=this.display&&this.showLabels?z(this.ctx,this.font,this.yLabels)+10:0},addXLabel:function(t){this.xLabels.push(t),this.valuesCount++,this.fit()},removeXLabel:function(){this.xLabels.shift(),this.valuesCount--,this.fit()},fit:function(){this.startPoint=this.display?this.fontSize:0,this.endPoint=this.display?this.height-1.5*this.fontSize-5:this.height,this.startPoint+=this.padding,this.endPoint-=this.padding;var t,i=this.endPoint,e=this.endPoint-this.startPoint;for(this.calculateYRange(e),this.buildYLabels(),this.calculateXLabelRotation();e>this.endPoint-this.startPoint;)e=this.endPoint-this.startPoint,t=this.yLabelWidth,this.calculateYRange(e),this.buildYLabels(),tthis.yLabelWidth?e/2:this.yLabelWidth,this.xLabelRotation=0,this.display){var n,o=z(this.ctx,this.font,this.xLabels);this.xLabelWidth=o;for(var a=Math.floor(this.calculateX(1)-this.calculateX(0))-6;this.xLabelWidth>a&&0===this.xLabelRotation||this.xLabelWidth>a&&this.xLabelRotation<=90&&this.xLabelRotation>0;)n=Math.cos(S(this.xLabelRotation)),t=n*e,i=n*s,t+this.fontSize/2>this.yLabelWidth&&(this.xScalePaddingLeft=t+this.fontSize/2),this.xScalePaddingRight=this.fontSize/2,this.xLabelRotation++,this.xLabelWidth=n*o;this.xLabelRotation>0&&(this.endPoint-=Math.sin(S(this.xLabelRotation))*o+3)}else this.xLabelWidth=0,this.xScalePaddingRight=this.padding,this.xScalePaddingLeft=this.padding},calculateYRange:c,drawingArea:function(){return this.startPoint-this.endPoint},calculateY:function(t){var i=this.drawingArea()/(this.min-this.max);return this.endPoint-i*(t-this.min)},calculateX:function(t){var i=(this.xLabelRotation>0,this.width-(this.xScalePaddingLeft+this.xScalePaddingRight)),e=i/Math.max(this.valuesCount-(this.offsetGridLines?0:1),1),s=e*t+this.xScalePaddingLeft;return this.offsetGridLines&&(s+=e/2),Math.round(s)},update:function(t){s.extend(this,t),this.fit()},draw:function(){var t=this.ctx,i=(this.endPoint-this.startPoint)/this.steps,e=Math.round(this.xScalePaddingLeft);this.display&&(t.fillStyle=this.textColor,t.font=this.font,n(this.yLabels,function(n,o){var a=this.endPoint-i*o,h=Math.round(a),l=this.showHorizontalLines;t.textAlign="right",t.textBaseline="middle",this.showLabels&&t.fillText(n,e-10,a),0!==o||l||(l=!0),l&&t.beginPath(),o>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),h+=s.aliasPixel(t.lineWidth),l&&(t.moveTo(e,h),t.lineTo(this.width,h),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(e-5,h),t.lineTo(e,h),t.stroke(),t.closePath()},this),n(this.xLabels,function(i,e){var s=this.calculateX(e)+x(this.lineWidth),n=this.calculateX(e-(this.offsetGridLines?.5:0))+x(this.lineWidth),o=this.xLabelRotation>0,a=this.showVerticalLines;0!==e||a||(a=!0),a&&t.beginPath(),e>0?(t.lineWidth=this.gridLineWidth,t.strokeStyle=this.gridLineColor):(t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor),a&&(t.moveTo(n,this.endPoint),t.lineTo(n,this.startPoint-3),t.stroke(),t.closePath()),t.lineWidth=this.lineWidth,t.strokeStyle=this.lineColor,t.beginPath(),t.moveTo(n,this.endPoint),t.lineTo(n,this.endPoint+5),t.stroke(),t.closePath(),t.save(),t.translate(s,o?this.endPoint+12:this.endPoint+8),t.rotate(-1*S(this.xLabelRotation)),t.font=this.font,t.textAlign=o?"right":"center",t.textBaseline=o?"middle":"top",t.fillText(i,0,0),t.restore()},this))}}),e.RadialScale=e.Element.extend({initialize:function(){this.size=m([this.height,this.width]),this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2},calculateCenterOffset:function(t){var i=this.drawingArea/(this.max-this.min);return(t-this.min)*i},update:function(){this.lineArc?this.drawingArea=this.display?this.size/2-(this.fontSize/2+this.backdropPaddingY):this.size/2:this.setScaleSize(),this.buildYLabels()},buildYLabels:function(){this.yLabels=[];for(var t=v(this.stepValue),i=0;i<=this.steps;i++)this.yLabels.push(C(this.templateString,{value:(this.min+i*this.stepValue).toFixed(t)}))},getCircumference:function(){return 2*Math.PI/this.valuesCount},setScaleSize:function(){var t,i,e,s,n,o,a,h,l,r,c,u,d=m([this.height/2-this.pointLabelFontSize-5,this.width/2]),p=this.width,g=0;for(this.ctx.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),i=0;ip&&(p=t.x+s,n=i),t.x-sp&&(p=t.x+e,n=i):i>this.valuesCount/2&&t.x-e0){var s,n=e*(this.drawingArea/this.steps),o=this.yCenter-n;if(this.lineWidth>0)if(t.strokeStyle=this.lineColor,t.lineWidth=this.lineWidth,this.lineArc)t.beginPath(),t.arc(this.xCenter,this.yCenter,n,0,2*Math.PI),t.closePath(),t.stroke();else{t.beginPath();for(var a=0;a=0;i--){var e=null,s=null;if(this.angleLineWidth>0&&(e=this.calculateCenterOffset(this.max),s=this.getPointPosition(i,e),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(s.x,s.y),t.stroke(),t.closePath()),this.backgroundColors&&this.backgroundColors.length==this.valuesCount){null==e&&(e=this.calculateCenterOffset(this.max)),null==s&&(s=this.getPointPosition(i,e));var o=this.getPointPosition(0===i?this.valuesCount-1:i-1,e),a=this.getPointPosition(i===this.valuesCount-1?0:i+1,e),h={x:(o.x+s.x)/2,y:(o.y+s.y)/2},l={x:(s.x+a.x)/2,y:(s.y+a.y)/2};t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(h.x,h.y),t.lineTo(s.x,s.y),t.lineTo(l.x,l.y),t.fillStyle=this.backgroundColors[i],t.fill(),t.closePath()}var r=this.getPointPosition(i,this.calculateCenterOffset(this.max)+5);t.font=W(this.pointLabelFontSize,this.pointLabelFontStyle,this.pointLabelFontFamily),t.fillStyle=this.pointLabelFontColor;var c=this.labels.length,u=this.labels.length/2,d=u/2,p=d>i||i>c-d,f=i===d||i===c-d;0===i?t.textAlign="center":i===u?t.textAlign="center":u>i?t.textAlign="left":t.textAlign="right",f?t.textBaseline="middle":p?t.textBaseline="bottom":t.textBaseline="top",t.fillText(this.labels[i],r.x,r.y)}}}}}),e.animationService={frameDuration:17,animations:[],dropFrames:0,addAnimation:function(t,i){for(var e=0;e1&&(i=Math.floor(this.dropFrames),this.dropFrames-=i);for(var e=0;ethis.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.currentStep=this.animations[e].animationObject.numSteps),this.animations[e].animationObject.render(this.animations[e].chartInstance,this.animations[e].animationObject),this.animations[e].animationObject.currentStep==this.animations[e].animationObject.numSteps&&(this.animations[e].animationObject.onAnimationComplete.call(this.animations[e].chartInstance),this.animations.splice(e,1),e--);var n=Date.now(),o=n-t-this.frameDuration,a=o/this.frameDuration;a>1&&(this.dropFrames+=a),this.animations.length>0&&s.requestAnimFrame.call(window,this.digestWrapper)}},s.addEvent(window,"resize",function(){var t;return function(){clearTimeout(t),t=setTimeout(function(){n(e.instances,function(t){t.options.responsive&&t.resize(t.render,!0)})},50)}}()),p?define("Chart",[],function(){return e}):"object"==typeof module&&module.exports&&(module.exports=e),t.Chart=e,e.noConflict=function(){return t.Chart=i,e}}).call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleBeginAtZero:!0,scaleShowGridLines:!0,scaleGridLineColor:"rgba(0,0,0,.05)",scaleGridLineWidth:1,scaleShowHorizontalLines:!0,scaleShowVerticalLines:!0,barShowStroke:!0,barStrokeWidth:2,barValueSpacing:5,barDatasetSpacing:1,legendTemplate:'
            <% for (var i=0; i
          • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
          • <%}%>
          '};i.Type.extend({name:"Bar",defaults:s,initialize:function(t){var s=this.options;this.ScaleClass=i.Scale.extend({offsetGridLines:!0,calculateBarX:function(t,i,e){var n=this.calculateBaseWidth(),o=this.calculateX(e)-n/2,a=this.calculateBarWidth(t);return o+a*i+i*s.barDatasetSpacing+a/2},calculateBaseWidth:function(){return this.calculateX(1)-this.calculateX(0)-2*s.barValueSpacing},calculateBarWidth:function(t){var i=this.calculateBaseWidth()-(t-1)*s.barDatasetSpacing; +return i/t}}),this.datasets=[],this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getBarsAtEvent(t):[];this.eachBars(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),this.BarClass=i.Rectangle.extend({strokeWidth:this.options.barStrokeWidth,showStroke:this.options.barShowStroke,ctx:this.chart.ctx}),e.each(t.datasets,function(i,s){var n={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,bars:[]};this.datasets.push(n),e.each(i.data,function(e,s){n.bars.push(new this.BarClass({value:e,label:t.labels[s],datasetLabel:i.label,strokeColor:i.strokeColor,fillColor:i.fillColor,highlightFill:i.highlightFill||i.fillColor,highlightStroke:i.highlightStroke||i.strokeColor}))},this)},this),this.buildScale(t.labels),this.BarClass.prototype.base=this.scale.endPoint,this.eachBars(function(t,i,s){e.extend(t,{width:this.scale.calculateBarWidth(this.datasets.length),x:this.scale.calculateBarX(this.datasets.length,s,i),y:this.scale.endPoint}),t.save()},this),this.render()},update:function(){this.scale.update(),e.each(this.activeElements,function(t){t.restore(["fillColor","strokeColor"])}),this.eachBars(function(t){t.save()}),this.render()},eachBars:function(t){e.each(this.datasets,function(i,s){e.each(i.bars,t,this,s)},this)},getBarsAtEvent:function(t){for(var i,s=[],n=e.getRelativePosition(t),o=function(t){s.push(t.bars[i])},a=0;a<% for (var i=0; i
        • <%if(segments[i].label){%><%=segments[i].label%><%}%>
        • <%}%>'};i.Type.extend({name:"Doughnut",defaults:s,initialize:function(t){this.segments=[],this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,this.SegmentArc=i.Arc.extend({ctx:this.chart.ctx,x:this.chart.width/2,y:this.chart.height/2}),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.calculateTotal(t),e.each(t,function(i,e){i.color||(i.color="hsl("+360*e/t.length+", 100%, 50%)"),this.addData(i,e,!0)},this),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,e,s){var n=void 0!==e?e:this.segments.length;"undefined"==typeof t.color&&(t.color=i.defaults.global.segmentColorDefault[n%i.defaults.global.segmentColorDefault.length],t.highlight=i.defaults.global.segmentHighlightColorDefaults[n%i.defaults.global.segmentHighlightColorDefaults.length]),this.segments.splice(n,0,new this.SegmentArc({value:t.value,outerRadius:this.options.animateScale?0:this.outerRadius,innerRadius:this.options.animateScale?0:this.outerRadius/100*this.options.percentageInnerCutout,fillColor:t.color,highlightColor:t.highlight||t.color,showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,startAngle:1.5*Math.PI,circumference:this.options.animateRotate?0:this.calculateCircumference(t.value),label:t.label})),s||(this.reflow(),this.update())},calculateCircumference:function(t){return this.total>0?2*Math.PI*(t/this.total):0},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=Math.abs(t.value)},this)},update:function(){this.calculateTotal(this.segments),e.each(this.activeElements,function(t){t.restore(["fillColor"])}),e.each(this.segments,function(t){t.save()}),this.render()},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.outerRadius=(e.min([this.chart.width,this.chart.height])-this.options.segmentStrokeWidth/2)/2,e.each(this.segments,function(t){t.update({outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout})},this)},draw:function(t){var i=t?t:1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.calculateCircumference(t.value),outerRadius:this.outerRadius,innerRadius:this.outerRadius/100*this.options.percentageInnerCutout},i),t.endAngle=t.startAngle+t.circumference,t.draw(),0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
        • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
        • <%}%>',offsetGridLines:!1};i.Type.extend({name:"Line",defaults:s,initialize:function(t){this.PointClass=i.Point.extend({offsetGridLines:this.options.offsetGridLines,strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx,inRange:function(t){return Math.pow(t-this.x,2)0&&ithis.scale.endPoint?t.controlPoints.outer.y=this.scale.endPoint:t.controlPoints.outer.ythis.scale.endPoint?t.controlPoints.inner.y=this.scale.endPoint:t.controlPoints.inner.y0&&(s.lineTo(h[h.length-1].x,this.scale.endPoint),s.lineTo(h[0].x,this.scale.endPoint),s.fillStyle=t.fillColor,s.closePath(),s.fill()),e.each(h,function(t){t.draw()})},this))}})}.call(this),function(){"use strict";var t=this,i=t.Chart,e=i.helpers,s={scaleShowLabelBackdrop:!0,scaleBackdropColor:"rgba(255,255,255,0.75)",scaleBeginAtZero:!0,scaleBackdropPaddingY:2,scaleBackdropPaddingX:2,scaleShowLine:!0,segmentShowStroke:!0,segmentStrokeColor:"#fff",segmentStrokeWidth:2,animationSteps:100,animationEasing:"easeOutBounce",animateRotate:!0,animateScale:!1,legendTemplate:'
            <% for (var i=0; i
          • <%if(segments[i].label){%><%=segments[i].label%><%}%>
          • <%}%>
          '};i.Type.extend({name:"PolarArea",defaults:s,initialize:function(t){this.segments=[],this.SegmentArc=i.Arc.extend({showStroke:this.options.segmentShowStroke,strokeWidth:this.options.segmentStrokeWidth,strokeColor:this.options.segmentStrokeColor,ctx:this.chart.ctx,innerRadius:0,x:this.chart.width/2,y:this.chart.height/2}),this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,lineArc:!0,width:this.chart.width,height:this.chart.height,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,valuesCount:t.length}),this.updateScaleRange(t),this.scale.update(),e.each(t,function(t,i){this.addData(t,i,!0)},this),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getSegmentsAtEvent(t):[];e.each(this.segments,function(t){t.restore(["fillColor"])}),e.each(i,function(t){t.fillColor=t.highlightColor}),this.showTooltip(i)}),this.render()},getSegmentsAtEvent:function(t){var i=[],s=e.getRelativePosition(t);return e.each(this.segments,function(t){t.inRange(s.x,s.y)&&i.push(t)},this),i},addData:function(t,i,e){var s=i||this.segments.length;this.segments.splice(s,0,new this.SegmentArc({fillColor:t.color,highlightColor:t.highlight||t.color,label:t.label,value:t.value,outerRadius:this.options.animateScale?0:this.scale.calculateCenterOffset(t.value),circumference:this.options.animateRotate?0:this.scale.getCircumference(),startAngle:1.5*Math.PI})),e||(this.reflow(),this.update())},removeData:function(t){var i=e.isNumber(t)?t:this.segments.length-1;this.segments.splice(i,1),this.reflow(),this.update()},calculateTotal:function(t){this.total=0,e.each(t,function(t){this.total+=t.value},this),this.scale.valuesCount=this.segments.length},updateScaleRange:function(t){var i=[];e.each(t,function(t){i.push(t.value)});var s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s,{size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2})},update:function(){this.calculateTotal(this.segments),e.each(this.segments,function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.SegmentArc.prototype,{x:this.chart.width/2,y:this.chart.height/2}),this.updateScaleRange(this.segments),this.scale.update(),e.extend(this.scale,{xCenter:this.chart.width/2,yCenter:this.chart.height/2}),e.each(this.segments,function(t){t.update({outerRadius:this.scale.calculateCenterOffset(t.value)})},this)},draw:function(t){var i=t||1;this.clear(),e.each(this.segments,function(t,e){t.transition({circumference:this.scale.getCircumference(),outerRadius:this.scale.calculateCenterOffset(t.value)},i),t.endAngle=t.startAngle+t.circumference,0===e&&(t.startAngle=1.5*Math.PI),e<% for (var i=0; i
        • <%if(datasets[i].label){%><%=datasets[i].label%><%}%>
        • <%}%>'},initialize:function(t){this.PointClass=i.Point.extend({strokeWidth:this.options.pointDotStrokeWidth,radius:this.options.pointDotRadius,display:this.options.pointDot,hitDetectionRadius:this.options.pointHitDetectionRadius,ctx:this.chart.ctx}),this.datasets=[],this.buildScale(t),this.options.showTooltips&&e.bindEvents(this,this.options.tooltipEvents,function(t){var i="mouseout"!==t.type?this.getPointsAtEvent(t):[];this.eachPoints(function(t){t.restore(["fillColor","strokeColor"])}),e.each(i,function(t){t.fillColor=t.highlightFill,t.strokeColor=t.highlightStroke}),this.showTooltip(i)}),e.each(t.datasets,function(i){var s={label:i.label||null,fillColor:i.fillColor,strokeColor:i.strokeColor,pointColor:i.pointColor,pointStrokeColor:i.pointStrokeColor,points:[]};this.datasets.push(s),e.each(i.data,function(e,n){var o;this.scale.animation||(o=this.scale.getPointPosition(n,this.scale.calculateCenterOffset(e))),s.points.push(new this.PointClass({value:e,label:t.labels[n],datasetLabel:i.label,x:this.options.animation?this.scale.xCenter:o.x,y:this.options.animation?this.scale.yCenter:o.y,strokeColor:i.pointStrokeColor,fillColor:i.pointColor,highlightFill:i.pointHighlightFill||i.pointColor,highlightStroke:i.pointHighlightStroke||i.pointStrokeColor}))},this)},this),this.render()},eachPoints:function(t){e.each(this.datasets,function(i){e.each(i.points,t,this)},this)},getPointsAtEvent:function(t){var i=e.getRelativePosition(t),s=e.getAngleFromPoint({x:this.scale.xCenter,y:this.scale.yCenter},i),n=2*Math.PI/this.scale.valuesCount,o=Math.round((s.angle-1.5*Math.PI)/n),a=[];return(o>=this.scale.valuesCount||0>o)&&(o=0),s.distance<=this.scale.drawingArea&&e.each(this.datasets,function(t){a.push(t.points[o])}),a},buildScale:function(t){this.scale=new i.RadialScale({display:this.options.showScale,fontStyle:this.options.scaleFontStyle,fontSize:this.options.scaleFontSize,fontFamily:this.options.scaleFontFamily,fontColor:this.options.scaleFontColor,showLabels:this.options.scaleShowLabels,showLabelBackdrop:this.options.scaleShowLabelBackdrop,backdropColor:this.options.scaleBackdropColor,backgroundColors:this.options.scaleBackgroundColors,backdropPaddingY:this.options.scaleBackdropPaddingY,backdropPaddingX:this.options.scaleBackdropPaddingX,lineWidth:this.options.scaleShowLine?this.options.scaleLineWidth:0,lineColor:this.options.scaleLineColor,angleLineColor:this.options.angleLineColor,angleLineWidth:this.options.angleShowLineOut?this.options.angleLineWidth:0,pointLabelFontColor:this.options.pointLabelFontColor,pointLabelFontSize:this.options.pointLabelFontSize,pointLabelFontFamily:this.options.pointLabelFontFamily,pointLabelFontStyle:this.options.pointLabelFontStyle,height:this.chart.height,width:this.chart.width,xCenter:this.chart.width/2,yCenter:this.chart.height/2,ctx:this.chart.ctx,templateString:this.options.scaleLabel,labels:t.labels,valuesCount:t.datasets[0].data.length}),this.scale.setScaleSize(),this.updateScaleRange(t.datasets),this.scale.buildYLabels()},updateScaleRange:function(t){var i=function(){var i=[];return e.each(t,function(t){t.data?i=i.concat(t.data):e.each(t.points,function(t){i.push(t.value)})}),i}(),s=this.options.scaleOverride?{steps:this.options.scaleSteps,stepValue:this.options.scaleStepWidth,min:this.options.scaleStartValue,max:this.options.scaleStartValue+this.options.scaleSteps*this.options.scaleStepWidth}:e.calculateScaleRange(i,e.min([this.chart.width,this.chart.height])/2,this.options.scaleFontSize,this.options.scaleBeginAtZero,this.options.scaleIntegersOnly);e.extend(this.scale,s)},addData:function(t,i){this.scale.valuesCount++,e.each(t,function(t,e){var s=this.scale.getPointPosition(this.scale.valuesCount,this.scale.calculateCenterOffset(t));this.datasets[e].points.push(new this.PointClass({value:t,label:i,datasetLabel:this.datasets[e].label,x:s.x,y:s.y,strokeColor:this.datasets[e].pointStrokeColor,fillColor:this.datasets[e].pointColor}))},this),this.scale.labels.push(i),this.reflow(),this.update()},removeData:function(){this.scale.valuesCount--,this.scale.labels.shift(),e.each(this.datasets,function(t){t.points.shift()},this),this.reflow(),this.update()},update:function(){this.eachPoints(function(t){t.save()}),this.reflow(),this.render()},reflow:function(){e.extend(this.scale,{width:this.chart.width,height:this.chart.height,size:e.min([this.chart.width,this.chart.height]),xCenter:this.chart.width/2,yCenter:this.chart.height/2}),this.updateScaleRange(this.datasets),this.scale.setScaleSize(),this.scale.buildYLabels()},draw:function(t){var i=t||1,s=this.chart.ctx;this.clear(),this.scale.draw(),e.each(this.datasets,function(t){e.each(t.points,function(t,e){t.hasValue()&&t.transition(this.scale.getPointPosition(e,this.scale.calculateCenterOffset(t.value)),i)},this),s.lineWidth=this.options.datasetStrokeWidth,s.strokeStyle=t.strokeColor,s.beginPath(),e.each(t.points,function(t,i){0===i?s.moveTo(t.x,t.y):s.lineTo(t.x,t.y)},this),s.closePath(),s.stroke(),s.fillStyle=t.fillColor,this.options.datasetFill&&s.fill(),e.each(t.points,function(t){t.hasValue()&&t.draw()})},this)}})}.call(this); \ No newline at end of file diff --git a/Output/Dhtml/js/Markdown.Converter.js b/Output/Dhtml/js/Markdown.Converter.js new file mode 100644 index 000000000..d2d39d45f --- /dev/null +++ b/Output/Dhtml/js/Markdown.Converter.js @@ -0,0 +1,1400 @@ +var Markdown; + +if (typeof exports === "object" && typeof require === "function") // we're in a CommonJS (e.g. Node.js) module + Markdown = exports; +else + Markdown = {}; + +// The following text is included for historical reasons, but should +// be taken with a pinch of salt; it's not all true anymore. + +// +// Wherever possible, Showdown is a straight, line-by-line port +// of the Perl version of Markdown. +// +// This is not a normal parser design; it's basically just a +// series of string substitutions. It's hard to read and +// maintain this way, but keeping Showdown close to the original +// design makes it easier to port new features. +// +// More importantly, Showdown behaves like markdown.pl in most +// edge cases. So web applications can do client-side preview +// in Javascript, and then build identical HTML on the server. +// +// This port needs the new RegExp functionality of ECMA 262, +// 3rd Edition (i.e. Javascript 1.5). Most modern web browsers +// should do fine. Even with the new regular expression features, +// We do a lot of work to emulate Perl's regex functionality. +// The tricky changes in this file mostly have the "attacklab:" +// label. Major or self-explanatory changes don't. +// +// Smart diff tools like Araxis Merge will be able to match up +// this file with markdown.pl in a useful way. A little tweaking +// helps: in a copy of markdown.pl, replace "#" with "//" and +// replace "$text" with "text". Be sure to ignore whitespace +// and line endings. +// + + +// +// Usage: +// +// var text = "Markdown *rocks*."; +// +// var converter = new Markdown.Converter(); +// var html = converter.makeHtml(text); +// +// alert(html); +// +// Note: move the sample code to the bottom of this +// file before uncommenting it. +// + +(function () { + + function identity(x) { return x; } + function returnFalse(x) { return false; } + + function HookCollection() { } + + HookCollection.prototype = { + + chain: function (hookname, func) { + var original = this[hookname]; + if (!original) + throw new Error("unknown hook " + hookname); + + if (original === identity) + this[hookname] = func; + else + this[hookname] = function (text) { + var args = Array.prototype.slice.call(arguments, 0); + args[0] = original.apply(null, args); + return func.apply(null, args); + }; + }, + set: function (hookname, func) { + if (!this[hookname]) + throw new Error("unknown hook " + hookname); + this[hookname] = func; + }, + addNoop: function (hookname) { + this[hookname] = identity; + }, + addFalse: function (hookname) { + this[hookname] = returnFalse; + } + }; + + Markdown.HookCollection = HookCollection; + + // g_urls and g_titles allow arbitrary user-entered strings as keys. This + // caused an exception (and hence stopped the rendering) when the user entered + // e.g. [push] or [__proto__]. Adding a prefix to the actual key prevents this + // (since no builtin property starts with "s_"). See + // http://meta.stackoverflow.com/questions/64655/strange-wmd-bug + // (granted, switching from Array() to Object() alone would have left only __proto__ + // to be a problem) + function SaveHash() { } + SaveHash.prototype = { + set: function (key, value) { + this["s_" + key] = value; + }, + get: function (key) { + return this["s_" + key]; + } + }; + + Markdown.Converter = function () { + var pluginHooks = this.hooks = new HookCollection(); + + // given a URL that was encountered by itself (without markup), should return the link text that's to be given to this link + pluginHooks.addNoop("plainLinkText"); + + // called with the orignal text as given to makeHtml. The result of this plugin hook is the actual markdown source that will be cooked + pluginHooks.addNoop("preConversion"); + + // called with the text once all normalizations have been completed (tabs to spaces, line endings, etc.), but before any conversions have + pluginHooks.addNoop("postNormalization"); + + // Called with the text before / after creating block elements like code blocks and lists. Note that this is called recursively + // with inner content, e.g. it's called with the full text, and then only with the content of a blockquote. The inner + // call will receive outdented text. + pluginHooks.addNoop("preBlockGamut"); + pluginHooks.addNoop("postBlockGamut"); + + // called with the text of a single block element before / after the span-level conversions (bold, code spans, etc.) have been made + pluginHooks.addNoop("preSpanGamut"); + pluginHooks.addNoop("postSpanGamut"); + + // called with the final cooked HTML code. The result of this plugin hook is the actual output of makeHtml + pluginHooks.addNoop("postConversion"); + + // + // Private state of the converter instance: + // + + // Global hashes, used by various utility routines + var g_urls; + var g_titles; + var g_html_blocks; + + // Used to track when we're inside an ordered or unordered list + // (see _ProcessListItems() for details): + var g_list_level; + + this.makeHtml = function (text) { + + // + // Main function. The order in which other subs are called here is + // essential. Link and image substitutions need to happen before + // _EscapeSpecialCharsWithinTagAttributes(), so that any *'s or _'s in the + // and tags get encoded. + // + + // This will only happen if makeHtml on the same converter instance is called from a plugin hook. + // Don't do that. + if (g_urls) + throw new Error("Recursive call to converter.makeHtml"); + + // Create the private state objects. + g_urls = new SaveHash(); + g_titles = new SaveHash(); + g_html_blocks = []; + g_list_level = 0; + + text = pluginHooks.preConversion(text); + + // attacklab: Replace ~ with ~T + // This lets us use tilde as an escape char to avoid md5 hashes + // The choice of character is arbitray; anything that isn't + // magic in Markdown will work. + text = text.replace(/~/g, "~T"); + + // attacklab: Replace $ with ~D + // RegExp interprets $ as a special character + // when it's in a replacement string + text = text.replace(/\$/g, "~D"); + + // Standardize line endings + text = text.replace(/\r\n/g, "\n"); // DOS to Unix + text = text.replace(/\r/g, "\n"); // Mac to Unix + + // Make sure text begins and ends with a couple of newlines: + text = "\n\n" + text + "\n\n"; + + // Convert all tabs to spaces. + text = _Detab(text); + + // Strip any lines consisting only of spaces and tabs. + // This makes subsequent regexen easier to write, because we can + // match consecutive blank lines with /\n+/ instead of something + // contorted like /[ \t]*\n+/ . + text = text.replace(/^[ \t]+$/mg, ""); + + text = pluginHooks.postNormalization(text); + + // Turn block-level HTML blocks into hash entries + text = _HashHTMLBlocks(text); + + // Strip link definitions, store in hashes. + text = _StripLinkDefinitions(text); + + text = _RunBlockGamut(text); + + text = _UnescapeSpecialChars(text); + + // attacklab: Restore dollar signs + text = text.replace(/~D/g, "$$"); + + // attacklab: Restore tildes + text = text.replace(/~T/g, "~"); + + text = pluginHooks.postConversion(text); + + g_html_blocks = g_titles = g_urls = null; + + return text; + }; + + function _StripLinkDefinitions(text) { + // + // Strips link definitions from text, stores the URLs and titles in + // hash references. + // + + // Link defs are in the form: ^[id]: url "optional title" + + /* + text = text.replace(/ + ^[ ]{0,3}\[(.+)\]: // id = $1 attacklab: g_tab_width - 1 + [ \t]* + \n? // maybe *one* newline + [ \t]* + ? // url = $2 + (?=\s|$) // lookahead for whitespace instead of the lookbehind removed below + [ \t]* + \n? // maybe one newline + [ \t]* + ( // (potential) title = $3 + (\n*) // any lines skipped = $4 attacklab: lookbehind removed + [ \t]+ + ["(] + (.+?) // title = $5 + [")] + [ \t]* + )? // title is optional + (?:\n+|$) + /gm, function(){...}); + */ + + text = text.replace(/^[ ]{0,3}\[(.+)\]:[ \t]*\n?[ \t]*?(?=\s|$)[ \t]*\n?[ \t]*((\n*)["(](.+?)[")][ \t]*)?(?:\n+)/gm, + function (wholeMatch, m1, m2, m3, m4, m5) { + m1 = m1.toLowerCase(); + g_urls.set(m1, _EncodeAmpsAndAngles(m2)); // Link IDs are case-insensitive + if (m4) { + // Oops, found blank lines, so it's not a title. + // Put back the parenthetical statement we stole. + return m3; + } else if (m5) { + g_titles.set(m1, m5.replace(/"/g, """)); + } + + // Completely remove the definition from the text + return ""; + } + ); + + return text; + } + + function _HashHTMLBlocks(text) { + + // Hashify HTML blocks: + // We only want to do this for block-level HTML tags, such as headers, + // lists, and tables. That's because we still want to wrap

          s around + // "paragraphs" that are wrapped in non-block-level tags, such as anchors, + // phrase emphasis, and spans. The list of tags we're looking for is + // hard-coded: + var block_tags_a = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del" + var block_tags_b = "p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math" + + // First, look for nested blocks, e.g.: + //

          + //
          + // tags for inner block must be indented. + //
          + //
          + // + // The outermost tags must start at the left margin for this to match, and + // the inner nested divs must be indented. + // We need to do this before the next, more liberal match, because the next + // match will start at the first `
          ` and stop at the first `
          `. + + // attacklab: This regex can be expensive when it fails. + + /* + text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_a) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*?\n // any number of lines, minimally matching + // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math|ins|del)\b[^\r]*?\n<\/\2>[ \t]*(?=\n+))/gm, hashElement); + + // + // Now match more liberally, simply from `\n` to `\n` + // + + /* + text = text.replace(/ + ( // save in $1 + ^ // start of line (with /m) + <($block_tags_b) // start tag = $2 + \b // word break + // attacklab: hack around khtml/pcre bug... + [^\r]*? // any number of lines, minimally matching + .* // the matching end tag + [ \t]* // trailing spaces/tabs + (?=\n+) // followed by a newline + ) // attacklab: there are sentinel newlines at end of document + /gm,function(){...}}; + */ + text = text.replace(/^(<(p|div|h[1-6]|blockquote|pre|table|dl|ol|ul|script|noscript|form|fieldset|iframe|math)\b[^\r]*?.*<\/\2>[ \t]*(?=\n+)\n)/gm, hashElement); + + // Special case just for
          . It was easier to make a special case than + // to make the other regex more complicated. + + /* + text = text.replace(/ + \n // Starting after a blank line + [ ]{0,3} + ( // save in $1 + (<(hr) // start tag = $2 + \b // word break + ([^<>])*? + \/?>) // the matching end tag + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/\n[ ]{0,3}((<(hr)\b([^<>])*?\/?>)[ \t]*(?=\n{2,}))/g, hashElement); + + // Special case for standalone HTML comments: + + /* + text = text.replace(/ + \n\n // Starting after a blank line + [ ]{0,3} // attacklab: g_tab_width - 1 + ( // save in $1 + -]|-[^>])(?:[^-]|-[^-])*)--) // see http://www.w3.org/TR/html-markup/syntax.html#comments and http://meta.stackoverflow.com/q/95256 + > + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/\n\n[ ]{0,3}(-]|-[^>])(?:[^-]|-[^-])*)--)>[ \t]*(?=\n{2,}))/g, hashElement); + + // PHP and ASP-style processor instructions ( and <%...%>) + + /* + text = text.replace(/ + (?: + \n\n // Starting after a blank line + ) + ( // save in $1 + [ ]{0,3} // attacklab: g_tab_width - 1 + (?: + <([?%]) // $2 + [^\r]*? + \2> + ) + [ \t]* + (?=\n{2,}) // followed by a blank line + ) + /g,hashElement); + */ + text = text.replace(/(?:\n\n)([ ]{0,3}(?:<([?%])[^\r]*?\2>)[ \t]*(?=\n{2,}))/g, hashElement); + + return text; + } + + function hashElement(wholeMatch, m1) { + var blockText = m1; + + // Undo double lines + blockText = blockText.replace(/^\n+/, ""); + + // strip trailing blank lines + blockText = blockText.replace(/\n+$/g, ""); + + // Replace the element text with a marker ("~KxK" where x is its key) + blockText = "\n\n~K" + (g_html_blocks.push(blockText) - 1) + "K\n\n"; + + return blockText; + } + + var blockGamutHookCallback = function (t) { return _RunBlockGamut(t); } + + function _RunBlockGamut(text, doNotUnhash) { + // + // These are all the transformations that form block-level + // tags like paragraphs, headers, and list items. + // + + text = pluginHooks.preBlockGamut(text, blockGamutHookCallback); + + text = _DoHeaders(text); + + // Do Horizontal Rules: + var replacement = "
          \n"; + text = text.replace(/^[ ]{0,2}([ ]?\*[ ]?){3,}[ \t]*$/gm, replacement); + text = text.replace(/^[ ]{0,2}([ ]?-[ ]?){3,}[ \t]*$/gm, replacement); + text = text.replace(/^[ ]{0,2}([ ]?_[ ]?){3,}[ \t]*$/gm, replacement); + + text = _DoLists(text); + text = _DoCodeBlocks(text); + text = _DoBlockQuotes(text); + + text = pluginHooks.postBlockGamut(text, blockGamutHookCallback); + + // We already ran _HashHTMLBlocks() before, in Markdown(), but that + // was to escape raw HTML in the original Markdown source. This time, + // we're escaping the markup we've just created, so that we don't wrap + //

          tags around block-level tags. + text = _HashHTMLBlocks(text); + text = _FormParagraphs(text, doNotUnhash); + + return text; + } + + function _RunSpanGamut(text) { + // + // These are all the transformations that occur *within* block-level + // tags like paragraphs, headers, and list items. + // + + text = pluginHooks.preSpanGamut(text); + + text = _DoCodeSpans(text); + text = _EscapeSpecialCharsWithinTagAttributes(text); + text = _EncodeBackslashEscapes(text); + + // Process anchor and image tags. Images must come first, + // because ![foo][f] looks like an anchor. + text = _DoImages(text); + text = _DoAnchors(text); + + // Make links out of things like `` + // Must come after _DoAnchors(), because you can use < and > + // delimiters in inline links like [this](). + text = _DoAutoLinks(text); + + text = text.replace(/~P/g, "://"); // put in place to prevent autolinking; reset now + + text = _EncodeAmpsAndAngles(text); + text = _DoItalicsAndBold(text); + + // Do hard breaks: + text = text.replace(/ +\n/g, "
          \n"); + + text = pluginHooks.postSpanGamut(text); + + return text; + } + + function _EscapeSpecialCharsWithinTagAttributes(text) { + // + // Within tags -- meaning between < and > -- encode [\ ` * _] so they + // don't conflict with their use in Markdown for code, italics and strong. + // + + // Build a regex to find HTML tags and comments. See Friedl's + // "Mastering Regular Expressions", 2nd Ed., pp. 200-201. + + // SE: changed the comment part of the regex + + var regex = /(<[a-z\/!$]("[^"]*"|'[^']*'|[^'">])*>|-]|-[^>])(?:[^-]|-[^-])*)--)>)/gi; + + text = text.replace(regex, function (wholeMatch) { + var tag = wholeMatch.replace(/(.)<\/?code>(?=.)/g, "$1`"); + tag = escapeCharacters(tag, wholeMatch.charAt(1) == "!" ? "\\`*_/" : "\\`*_"); // also escape slashes in comments to prevent autolinking there -- http://meta.stackoverflow.com/questions/95987 + return tag; + }); + + return text; + } + + function _DoAnchors(text) { + // + // Turn Markdown link shortcuts into XHTML
          tags. + // + // + // First, handle reference-style links: [link text] [id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[] // or anything else + )* + ) + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + ) + ()()()() // pad remaining backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeAnchorTag); + + // + // Next, inline-style links: [link text](url "optional title") + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ( + (?: + \[[^\]]*\] // allow brackets nested one level + | + [^\[\]] // or anything else + )* + ) + \] + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // Title = $7 + \6 // matching quote + [ \t]* // ignore any spaces/tabs between closing quote and ) + )? // title is optional + \) + ) + /g, writeAnchorTag); + */ + + text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag); + + // + // Last, handle reference-style shortcuts: [link text] + // These must come last in case you've also got [link test][1] + // or [link test](/foo) + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + \[ + ([^\[\]]+) // link text = $2; can't contain '[' or ']' + \] + ) + ()()()()() // pad rest of backreferences + /g, writeAnchorTag); + */ + text = text.replace(/(\[([^\[\]]+)\])()()()()()/g, writeAnchorTag); + + return text; + } + + function writeAnchorTag(wholeMatch, m1, m2, m3, m4, m5, m6, m7) { + if (m7 == undefined) m7 = ""; + var whole_match = m1; + var link_text = m2.replace(/:\/\//g, "~P"); // to prevent auto-linking withing the link. will be converted back after the auto-linker runs + var link_id = m3.toLowerCase(); + var url = m4; + var title = m7; + + if (url == "") { + if (link_id == "") { + // lower-case and turn embedded newlines into spaces + link_id = link_text.toLowerCase().replace(/ ?\n/g, " "); + } + url = "#" + link_id; + + if (g_urls.get(link_id) != undefined) { + url = g_urls.get(link_id); + if (g_titles.get(link_id) != undefined) { + title = g_titles.get(link_id); + } + } + else { + if (whole_match.search(/\(\s*\)$/m) > -1) { + // Special case for explicit empty url + url = ""; + } else { + return whole_match; + } + } + } + url = encodeProblemUrlChars(url); + url = escapeCharacters(url, "*_"); + var result = ""; + + return result; + } + + function _DoImages(text) { + // + // Turn Markdown image shortcuts into tags. + // + + // + // First, handle reference-style labeled images: ![alt text][id] + // + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + + [ ]? // one optional space + (?:\n[ ]*)? // one optional newline followed by spaces + + \[ + (.*?) // id = $3 + \] + ) + ()()()() // pad rest of backreferences + /g, writeImageTag); + */ + text = text.replace(/(!\[(.*?)\][ ]?(?:\n[ ]*)?\[(.*?)\])()()()()/g, writeImageTag); + + // + // Next, handle inline images: ![alt text](url "optional title") + // Don't forget: encode * and _ + + /* + text = text.replace(/ + ( // wrap whole match in $1 + !\[ + (.*?) // alt text = $2 + \] + \s? // One optional whitespace character + \( // literal paren + [ \t]* + () // no id, so leave $3 empty + ? // src url = $4 + [ \t]* + ( // $5 + (['"]) // quote char = $6 + (.*?) // title = $7 + \6 // matching quote + [ \t]* + )? // title is optional + \) + ) + /g, writeImageTag); + */ + text = text.replace(/(!\[(.*?)\]\s?\([ \t]*()?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeImageTag); + + return text; + } + + function attributeEncode(text) { + // unconditionally replace angle brackets here -- what ends up in an attribute (e.g. alt or title) + // never makes sense to have verbatim HTML in it (and the sanitizer would totally break it) + return text.replace(/>/g, ">").replace(/" + _RunSpanGamut(m1) + "\n\n"; } + ); + + text = text.replace(/^(.+)[ \t]*\n-+[ \t]*\n+/gm, + function (matchFound, m1) { return "

          " + _RunSpanGamut(m1) + "

          \n\n"; } + ); + + // atx-style headers: + // # Header 1 + // ## Header 2 + // ## Header 2 with closing hashes ## + // ... + // ###### Header 6 + // + + /* + text = text.replace(/ + ^(\#{1,6}) // $1 = string of #'s + [ \t]* + (.+?) // $2 = Header text + [ \t]* + \#* // optional closing #'s (not counted) + \n+ + /gm, function() {...}); + */ + + text = text.replace(/^(\#{1,6})[ \t]*(.+?)[ \t]*\#*\n+/gm, + function (wholeMatch, m1, m2) { + var h_level = m1.length; + return "" + _RunSpanGamut(m2) + "\n\n"; + } + ); + + return text; + } + + function _DoLists(text) { + // + // Form HTML ordered (numbered) and unordered (bulleted) lists. + // + + // attacklab: add sentinel to hack around khtml/safari bug: + // http://bugs.webkit.org/show_bug.cgi?id=11231 + text += "~0"; + + // Re-usable pattern to match any entirel ul or ol list: + + /* + var whole_list = / + ( // $1 = whole list + ( // $2 + [ ]{0,3} // attacklab: g_tab_width - 1 + ([*+-]|\d+[.]) // $3 = first list item marker + [ \t]+ + ) + [^\r]+? + ( // $4 + ~0 // sentinel for workaround; should be $ + | + \n{2,} + (?=\S) + (?! // Negative lookahead for another list item marker + [ \t]* + (?:[*+-]|\d+[.])[ \t]+ + ) + ) + ) + /g + */ + var whole_list = /^(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/gm; + + if (g_list_level) { + text = text.replace(whole_list, function (wholeMatch, m1, m2) { + var list = m1; + var list_type = (m2.search(/[*+-]/g) > -1) ? "ul" : "ol"; + + var result = _ProcessListItems(list, list_type); + + // Trim any trailing whitespace, to put the closing `` + // up on the preceding line, to get it past the current stupid + // HTML block parser. This is a hack to work around the terrible + // hack that is the HTML block parser. + result = result.replace(/\s+$/, ""); + result = "<" + list_type + ">" + result + "\n"; + return result; + }); + } else { + whole_list = /(\n\n|^\n?)(([ ]{0,3}([*+-]|\d+[.])[ \t]+)[^\r]+?(~0|\n{2,}(?=\S)(?![ \t]*(?:[*+-]|\d+[.])[ \t]+)))/g; + text = text.replace(whole_list, function (wholeMatch, m1, m2, m3) { + var runup = m1; + var list = m2; + + var list_type = (m3.search(/[*+-]/g) > -1) ? "ul" : "ol"; + var result = _ProcessListItems(list, list_type); + result = runup + "<" + list_type + ">\n" + result + "\n"; + return result; + }); + } + + // attacklab: strip sentinel + text = text.replace(/~0/, ""); + + return text; + } + + var _listItemMarkers = { ol: "\\d+[.]", ul: "[*+-]" }; + + function _ProcessListItems(list_str, list_type) { + // + // Process the contents of a single ordered or unordered list, splitting it + // into individual list items. + // + // list_type is either "ul" or "ol". + + // The $g_list_level global keeps track of when we're inside a list. + // Each time we enter a list, we increment it; when we leave a list, + // we decrement. If it's zero, we're not in a list anymore. + // + // We do this because when we're not inside a list, we want to treat + // something like this: + // + // I recommend upgrading to version + // 8. Oops, now this line is treated + // as a sub-list. + // + // As a single paragraph, despite the fact that the second line starts + // with a digit-period-space sequence. + // + // Whereas when we're inside a list (or sub-list), that line will be + // treated as the start of a sub-list. What a kludge, huh? This is + // an aspect of Markdown's syntax that's hard to parse perfectly + // without resorting to mind-reading. Perhaps the solution is to + // change the syntax rules such that sub-lists must start with a + // starting cardinal number; e.g. "1." or "a.". + + g_list_level++; + + // trim trailing blank lines: + list_str = list_str.replace(/\n{2,}$/, "\n"); + + // attacklab: add sentinel to emulate \z + list_str += "~0"; + + // In the original attacklab showdown, list_type was not given to this function, and anything + // that matched /[*+-]|\d+[.]/ would just create the next
        • , causing this mismatch: + // + // Markdown rendered by WMD rendered by MarkdownSharp + // ------------------------------------------------------------------ + // 1. first 1. first 1. first + // 2. second 2. second 2. second + // - third 3. third * third + // + // We changed this to behave identical to MarkdownSharp. This is the constructed RegEx, + // with {MARKER} being one of \d+[.] or [*+-], depending on list_type: + + /* + list_str = list_str.replace(/ + (^[ \t]*) // leading whitespace = $1 + ({MARKER}) [ \t]+ // list marker = $2 + ([^\r]+? // list item text = $3 + (\n+) + ) + (?= + (~0 | \2 ({MARKER}) [ \t]+) + ) + /gm, function(){...}); + */ + + var marker = _listItemMarkers[list_type]; + var re = new RegExp("(^[ \\t]*)(" + marker + ")[ \\t]+([^\\r]+?(\\n+))(?=(~0|\\1(" + marker + ")[ \\t]+))", "gm"); + var last_item_had_a_double_newline = false; + list_str = list_str.replace(re, + function (wholeMatch, m1, m2, m3) { + var item = m3; + var leading_space = m1; + var ends_with_double_newline = /\n\n$/.test(item); + var contains_double_newline = ends_with_double_newline || item.search(/\n{2,}/) > -1; + + if (contains_double_newline || last_item_had_a_double_newline) { + item = _RunBlockGamut(_Outdent(item), /* doNotUnhash = */true); + } + else { + // Recursion for sub-lists: + item = _DoLists(_Outdent(item)); + item = item.replace(/\n$/, ""); // chomp(item) + item = _RunSpanGamut(item); + } + last_item_had_a_double_newline = ends_with_double_newline; + return "
        • " + item + "
        • \n"; + } + ); + + // attacklab: strip sentinel + list_str = list_str.replace(/~0/g, ""); + + g_list_level--; + return list_str; + } + + function _DoCodeBlocks(text) { + // + // Process Markdown `
          ` blocks.
          +            //  
          +
          +            /*
          +            text = text.replace(/
          +                (?:\n\n|^)
          +                (                               // $1 = the code block -- one or more lines, starting with a space/tab
          +                    (?:
          +                        (?:[ ]{4}|\t)           // Lines must start with a tab or a tab-width of spaces - attacklab: g_tab_width
          +                        .*\n+
          +                    )+
          +                )
          +                (\n*[ ]{0,3}[^ \t\n]|(?=~0))    // attacklab: g_tab_width
          +            /g ,function(){...});
          +            */
          +
          +            // attacklab: sentinel workarounds for lack of \A and \Z, safari\khtml bug
          +            text += "~0";
          +
          +            text = text.replace(/(?:\n\n|^)((?:(?:[ ]{4}|\t).*\n+)+)(\n*[ ]{0,3}[^ \t\n]|(?=~0))/g,
          +                function (wholeMatch, m1, m2) {
          +                    var codeblock = m1;
          +                    var nextChar = m2;
          +
          +                    codeblock = _EncodeCode(_Outdent(codeblock));
          +                    codeblock = _Detab(codeblock);
          +                    codeblock = codeblock.replace(/^\n+/g, ""); // trim leading newlines
          +                    codeblock = codeblock.replace(/\n+$/g, ""); // trim trailing whitespace
          +
          +                    codeblock = "
          " + codeblock + "\n
          "; + + return "\n\n" + codeblock + "\n\n" + nextChar; + } + ); + + // attacklab: strip sentinel + text = text.replace(/~0/, ""); + + return text; + } + + function hashBlock(text) { + text = text.replace(/(^\n+|\n+$)/g, ""); + return "\n\n~K" + (g_html_blocks.push(text) - 1) + "K\n\n"; + } + + function _DoCodeSpans(text) { + // + // * Backtick quotes are used for spans. + // + // * You can use multiple backticks as the delimiters if you want to + // include literal backticks in the code span. So, this input: + // + // Just type ``foo `bar` baz`` at the prompt. + // + // Will translate to: + // + //

          Just type foo `bar` baz at the prompt.

          + // + // There's no arbitrary limit to the number of backticks you + // can use as delimters. If you need three consecutive backticks + // in your code, use four for delimiters, etc. + // + // * You can use spaces to get literal backticks at the edges: + // + // ... type `` `bar` `` ... + // + // Turns to: + // + // ... type `bar` ... + // + + /* + text = text.replace(/ + (^|[^\\]) // Character before opening ` can't be a backslash + (`+) // $2 = Opening run of ` + ( // $3 = The code block + [^\r]*? + [^`] // attacklab: work around lack of lookbehind + ) + \2 // Matching closer + (?!`) + /gm, function(){...}); + */ + + text = text.replace(/(^|[^\\])(`+)([^\r]*?[^`])\2(?!`)/gm, + function (wholeMatch, m1, m2, m3, m4) { + var c = m3; + c = c.replace(/^([ \t]*)/g, ""); // leading whitespace + c = c.replace(/[ \t]*$/g, ""); // trailing whitespace + c = _EncodeCode(c); + c = c.replace(/:\/\//g, "~P"); // to prevent auto-linking. Not necessary in code *blocks*, but in code spans. Will be converted back after the auto-linker runs. + return m1 + "" + c + ""; + } + ); + + return text; + } + + function _EncodeCode(text) { + // + // Encode/escape certain characters inside Markdown code runs. + // The point is that in code, these characters are literals, + // and lose their special Markdown meanings. + // + // Encode all ampersands; HTML entities are not + // entities within a Markdown code span. + text = text.replace(/&/g, "&"); + + // Do the angle bracket song and dance: + text = text.replace(//g, ">"); + + // Now, escape characters that are magic in Markdown: + text = escapeCharacters(text, "\*_{}[]\\", false); + + // jj the line above breaks this: + //--- + + //* Item + + // 1. Subitem + + // special char: * + //--- + + return text; + } + + function _DoItalicsAndBold(text) { + + // must go first: + text = text.replace(/([\W_]|^)(\*\*|__)(?=\S)([^\r]*?\S[\*_]*)\2([\W_]|$)/g, + "$1$3$4"); + + text = text.replace(/([\W_]|^)(\*|_)(?=\S)([^\r\*_]*?\S)\2([\W_]|$)/g, + "$1$3$4"); + + return text; + } + + function _DoBlockQuotes(text) { + + /* + text = text.replace(/ + ( // Wrap whole match in $1 + ( + ^[ \t]*>[ \t]? // '>' at the start of a line + .+\n // rest of the first line + (.+\n)* // subsequent consecutive lines + \n* // blanks + )+ + ) + /gm, function(){...}); + */ + + text = text.replace(/((^[ \t]*>[ \t]?.+\n(.+\n)*\n*)+)/gm, + function (wholeMatch, m1) { + var bq = m1; + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + bq = bq.replace(/^[ \t]*>[ \t]?/gm, "~0"); // trim one level of quoting + + // attacklab: clean up hack + bq = bq.replace(/~0/g, ""); + + bq = bq.replace(/^[ \t]+$/gm, ""); // trim whitespace-only lines + bq = _RunBlockGamut(bq); // recurse + + bq = bq.replace(/(^|\n)/g, "$1 "); + // These leading spaces screw with
           content, so we need to fix that:
          +                    bq = bq.replace(
          +                            /(\s*
          [^\r]+?<\/pre>)/gm,
          +                        function (wholeMatch, m1) {
          +                            var pre = m1;
          +                            // attacklab: hack around Konqueror 3.5.4 bug:
          +                            pre = pre.replace(/^  /mg, "~0");
          +                            pre = pre.replace(/~0/g, "");
          +                            return pre;
          +                        });
          +
          +                    return hashBlock("
          \n" + bq + "\n
          "); + } + ); + return text; + } + + function _FormParagraphs(text, doNotUnhash) { + // + // Params: + // $text - string to process with html

          tags + // + + // Strip leading and trailing lines: + text = text.replace(/^\n+/g, ""); + text = text.replace(/\n+$/g, ""); + + var grafs = text.split(/\n{2,}/g); + var grafsOut = []; + + var markerRe = /~K(\d+)K/; + + // + // Wrap

          tags. + // + var end = grafs.length; + for (var i = 0; i < end; i++) { + var str = grafs[i]; + + // if this is an HTML marker, copy it + if (markerRe.test(str)) { + grafsOut.push(str); + } + else if (/\S/.test(str)) { + str = _RunSpanGamut(str); + str = str.replace(/^([ \t]*)/g, "

          "); + str += "

          " + grafsOut.push(str); + } + + } + // + // Unhashify HTML blocks + // + if (!doNotUnhash) { + end = grafsOut.length; + for (var i = 0; i < end; i++) { + var foundAny = true; + while (foundAny) { // we may need several runs, since the data may be nested + foundAny = false; + grafsOut[i] = grafsOut[i].replace(/~K(\d+)K/g, function (wholeMatch, id) { + foundAny = true; + return g_html_blocks[id]; + }); + } + } + } + return grafsOut.join("\n\n"); + } + + function _EncodeAmpsAndAngles(text) { + // Smart processing for ampersands and angle brackets that need to be encoded. + + // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin: + // http://bumppo.net/projects/amputator/ + text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\w+);)/g, "&"); + + // Encode naked <'s + text = text.replace(/<(?![a-z\/?!]|~D)/gi, "<"); + + return text; + } + + function _EncodeBackslashEscapes(text) { + // + // Parameter: String. + // Returns: The string, with after processing the following backslash + // escape sequences. + // + + // attacklab: The polite way to do this is with the new + // escapeCharacters() function: + // + // text = escapeCharacters(text,"\\",true); + // text = escapeCharacters(text,"`*_{}[]()>#+-.!",true); + // + // ...but we're sidestepping its use of the (slow) RegExp constructor + // as an optimization for Firefox. This function gets called a LOT. + + text = text.replace(/\\(\\)/g, escapeCharacters_callback); + text = text.replace(/\\([`*_{}\[\]()>#+-.!])/g, escapeCharacters_callback); + return text; + } + + function handleTrailingParens(wholeMatch, lookbehind, protocol, link) { + if (lookbehind) + return wholeMatch; + if (link.charAt(link.length - 1) !== ")") + return "<" + protocol + link + ">"; + var parens = link.match(/[()]/g); + var level = 0; + for (var i = 0; i < parens.length; i++) { + if (parens[i] === "(") { + if (level <= 0) + level = 1; + else + level++; + } + else { + level--; + } + } + var tail = ""; + if (level < 0) { + var re = new RegExp("\\){1," + (-level) + "}$"); + link = link.replace(re, function (trailingParens) { + tail = trailingParens; + return ""; + }); + } + + return "<" + protocol + link + ">" + tail; + } + + function _DoAutoLinks(text) { + + // note that at this point, all other URL in the text are already hyperlinked as
          + // *except* for the case + + // automatically add < and > around unadorned raw hyperlinks + // must be preceded by a non-word character (and not by =" or <) and followed by non-word/EOF character + // simulating the lookbehind in a consuming way is okay here, since a URL can neither and with a " nor + // with a <, so there is no risk of overlapping matches. + text = text.replace(/(="|<)?\b(https?|ftp)(:\/\/[-A-Z0-9+&@#\/%?=~_|\[\]\(\)!:,\.;]*[-A-Z0-9+&@#\/%=~_|\[\])])(?=$|\W)/gi, handleTrailingParens); + + // autolink anything like + + var replacer = function (wholematch, m1) { return "" + pluginHooks.plainLinkText(m1) + ""; } + text = text.replace(/<((https?|ftp):[^'">\s]+)>/gi, replacer); + + // Email addresses: + /* + text = text.replace(/ + < + (?:mailto:)? + ( + [-.\w]+ + \@ + [-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+ + ) + > + /gi, _DoAutoLinks_callback()); + */ + + /* disabling email autolinking, since we don't do that on the server, either + text = text.replace(/<(?:mailto:)?([-.\w]+\@[-a-z0-9]+(\.[-a-z0-9]+)*\.[a-z]+)>/gi, + function(wholeMatch,m1) { + return _EncodeEmailAddress( _UnescapeSpecialChars(m1) ); + } + ); + */ + return text; + } + + function _UnescapeSpecialChars(text) { + // + // Swap back in all the special characters we've hidden. + // + text = text.replace(/~E(\d+)E/g, + function (wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + } + ); + return text; + } + + function _Outdent(text) { + // + // Remove one level of line-leading tabs or spaces + // + + // attacklab: hack around Konqueror 3.5.4 bug: + // "----------bug".replace(/^-/g,"") == "bug" + + text = text.replace(/^(\t|[ ]{1,4})/gm, "~0"); // attacklab: g_tab_width + + // attacklab: clean up hack + text = text.replace(/~0/g, "") + + return text; + } + + function _Detab(text) { + if (!/\t/.test(text)) + return text; + + var spaces = [" ", " ", " ", " "], + skew = 0, + v; + + return text.replace(/[\n\t]/g, function (match, offset) { + if (match === "\n") { + skew = offset + 1; + return match; + } + v = (offset - skew) % 4; + skew = offset + 1; + return spaces[v]; + }); + } + + // + // attacklab: Utility functions + // + + var _problemUrlChars = /(?:["'*()[\]:]|~D)/g; + + // hex-encodes some unusual "problem" chars in URLs to avoid URL detection problems + function encodeProblemUrlChars(url) { + if (!url) + return ""; + + var len = url.length; + + return url.replace(_problemUrlChars, function (match, offset) { + if (match == "~D") // escape for dollar + return "%24"; + if (match == ":") { + if (offset == len - 1 || /[0-9\/]/.test(url.charAt(offset + 1))) + return ":" + } + return "%" + match.charCodeAt(0).toString(16); + }); + } + + + function escapeCharacters(text, charsToEscape, afterBackslash) { + // First we have to escape the escape characters so that + // we can build a character class out of them + var regexString = "([" + charsToEscape.replace(/([\[\]\\])/g, "\\$1") + "])"; + + if (afterBackslash) { + regexString = "\\\\" + regexString; + } + + var regex = new RegExp(regexString, "g"); + text = text.replace(regex, escapeCharacters_callback); + + return text; + } + + + function escapeCharacters_callback(wholeMatch, m1) { + var charCodeToEscape = m1.charCodeAt(0); + return "~E" + charCodeToEscape + "E"; + } + + }; // end of the Markdown.Converter constructor + +})(); diff --git a/Output/Dhtml/js/Markdown.Extra.js b/Output/Dhtml/js/Markdown.Extra.js new file mode 100644 index 000000000..9b3edada2 --- /dev/null +++ b/Output/Dhtml/js/Markdown.Extra.js @@ -0,0 +1,787 @@ +(function () { + // A quick way to make sure we're only keeping span-level tags when we need to. + // This isn't supposed to be foolproof. It's just a quick way to make sure we + // keep all span-level tags returned by a pagedown converter. It should allow + // all span-level tags through, with or without attributes. + var inlineTags = new RegExp(['^(<\\/?(a|abbr|acronym|applet|area|b|basefont|', + 'bdo|big|button|cite|code|del|dfn|em|figcaption|', + 'font|i|iframe|img|input|ins|kbd|label|map|', + 'mark|meter|object|param|progress|q|ruby|rp|rt|s|', + 'samp|script|select|small|span|strike|strong|', + 'sub|sup|textarea|time|tt|u|var|wbr)[^>]*>|', + '<(br)\\s?\\/?>)$'].join(''), 'i'); + + /****************************************************************** + * Utility Functions * + *****************************************************************/ + + // patch for ie7 + if (!Array.indexOf) { + Array.prototype.indexOf = function(obj) { + for (var i = 0; i < this.length; i++) { + if (this[i] == obj) { + return i; + } + } + return -1; + }; + } + + function trim(str) { + return str.replace(/^\s+|\s+$/g, ''); + } + + function rtrim(str) { + return str.replace(/\s+$/g, ''); + } + + // Remove one level of indentation from text. Indent is 4 spaces. + function outdent(text) { + return text.replace(new RegExp('^(\\t|[ ]{1,4})', 'gm'), ''); + } + + function contains(str, substr) { + return str.indexOf(substr) != -1; + } + + // Sanitize html, removing tags that aren't in the whitelist + function sanitizeHtml(html, whitelist) { + return html.replace(/<[^>]*>?/gi, function(tag) { + return tag.match(whitelist) ? tag : ''; + }); + } + + // Merge two arrays, keeping only unique elements. + function union(x, y) { + var obj = {}; + for (var i = 0; i < x.length; i++) + obj[x[i]] = x[i]; + for (i = 0; i < y.length; i++) + obj[y[i]] = y[i]; + var res = []; + for (var k in obj) { + if (obj.hasOwnProperty(k)) + res.push(obj[k]); + } + return res; + } + + // JS regexes don't support \A or \Z, so we add sentinels, as Pagedown + // does. In this case, we add the ascii codes for start of text (STX) and + // end of text (ETX), an idea borrowed from: + // https://github.com/tanakahisateru/js-markdown-extra + function addAnchors(text) { + if(text.charAt(0) != '\x02') + text = '\x02' + text; + if(text.charAt(text.length - 1) != '\x03') + text = text + '\x03'; + return text; + } + + // Remove STX and ETX sentinels. + function removeAnchors(text) { + if(text.charAt(0) == '\x02') + text = text.substr(1); + if(text.charAt(text.length - 1) == '\x03') + text = text.substr(0, text.length - 1); + return text; + } + + // Convert markdown within an element, retaining only span-level tags + function convertSpans(text, extra) { + return sanitizeHtml(convertAll(text, extra), inlineTags); + } + + // Convert internal markdown using the stock pagedown converter + function convertAll(text, extra) { + var result = extra.blockGamutHookCallback(text); + // We need to perform these operations since we skip the steps in the converter + result = unescapeSpecialChars(result); + result = result.replace(/~D/g, "$$").replace(/~T/g, "~"); + result = extra.previousPostConversion(result); + return result; + } + + // Convert escaped special characters to HTML decimal entity codes. + function processEscapes(text) { + // Markdown extra adds two escapable characters, `:` and `|` + // If escaped, we convert them to html entities so our + // regexes don't recognize them. Markdown doesn't support escaping + // the escape character, e.g. `\\`, which make this even simpler. + return text.replace(/\\\|/g, '|').replace(/\\:/g, ':'); + } + + // Duplicated from PageDown converter + function unescapeSpecialChars(text) { + // Swap back in all the special characters we've hidden. + text = text.replace(/~E(\d+)E/g, function(wholeMatch, m1) { + var charCodeToReplace = parseInt(m1); + return String.fromCharCode(charCodeToReplace); + }); + return text; + } + + function slugify(text) { + return text.toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .replace(/^-+/, '') // Trim - from start of text + .replace(/-+$/, ''); // Trim - from end of text + } + + /***************************************************************************** + * Markdown.Extra * + ****************************************************************************/ + + Markdown.Extra = function() { + // For converting internal markdown (in tables for instance). + // This is necessary since these methods are meant to be called as + // preConversion hooks, and the Markdown converter passed to init() + // won't convert any markdown contained in the html tags we return. + this.converter = null; + + // Stores html blocks we generate in hooks so that + // they're not destroyed if the user is using a sanitizing converter + this.hashBlocks = []; + + // Stores footnotes + this.footnotes = {}; + this.usedFootnotes = []; + + // Special attribute blocks for fenced code blocks and headers enabled. + this.attributeBlocks = false; + + // Fenced code block options + this.googleCodePrettify = false; + this.highlightJs = false; + + // Table options + this.tableClass = ''; + + this.tabWidth = 4; + }; + + Markdown.Extra.init = function(converter, options) { + // Each call to init creates a new instance of Markdown.Extra so it's + // safe to have multiple converters, with different options, on a single page + var extra = new Markdown.Extra(); + var postNormalizationTransformations = []; + var preBlockGamutTransformations = []; + var postConversionTransformations = ["unHashExtraBlocks"]; + + options = options || {}; + options.extensions = options.extensions || ["all"]; + if (contains(options.extensions, "all")) { + options.extensions = ["tables", "fenced_code_gfm", "def_list", "attr_list", "footnotes", "smartypants"]; + } + preBlockGamutTransformations.push("wrapHeaders"); + if (contains(options.extensions, "attr_list")) { + postNormalizationTransformations.push("hashFcbAttributeBlocks"); + preBlockGamutTransformations.push("hashHeaderAttributeBlocks"); + postConversionTransformations.push("applyAttributeBlocks"); + extra.attributeBlocks = true; + } + if (contains(options.extensions, "fenced_code_gfm")) { + postNormalizationTransformations.push("fencedCodeBlocks"); + } + if (contains(options.extensions, "tables")) { + preBlockGamutTransformations.push("tables"); + } + if (contains(options.extensions, "def_list")) { + preBlockGamutTransformations.push("definitionLists"); + } + if (contains(options.extensions, "footnotes")) { + postNormalizationTransformations.push("stripFootnoteDefinitions"); + preBlockGamutTransformations.push("doFootnotes"); + postConversionTransformations.push("printFootnotes"); + } + if (contains(options.extensions, "smartypants")) { + postConversionTransformations.push("runSmartyPants"); + } + + converter.hooks.chain("postNormalization", function(text) { + return extra.doTransform(postNormalizationTransformations, text) + '\n'; + }); + + converter.hooks.chain("preBlockGamut", function(text, blockGamutHookCallback) { + // Keep a reference to the block gamut callback to run recursively + extra.blockGamutHookCallback = blockGamutHookCallback; + text = processEscapes(text); + return extra.doTransform(preBlockGamutTransformations, text) + '\n'; + }); + + // Keep a reference to the hook chain running before doPostConversion to apply on hashed extra blocks + extra.previousPostConversion = converter.hooks.postConversion; + converter.hooks.chain("postConversion", function(text) { + text = extra.doTransform(postConversionTransformations, text); + // Clear state vars that may use unnecessary memory + extra.hashBlocks = []; + extra.footnotes = {}; + extra.usedFootnotes = []; + return text; + }); + + if ("highlighter" in options) { + extra.googleCodePrettify = options.highlighter === 'prettify'; + extra.highlightJs = options.highlighter === 'highlight'; + } + + if ("table_class" in options) { + extra.tableClass = options.table_class; + } + + extra.converter = converter; + + // Caller usually won't need this, but it's handy for testing. + return extra; + }; + + // Do transformations + Markdown.Extra.prototype.doTransform = function(transformations, text) { + for(var i = 0; i < transformations.length; i++) + text = this[transformations[i]](text); + return text; + }; + + // Return a placeholder containing a key, which is the block's index in the + // hashBlocks array. We wrap our output in a

          tag here so Pagedown won't. + Markdown.Extra.prototype.hashExtraBlock = function(block) { + return '\n

          ~X' + (this.hashBlocks.push(block) - 1) + 'X

          \n'; + }; + Markdown.Extra.prototype.hashExtraInline = function(block) { + return '~X' + (this.hashBlocks.push(block) - 1) + 'X'; + }; + + // Replace placeholder blocks in `text` with their corresponding + // html blocks in the hashBlocks array. + Markdown.Extra.prototype.unHashExtraBlocks = function(text) { + var self = this; + function recursiveUnHash() { + var hasHash = false; + text = text.replace(/(?:

          )?~X(\d+)X(?:<\/p>)?/g, function(wholeMatch, m1) { + hasHash = true; + var key = parseInt(m1, 10); + return self.hashBlocks[key]; + }); + if(hasHash === true) { + recursiveUnHash(); + } + } + recursiveUnHash(); + return text; + }; + + // Wrap headers to make sure they won't be in def lists + Markdown.Extra.prototype.wrapHeaders = function(text) { + function wrap(text) { + return '\n' + text + '\n'; + } + text = text.replace(/^.+[ \t]*\n=+[ \t]*\n+/gm, wrap); + text = text.replace(/^.+[ \t]*\n-+[ \t]*\n+/gm, wrap); + text = text.replace(/^\#{1,6}[ \t]*.+?[ \t]*\#*\n+/gm, wrap); + return text; + }; + + + /****************************************************************** + * Attribute Blocks * + *****************************************************************/ + + // Extract headers attribute blocks, move them above the element they will be + // applied to, and hash them for later. + Markdown.Extra.prototype.hashHeaderAttributeBlocks = function(text) { + // TODO: use sentinels. Should we just add/remove them in doConversion? + // TODO: better matches for id / class attributes + var attrBlock = "\\{\\s*[.|#][^}]+\\}"; + var hdrAttributesA = new RegExp("^(#{1,6}.*#{0,6})\\s+(" + attrBlock + ")[ \\t]*(\\n|0x03)", "gm"); + var hdrAttributesB = new RegExp("^(.*)\\s+(" + attrBlock + ")[ \\t]*\\n" + + "(?=[\\-|=]+\\s*(\\n|0x03))", "gm"); // underline lookahead + + var self = this; + function attributeCallback(wholeMatch, pre, attr) { + return '

          ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

          \n' + pre + "\n"; + } + + text = text.replace(hdrAttributesA, attributeCallback); // ## headers + text = text.replace(hdrAttributesB, attributeCallback); // underline headers + return text; + }; + + // Extract FCB attribute blocks, move them above the element they will be + // applied to, and hash them for later. + Markdown.Extra.prototype.hashFcbAttributeBlocks = function(text) { + // TODO: use sentinels. Should we just add/remove them in doConversion? + // TODO: better matches for id / class attributes + var attrBlock = "\\{\\s*[.|#][^}]+\\}"; + var fcbAttributes = new RegExp("^(```[^{\\n]*)\\s+(" + attrBlock + ")[ \\t]*\\n" + + "(?=([\\s\\S]*?)\\n```\\s*(\\n|0x03))", "gm"); + + var self = this; + function attributeCallback(wholeMatch, pre, attr) { + return '

          ~XX' + (self.hashBlocks.push(attr) - 1) + 'XX

          \n' + pre + "\n"; + } + + return text.replace(fcbAttributes, attributeCallback); + }; + + Markdown.Extra.prototype.applyAttributeBlocks = function(text) { + var self = this; + var blockRe = new RegExp('

          ~XX(\\d+)XX

          [\\s]*' + + '(?:<(h[1-6]|pre)(?: +class="(\\S+)")?(>[\\s\\S]*?))', "gm"); + text = text.replace(blockRe, function(wholeMatch, k, tag, cls, rest) { + if (!tag) // no following header or fenced code block. + return ''; + + // get attributes list from hash + var key = parseInt(k, 10); + var attributes = self.hashBlocks[key]; + + // get id + var id = attributes.match(/#[^\s{}]+/g) || []; + var idStr = id[0] ? ' id="' + id[0].substr(1, id[0].length - 1) + '"' : ''; + + // get classes and merge with existing classes + var classes = attributes.match(/\.[^\s{}]+/g) || []; + for (var i = 0; i < classes.length; i++) // Remove leading dot + classes[i] = classes[i].substr(1, classes[i].length - 1); + + var classStr = ''; + if (cls) + classes = union(classes, [cls]); + + if (classes.length > 0) + classStr = ' class="' + classes.join(' ') + '"'; + + return "<" + tag + idStr + classStr + rest; + }); + + return text; + }; + + /****************************************************************** + * Tables * + *****************************************************************/ + + // Find and convert Markdown Extra tables into html. + Markdown.Extra.prototype.tables = function(text) { + var self = this; + + var leadingPipe = new RegExp( + ['^' , + '[ ]{0,3}' , // Allowed whitespace + '[|]' , // Initial pipe + '(.+)\\n' , // $1: Header Row + + '[ ]{0,3}' , // Allowed whitespace + '[|]([ ]*[-:]+[-| :]*)\\n' , // $2: Separator + + '(' , // $3: Table Body + '(?:[ ]*[|].*\\n?)*' , // Table rows + ')', + '(?:\\n|$)' // Stop at final newline + ].join(''), + 'gm' + ); + + var noLeadingPipe = new RegExp( + ['^' , + '[ ]{0,3}' , // Allowed whitespace + '(\\S.*[|].*)\\n' , // $1: Header Row + + '[ ]{0,3}' , // Allowed whitespace + '([-:]+[ ]*[|][-| :]*)\\n' , // $2: Separator + + '(' , // $3: Table Body + '(?:.*[|].*\\n?)*' , // Table rows + ')' , + '(?:\\n|$)' // Stop at final newline + ].join(''), + 'gm' + ); + + text = text.replace(leadingPipe, doTable); + text = text.replace(noLeadingPipe, doTable); + + // $1 = header, $2 = separator, $3 = body + function doTable(match, header, separator, body, offset, string) { + // remove any leading pipes and whitespace + header = header.replace(/^ *[|]/m, ''); + separator = separator.replace(/^ *[|]/m, ''); + body = body.replace(/^ *[|]/gm, ''); + + // remove trailing pipes and whitespace + header = header.replace(/[|] *$/m, ''); + separator = separator.replace(/[|] *$/m, ''); + body = body.replace(/[|] *$/gm, ''); + + // determine column alignments + alignspecs = separator.split(/ *[|] */); + align = []; + for (var i = 0; i < alignspecs.length; i++) { + var spec = alignspecs[i]; + if (spec.match(/^ *-+: *$/m)) + align[i] = ' style="text-align:right;"'; + else if (spec.match(/^ *:-+: *$/m)) + align[i] = ' style="text-align:center;"'; + else if (spec.match(/^ *:-+ *$/m)) + align[i] = ' style="text-align:left;"'; + else align[i] = ''; + } + + // TODO: parse spans in header and rows before splitting, so that pipes + // inside of tags are not interpreted as separators + var headers = header.split(/ *[|] */); + var colCount = headers.length; + + // build html + var cls = self.tableClass ? ' class="' + self.tableClass + '"' : ''; + var html = ['\n', '\n', '\n'].join(''); + + // build column headers. + for (i = 0; i < colCount; i++) { + var headerHtml = convertSpans(trim(headers[i]), self); + html += [" ", headerHtml, "\n"].join(''); + } + html += "\n\n"; + + // build rows + var rows = body.split('\n'); + for (i = 0; i < rows.length; i++) { + if (rows[i].match(/^\s*$/)) // can apply to final row + continue; + + // ensure number of rowCells matches colCount + var rowCells = rows[i].split(/ *[|] */); + var lenDiff = colCount - rowCells.length; + for (var j = 0; j < lenDiff; j++) + rowCells.push(''); + + html += "\n"; + for (j = 0; j < colCount; j++) { + var colHtml = convertSpans(trim(rowCells[j]), self); + html += [" ", colHtml, "\n"].join(''); + } + html += "\n"; + } + + html += "\n"; + + // replace html with placeholder until postConversion step + return self.hashExtraBlock(html); + } + + return text; + }; + + + /****************************************************************** + * Footnotes * + *****************************************************************/ + + // Strip footnote, store in hashes. + Markdown.Extra.prototype.stripFootnoteDefinitions = function(text) { + var self = this; + + text = text.replace( + /\n[ ]{0,3}\[\^(.+?)\]\:[ \t]*\n?([\s\S]*?)\n{1,2}((?=\n[ ]{0,3}\S)|$)/g, + function(wholeMatch, m1, m2) { + m1 = slugify(m1); + m2 += "\n"; + m2 = m2.replace(/^[ ]{0,3}/g, ""); + self.footnotes[m1] = m2; + return "\n"; + }); + + return text; + }; + + + // Find and convert footnotes references. + Markdown.Extra.prototype.doFootnotes = function(text) { + var self = this; + if(self.isConvertingFootnote === true) { + return text; + } + + var footnoteCounter = 0; + text = text.replace(/\[\^(.+?)\]/g, function(wholeMatch, m1) { + var id = slugify(m1); + var footnote = self.footnotes[id]; + if (footnote === undefined) { + return wholeMatch; + } + footnoteCounter++; + self.usedFootnotes.push(id); + var html = '' + footnoteCounter + + ''; + return self.hashExtraInline(html); + }); + + return text; + }; + + // Print footnotes at the end of the document + Markdown.Extra.prototype.printFootnotes = function(text) { + var self = this; + + if (self.usedFootnotes.length === 0) { + return text; + } + + text += '\n\n
          \n
          \n
            \n\n'; + for(var i=0; i' + + formattedfootnote + + ' \n\n'; + } + text += '
          \n
          '; + return text; + }; + + + /****************************************************************** + * Fenced Code Blocks (gfm) * + ******************************************************************/ + + // Find and convert gfm-inspired fenced code blocks into html. + Markdown.Extra.prototype.fencedCodeBlocks = function(text) { + function encodeCode(code) { + code = code.replace(/&/g, "&"); + code = code.replace(//g, ">"); + // These were escaped by PageDown before postNormalization + code = code.replace(/~D/g, "$$"); + code = code.replace(/~T/g, "~"); + return code; + } + + var self = this; + text = text.replace(/(?:^|\n)```(.*)\n([\s\S]*?)\n```/g, function(match, m1, m2) { + var language = m1, codeblock = m2; + + // adhere to specified options + var preclass = self.googleCodePrettify ? ' class="prettyprint"' : ''; + var codeclass = ''; + if (language) { + if (self.googleCodePrettify || self.highlightJs) { + // use html5 language- class names. supported by both prettify and highlight.js + codeclass = ' class="language-' + language + '"'; + } else { + codeclass = ' class="' + language + '"'; + } + } + + var html = ['', + encodeCode(codeblock), '
          '].join(''); + + // replace codeblock with placeholder until postConversion step + return self.hashExtraBlock(html); + }); + + return text; + }; + + + /****************************************************************** + * SmartyPants * + ******************************************************************/ + + var educatePants = function(wholeMatch,m1,m2,m3,m4,m5,m6) { + var blockText = m5; + var blockOffset = 0; + var newBlockText = ''; + blockText.replace(/(<)([a-zA-Z1-6]*)([^\n>]?)(>)(.*?)(<\/\2>)/mg, function(wholeMatch,m1,m2,m3,m4,m5,m6,offset) { + newBlockText += applyPants(blockText.substring(blockOffset, offset)) + educatePants(wholeMatch,m1,m2,m3,m4,m5,m6); + blockOffset = offset + wholeMatch.length; + }); + newBlockText += applyPants(blockText.substring(blockOffset)); + return m1 + m2 + m3 + m4 + newBlockText + m6; + }; + + function revertPants(wholeMatch, m1) { + var blockText = m1; + blockText = blockText.replace(/&\#8220;/g, "\""); + blockText = blockText.replace(/&\#8221;/g, "\""); + blockText = blockText.replace(/&\#8216;/g, "'"); + blockText = blockText.replace(/&\#8217;/g, "'"); + blockText = blockText.replace(/&\#8212;/g, "---"); + blockText = blockText.replace(/&\#8211;/g, "--"); + blockText = blockText.replace(/&\#8230;/g, "..."); + return blockText; + } + + function applyPants(text) { + text = text.replace(/``/g, "“").replace (/''/g, "”"); + text = text.replace(/---/g, "—").replace(/--/g, "–"); + text = text.replace(/\.\.\./g, "…").replace(/\.\s\.\s\./g, "…"); + + text = text.replace (/^'(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/g, "‘"); + text = text.replace (/^"(?=[!"#\$\%'()*+,\-.\/:;<=>?\@\[\\]\^_`{|}~]\B)/g, "“"); + text = text.replace(/^"(?=\w)/g, "“"); + text = text.replace(/^'(?=\w)/g, "‘"); + + text = text.replace(/"'(?=\w)/g, "“‘"); + text = text.replace(/'"(?=\w)/g, "‘“"); + + // Special case for decade abbreviations (the '80s): + text = text.replace(/'(?=\d{2}s)/g, "’"); + text = text.replace(/(>|\t|\n|\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)'(?=\w)/g, "$1‘"); + text = text.replace(/([^<>\\ \t\r\n\[\{\(\-])'(?=\s | s\b)/g, "$1’"); + + // Any remaining single quotes should be opening ones: + text = text.replace(/`/g, "‘").replace(/'/g, "’"); + text = text.replace(/(>|\t|\n|\s| |--|&[mn]dash;|&\#8211;|&\#8212;|&\#x201[34];)"(?=\w)/g, "$1“"); + text = text.replace(/([^<>\\ \t\r\n\[\{\(\-])"(?=\s | s\b)/g, "$1”"); + + text = text.replace(/"/ig, "”"); + return text; + } + + // Find and convert markdown extra definition lists into html. + Markdown.Extra.prototype.runSmartyPants = function(text) { + text = text.replace(/(<)([a-zA-Z1-6]+)([^\n>]*?)(>)(.*?)(<\/\2>)/gm, educatePants); + //clean everything inside html tags + text = text.replace(/(<([a-zA-Z1-6]+)\b([^\n>]*?)(\/)?>)/g, revertPants); + //clean out replacements inside special tags + text = text.replace(/((<)(code|kbd|pre|script|noscript|iframe|math|ins|del|pre)(.?)(>)(.*?)(<\/)(code|kbd|pre|script|noscript|iframe|math|ins|del|pre)(>))/gm, revertPants); + return text; + }; + + /****************************************************************** + * Definition Lists * + ******************************************************************/ + + // Find and convert markdown extra definition lists into html. + Markdown.Extra.prototype.definitionLists = function(text) { + var wholeList = new RegExp( + ['(\\x02\\n?|\\n\\n)' , + '(?:' , + '(' , // $1 = whole list + '(' , // $2 + '[ ]{0,3}' , + '((?:[ \\t]*\\S.*\\n)+)', // $3 = defined term + '\\n?' , + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + '([\\s\\S]+?)' , + '(' , // $4 + '(?=\\0x03)' , // \z + '|' , + '(?=' , + '\\n{2,}' , + '(?=\\S)' , + '(?!' , // Negative lookahead for another term + '[ ]{0,3}' , + '(?:\\S.*\\n)+?' , // defined term + '\\n?' , + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + '(?!' , // Negative lookahead for another definition + '[ ]{0,3}:[ ]+' , // colon starting definition + ')' , + ')' , + ')' , + ')' , + ')' + ].join(''), + 'gm' + ); + + var self = this; + text = addAnchors(text); + + text = text.replace(wholeList, function(match, pre, list) { + var result = trim(self.processDefListItems(list)); + result = "
          \n" + result + "\n
          "; + return pre + self.hashExtraBlock(result) + "\n\n"; + }); + + return removeAnchors(text); + }; + + // Process the contents of a single definition list, splitting it + // into individual term and definition list items. + Markdown.Extra.prototype.processDefListItems = function(listStr) { + var self = this; + + var dt = new RegExp( + ['(\\x02\\n?|\\n\\n+)' , // leading line + '(' , // definition terms = $1 + '[ ]{0,3}' , // leading whitespace + '(?![:][ ]|[ ])' , // negative lookahead for a definition + // mark (colon) or more whitespace + '(?:\\S.*\\n)+?' , // actual term (not whitespace) + ')' , + '(?=\\n?[ ]{0,3}:[ ])' // lookahead for following line feed + ].join(''), // with a definition mark + 'gm' + ); + + var dd = new RegExp( + ['\\n(\\n+)?' , // leading line = $1 + '(' , // marker space = $2 + '[ ]{0,3}' , // whitespace before colon + '[:][ ]+' , // definition mark (colon) + ')' , + '([\\s\\S]+?)' , // definition text = $3 + '(?=\\n*' , // stop at next definition mark, + '(?:' , // next term or end of text + '\\n[ ]{0,3}[:][ ]|' , + '
          |\\x03' , // \z + ')' , + ')' + ].join(''), + 'gm' + ); + + listStr = addAnchors(listStr); + // trim trailing blank lines: + listStr = listStr.replace(/\n{2,}(?=\\x03)/, "\n"); + + // Process definition terms. + listStr = listStr.replace(dt, function(match, pre, termsStr) { + var terms = trim(termsStr).split("\n"); + var text = ''; + for (var i = 0; i < terms.length; i++) { + var term = terms[i]; + // process spans inside dt + term = convertSpans(trim(term), self); + text += "\n
          " + term + "
          "; + } + return text + "\n"; + }); + + // Process actual definitions. + listStr = listStr.replace(dd, function(match, leadingLine, markerSpace, def) { + if (leadingLine || def.match(/\n{2,}/)) { + // replace marker with the appropriate whitespace indentation + def = Array(markerSpace.length + 1).join(' ') + def; + // process markdown inside definition + // TODO?: currently doesn't apply extensions + def = outdent(def) + "\n\n"; + def = "\n" + convertAll(def, self) + "\n"; + } else { + // convert span-level markdown inside definition + def = rtrim(def); + def = convertSpans(outdent(def), self); + } + + return "\n
          " + def + "
          \n"; + }); + + return removeAnchors(listStr); + }; + +})(); + diff --git a/Output/Dhtml/js/bootstrap.min.js b/Output/Dhtml/js/bootstrap.min.js new file mode 100644 index 000000000..73730522c --- /dev/null +++ b/Output/Dhtml/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/** +* Bootstrap.js by @fat & @mdo +* plugins: bootstrap-transition.js, bootstrap-modal.js, bootstrap-dropdown.js, bootstrap-scrollspy.js, bootstrap-tab.js, bootstrap-tooltip.js, bootstrap-popover.js, bootstrap-affix.js, bootstrap-alert.js, bootstrap-button.js, bootstrap-collapse.js, bootstrap-carousel.js, bootstrap-typeahead.js +* Copyright 2012 Twitter, Inc. +* http://www.apache.org/licenses/LICENSE-2.0.txt +*/ +!function(a){a(function(){a.support.transition=function(){var a=function(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},c;for(c in b)if(a.style[c]!==undefined)return b[c]}();return a&&{end:a}}()})}(window.jQuery),!function(a){var b=function(b,c){this.options=c,this.$element=a(b).delegate('[data-dismiss="modal"]',"click.dismiss.modal",a.proxy(this.hide,this)),this.options.remote&&this.$element.find(".modal-body").load(this.options.remote)};b.prototype={constructor:b,toggle:function(){return this[this.isShown?"hide":"show"]()},show:function(){var b=this,c=a.Event("show");this.$element.trigger(c);if(this.isShown||c.isDefaultPrevented())return;this.isShown=!0,this.escape(),this.backdrop(function(){var c=a.support.transition&&b.$element.hasClass("fade");b.$element.parent().length||b.$element.appendTo(document.body),b.$element.show(),c&&b.$element[0].offsetWidth,b.$element.addClass("in").attr("aria-hidden",!1),b.enforceFocus(),c?b.$element.one(a.support.transition.end,function(){b.$element.focus().trigger("shown")}):b.$element.focus().trigger("shown")})},hide:function(b){b&&b.preventDefault();var c=this;b=a.Event("hide"),this.$element.trigger(b);if(!this.isShown||b.isDefaultPrevented())return;this.isShown=!1,this.escape(),a(document).off("focusin.modal"),this.$element.removeClass("in").attr("aria-hidden",!0),a.support.transition&&this.$element.hasClass("fade")?this.hideWithTransition():this.hideModal()},enforceFocus:function(){var b=this;a(document).on("focusin.modal",function(a){b.$element[0]!==a.target&&!b.$element.has(a.target).length&&b.$element.focus()})},escape:function(){var a=this;this.isShown&&this.options.keyboard?this.$element.on("keyup.dismiss.modal",function(b){b.which==27&&a.hide()}):this.isShown||this.$element.off("keyup.dismiss.modal")},hideWithTransition:function(){var b=this,c=setTimeout(function(){b.$element.off(a.support.transition.end),b.hideModal()},500);this.$element.one(a.support.transition.end,function(){clearTimeout(c),b.hideModal()})},hideModal:function(a){this.$element.hide().trigger("hidden"),this.backdrop()},removeBackdrop:function(){this.$backdrop.remove(),this.$backdrop=null},backdrop:function(b){var c=this,d=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var e=a.support.transition&&d;this.$backdrop=a('
          diff --git a/docs/Output/Html/Features/09CallingStepsFromSteps/CallingStepsFromSteps.html b/docs/Output/Html/Features/09CallingStepsFromSteps/CallingStepsFromSteps.html index 13bdf8815..f22000402 100644 --- a/docs/Output/Html/Features/09CallingStepsFromSteps/CallingStepsFromSteps.html +++ b/docs/Output/Html/Features/09CallingStepsFromSteps/CallingStepsFromSteps.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -298,9 +301,9 @@

          Do something meaningful

          diff --git a/docs/Output/Html/Features/09CallingStepsFromSteps/index.html b/docs/Output/Html/Features/09CallingStepsFromSteps/index.html index f322c4283..5f2e8cd3c 100644 --- a/docs/Output/Html/Features/09CallingStepsFromSteps/index.html +++ b/docs/Output/Html/Features/09CallingStepsFromSteps/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -266,9 +269,9 @@

          09 Calling Steps From Steps

          diff --git a/docs/Output/Html/Features/10StepTransformation/StepTransformation.html b/docs/Output/Html/Features/10StepTransformation/StepTransformation.html index 81c6a81b4..3160dc20b 100644 --- a/docs/Output/Html/Features/10StepTransformation/StepTransformation.html +++ b/docs/Output/Html/Features/10StepTransformation/StepTransformation.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -278,9 +281,9 @@

          Steps with non-string arguments

          diff --git a/docs/Output/Html/Features/10StepTransformation/index.html b/docs/Output/Html/Features/10StepTransformation/index.html index d12c95d63..85e891cc3 100644 --- a/docs/Output/Html/Features/10StepTransformation/index.html +++ b/docs/Output/Html/Features/10StepTransformation/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -266,9 +269,9 @@

          10 Step Transformation

          diff --git a/docs/Output/Html/Features/11ContextInjection/ContextInjection.html b/docs/Output/Html/Features/11ContextInjection/ContextInjection.html index 5e92503b2..41da4ddd9 100644 --- a/docs/Output/Html/Features/11ContextInjection/ContextInjection.html +++ b/docs/Output/Html/Features/11ContextInjection/ContextInjection.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -346,9 +349,9 @@

          Feature with a dependent context

          diff --git a/docs/Output/Html/Features/11ContextInjection/index.html b/docs/Output/Html/Features/11ContextInjection/index.html index 720008723..2c5ea7a1c 100644 --- a/docs/Output/Html/Features/11ContextInjection/index.html +++ b/docs/Output/Html/Features/11ContextInjection/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -268,9 +271,9 @@

          11 Context Injection

          diff --git a/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/NestedFolderExample.html b/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/NestedFolderExample.html index 62cc6c1bf..c0a5458f0 100644 --- a/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/NestedFolderExample.html +++ b/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/NestedFolderExample.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -281,9 +284,9 @@

          Nested - Add two numbers

          diff --git a/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/index.html b/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/index.html index 90a6645f8..562d67448 100644 --- a/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/index.html +++ b/docs/Output/Html/Features/12NestedFolders/ChildFolder/ChildChildFolder/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -266,9 +269,9 @@

          Child Child Folder

          diff --git a/docs/Output/Html/Features/12NestedFolders/ChildFolder/index.html b/docs/Output/Html/Features/12NestedFolders/ChildFolder/index.html index b00f09e98..b9498354d 100644 --- a/docs/Output/Html/Features/12NestedFolders/ChildFolder/index.html +++ b/docs/Output/Html/Features/12NestedFolders/ChildFolder/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -256,9 +259,9 @@

          Child Folder

            diff --git a/docs/Output/Html/Features/12NestedFolders/index.html b/docs/Output/Html/Features/12NestedFolders/index.html index 548c4aa23..c3f8f3ad5 100644 --- a/docs/Output/Html/Features/12NestedFolders/index.html +++ b/docs/Output/Html/Features/12NestedFolders/index.html @@ -235,6 +235,9 @@
          • Interactive DHTML View
          • +
          • + Kinds of verification +
        • @@ -256,9 +259,9 @@

          12 Nested Folders

            diff --git a/docs/Output/Html/Features/13MultilineText/MultilineFeatureExample.html b/docs/Output/Html/Features/13MultilineText/MultilineFeatureExample.html index aabed4a78..2e2e68928 100644 --- a/docs/Output/Html/Features/13MultilineText/MultilineFeatureExample.html +++ b/docs/Output/Html/Features/13MultilineText/MultilineFeatureExample.html @@ -235,6 +235,9 @@
          • Interactive DHTML View
          • +
          • + Kinds of verification +
        • @@ -281,9 +284,9 @@

          Mutliline Output

          diff --git a/docs/Output/Html/Features/13MultilineText/index.html b/docs/Output/Html/Features/13MultilineText/index.html index e3ab6400c..db29dc508 100644 --- a/docs/Output/Html/Features/13MultilineText/index.html +++ b/docs/Output/Html/Features/13MultilineText/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -266,9 +269,9 @@

          13 Multiline Text

          diff --git a/docs/Output/Html/Features/14MarkdownExample/MarkdownExamples.html b/docs/Output/Html/Features/14MarkdownExample/MarkdownExamples.html index 98be965f0..f4c316ddb 100644 --- a/docs/Output/Html/Features/14MarkdownExample/MarkdownExamples.html +++ b/docs/Output/Html/Features/14MarkdownExample/MarkdownExamples.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -396,9 +399,9 @@

          Examples:

          diff --git a/docs/Output/Html/Features/14MarkdownExample/index.html b/docs/Output/Html/Features/14MarkdownExample/index.html index 0fae5707e..f7bff0b0c 100644 --- a/docs/Output/Html/Features/14MarkdownExample/index.html +++ b/docs/Output/Html/Features/14MarkdownExample/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -298,9 +301,9 @@

          14 Markdown Example

          diff --git a/docs/Output/Html/Features/15Pickles/InteractiveDHTMLView.html b/docs/Output/Html/Features/15Pickles/InteractiveDHTMLView.html index 8467af152..19a3841aa 100644 --- a/docs/Output/Html/Features/15Pickles/InteractiveDHTMLView.html +++ b/docs/Output/Html/Features/15Pickles/InteractiveDHTMLView.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -278,9 +281,9 @@

          Scenario with large data table

          diff --git a/docs/Output/Html/Features/15Pickles/NotTestedAutomatedManualTags.html b/docs/Output/Html/Features/15Pickles/NotTestedAutomatedManualTags.html new file mode 100644 index 000000000..2b3b658c7 --- /dev/null +++ b/docs/Output/Html/Features/15Pickles/NotTestedAutomatedManualTags.html @@ -0,0 +1,332 @@ + + + + + Kinds of verification + + + + + + + + +
          +
          + +
          +

          Kinds of verification

          +
          +

          In order to increase stakeholder engagement with pickled specs +As a SpecFlow evangelist +I want to make clear how many scenarios are automated, manually tested and not tested +So that the stakeholders have a better overview of progress

          +
          +
            +
          • +
            +

            Tags: @automated

            +

            Verified automatically

            +
            +
            +
              +
            • + Given a feature that is verified automatically
            • +
            • + When I run pickles
            • +
            • + Then it appears in the @automated summary
            • +
            +
            + + + +
          • +
          • +
            +

            Tags: @manual

            +

            Verified manually

            +
            +
            +
              +
            • + Given a feature that is verified manually
            • +
            • + When I run pickles
            • +
            • + Then it appears in the @manual summary
            • +
            +
            + + + +
          • +
          • +
            +

            Tags: @notTested_waitingForAutomation

            +

            Verified automatically

            +
            +
            +
              +
            • + Given a feature that is not verified
            • +
            • + When I run pickles
            • +
            • + Then it appears in the @notTested summary
            • +
            +
            + + + +
          • +
          +
          + +
          + + \ No newline at end of file diff --git a/docs/Output/Html/Features/15Pickles/index.html b/docs/Output/Html/Features/15Pickles/index.html index 9e210ed00..9cfba0d45 100644 --- a/docs/Output/Html/Features/15Pickles/index.html +++ b/docs/Output/Html/Features/15Pickles/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -264,12 +267,22 @@

          15 Pickles

          So that I do not overwhelm them.
        • +
        • + + Kinds of verification + - + In order to increase stakeholder engagement with pickled specs +As a SpecFlow evangelist +I want to make clear how many scenarios are automated, manually tested and not tested +So that the stakeholders have a better overview of progress + +
        • diff --git a/docs/Output/Html/Features/Arithmetic.html b/docs/Output/Html/Features/Arithmetic.html index d77e99d8e..d8ea745d4 100644 --- a/docs/Output/Html/Features/Arithmetic.html +++ b/docs/Output/Html/Features/Arithmetic.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -350,9 +353,9 @@

          Divide two numbers

          diff --git a/docs/Output/Html/Features/Trigonometry.html b/docs/Output/Html/Features/Trigonometry.html index ece05c4bb..302dc005d 100644 --- a/docs/Output/Html/Features/Trigonometry.html +++ b/docs/Output/Html/Features/Trigonometry.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -317,9 +320,9 @@

          Tangent

          diff --git a/docs/Output/Html/Features/Workflow/ClearingScreen.html b/docs/Output/Html/Features/Workflow/ClearingScreen.html index 99ccf52f4..ba4b48b65 100644 --- a/docs/Output/Html/Features/Workflow/ClearingScreen.html +++ b/docs/Output/Html/Features/Workflow/ClearingScreen.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -281,9 +284,9 @@

          Clear the screen

          diff --git a/docs/Output/Html/Features/Workflow/index.html b/docs/Output/Html/Features/Workflow/index.html index 976e685ce..5ffb64d7c 100644 --- a/docs/Output/Html/Features/Workflow/index.html +++ b/docs/Output/Html/Features/Workflow/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -266,9 +269,9 @@

          Workflow

          diff --git a/docs/Output/Html/Features/index.html b/docs/Output/Html/Features/index.html index ef4a7d6b4..9ef2ac9ef 100644 --- a/docs/Output/Html/Features/index.html +++ b/docs/Output/Html/Features/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -278,9 +281,9 @@

          Features

          diff --git a/docs/Output/Html/index.html b/docs/Output/Html/index.html index b3b1bb52b..e49a014b7 100644 --- a/docs/Output/Html/index.html +++ b/docs/Output/Html/index.html @@ -235,6 +235,9 @@
        • Interactive DHTML View
        • +
        • + Kinds of verification +
        • @@ -256,9 +259,9 @@

          Examples

            diff --git a/docs/Output/Html/readme.html b/docs/Output/Html/readme.html index 44a38f525..6ee147711 100644 --- a/docs/Output/Html/readme.html +++ b/docs/Output/Html/readme.html @@ -235,6 +235,9 @@
          • Interactive DHTML View
          • +
          • + Kinds of verification +
        • @@ -255,9 +258,9 @@

          In the Features-folders you'll find quite a large population of .feature files that you can use to test out pickles on.

          diff --git a/docs/Output/JSON/pickledFeatures.json b/docs/Output/JSON/pickledFeatures.json index 874f9bfdf..1911f7874 100644 --- a/docs/Output/JSON/pickledFeatures.json +++ b/docs/Output/JSON/pickledFeatures.json @@ -2695,6 +2695,134 @@ "WasProvided": false } }, + { + "RelativeFolder": "Features\\15Pickles\\NotTestedAutomatedManualTags.feature", + "Feature": { + "Name": "Kinds of verification", + "Description": "In order to increase stakeholder engagement with pickled specs\r\nAs a SpecFlow evangelist\r\nI want to make clear how many scenarios are automated, manually tested and not tested\r\nSo that the stakeholders have a better overview of progress", + "FeatureElements": [ + { + "Name": "Verified automatically", + "Slug": "verified-automatically", + "Description": "", + "Steps": [ + { + "Keyword": "Given", + "NativeKeyword": "Given ", + "Name": "a feature that is verified automatically", + "StepComments": [], + "AfterLastStepComments": [] + }, + { + "Keyword": "When", + "NativeKeyword": "When ", + "Name": "I run pickles", + "StepComments": [], + "AfterLastStepComments": [] + }, + { + "Keyword": "Then", + "NativeKeyword": "Then ", + "Name": "it appears in the @automated summary", + "StepComments": [], + "AfterLastStepComments": [] + } + ], + "Tags": [ + "@automated" + ], + "Result": { + "WasExecuted": false, + "WasSuccessful": false, + "WasProvided": false + } + }, + { + "Name": "Verified manually", + "Slug": "verified-manually", + "Description": "", + "Steps": [ + { + "Keyword": "Given", + "NativeKeyword": "Given ", + "Name": "a feature that is verified manually", + "StepComments": [], + "AfterLastStepComments": [] + }, + { + "Keyword": "When", + "NativeKeyword": "When ", + "Name": "I run pickles", + "StepComments": [], + "AfterLastStepComments": [] + }, + { + "Keyword": "Then", + "NativeKeyword": "Then ", + "Name": "it appears in the @manual summary", + "StepComments": [], + "AfterLastStepComments": [] + } + ], + "Tags": [ + "@manual" + ], + "Result": { + "WasExecuted": false, + "WasSuccessful": false, + "WasProvided": false + } + }, + { + "Name": "Verified automatically", + "Slug": "verified-automatically", + "Description": "", + "Steps": [ + { + "Keyword": "Given", + "NativeKeyword": "Given ", + "Name": "a feature that is not verified", + "StepComments": [], + "AfterLastStepComments": [] + }, + { + "Keyword": "When", + "NativeKeyword": "When ", + "Name": "I run pickles", + "StepComments": [], + "AfterLastStepComments": [] + }, + { + "Keyword": "Then", + "NativeKeyword": "Then ", + "Name": "it appears in the @notTested summary", + "StepComments": [], + "AfterLastStepComments": [] + } + ], + "Tags": [ + "@notTested_waitingForAutomation" + ], + "Result": { + "WasExecuted": false, + "WasSuccessful": false, + "WasProvided": false + } + } + ], + "Result": { + "WasExecuted": false, + "WasSuccessful": false, + "WasProvided": false + }, + "Tags": [] + }, + "Result": { + "WasExecuted": false, + "WasSuccessful": false, + "WasProvided": false + } + }, { "RelativeFolder": "Features\\Arithmetic.feature", "Feature": { @@ -3177,6 +3305,27 @@ "Failing": 0, "Inconclusive": 1 }, + { + "Tag": "@automated", + "Total": 1, + "Passing": 0, + "Failing": 0, + "Inconclusive": 1 + }, + { + "Tag": "@manual", + "Total": 1, + "Passing": 0, + "Failing": 0, + "Inconclusive": 1 + }, + { + "Tag": "@notTested_waitingForAutomation", + "Total": 1, + "Passing": 0, + "Failing": 0, + "Inconclusive": 1 + }, { "Tag": "@arithmetic", "Total": 4, @@ -3216,37 +3365,46 @@ "Folders": [ { "Folder": "Features", - "Total": 54, + "Total": 57, "Passing": 0, "Failing": 0, - "Inconclusive": 54 + "Inconclusive": 57 } ], "NotTestedFolders": [ { "Folder": "Features", - "Total": 0, + "Total": 1, "Passing": 0, "Failing": 0, - "Inconclusive": 0 + "Inconclusive": 1 } ], "Scenarios": { - "Total": 54, + "Total": 57, "Passing": 0, "Failing": 0, - "Inconclusive": 54 + "Inconclusive": 57 }, "Features": { - "Total": 23, + "Total": 24, "Passing": 0, "Failing": 0, - "Inconclusive": 23 - } + "Inconclusive": 24 + }, + "FoldersWithTestKinds": [ + { + "Folder": "Features", + "Total": 57, + "Automated": 55, + "Manual": 1, + "NotTested": 1 + } + ] }, "Configuration": { "SutName": "Pickles", - "SutVersion": "2.20.1", - "GeneratedOn": "18 Oktober 2018 19:07:15" + "SutVersion": "2.21.0", + "GeneratedOn": "14 Juli 2020 12:05:39" } } \ No newline at end of file diff --git a/docs/Output/Word/Pickles.docx b/docs/Output/Word/Pickles.docx index 263366947..326e6eb96 100644 Binary files a/docs/Output/Word/Pickles.docx and b/docs/Output/Word/Pickles.docx differ diff --git a/docs/Output/Word/features.docx b/docs/Output/Word/features.docx index 5bfb02fdd..172365bd3 100644 Binary files a/docs/Output/Word/features.docx and b/docs/Output/Word/features.docx differ diff --git a/docs/index.html b/docs/index.html index 9f4a7045f..06216a4ac 100644 --- a/docs/index.html +++ b/docs/index.html @@ -159,7 +159,7 @@

          Download

          - If you prefer to download the .zip files, you can so from the Github release page. + If you prefer to download the .zip files, you can so from the Github release page.

          + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Generated on: {0:dd MMMM yyyy} at {0:H:mm:ss} + The date and time when document was generated, parameter {0} is this date/time. + + + Features + Title for the complete document containing all features and scenarions. + + \ No newline at end of file diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/MarkdownDocumentationBuilder.cs b/src/Pickles/Pickles.DocumentationBuilders.Markdown/MarkdownDocumentationBuilder.cs new file mode 100644 index 000000000..58e2ee5bb --- /dev/null +++ b/src/Pickles/Pickles.DocumentationBuilders.Markdown/MarkdownDocumentationBuilder.cs @@ -0,0 +1,108 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright 2018 Darren Comeau +// Copyright 2018-present PicklesDoc team and community contributors +// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// -------------------------------------------------------------------------------------------------------------------- + +using PicklesDoc.Pickles.DataStructures; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.IO.Abstractions; + +namespace PicklesDoc.Pickles.DocumentationBuilders.Markdown +{ + public class MarkdownDocumentationBuilder : IDocumentationBuilder + { + private readonly Stylist style = new Stylist(); + private readonly IFileSystem fileSystem; + private readonly IConfiguration configuration; + + private readonly string namespaceOfResources; + + private readonly string outputFolder; + + + public MarkdownDocumentationBuilder(IFileSystem fileSystem, IConfiguration configuration) + { + this.fileSystem = fileSystem; + this.configuration = configuration; + this.namespaceOfResources = "PicklesDoc.Pickles.DocumentationBuilders.Markdown.Resource."; + + if (configuration.OutputFolder == null) + { + outputFolder = @"C:\testing"; + } + else + { + outputFolder = configuration.OutputFolder.FullName; + } + } + + public void Build(Tree featureTree) + { + var documentation = new Documentation(featureTree); + + WriteContentToFile(TargetFile(), documentation.CurrentPage); + + WriteImage(outputFolder, "pass_32.png", "pass.png"); + WriteImage(outputFolder, "fail_32.png", "fail.png"); + WriteImage(outputFolder, "inconclusive_32.png", "inconclusive.png"); + } + + // TODO: new class handles file system interaction + private void WriteContentToFile(string filePath, string content) + { + using (var file = fileSystem.FileInfo.FromFileName(filePath).CreateText()) + { + file.Write(content); + + file.Close(); + } + } + + private string TargetFile() + { + var fileName = "features.md"; + + string defaultOutputFile = string.Empty; + defaultOutputFile = Path.Combine(outputFolder, fileName); + + return defaultOutputFile; + } + + + + private void WriteImage(string folder, string sourcefilename, string targetfilename) + { + string path = this.fileSystem.Path.Combine(folder, targetfilename); + + using (Image image = Image.FromStream(this.GetResourceStream(this.namespaceOfResources + sourcefilename))) + { + using (var stream = this.fileSystem.File.Create(path)) + { + image.Save(stream, ImageFormat.Png); + } + } + } + + private Stream GetResourceStream(string nameOfResource) + { + return this.GetType().Assembly.GetManifestResourceStream(nameOfResource); + } + } +} diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/Pickles.DocumentationBuilders.Markdown.csproj b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Pickles.DocumentationBuilders.Markdown.csproj new file mode 100644 index 000000000..17c67d122 --- /dev/null +++ b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Pickles.DocumentationBuilders.Markdown.csproj @@ -0,0 +1,91 @@ + + + + + Debug + AnyCPU + {732039F2-CAD8-44BC-9647-EC0ACAF59632} + Library + Properties + PicklesDoc.Pickles.DocumentationBuilders.Markdown + PicklesDoc.Pickles.DocumentationBuilders.Markdown + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\packages\System.IO.Abstractions.2.1.0.178\lib\net40\System.IO.Abstractions.dll + + + + + + + + + + + VersionInfo.cs + + + + + + + + + + + + True + True + Localization.resx + + + + + + + + + {55382afc-e050-4df7-aa4f-0aba71e2e169} + Pickles.ObjectModel + + + + + + + + + ResXFileCodeGenerator + Localization.Designer.cs + + + + + + + + + \ No newline at end of file diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/Properties/AssemblyInfo.cs b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..fb8816996 --- /dev/null +++ b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("PicklesDoc.Pickles.DocumentationBuilders.Markdown.UnitTests")] +[assembly: InternalsVisibleTo("PicklesDoc.Pickles.DocumentationBuilders.Markdown.AcceptanceTests")] + +[assembly: AssemblyTitle("Pickles.DocumentationBuilders.Markdown")] +[assembly: AssemblyDescription("A Pickles output formatter that outputs Markdown documents")] diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/fail_32.png b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/fail_32.png new file mode 100644 index 000000000..ffe645a9d Binary files /dev/null and b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/fail_32.png differ diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/inconclusive_32.png b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/inconclusive_32.png new file mode 100644 index 000000000..dd9589ad2 Binary files /dev/null and b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/inconclusive_32.png differ diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/pass_32.png b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/pass_32.png new file mode 100644 index 000000000..077294d33 Binary files /dev/null and b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Resource/pass_32.png differ diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/Stylist.cs b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Stylist.cs new file mode 100644 index 000000000..b10bd5fb4 --- /dev/null +++ b/src/Pickles/Pickles.DocumentationBuilders.Markdown/Stylist.cs @@ -0,0 +1,168 @@ +// -------------------------------------------------------------------------------------------------------------------- +// +// Copyright 2018 Darren Comeau +// Copyright 2018-present PicklesDoc team and community contributors +// +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// +// -------------------------------------------------------------------------------------------------------------------- + +using PicklesDoc.Pickles.ObjectModel; + +namespace PicklesDoc.Pickles.DocumentationBuilders.Markdown +{ + class Stylist + { + public string TableResultHeading { get { return "Result"; } } + + internal virtual string AsTitle(string title) + { + var titleTemplate = "# {0}"; + + var styledTitle = string.Format(titleTemplate, title); + + return styledTitle; + } + + internal virtual string AsFeatureHeading(string featureName) + { + var featureHeadingTemplate = "### {0}"; + + var styledFeatureHeading = string.Format(featureHeadingTemplate, featureName); + + return styledFeatureHeading; + } + + internal virtual string AsBackgroundHeading(string scenarioName) + { + var backgroundHeadingTemplate = "#### Background: {0}"; + + var styledBackgroundHeading = string.Format(backgroundHeadingTemplate, scenarioName).Trim(); + + return styledBackgroundHeading; + } + + internal virtual string AsScenarioHeading(string scenarioName) + { + var scenarioHeadingTemplate = "#### Scenario: {0}"; + + var styledScenarioHeading = string.Format(scenarioHeadingTemplate, scenarioName); + + return styledScenarioHeading; + } + + internal virtual string AsResult(TestResult testresult) + { + var resultTemplate = "![{0}]({1})"; + + string styledResult = ""; + + switch (testresult) + { + case TestResult.Passed: + styledResult = string.Format(resultTemplate,"Passed","pass.png"); + break; + + case TestResult.Failed: + styledResult = string.Format(resultTemplate, "Failed", "fail.png"); + break; + + case TestResult.Inconclusive: + styledResult = string.Format(resultTemplate, "Inconclusive", "inconclusive.png"); + break; + + case TestResult.NotProvided: + break; + + default: + throw new System.Exception("Unhandled TestResult value"); + } + + return styledResult; + } + + internal virtual string AsScenarioHeading(string scenarioName, TestResult result) + { + var scenarioHeadingTemplate = "#### Scenario: {0} {1}"; + + var styledScenarioHeading = string.Format(scenarioHeadingTemplate, AsResult(result), scenarioName); + + return styledScenarioHeading; + } + + internal virtual string AsScenarioOutlineHeading(string scenarioOutlineName) + { + var scenarioOutlineHeadingTemplate = "#### Scenario Outline: {0}"; + + var styledScenarioOutlineHeading = string.Format(scenarioOutlineHeadingTemplate, scenarioOutlineName); + + return styledScenarioOutlineHeading; + } + + internal virtual string AsExampleHeading(string exampleName) + { + var exampleHeadingTemplate = "> Examples: {0}"; + + var styledExampleHeading = string.Format(exampleHeadingTemplate, exampleName) + .TrimEnd(); + + return styledExampleHeading; + } + + internal virtual string AsTag(string tag) + { + var tagTemplate = "*`{0}`*"; + + var styledFeatureHeading = string.Format(tagTemplate, tag); + + return styledFeatureHeading; + } + + internal virtual string AsStep(string keyword, string step) + { + var stepTemplate = "**{0}** {1}"; + + var styledStep = string.Format(stepTemplate, keyword.Trim(), step.Trim()); + + return AsStepLine(styledStep); + } + + internal virtual string AsStepTable(string tableLine) + { + var line = string.Empty; + line = string.Concat(line, string.Format(tableLine, " | ", "---")) + .Trim(); + return AsStepLine(line); + } + + internal virtual string AsStepLine(string stepLine) + { + var stepLineTemplate = "> {0}"; + + var styledStepLine = string.Format(stepLineTemplate, EscapeMarkdownSensitiveCharacters(stepLine)) + .TrimEnd(); + + return styledStepLine; + } + + protected string EscapeMarkdownSensitiveCharacters(string rawText) + { + var escapedText = rawText + .Replace("<", @"\<") + .Replace(">", @"\>"); + + return escapedText; + } + } +} diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/app.config b/src/Pickles/Pickles.DocumentationBuilders.Markdown/app.config new file mode 100644 index 000000000..3e4f9f30e --- /dev/null +++ b/src/Pickles/Pickles.DocumentationBuilders.Markdown/app.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/src/Pickles/Pickles.DocumentationBuilders.Markdown/packages.config b/src/Pickles/Pickles.DocumentationBuilders.Markdown/packages.config new file mode 100644 index 000000000..8d292d17a --- /dev/null +++ b/src/Pickles/Pickles.DocumentationBuilders.Markdown/packages.config @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/src/Pickles/Pickles.MSBuild/Pickles.MSBuild.nuspec b/src/Pickles/Pickles.MSBuild/Pickles.MSBuild.nuspec index 048f558ea..e69c638fe 100644 --- a/src/Pickles/Pickles.MSBuild/Pickles.MSBuild.nuspec +++ b/src/Pickles/Pickles.MSBuild/Pickles.MSBuild.nuspec @@ -21,6 +21,7 @@ - Word: Microsoft Word - Excel: Microsoft Excel - JSON: a custom JSON format + - Markdown: a simple output format Optionally, *Pickles* can **integrate test results**, so that your stakeholders know which scenarios pass validation. *Pickles* supports these test formats: @@ -53,6 +54,7 @@ + diff --git a/src/Pickles/Pickles.MSBuild/build/Pickles.MSBuild.targets b/src/Pickles/Pickles.MSBuild/build/Pickles.MSBuild.targets index 2b764f24e..9320072dd 100644 --- a/src/Pickles/Pickles.MSBuild/build/Pickles.MSBuild.targets +++ b/src/Pickles/Pickles.MSBuild/build/Pickles.MSBuild.targets @@ -20,6 +20,7 @@ Language="$(Pickles_Language)" IncludeExperimentalFeatures="$(Pickles_IncludeExperimentalFeatures)" EnableComments="$(Pickles_EnableComments)" - ExcludeTags="$(Pickles_ExcludeTags)" /> + ExcludeTags="$(Pickles_ExcludeTags)" + HideTags="$(Pickles_HideTags)" /> \ No newline at end of file diff --git a/src/Pickles/Pickles.ObjectModel/DocumentationFormat.cs b/src/Pickles/Pickles.ObjectModel/DocumentationFormat.cs index 8da9d2a9d..a9924d319 100644 --- a/src/Pickles/Pickles.ObjectModel/DocumentationFormat.cs +++ b/src/Pickles/Pickles.ObjectModel/DocumentationFormat.cs @@ -18,7 +18,6 @@ // // -------------------------------------------------------------------------------------------------------------------- -using System; using System.ComponentModel; namespace PicklesDoc.Pickles @@ -56,7 +55,12 @@ public enum DocumentationFormat /// /// Cucumber output JSON format /// - [Description("Cucumber JSON export format")] Cucumber + [Description("Cucumber JSON export format")] Cucumber, + + /// + /// Markdown output format + /// + [Description("Markdown output format")] Markdown diff --git a/src/Pickles/Pickles.PowerShell/Pickles.nuspec b/src/Pickles/Pickles.PowerShell/Pickles.nuspec index 350996669..23103d98b 100644 --- a/src/Pickles/Pickles.PowerShell/Pickles.nuspec +++ b/src/Pickles/Pickles.PowerShell/Pickles.nuspec @@ -21,6 +21,7 @@ - Word: Microsoft Word - Excel: Microsoft Excel - JSON: a custom JSON format + - Markdown: a simple output format Optionally, *Pickles* can **integrate test results**, so that your stakeholders know which scenarios pass validation. *Pickles* supports these test formats: @@ -54,6 +55,7 @@ + diff --git a/src/Pickles/Pickles.Test/Pickles.Test.csproj b/src/Pickles/Pickles.Test/Pickles.Test.csproj index b561177c1..49d3c65cd 100644 --- a/src/Pickles/Pickles.Test/Pickles.Test.csproj +++ b/src/Pickles/Pickles.Test/Pickles.Test.csproj @@ -189,6 +189,10 @@ {836020D1-A309-4367-9654-EBB7C3F60D97} Pickles.DocumentationBuilders.Json + + {732039F2-CAD8-44BC-9647-EC0ACAF59632} + Pickles.DocumentationBuilders.Markdown + {BDD5290E-BF98-436B-ADEE-A7479E22A875} Pickles.DocumentationBuilders.Word diff --git a/src/Pickles/Pickles.Test/WhenResolvingADocumentationBuilder.cs b/src/Pickles/Pickles.Test/WhenResolvingADocumentationBuilder.cs index 7862b0121..7403d5735 100644 --- a/src/Pickles/Pickles.Test/WhenResolvingADocumentationBuilder.cs +++ b/src/Pickles/Pickles.Test/WhenResolvingADocumentationBuilder.cs @@ -29,6 +29,7 @@ using PicklesDoc.Pickles.DocumentationBuilders.Json; using PicklesDoc.Pickles.DocumentationBuilders.Word; using PicklesDoc.Pickles.DocumentationBuilders.Cucumber; +using PicklesDoc.Pickles.DocumentationBuilders.Markdown; namespace PicklesDoc.Pickles.Test { @@ -42,6 +43,7 @@ public class WhenResolvingADocumentationBuilder : BaseFixture new object[] { DocumentationFormat.DHtml, typeof(DhtmlDocumentationBuilder) }, new object[] { DocumentationFormat.Json, typeof(JsonDocumentationBuilder) }, new object[] { DocumentationFormat.Cucumber, typeof(CucumberDocumentationBuilder) }, + new object[] { DocumentationFormat.Markdown, typeof(MarkdownDocumentationBuilder) }, }; [Test] diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromJSResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromJSResultsFileWithIndividualResults.cs index b18bed901..994f00b86 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromJSResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromJSResultsFileWithIndividualResults.cs @@ -68,5 +68,29 @@ public WhenParsingCucumberJsonFromJSResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } } diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromRubyResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromRubyResultsFileWithIndividualResults.cs index 165eec77e..cb7851547 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromRubyResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/WhenParsingCucumberJsonFromRubyResultsFileWithIndividualResults.cs @@ -68,5 +68,29 @@ public WhenParsingCucumberJsonFromRubyResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } } diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-cucumberjs-json.json b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-cucumberjs-json.json index 774fd6adb..3a9e19224 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-cucumberjs-json.json +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-cucumberjs-json.json @@ -31,7 +31,7 @@ }, "result": { "status": "passed", - "duration": 2000000 + "duration": 4000000 } }, { @@ -43,8 +43,7 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:15" }, "result": { - "status": "passed", - "duration": 1000000 + "status": "passed" } }, { @@ -56,7 +55,8 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:15" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -159,7 +159,8 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:15" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -171,8 +172,7 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:25" }, "result": { - "status": "passed", - "duration": 1000000 + "status": "passed" } }, { @@ -247,7 +247,8 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:25" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -299,7 +300,8 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:15" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -416,7 +418,7 @@ "result": { "status": "failed", "duration": 2000000, - "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\DirkRombauts\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\AdditionSteps.js:36:12)" + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\AdditionSteps.js:36:12)" } }, { @@ -499,7 +501,7 @@ }, "result": { "status": "failed", - "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\DirkRombauts\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\AdditionSteps.js:36:12)" + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\AdditionSteps.js:36:12)" } }, { @@ -594,7 +596,7 @@ }, "result": { "status": "failed", - "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\DirkRombauts\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\AdditionSteps.js:36:12)" + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\AdditionSteps.js:36:12)" } }, { @@ -744,7 +746,7 @@ }, "result": { "status": "failed", - "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\DirkRombauts\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\MinimalSteps.js:22:20)" + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\MinimalSteps.js:22:20)" } } ] @@ -1082,7 +1084,8 @@ "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:8" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } } ] @@ -1175,7 +1178,8 @@ "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:8" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } } ] @@ -1199,7 +1203,7 @@ }, "result": { "status": "failed", - "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\DirkRombauts\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:19:12)" + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:19:12)" } } ] @@ -1310,7 +1314,7 @@ }, "result": { "status": "failed", - "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\DirkRombauts\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:19:12)" + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:19:12)" } } ] @@ -1333,7 +1337,8 @@ }, "result": { "status": "failed", - "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\DirkRombauts\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:19:12)" + "duration": 1000000, + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:19:12)" } } ] @@ -1352,7 +1357,7 @@ "line": 65, "name": "I have backslashes in the value, for example a 'c:\\Temp\\'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:38" }, "result": { "status": "passed" @@ -1374,7 +1379,7 @@ "line": 74, "name": "I have parenthesis in the value, for example an 'This is a description (and more)'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:28" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:43" }, "result": { "status": "passed" @@ -1396,11 +1401,10 @@ "line": 82, "name": "I have a field with value 'Please enter a valid two letter country code (e.g. DE)!'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:38" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:53" }, "result": { - "status": "passed", - "duration": 1000000 + "status": "passed" } }, { @@ -1409,10 +1413,11 @@ "line": 83, "name": "I have a field with value 'This is just a very very very veery long error message!'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:38" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:53" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -1428,6 +1433,502 @@ } } ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values", + "keyword": "Scenario", + "line": 95, + "name": "Deal with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 91, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values", + "keyword": "Scenario", + "line": 96, + "name": "Deal with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 91, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values", + "keyword": "Scenario", + "line": 97, + "name": "Deal with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 91, + "name": "the scenario will 'inconclusive'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:28" + }, + "result": { + "status": "pending" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values", + "keyword": "Scenario", + "line": 98, + "name": "Deal with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 91, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values", + "keyword": "Scenario", + "line": 99, + "name": "Deal with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 91, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 106, + "name": "Deal with multiple example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 102, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 107, + "name": "Deal with multiple example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 102, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 108, + "name": "Deal with multiple example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 102, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 112, + "name": "Deal with multiple example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 102, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 113, + "name": "Deal with multiple example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 102, + "name": "the scenario will 'inconclusive'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:28" + }, + "result": { + "status": "pending" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 114, + "name": "Deal with multiple example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 102, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 115, + "name": "Deal with multiple example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 102, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed", + "duration": 1000000 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-without-duplicate-values", + "keyword": "Scenario", + "line": 122, + "name": "Deal with multiple named example sections without duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 118, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-without-duplicate-values", + "keyword": "Scenario", + "line": 123, + "name": "Deal with multiple named example sections without duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 118, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-without-duplicate-values", + "keyword": "Scenario", + "line": 127, + "name": "Deal with multiple named example sections without duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 118, + "name": "the scenario will 'inconclusive'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:28" + }, + "result": { + "status": "pending" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 134, + "name": "Deal with multiple named example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 130, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 135, + "name": "Deal with multiple named example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 130, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 136, + "name": "Deal with multiple named example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 130, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 140, + "name": "Deal with multiple named example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 130, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 141, + "name": "Deal with multiple named example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 130, + "name": "the scenario will 'inconclusive'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:28" + }, + "result": { + "status": "pending", + "duration": 1000000 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 142, + "name": "Deal with multiple named example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 130, + "name": "the scenario will 'fail'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + }, + "result": { + "status": "failed", + "duration": 1000000, + "error_message": "AssertionError: 'true' == 'false'\n + expected - actual\n\n -true\n +false\n\n at World. (C:\\Dev\\Code\\GitHub\\PicklesContributors\\rik-smeets\\pickles\\test-harness\\CucumberJS\\features\\stepdefinitions\\ScenarioOutlineSteps.js:34:12)" + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values", + "keyword": "Scenario", + "line": 143, + "name": "Deal with multiple named example sections with duplicate values", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Then ", + "line": 130, + "name": "the scenario will 'pass'", + "match": { + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:23" + }, + "result": { + "status": "passed" + } + } + ] } ] }, @@ -1481,8 +1982,7 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:15" }, "result": { - "status": "passed", - "duration": 2000000 + "status": "passed" } }, { @@ -1571,7 +2071,7 @@ "line": 22, "name": "I have special characters for regexes in the value, for example a '**'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:48" }, "result": { "status": "passed", @@ -1618,7 +2118,7 @@ "line": 22, "name": "I have special characters for regexes in the value, for example a '++'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:48" }, "result": { "status": "passed" @@ -1664,7 +2164,7 @@ "line": 22, "name": "I have special characters for regexes in the value, for example a '.*'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:48" }, "result": { "status": "passed" @@ -1710,7 +2210,7 @@ "line": 22, "name": "I have special characters for regexes in the value, for example a '[]'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:48" }, "result": { "status": "passed" @@ -1756,7 +2256,7 @@ "line": 22, "name": "I have special characters for regexes in the value, for example a '{}'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:48" }, "result": { "status": "passed" @@ -1803,10 +2303,11 @@ "line": 22, "name": "I have special characters for regexes in the value, for example a '()'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:48" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -1851,7 +2352,7 @@ "line": 22, "name": "I have special characters for regexes in the value, for example a '^.*(?BAR)\\s[^0-9]{3,4}A+$'", "match": { - "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:33" + "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:48" }, "result": { "status": "passed" @@ -1922,7 +2423,8 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:10" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -1934,7 +2436,8 @@ "location": "features\\stepdefinitions\\ScenarioOutlineSteps.js:8" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } } ] @@ -1956,7 +2459,8 @@ "location": "features\\stepdefinitions\\AdditionSteps.js:10" }, "result": { - "status": "passed" + "status": "passed", + "duration": 1000000 } }, { @@ -1973,6 +2477,40 @@ } ] }, + { + "id": "scenarios-with-special-characters;this-is-a-scenario-with-spanish-characters-ñáéíóú", + "keyword": "Scenario", + "line": 52, + "name": "This is a scenario with spanish characters ñáéíóú", + "tags": [], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Given ", + "line": 5, + "name": "the calculator has clean memory", + "match": { + "location": "features\\stepdefinitions\\AdditionSteps.js:10" + }, + "result": { + "status": "passed" + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 53, + "name": "passing step", + "match": { + "location": "features\\stepdefinitions\\MinimalSteps.js:8" + }, + "result": { + "status": "passed" + } + } + ] + }, { "id": "scenarios-with-special-characters;this-is-a-scenario-with-spanish-characters-ñáéíóú", "keyword": "Scenario", diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-json.json b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-json.json index 77a974ac9..4d5e3557c 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-json.json +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/CucumberJson/results-example-json.json @@ -23,7 +23,7 @@ }, "result": { "status": "passed", - "duration": 73481 + "duration": 62300 } } ] @@ -45,61 +45,61 @@ { "keyword": "Given ", "name": "I have entered 60 into the calculator", - "line": 19, + "line": 11, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, "result": { "status": "passed", - "duration": 43062 + "duration": 38800 } }, { "keyword": "And ", "name": "I have entered 70 into the calculator", - "line": 19, + "line": 12, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, "result": { "status": "passed", - "duration": 68741 + "duration": 20700 } }, { "keyword": "And ", "name": "I have entered 130 into the calculator", - "line": 19, + "line": 13, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, "result": { "status": "passed", - "duration": 21729 + "duration": 17700 } }, { "keyword": "When ", "name": "I press add", - "line": 19, + "line": 14, "match": { "location": "features/step_definitions/AdditionSteps.rb:14" }, "result": { "status": "passed", - "duration": 23704 + "duration": 18600 } }, { "keyword": "Then ", "name": "the result should be 260 on the screen", - "line": 19, + "line": 15, "match": { "location": "features/step_definitions/AdditionSteps.rb:20" }, "result": { "status": "passed", - "duration": 1881680 + "duration": 2114200 } } ] @@ -120,7 +120,7 @@ }, "result": { "status": "passed", - "duration": 34370 + "duration": 32300 } } ] @@ -142,61 +142,61 @@ { "keyword": "Given ", "name": "I have entered 40 into the calculator", - "line": 20, + "line": 11, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, "result": { "status": "passed", - "duration": 32395 + "duration": 45600 } }, { "keyword": "And ", "name": "I have entered 50 into the calculator", - "line": 20, + "line": 12, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, "result": { "status": "passed", - "duration": 18963 + "duration": 71200 } }, { "keyword": "And ", "name": "I have entered 90 into the calculator", - "line": 20, + "line": 13, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, "result": { "status": "passed", - "duration": 19358 + "duration": 19400 } }, { "keyword": "When ", "name": "I press add", - "line": 20, + "line": 14, "match": { "location": "features/step_definitions/AdditionSteps.rb:14" }, "result": { "status": "passed", - "duration": 14222 + "duration": 14500 } }, { "keyword": "Then ", "name": "the result should be 180 on the screen", - "line": 20, + "line": 15, "match": { "location": "features/step_definitions/AdditionSteps.rb:20" }, "result": { "status": "passed", - "duration": 52543 + "duration": 47300 } } ] @@ -217,7 +217,7 @@ }, "result": { "status": "passed", - "duration": 32790 + "duration": 29300 } } ] @@ -245,7 +245,7 @@ }, "result": { "status": "passed", - "duration": 30420 + "duration": 27600 } }, { @@ -257,7 +257,7 @@ }, "result": { "status": "passed", - "duration": 18963 + "duration": 18000 } }, { @@ -269,7 +269,7 @@ }, "result": { "status": "passed", - "duration": 14223 + "duration": 15200 } }, { @@ -281,7 +281,7 @@ }, "result": { "status": "passed", - "duration": 43852 + "duration": 43400 } } ] @@ -302,7 +302,7 @@ }, "result": { "status": "passed", - "duration": 29630 + "duration": 41900 } } ] @@ -330,7 +330,7 @@ }, "result": { "status": "passed", - "duration": 35555 + "duration": 22900 } }, { @@ -343,7 +343,7 @@ "result": { "status": "failed", "error_message": "\nexpected: \"fail\"\n got: \"this is a hacky way of making the scenario with a non-integer number\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/AdditionSteps.rb:11:in `/^I have entered (\\d+)\\.(\\d+) into the calculator$/'\nfeatures/Addition.feature:32:in `And I have entered 2.2 into the calculator'", - "duration": 34923076 + "duration": 24496300 } }, { @@ -386,7 +386,7 @@ }, "result": { "status": "passed", - "duration": 47013 + "duration": 53500 } } ] @@ -461,7 +461,7 @@ "result": { "status": "failed", "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/AdditionSteps.rb:29:in `/^the background step fails$/'\nfeatures/FailingBackground.feature:5:in `Given the background step fails'", - "duration": 413234 + "duration": 250600 } }, { @@ -548,7 +548,7 @@ "result": { "status": "failed", "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/AdditionSteps.rb:29:in `/^the background step fails$/'\nfeatures/FailingBackground.feature:5:in `Given the background step fails'", - "duration": 352395 + "duration": 308900 } }, { @@ -575,7 +575,7 @@ { "keyword": "Given ", "name": "I have entered 60 into the calculator", - "line": 23, + "line": 15, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, @@ -586,7 +586,7 @@ { "keyword": "And ", "name": "I have entered 70 into the calculator", - "line": 23, + "line": 16, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, @@ -597,7 +597,7 @@ { "keyword": "And ", "name": "I have entered 130 into the calculator", - "line": 23, + "line": 17, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, @@ -608,7 +608,7 @@ { "keyword": "When ", "name": "I press add", - "line": 23, + "line": 18, "match": { "location": "features/step_definitions/AdditionSteps.rb:14" }, @@ -619,7 +619,7 @@ { "keyword": "Then ", "name": "the result should be 260 on the screen", - "line": 23, + "line": 19, "match": { "location": "features/step_definitions/AdditionSteps.rb:20" }, @@ -646,7 +646,7 @@ "result": { "status": "failed", "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/AdditionSteps.rb:29:in `/^the background step fails$/'\nfeatures/FailingBackground.feature:5:in `Given the background step fails'", - "duration": 298272 + "duration": 229900 } }, { @@ -673,7 +673,7 @@ { "keyword": "Given ", "name": "I have entered 40 into the calculator", - "line": 24, + "line": 15, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, @@ -684,7 +684,7 @@ { "keyword": "And ", "name": "I have entered 50 into the calculator", - "line": 24, + "line": 16, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, @@ -695,7 +695,7 @@ { "keyword": "And ", "name": "I have entered 90 into the calculator", - "line": 24, + "line": 17, "match": { "location": "features/step_definitions/AdditionSteps.rb:6" }, @@ -706,7 +706,7 @@ { "keyword": "When ", "name": "I press add", - "line": 24, + "line": 18, "match": { "location": "features/step_definitions/AdditionSteps.rb:14" }, @@ -717,7 +717,7 @@ { "keyword": "Then ", "name": "the result should be 180 on the screen", - "line": 24, + "line": 19, "match": { "location": "features/step_definitions/AdditionSteps.rb:20" }, @@ -754,7 +754,7 @@ }, "result": { "status": "passed", - "duration": 37530 + "duration": 32400 } } ] @@ -777,7 +777,7 @@ "result": { "status": "pending", "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/MinimalSteps.rb:6:in `/^inconclusive step$/'\nfeatures/Minimal Features/Failing.feature:7:in `Then inconclusive step'", - "duration": 212543 + "duration": 246400 } } ] @@ -800,7 +800,7 @@ "result": { "status": "failed", "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/MinimalSteps.rb:10:in `/^failing step$/'\nfeatures/Minimal Features/Failing.feature:10:in `Then failing step'", - "duration": 378470 + "duration": 440400 } } ] @@ -832,7 +832,7 @@ }, "result": { "status": "passed", - "duration": 39507 + "duration": 21000 } } ] @@ -855,7 +855,7 @@ "result": { "status": "pending", "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/MinimalSteps.rb:6:in `/^inconclusive step$/'\nfeatures/Minimal Features/Inconclusive.feature:7:in `Then inconclusive step'", - "duration": 249284 + "duration": 129200 } } ] @@ -887,7 +887,7 @@ }, "result": { "status": "passed", - "duration": 32790 + "duration": 17400 } } ] @@ -1112,13 +1112,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 12, + "line": 8, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 43457 + "duration": 51100 } } ] @@ -1134,13 +1134,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_2'", - "line": 13, + "line": 8, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 40691 + "duration": 23400 } } ] @@ -1156,13 +1156,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_3'", - "line": 14, + "line": 8, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 28444 + "duration": 29700 } } ] @@ -1178,13 +1178,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 25, + "line": 21, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 45828 + "duration": 32800 } } ] @@ -1200,13 +1200,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_2'", - "line": 26, + "line": 21, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 30420 + "duration": 22600 } } ] @@ -1222,14 +1222,14 @@ { "keyword": "Then ", "name": "the scenario will 'inconclusive_1'", - "line": 27, + "line": 21, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:5" }, "result": { "status": "pending", "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/ScenarioOutlineSteps.rb:6:in `/^the scenario will 'inconclusive_(\\d+)'$/'\nfeatures/ScenarioOutlines.feature:27:in `Then the scenario will 'inconclusive_1''\nfeatures/ScenarioOutlines.feature:21:in `Then the scenario will '''", - "duration": 254420 + "duration": 429000 } } ] @@ -1245,13 +1245,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 38, + "line": 34, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 41876 + "duration": 29100 } } ] @@ -1267,13 +1267,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_2'", - "line": 39, + "line": 34, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 29629 + "duration": 63400 } } ] @@ -1289,14 +1289,14 @@ { "keyword": "Then ", "name": "the scenario will 'fail_1'", - "line": 40, + "line": 34, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:9" }, "result": { "status": "failed", "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:10:in `/^the scenario will 'fail_(\\d+)'$/'\nfeatures/ScenarioOutlines.feature:40:in `Then the scenario will 'fail_1''\nfeatures/ScenarioOutlines.feature:34:in `Then the scenario will '''", - "duration": 285234 + "duration": 303100 } } ] @@ -1312,13 +1312,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 49, + "line": 45, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 55308 + "duration": 25100 } } ] @@ -1334,13 +1334,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_2'", - "line": 50, + "line": 45, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 77432 + "duration": 23700 } } ] @@ -1356,14 +1356,14 @@ { "keyword": "Then ", "name": "the scenario will 'inconclusive_1'", - "line": 54, + "line": 45, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:5" }, "result": { "status": "pending", "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/ScenarioOutlineSteps.rb:6:in `/^the scenario will 'inconclusive_(\\d+)'$/'\nfeatures/ScenarioOutlines.feature:54:in `Then the scenario will 'inconclusive_1''\nfeatures/ScenarioOutlines.feature:45:in `Then the scenario will '''", - "duration": 151308 + "duration": 163700 } } ] @@ -1379,14 +1379,14 @@ { "keyword": "Then ", "name": "the scenario will 'inconclusive_2'", - "line": 55, + "line": 45, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:5" }, "result": { "status": "pending", "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/ScenarioOutlineSteps.rb:6:in `/^the scenario will 'inconclusive_(\\d+)'$/'\nfeatures/ScenarioOutlines.feature:55:in `Then the scenario will 'inconclusive_2''\nfeatures/ScenarioOutlines.feature:45:in `Then the scenario will '''", - "duration": 121679 + "duration": 162500 } } ] @@ -1402,14 +1402,14 @@ { "keyword": "Then ", "name": "the scenario will 'fail_1'", - "line": 59, + "line": 45, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:9" }, "result": { "status": "failed", "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:10:in `/^the scenario will 'fail_(\\d+)'$/'\nfeatures/ScenarioOutlines.feature:59:in `Then the scenario will 'fail_1''\nfeatures/ScenarioOutlines.feature:45:in `Then the scenario will '''", - "duration": 235061 + "duration": 411400 } } ] @@ -1425,14 +1425,14 @@ { "keyword": "Then ", "name": "the scenario will 'fail_2'", - "line": 60, + "line": 45, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:9" }, "result": { "status": "failed", "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:10:in `/^the scenario will 'fail_(\\d+)'$/'\nfeatures/ScenarioOutlines.feature:60:in `Then the scenario will 'fail_2''\nfeatures/ScenarioOutlines.feature:45:in `Then the scenario will '''", - "duration": 193580 + "duration": 287800 } } ] @@ -1448,13 +1448,13 @@ { "keyword": "When ", "name": "I have backslashes in the value, for example a 'c:\\Temp\\'", - "line": 69, + "line": 65, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:25" }, "result": { "status": "passed", - "duration": 19358 + "duration": 31000 } } ] @@ -1470,13 +1470,13 @@ { "keyword": "When ", "name": "I have parenthesis in the value, for example an 'This is a description (and more)'", - "line": 78, + "line": 74, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:17" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:29" }, "result": { "status": "passed", - "duration": 52544 + "duration": 65700 } } ] @@ -1492,37 +1492,534 @@ { "keyword": "When ", "name": "I have a field with value 'Please enter a valid two letter country code (e.g. DE)!'", - "line": 88, + "line": 82, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:25" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:37" }, "result": { "status": "passed", - "duration": 39507 + "duration": 46600 } }, { "keyword": "And ", "name": "I have a field with value 'This is just a very very very veery long error message!'", - "line": 88, + "line": 83, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:25" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:37" }, "result": { "status": "passed", - "duration": 14618 + "duration": 20100 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 88, + "line": 84, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 13037 + "duration": 18200 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values;;2", + "keyword": "Scenario Outline", + "name": "Deal with duplicate values", + "description": "", + "line": 95, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 91, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 46400 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values;;3", + "keyword": "Scenario Outline", + "name": "Deal with duplicate values", + "description": "", + "line": 96, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 91, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:96:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:91:in `Then the scenario will '''", + "duration": 245500 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values;;4", + "keyword": "Scenario Outline", + "name": "Deal with duplicate values", + "description": "", + "line": 97, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'inconclusive'", + "line": 91, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:17" + }, + "result": { + "status": "pending", + "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/ScenarioOutlineSteps.rb:18:in `/^the scenario will 'inconclusive'$/'\nfeatures/ScenarioOutlines.feature:97:in `Then the scenario will 'inconclusive''\nfeatures/ScenarioOutlines.feature:91:in `Then the scenario will '''", + "duration": 120000 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values;;5", + "keyword": "Scenario Outline", + "name": "Deal with duplicate values", + "description": "", + "line": 98, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 91, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 18500 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-duplicate-values;;6", + "keyword": "Scenario Outline", + "name": "Deal with duplicate values", + "description": "", + "line": 99, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 91, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:99:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:91:in `Then the scenario will '''", + "duration": 400500 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values;;2", + "keyword": "Scenario Outline", + "name": "Deal with multiple example sections with duplicate values", + "description": "", + "line": 106, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 102, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 21400 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values;;3", + "keyword": "Scenario Outline", + "name": "Deal with multiple example sections with duplicate values", + "description": "", + "line": 107, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 102, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:107:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:102:in `Then the scenario will '''", + "duration": 200600 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values;;4", + "keyword": "Scenario Outline", + "name": "Deal with multiple example sections with duplicate values", + "description": "", + "line": 108, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 102, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 14400 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values;;2", + "keyword": "Scenario Outline", + "name": "Deal with multiple example sections with duplicate values", + "description": "", + "line": 112, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 102, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:112:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:102:in `Then the scenario will '''", + "duration": 179300 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values;;3", + "keyword": "Scenario Outline", + "name": "Deal with multiple example sections with duplicate values", + "description": "", + "line": 113, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'inconclusive'", + "line": 102, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:17" + }, + "result": { + "status": "pending", + "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/ScenarioOutlineSteps.rb:18:in `/^the scenario will 'inconclusive'$/'\nfeatures/ScenarioOutlines.feature:113:in `Then the scenario will 'inconclusive''\nfeatures/ScenarioOutlines.feature:102:in `Then the scenario will '''", + "duration": 100200 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values;;4", + "keyword": "Scenario Outline", + "name": "Deal with multiple example sections with duplicate values", + "description": "", + "line": 114, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 102, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:114:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:102:in `Then the scenario will '''", + "duration": 177600 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-example-sections-with-duplicate-values;;5", + "keyword": "Scenario Outline", + "name": "Deal with multiple example sections with duplicate values", + "description": "", + "line": 115, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 102, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 18300 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-without-duplicate-values;first-set;2", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections without duplicate values", + "description": "", + "line": 122, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 118, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 23100 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-without-duplicate-values;first-set;3", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections without duplicate values", + "description": "", + "line": 123, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 118, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:123:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:118:in `Then the scenario will '''", + "duration": 193300 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-without-duplicate-values;second-set;2", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections without duplicate values", + "description": "", + "line": 127, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'inconclusive'", + "line": 118, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:17" + }, + "result": { + "status": "pending", + "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/ScenarioOutlineSteps.rb:18:in `/^the scenario will 'inconclusive'$/'\nfeatures/ScenarioOutlines.feature:127:in `Then the scenario will 'inconclusive''\nfeatures/ScenarioOutlines.feature:118:in `Then the scenario will '''", + "duration": 104500 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values;first-set;2", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections with duplicate values", + "description": "", + "line": 134, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 130, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 14200 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values;first-set;3", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections with duplicate values", + "description": "", + "line": 135, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 130, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:135:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:130:in `Then the scenario will '''", + "duration": 351300 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values;first-set;4", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections with duplicate values", + "description": "", + "line": 136, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 130, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 16700 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values;second-set;2", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections with duplicate values", + "description": "", + "line": 140, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 130, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:140:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:130:in `Then the scenario will '''", + "duration": 244100 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values;second-set;3", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections with duplicate values", + "description": "", + "line": 141, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'inconclusive'", + "line": 130, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:17" + }, + "result": { + "status": "pending", + "error_message": "TODO (Cucumber::Pending)\n./features/step_definitions/ScenarioOutlineSteps.rb:18:in `/^the scenario will 'inconclusive'$/'\nfeatures/ScenarioOutlines.feature:141:in `Then the scenario will 'inconclusive''\nfeatures/ScenarioOutlines.feature:130:in `Then the scenario will '''", + "duration": 121900 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values;second-set;4", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections with duplicate values", + "description": "", + "line": 142, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'fail'", + "line": 130, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + }, + "result": { + "status": "failed", + "error_message": "\nexpected: \"false\"\n got: \"true\"\n\n(compared using eql?)\n (RSpec::Expectations::ExpectationNotMetError)\n./features/step_definitions/ScenarioOutlineSteps.rb:22:in `/^the scenario will 'fail'$/'\nfeatures/ScenarioOutlines.feature:142:in `Then the scenario will 'fail''\nfeatures/ScenarioOutlines.feature:130:in `Then the scenario will '''", + "duration": 177300 + } + } + ] + }, + { + "id": "scenario-outlines;deal-with-multiple-named-example-sections-with-duplicate-values;second-set;5", + "keyword": "Scenario Outline", + "name": "Deal with multiple named example sections with duplicate values", + "description": "", + "line": 143, + "type": "scenario", + "steps": [ + { + "keyword": "Then ", + "name": "the scenario will 'pass'", + "line": 130, + "match": { + "location": "features/step_definitions/ScenarioOutlineSteps.rb:13" + }, + "result": { + "status": "passed", + "duration": 14800 } } ] @@ -1553,7 +2050,7 @@ }, "result": { "status": "passed", - "duration": 28050 + "duration": 22000 } } ] @@ -1575,7 +2072,7 @@ }, "result": { "status": "passed", - "duration": 41877 + "duration": 24500 } }, { @@ -1587,7 +2084,7 @@ }, "result": { "status": "passed", - "duration": 11062 + "duration": 15500 } }, { @@ -1599,7 +2096,7 @@ }, "result": { "status": "passed", - "duration": 13432 + "duration": 12000 } }, { @@ -1611,7 +2108,7 @@ }, "result": { "status": "passed", - "duration": 37926 + "duration": 62100 } } ] @@ -1632,7 +2129,7 @@ }, "result": { "status": "passed", - "duration": 33580 + "duration": 16400 } } ] @@ -1648,13 +2145,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 19, + "line": 15, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 46617 + "duration": 18500 } } ] @@ -1675,7 +2172,7 @@ }, "result": { "status": "passed", - "duration": 23703 + "duration": 17200 } } ] @@ -1691,25 +2188,25 @@ { "keyword": "When ", "name": "I have special characters for regexes in the value, for example a '**'", - "line": 27, + "line": 22, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:33" }, "result": { "status": "passed", - "duration": 18963 + "duration": 18000 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 27, + "line": 23, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 11852 + "duration": 11800 } } ] @@ -1730,7 +2227,7 @@ }, "result": { "status": "passed", - "duration": 17383 + "duration": 13600 } } ] @@ -1746,25 +2243,25 @@ { "keyword": "When ", "name": "I have special characters for regexes in the value, for example a '++'", - "line": 28, + "line": 22, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:33" }, "result": { "status": "passed", - "duration": 15408 + "duration": 15400 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 28, + "line": 23, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 10271 + "duration": 12300 } } ] @@ -1785,7 +2282,7 @@ }, "result": { "status": "passed", - "duration": 13827 + "duration": 15800 } } ] @@ -1801,25 +2298,25 @@ { "keyword": "When ", "name": "I have special characters for regexes in the value, for example a '.*'", - "line": 29, + "line": 22, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:33" }, "result": { "status": "passed", - "duration": 15407 + "duration": 15700 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 29, + "line": 23, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 10272 + "duration": 11800 } } ] @@ -1840,7 +2337,7 @@ }, "result": { "status": "passed", - "duration": 14222 + "duration": 17800 } } ] @@ -1856,25 +2353,25 @@ { "keyword": "When ", "name": "I have special characters for regexes in the value, for example a '[]'", - "line": 30, + "line": 22, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:33" }, "result": { "status": "passed", - "duration": 14617 + "duration": 15500 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 30, + "line": 23, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 10272 + "duration": 11700 } } ] @@ -1895,7 +2392,7 @@ }, "result": { "status": "passed", - "duration": 108642 + "duration": 16100 } } ] @@ -1911,25 +2408,25 @@ { "keyword": "When ", "name": "I have special characters for regexes in the value, for example a '{}'", - "line": 31, + "line": 22, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:33" }, "result": { "status": "passed", - "duration": 66370 + "duration": 15100 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 31, + "line": 23, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 34371 + "duration": 10800 } } ] @@ -1950,7 +2447,7 @@ }, "result": { "status": "passed", - "duration": 24889 + "duration": 14200 } } ] @@ -1966,25 +2463,25 @@ { "keyword": "When ", "name": "I have special characters for regexes in the value, for example a '()'", - "line": 32, + "line": 22, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:33" }, "result": { "status": "passed", - "duration": 18963 + "duration": 41100 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 32, + "line": 23, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 12642 + "duration": 11700 } } ] @@ -2005,7 +2502,7 @@ }, "result": { "status": "passed", - "duration": 13432 + "duration": 13900 } } ] @@ -2021,25 +2518,25 @@ { "keyword": "When ", "name": "I have special characters for regexes in the value, for example a '^.*(?BAR)\\s[^0-9]{3,4}A+$'", - "line": 33, + "line": 22, "match": { - "location": "features/step_definitions/ScenarioOutlineSteps.rb:21" + "location": "features/step_definitions/ScenarioOutlineSteps.rb:33" }, "result": { "status": "passed", - "duration": 24493 + "duration": 14800 } }, { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 33, + "line": 23, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 11061 + "duration": 10300 } } ] @@ -2060,7 +2557,7 @@ }, "result": { "status": "passed", - "duration": 17383 + "duration": 12500 } } ] @@ -2076,13 +2573,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 40, + "line": 36, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 13432 + "duration": 11800 } } ] @@ -2103,7 +2600,7 @@ }, "result": { "status": "passed", - "duration": 38321 + "duration": 12300 } } ] @@ -2119,13 +2616,13 @@ { "keyword": "Then ", "name": "the scenario will 'pass_1'", - "line": 47, + "line": 43, "match": { "location": "features/step_definitions/ScenarioOutlineSteps.rb:1" }, "result": { "status": "passed", - "duration": 15012 + "duration": 11500 } } ] @@ -2146,7 +2643,7 @@ }, "result": { "status": "passed", - "duration": 40296 + "duration": 12800 } } ] @@ -2168,7 +2665,7 @@ }, "result": { "status": "passed", - "duration": 32000 + "duration": 7500 } } ] @@ -2189,7 +2686,7 @@ }, "result": { "status": "passed", - "duration": 39111 + "duration": 13000 } } ] @@ -2211,7 +2708,7 @@ }, "result": { "status": "passed", - "duration": 12247 + "duration": 7700 } } ] diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/WhenParsingMsTestResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/WhenParsingMsTestResultsFileWithIndividualResults.cs index 20c302c4e..8d04fb936 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/WhenParsingMsTestResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/WhenParsingMsTestResultsFileWithIndividualResults.cs @@ -18,7 +18,6 @@ // // -------------------------------------------------------------------------------------------------------------------- - using NUnit.Framework; using PicklesDoc.Pickles.TestFrameworks.MsTest; @@ -68,5 +67,29 @@ public WhenParsingMsTestResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } -} +} \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/results-example-mstest.trx b/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/results-example-mstest.trx index 7f98d9db1..de8bef074 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/results-example-mstest.trx +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/MsTest/results-example-mstest.trx @@ -1,56 +1,71 @@  - + These are default test settings for a local test run. - - + + - + - + - - This scenario contains examples with Regex-special characters - + + Fail to add two numbers + + + + FeatureTitle - Scenarios With Special Characters + Addition + + + + + + Deal with multiple named example sections with duplicate values + + + + FeatureTitle + Scenario Outlines VariantName Variant 3 - Parameter:regex - [] + ExampleSetName + Second set + + + Parameter:result + pass - + - - Not automated scenario 1 - + + Inconclusive Feature Inconclusive Scenario + FeatureTitle - Not Automated At All + Inconclusive - + - + Adding several numbers - - - - + Parameter:first number @@ -72,16 +87,30 @@ Parameter:second number 50 + + FeatureTitle + Failing Background + + + + + + Add two numbers + + + + + FeatureTitle Addition - + - + And we can go totally bonkers with multiple example sections. - + FeatureTitle @@ -89,100 +118,60 @@ VariantName - fail_2 + fail_1 Parameter:result - fail_2 - - - - - - Not automated scenario 3 - - - - FeatureTitle - Not Automated At All + fail_1 - + - - This scenario contains examples with Regex-special characters - + + Deal with multiple example sections with duplicate values + FeatureTitle - Scenarios With Special Characters + Scenario Outlines VariantName - Variant 2 - - - Parameter:regex - .* + Variant 3 - - - - - This is a scenario with parentheses, hyphen and comma (10-20, 30-40) - - - FeatureTitle - Scenarios With Special Characters + Parameter:result + pass - + - - This scenario contains examples with Regex-special characters - + + Deal with multiple named example sections without duplicate values + FeatureTitle - Scenarios With Special Characters + Scenario Outlines VariantName - Variant 1 - - - Parameter:regex - ++ + pass - - - - - Add two numbers - - - FeatureTitle - Failing Background + ExampleSetName + First set - - - - - Failing Feature Inconclusive Scenario - - - FeatureTitle - Failing + Parameter:result + pass - + - + This is a scenario outline with parentheses, hyphen and comma (10-20, 30-40) - + FeatureTitle @@ -197,33 +186,11 @@ pass_1 - - - - Inconclusive Feature Inconclusive Scenario - - - - FeatureTitle - Inconclusive - - - - - - Failing Feature Passing Scenario - - - - FeatureTitle - Failing - - - + - - Deal correctly with backslashes in the examples - + + Deal with multiple named example sections without duplicate values + FeatureTitle @@ -231,18 +198,22 @@ VariantName - c:\Temp\ + fail - Parameter:file path - c:\Temp\ + ExampleSetName + First set + + + Parameter:result + fail - + - - This is a scenario outline where one scenario fails - + + Deal with multiple example sections with duplicate values + FeatureTitle @@ -250,56 +221,52 @@ VariantName - pass_2 + Variant 0 Parameter:result - pass_2 + fail - + - - This is a scenario outline with german umlauts äöüß ÄÖÜ - + + Deal with multiple named example sections without duplicate values + FeatureTitle - Scenarios With Special Characters + Scenario Outlines VariantName - pass_1 + inconclusive + + + ExampleSetName + Second set Parameter:result - pass_1 + inconclusive - + - - This scenario contains examples with Regex-special characters - + + Not automated scenario 2 + FeatureTitle - Scenarios With Special Characters - - - VariantName - Variant 6 - - - Parameter:regex - ^.*(?<foo>BAR)\s[^0-9]{3,4}A+$ + Not Automated At All - + - - And we can go totally bonkers with multiple example sections. - + + Deal with multiple example sections with duplicate values + FeatureTitle @@ -307,51 +274,55 @@ VariantName - fail_1 + Variant 2 Parameter:result - fail_1 + fail - + - + This is a scenario with danish characters æøå ÆØÅ - + FeatureTitle Scenarios With Special Characters - + - - This scenario contains examples with Regex-special characters - + + Deal with multiple named example sections with duplicate values + FeatureTitle - Scenarios With Special Characters + Scenario Outlines VariantName - Variant 5 + Variant 2 - Parameter:regex - () + ExampleSetName + Second set + + + Parameter:result + fail - + - + Adding several numbers - + Parameter:first number @@ -378,11 +349,11 @@ Addition - + - - And we can go totally bonkers with multiple example sections. - + + This is a scenario outline where all scenarios pass + FeatureTitle @@ -390,48 +361,18 @@ VariantName - pass_2 + pass_1 Parameter:result - pass_2 - - - - - - Failing Feature Failing Scenario - - - - FeatureTitle - Failing - - - - - - Deal correctly with parenthesis in the examples - - - - FeatureTitle - Scenario Outlines - - - VariantName - This is a description (and more) - - - Parameter:overly descriptive field - This is a description (and more) + pass_1 - + - + This is a scenario outline where one scenario is inconclusive - + FeatureTitle @@ -439,48 +380,37 @@ VariantName - pass_1 + inconclusive_1 Parameter:result - pass_1 + inconclusive_1 - + - - This is a scenario outline where all scenarios pass - + + This scenario contains examples with Regex-special characters + FeatureTitle - Scenario Outlines + Scenarios With Special Characters VariantName - pass_2 - - - Parameter:result - pass_2 + Variant 6 - - - - - Inconclusive Feature Passing Scenario - - - FeatureTitle - Inconclusive + Parameter:regex + ^.*(?<foo>BAR)\s[^0-9]{3,4}A+$ - + - - This is a scenario outline where one scenario is inconclusive - + + Deal correctly with backslashes in the examples + FeatureTitle @@ -488,28 +418,18 @@ VariantName - inconclusive_1 - - - Parameter:result - inconclusive_1 + c:\Temp\ - - - - - - - FeatureTitle - Addition + Parameter:file path + c:\Temp\ - + - - This is a scenario outline with ampersand & - + + This scenario contains examples with Regex-special characters + FeatureTitle @@ -517,32 +437,18 @@ VariantName - pass_1 - - - Parameter:result - pass_1 + Variant 1 - - - - - Add two numbers - - - - - - FeatureTitle - Addition + Parameter:regex + ++ - + - - This is a scenario outline where one scenario is inconclusive - + + Deal with duplicate values + FeatureTitle @@ -550,37 +456,18 @@ VariantName - pass_2 + Variant 3 Parameter:result - pass_2 + pass - + - + This is a scenario outline where one scenario fails - - - - FeatureTitle - Scenario Outlines - - - VariantName - fail_1 - - - Parameter:result - fail_1 - - - - - - And we can go totally bonkers with multiple example sections. - + FeatureTitle @@ -588,18 +475,18 @@ VariantName - inconclusive_2 + pass_2 Parameter:result - inconclusive_2 + pass_2 - + - + Adding several numbers - + Parameter:first number @@ -626,22 +513,34 @@ Failing Background - + - - Not automated scenario 2 - + + Deal correctly with overlong example values + FeatureTitle - Not Automated At All + Scenario Outlines + + + VariantName + Please enter a valid two letter country code (e.g. DE)! + + + Parameter:value1 + Please enter a valid two letter country code (e.g. DE)! + + + Parameter:value2 + This is just a very very very veery long error message! - + - - This is a scenario outline where all scenarios pass - + + This is a scenario outline where one scenario is inconclusive + FeatureTitle @@ -649,18 +548,18 @@ VariantName - pass_1 + pass_2 Parameter:result - pass_1 + pass_2 - + - - Deal correctly with overlong example values - + + And we can go totally bonkers with multiple example sections. + FeatureTitle @@ -668,22 +567,59 @@ VariantName - Please enter a valid two letter country code (e.g. DE)! + inconclusive_2 - Parameter:value1 - Please enter a valid two letter country code (e.g. DE)! + Parameter:result + inconclusive_2 + + + + + + This is a scenario outline where one scenario fails + + + + FeatureTitle + Scenario Outlines - Parameter:value2 - This is just a very very very veery long error message! + VariantName + fail_1 + + + Parameter:result + fail_1 + + + + + + Not automated adding two numbers + + + + FeatureTitle + Addition + + + + + + This is a scenario with parentheses, hyphen and comma (10-20, 30-40) + + + + FeatureTitle + Scenarios With Special Characters - + - + And we can go totally bonkers with multiple example sections. - + FeatureTitle @@ -698,41 +634,148 @@ pass_1 - + + + + Deal with multiple named example sections with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 0 + + + ExampleSetName + Second set + + + Parameter:result + fail + + + + + + Deal with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 2 + + + Parameter:result + inconclusive + + + + + + Deal with multiple example sections with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 2 + + + Parameter:result + pass + + + - + Passing Feature Passing Scenario - + FeatureTitle Passing - + - - This scenario contains examples with Regex-special characters - + + Deal with multiple named example sections with duplicate values + FeatureTitle - Scenarios With Special Characters + Scenario Outlines + + + VariantName + Variant 1 + + + ExampleSetName + Second set + + + Parameter:result + inconclusive + + + + + + And we can go totally bonkers with multiple example sections. + + + + FeatureTitle + Scenario Outlines + + + VariantName + fail_2 + + + Parameter:result + fail_2 + + + + + + Deal with multiple named example sections with duplicate values + + + + FeatureTitle + Scenario Outlines VariantName Variant 0 - Parameter:regex - ** + ExampleSetName + First set + + + Parameter:result + pass - + - + This is a scenario outline where all scenarios pass - + FeatureTitle @@ -747,11 +790,11 @@ pass_3 - + - - This is a scenario outline where one scenario fails - + + And we can go totally bonkers with multiple example sections. + FeatureTitle @@ -759,18 +802,101 @@ VariantName - pass_1 + pass_2 Parameter:result - pass_1 + pass_2 + + + + + + Deal with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 0 + + + Parameter:result + pass + + + + + + Deal with multiple named example sections with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 1 + + + ExampleSetName + First set + + + Parameter:result + fail + + + + + + Deal with multiple example sections with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 1 + + + Parameter:result + fail + + + + + + This is a scenario with spanish characters ñáéíóú + + + + FeatureTitle + Scenarios With Special Characters + + + + + + Add two numbers + + + + FeatureTitle + Failing Background - + - + This scenario contains examples with Regex-special characters - + FeatureTitle @@ -778,18 +904,21 @@ VariantName - Variant 4 + Variant 3 Parameter:regex - {} + [] - + - + Adding several numbers - + + + + Parameter:first number @@ -813,50 +942,44 @@ FeatureTitle - Failing Background + Addition - + - - Fail to add two numbers - - - - + + Deal with multiple example sections with duplicate values + FeatureTitle - Addition + Scenario Outlines - - - - - Not automated adding two numbers - - - FeatureTitle - Addition + VariantName + Variant 0 + + + Parameter:result + pass - + - - This is a scenario with spanish characters ñáéíóú - + + Not automated scenario 1 + FeatureTitle - Scenarios With Special Characters + Not Automated At All - + - - And we can go totally bonkers with multiple example sections. - + + Deal with multiple named example sections with duplicate values + FeatureTitle @@ -864,159 +987,924 @@ VariantName - inconclusive_1 + Variant 2 + + + ExampleSetName + First set Parameter:result - inconclusive_1 + pass - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + This scenario contains examples with Regex-special characters + + + + FeatureTitle + Scenarios With Special Characters + + + VariantName + Variant 5 + + + Parameter:regex + () + + + + + + This is a scenario outline with ampersand & + + + + FeatureTitle + Scenarios With Special Characters + + + VariantName + pass_1 + + + Parameter:result + pass_1 + + + + + + And we can go totally bonkers with multiple example sections. + + + + FeatureTitle + Scenario Outlines + + + VariantName + inconclusive_1 + + + Parameter:result + inconclusive_1 + + + + + + This scenario contains examples with Regex-special characters + + + + FeatureTitle + Scenarios With Special Characters + + + VariantName + Variant 2 + + + Parameter:regex + .* + + + + + + Deal with multiple example sections with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 1 + + + Parameter:result + inconclusive + + + + + + Deal correctly with parenthesis in the examples + + + + FeatureTitle + Scenario Outlines + + + VariantName + This is a description (and more) + + + Parameter:overly descriptive field + This is a description (and more) + + + + + + This scenario contains examples with Regex-special characters + + + + FeatureTitle + Scenarios With Special Characters + + + VariantName + Variant 0 + + + Parameter:regex + ** + + + + + + This is a scenario outline where one scenario is inconclusive + + + + FeatureTitle + Scenario Outlines + + + VariantName + pass_1 + + + Parameter:result + pass_1 + + + + + + This is a scenario outline where all scenarios pass + + + + FeatureTitle + Scenario Outlines + + + VariantName + pass_2 + + + Parameter:result + pass_2 + + + + + + This is a scenario outline with german umlauts äöüß ÄÖÜ + + + + FeatureTitle + Scenarios With Special Characters + + + VariantName + pass_1 + + + Parameter:result + pass_1 + + + + + + Inconclusive Feature Passing Scenario + + + + FeatureTitle + Inconclusive + + + + + + Failing Feature Failing Scenario + + + + FeatureTitle + Failing + + + + + + Not automated scenario 3 + + + + FeatureTitle + Not Automated At All + + + + + + Deal with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 1 + + + Parameter:result + fail + + + + + + Failing Feature Passing Scenario + + + + FeatureTitle + Failing + + + + + + + + + FeatureTitle + Addition + + + + + + This is a scenario outline where one scenario fails + + + + FeatureTitle + Scenario Outlines + + + VariantName + pass_1 + + + Parameter:result + pass_1 + + + + + + Failing Feature Inconclusive Scenario + + + + FeatureTitle + Failing + + + + + + This scenario contains examples with Regex-special characters + + + + FeatureTitle + Scenarios With Special Characters + + + VariantName + Variant 4 + + + Parameter:regex + {} + + + + + + Deal with duplicate values + + + + FeatureTitle + Scenario Outlines + + + VariantName + Variant 4 + + + Parameter:result + fail + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 40 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0.0s) And I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) And I have entered 90 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 180 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0,0s) +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0.1s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 60 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0.0s) +And I have entered 70 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) +And I have entered 130 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 260 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 1 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) +And I have entered 2 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 3 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 1 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) +And I have entered 2.2 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2.2) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 3.2 on the screen +-> error: Input string was not in a correct format. + + Test method Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers threw exception: +System.FormatException: Input string was not in a correct format. + at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) + at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) + at System.String.System.IConvertible.ToInt32(IFormatProvider provider) + at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) + at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext() + at System.Linq.Buffer`1..ctor(IEnumerable`1 source) + at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers() in C:\Git\pickles\test-harness\MsTest\Addition.feature:line 34 + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +When unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Then unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + Assert.Inconclusive failed. No matching step definition found for one or more steps. +using System; +using TechTalk.SpecFlow; + +namespace MyNamespace +{ + [Binding] + public class StepDefinitions + { + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + } +} + + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.AdditionFeature.NotAutomatedAddingTwoNumbers() in C:\Git\pickles\test-harness\MsTest\Addition.feature:line 46 + + + + + + + Given the background step fails +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +And the calculator has clean memory +-> skipped because of previous errors +Given I have entered 40 into the calculator +-> skipped because of previous errors +And I have entered 50 into the calculator +-> skipped because of previous errors +And I have entered 90 into the calculator +-> skipped because of previous errors +When I press add +-> skipped because of previous errors +Then the result should be 180 on the screen +-> skipped because of previous errors + + Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\FailingBackground.feature:line 19 + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40() + + - + - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) + Given the background step fails +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +And the calculator has clean memory +-> skipped because of previous errors Given I have entered 60 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0,0s) +-> skipped because of previous errors And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) +-> skipped because of previous errors And I have entered 130 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0,0s) +-> skipped because of previous errors When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> skipped because of previous errors Then the result should be 260 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0,0s) +-> skipped because of previous errors + + Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\FailingBackground.feature:line 19 + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60() + + - + - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) -And I have entered 2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0,0s) + Given the background step fails +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +And the calculator has clean memory +-> skipped because of previous errors +Given I have entered 50 into the calculator +-> skipped because of previous errors +And I have entered 70 into the calculator +-> skipped because of previous errors When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 3 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0,0s) +-> skipped because of previous errors +Then the result should be 120 on the screen +-> skipped because of previous errors + + Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers() in C:\Git\pickles\test-harness\MsTest\FailingBackground.feature:line 12 + + - + - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) -And I have entered 2.2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2,2) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 3.2 on the screen --> error: Input string was not in a correct format. + Then failing step +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] - Test method Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers threw exception: -System.FormatException: Input string was not in a correct format. - at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) - at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) - at System.String.System.IConvertible.ToInt32(IFormatProvider provider) - at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) - at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.ConvertSimple(Type typeToConvertTo, Object value, CultureInfo cultureInfo) - at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.ConvertSimple(IBindingType typeToConvertTo, Object value, CultureInfo cultureInfo) - at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.Convert(Object value, IBindingType typeToConvertTo, CultureInfo cultureInfo) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ConvertArg(Object value, IBindingType typeToConvertTo) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.<>c__DisplayClass5.<GetExecuteArguments>b__4(Object arg, Int32 argIndex) - at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext() - at System.Linq.Buffer`1..ctor(IEnumerable`1 source) - at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) + Test method Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.MinimalFeatures.MinimalSteps.ThenFailingStep() in C:\Git\pickles\test-harness\AutomationLayer\MinimalFeatures\MinimalSteps.cs:line 24 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Addition.feature:line 34 + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Git\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 10 + + + + + + + Then inconclusive step +-> pending: MinimalSteps.ThenInconclusiveStep() + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + MinimalSteps.ThenInconclusiveStep() + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureInconclusiveScenario() in C:\Git\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 7 + + + + + + + Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Then inconclusive step +-> pending: MinimalSteps.ThenInconclusiveStep() + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + MinimalSteps.ThenInconclusiveStep() + at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.InconclusiveFeatureInconclusiveScenario() in C:\Git\pickles\test-harness\MsTest\Minimal Features\Inconclusive.feature:line 7 + + + + + + + Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +When unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Then unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + Assert.Inconclusive failed. No matching step definition found for one or more steps. +using System; +using TechTalk.SpecFlow; + +namespace MyNamespace +{ + [Binding] + public class StepDefinitions + { + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + } +} + + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Git\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 9 + + + + + + + Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +When unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Then unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + Assert.Inconclusive failed. No matching step definition found for one or more steps. +using System; +using TechTalk.SpecFlow; + +namespace MyNamespace +{ + [Binding] + public class StepDefinitions + { + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + } +} + + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario2() in C:\Git\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 14 - + - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) + Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + Given unimplemented step -> No matching step definition found for the step. Use the following code to create one: [Given(@"unimplemented step")] @@ -1070,90 +1958,66 @@ namespace MyNamespace } } - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.AdditionFeature.NotAutomatedAddingTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Addition.feature:line 46 + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario3() in C:\Git\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 19 - + + + - Given the background step fails --> error: -The checked value is different from the expected one. -The checked value: - [True] -The expected value: - [False] -And the calculator has clean memory --> skipped because of previous errors -Given I have entered 40 into the calculator --> skipped because of previous errors -And I have entered 50 into the calculator --> skipped because of previous errors -And I have entered 90 into the calculator --> skipped because of previous errors -When I press add --> skipped because of previous errors -Then the result should be 180 on the screen --> skipped because of previous errors + Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'pass_2' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) + + + + + Then the scenario will 'inconclusive_1' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") - Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40 threw exception: -NFluent.FluentCheckException: -The checked value is different from the expected one. -The checked value: - [True] -The expected value: - [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 - at lambda_method(Closure , IContextManager ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\FailingBackground.feature:line 19 - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40() + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_1() - + - Given the background step fails + Then the scenario will 'inconclusive_2' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_2() + + + + + + + Then the scenario will 'fail_1' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: - [False] -And the calculator has clean memory --> skipped because of previous errors -Given I have entered 60 into the calculator --> skipped because of previous errors -And I have entered 70 into the calculator --> skipped because of previous errors -And I have entered 130 into the calculator --> skipped because of previous errors -When I press add --> skipped because of previous errors -Then the result should be 260 on the screen --> skipped because of previous errors + [False] - Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60 threw exception: + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: @@ -1161,46 +2025,31 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 - at lambda_method(Closure , IContextManager ) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\FailingBackground.feature:line 19 - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1() - + - Given the background step fails + Then the scenario will 'fail_2' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: - [False] -And the calculator has clean memory --> skipped because of previous errors -Given I have entered 50 into the calculator --> skipped because of previous errors -And I have entered 70 into the calculator --> skipped because of previous errors -When I press add --> skipped because of previous errors -Then the result should be 120 on the screen --> skipped because of previous errors + [False] - Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers threw exception: + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: @@ -1208,27 +2057,51 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 - at lambda_method(Closure , IContextManager ) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\FailingBackground.feature:line 12 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2() - + - Then failing step + When I have backslashes in the value, for example a 'c:\Temp\' +-> done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0.0s) + + + + + When I have a field with value 'Please enter a valid two letter country code (e.g. DE)!' +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0.0s) +And I have a field with value 'This is just a very very very veery long error message!' +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0.0s) +Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + When I have parenthesis in the value, for example an 'This is a description (and more)' +-> done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: @@ -1236,7 +2109,7 @@ The checked value: The expected value: [False] - Test method Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario threw exception: + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant1 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: @@ -1244,362 +2117,293 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.MinimalFeatures.MinimalSteps.ThenFailingStep() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MinimalFeatures\MinimalSteps.cs:line 24 - at lambda_method(Closure , IContextManager ) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 10 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 90 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant1() - + - Then inconclusive step --> pending: MinimalSteps.ThenInconclusiveStep() + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") Assert.Inconclusive failed. One or more step definitions are not implemented yet. - MinimalSteps.ThenInconclusiveStep() - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureInconclusiveScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 7 + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 90 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant2() - + - Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) - + - Then inconclusive step --> pending: MinimalSteps.ThenInconclusiveStep() + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] - Assert.Inconclusive failed. One or more step definitions are not implemented yet. - MinimalSteps.ThenInconclusiveStep() - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant4 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.InconclusiveFeatureInconclusiveScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Minimal Features\Inconclusive.feature:line 7 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 90 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant4() - - - Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) - - - + - Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) - + - Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -When unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Then unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] - Assert.Inconclusive failed. No matching step definition found for one or more steps. -using System; -using TechTalk.SpecFlow; - -namespace MyNamespace -{ - [Binding] - public class StepDefinitions - { - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - } -} - - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant1 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 9 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant1() - + - Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -When unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Then unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] - Assert.Inconclusive failed. No matching step definition found for one or more steps. -using System; -using TechTalk.SpecFlow; - -namespace MyNamespace -{ - [Binding] - public class StepDefinitions - { - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - } -} - - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant0 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario2() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 14 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant0() - + - Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -When unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Then unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") - Assert.Inconclusive failed. No matching step definition found for one or more steps. -using System; -using TechTalk.SpecFlow; - -namespace MyNamespace -{ - [Binding] - public class StepDefinitions - { - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - } -} - - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario3() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 19 + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant1() - + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant2 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant2() + + + - + - Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) - + - Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) - + - Then the scenario will 'inconclusive_1' --> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] - Assert.Inconclusive failed. One or more step definitions are not implemented yet. - ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant1 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_1() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant1() - + - Then the scenario will 'inconclusive_2' --> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] - Assert.Inconclusive failed. One or more step definitions are not implemented yet. - ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant0 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_2() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant0() - + - Then the scenario will 'fail_1' + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant1() + + + + + + + Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: @@ -1607,7 +2411,7 @@ The checked value: The expected value: [False] - Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1 threw exception: + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant2 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: @@ -1615,28 +2419,29 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 - at lambda_method(Closure , IContextManager , String ) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant2() - + - Then the scenario will 'fail_2' + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: @@ -1644,7 +2449,7 @@ The checked value: The expected value: [False] - Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2 threw exception: + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Fail threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: @@ -1652,66 +2457,59 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 - at lambda_method(Closure , IContextManager , String ) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 117 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Fail() - + - When I have backslashes in the value, for example a 'c:\Temp\' --> done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0,0s) - - - - - When I have a field with value 'Please enter a valid two letter country code (e.g. DE)!' --> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0,0s) -And I have a field with value 'This is just a very very very veery long error message!' --> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0,0s) -Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) - + - When I have parenthesis in the value, for example an 'This is a description (and more)' --> done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0,0s) + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 117 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_SecondSet_Inconclusive() + + - + Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) - + Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) - + Then the scenario will 'pass_3' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0.0s) - + Then the scenario will 'fail_1' -> error: @@ -1729,191 +2527,180 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 - at lambda_method(Closure , IContextManager , String ) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 34 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 34 at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails_Fail_1() - + Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) - + Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) - + Then the scenario will 'inconclusive_1' -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") Assert.Inconclusive failed. One or more step definitions are not implemented yet. ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 21 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 21 at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Inconclusive_1() - + Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) - + Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 120 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0,0s) +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '**' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '++' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '.*' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '[]' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '{}' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '()' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) - + Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '^.*(?<foo>BAR)\s[^0-9]{3,4}A+$' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?<foo>BAR)\s[...") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?<foo>BAR)\s[...") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/WhenParsingNUnitResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/WhenParsingNUnitResultsFileWithIndividualResults.cs index 70934aaf7..978a4cd20 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/WhenParsingNUnitResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/WhenParsingNUnitResultsFileWithIndividualResults.cs @@ -18,7 +18,6 @@ // // -------------------------------------------------------------------------------------------------------------------- - using NUnit.Framework; using PicklesDoc.Pickles.TestFrameworks.NUnit.NUnit2; @@ -68,5 +67,29 @@ public WhenParsingNUnitResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } -} +} \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/results-example-nunit.xml b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/results-example-nunit.xml index eaab0f41b..3297fdeee 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/results-example-nunit.xml +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit2/results-example-nunit.xml @@ -1,33 +1,33 @@ - - - - + + + + - + - + - + - + - + - - + + - + - + @@ -44,7 +44,7 @@ at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(Bind at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.nunit.AdditionFeature.ScenarioCleanup() -at Pickles.TestHarness.nunit.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\nunit\Addition.feature:line 34 +at Pickles.TestHarness.nunit.AdditionFeature.FailToAddTwoNumbers() in C:\Git\pickles\test-harness\nunit\Addition.feature:line 34 ]]> @@ -53,7 +53,7 @@ at Pickles.TestHarness.nunit.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Cod - + - + - + @@ -102,14 +102,14 @@ The expected value: [False]]]> @@ -123,14 +123,14 @@ The expected value: [False]]]> @@ -146,24 +146,24 @@ The expected value: [False]]]> - + - + - + - + - + @@ -204,16 +204,16 @@ at Pickles.TestHarness.nunit.MinimalFeatures.FailingFeature.FailingFeatureFailin - + - + - + - + - + - + - + - + @@ -326,7 +326,7 @@ namespace MyNamespace ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1")]]> - + @@ -342,18 +342,18 @@ The expected value: [False]]]> - + @@ -388,21 +388,259 @@ at Pickles.TestHarness.nunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWit - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - + - + - + @@ -439,7 +677,7 @@ at Pickles.TestHarness.nunit.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhere - + @@ -457,17 +695,17 @@ at Pickles.TestHarness.nunit.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhere - + - + - + - + diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/WhenParsingNUnitResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/WhenParsingNUnitResultsFileWithIndividualResults.cs index 528cf2335..b19ef51c9 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/WhenParsingNUnitResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/WhenParsingNUnitResultsFileWithIndividualResults.cs @@ -18,7 +18,6 @@ // // -------------------------------------------------------------------------------------------------------------------- - using NUnit.Framework; using PicklesDoc.Pickles.TestFrameworks.NUnit.NUnit3; @@ -68,5 +67,29 @@ public WhenParsingNUnitResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } } \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit2-with-nunit3-runner.xml b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit2-with-nunit3-runner.xml index 227b1bbac..652843caa 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit2-with-nunit3-runner.xml +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit2-with-nunit3-runner.xml @@ -1,48 +1,48 @@  - - - + + + - + - + - + - + - + - + - - + + - + - + @@ -60,10 +60,10 @@ at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.nunit.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.nunit.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\nunit\Addition.feature:line 34]]> + at Pickles.TestHarness.nunit.AdditionFeature.FailToAddTwoNumbers() in C:\Git\pickles\test-harness\nunit\Addition.feature:line 34]]> - + @@ -72,7 +72,7 @@ - + @@ -109,21 +109,21 @@ namespace MyNamespace - + - + - + + at Pickles.TestHarness.nunit.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit\FailingBackground.feature:line 19]]> - + + at Pickles.TestHarness.nunit.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit\FailingBackground.feature:line 19]]> - + @@ -177,29 +177,29 @@ The expected value: [False]]]> + at Pickles.TestHarness.nunit.FailingBackgroundFeature.AddTwoNumbers() in C:\Git\pickles\test-harness\nunit\FailingBackground.feature:line 12]]> - + - + - + @@ -212,17 +212,17 @@ The expected value: [False]]]> + at Pickles.TestHarness.nunit.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Git\pickles\test-harness\nunit\Minimal Features\Failing.feature:line 10]]> - + @@ -231,17 +231,17 @@ The expected value: MinimalSteps.ThenInconclusiveStep()]]> - + - + - + @@ -250,28 +250,28 @@ The expected value: MinimalSteps.ThenInconclusiveStep()]]> - + - + - + - + - + @@ -307,7 +307,7 @@ namespace MyNamespace ]]> - + @@ -343,7 +343,7 @@ namespace MyNamespace ]]> - + @@ -380,35 +380,35 @@ namespace MyNamespace - + - + - - - + + + - + - + + at Pickles.TestHarness.nunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit\ScenarioOutlines.feature:line 45]]> - + + at Pickles.TestHarness.nunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit\ScenarioOutlines.feature:line 45]]> - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - + + + - + - - - + + + + at Pickles.TestHarness.nunit.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit\ScenarioOutlines.feature:line 34]]> - + - - - + + + @@ -519,54 +764,54 @@ The expected value: - + - + - + - + - + - + - + - + - + - + - + - - - - - - - + + + + + + + diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit3.xml b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit3.xml index 9ac813026..90edd3d53 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit3.xml +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/NUnit/NUnit3/results-example-nunit3.xml @@ -1,97 +1,97 @@  - - - - + + + + - + - + - + - + - + - + - + - + - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 60 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0.0s) And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) And I have entered 130 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 260 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0,0s) +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 40 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0.0s) And I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) And I have entered 90 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 180 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0,0s) +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) And I have entered 2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 3 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0,0s) +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0.0s) ]]> - + @@ -109,21 +109,21 @@ Then the result should be 3 on the screen at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.nunit3.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.nunit3.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\nunit3\Addition.feature:line 34]]> + at Pickles.TestHarness.nunit3.AdditionFeature.FailToAddTwoNumbers() in C:\Git\pickles\test-harness\nunit3\Addition.feature:line 34]]> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) And I have entered 2.2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2,2) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2.2) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 3.2 on the screen -> error: Input string was not in a correct format. ]]> - + @@ -132,7 +132,7 @@ Then the result should be 3.2 on the screen - + @@ -168,7 +168,7 @@ namespace MyNamespace ]]> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given unimplemented step -> No matching step definition found for the step. Use the following code to create one: [Given(@"unimplemented step")] @@ -196,21 +196,21 @@ Then unimplemented step ]]> - + - + - + + at Pickles.TestHarness.nunit3.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit3\FailingBackground.feature:line 19]]> error: @@ -250,7 +250,7 @@ Then the result should be 260 on the screen -> skipped because of previous errors ]]> - + + at Pickles.TestHarness.nunit3.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit3\FailingBackground.feature:line 19]]> error: @@ -291,7 +291,7 @@ Then the result should be 180 on the screen ]]> - + @@ -304,14 +304,14 @@ The expected value: [False]]]> + at Pickles.TestHarness.nunit3.FailingBackgroundFeature.AddTwoNumbers() in C:\Git\pickles\test-harness\nunit3\FailingBackground.feature:line 12]]> error: @@ -333,18 +333,18 @@ Then the result should be 120 on the screen ]]> - + - + - + @@ -357,14 +357,14 @@ The expected value: [False]]]> + at Pickles.TestHarness.nunit3.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Git\pickles\test-harness\nunit3\Minimal Features\Failing.feature:line 10]]> error: @@ -375,7 +375,7 @@ The expected value: [False] ]]> - + @@ -387,20 +387,20 @@ The expected value: -> pending: MinimalSteps.ThenInconclusiveStep() ]]> - + done: MinimalSteps.ThenPassingStep() (0,0s) +-> done: MinimalSteps.ThenPassingStep() (0.0s) ]]> - + - + @@ -412,51 +412,51 @@ The expected value: -> pending: MinimalSteps.ThenInconclusiveStep() ]]> - + done: MinimalSteps.ThenPassingStep() (0,0s) +-> done: MinimalSteps.ThenPassingStep() (0.0s) ]]> - + - + done: MinimalSteps.ThenPassingStep() (0,0s) +-> done: MinimalSteps.ThenPassingStep() (0.0s) ]]> - + - + - + at Pickles.TestHarness.nunit3.NotAutomatedAtAllFeature.AddTwoNumbers() in C:\Git\pickles\test-harness\nunit3\NotAutomatedAtAll.feature:line 11]]> error: Object reference not set to an instance of an object. @@ -469,31 +469,31 @@ Then the result should be 120 on the screen ]]> - + - + - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) ]]> - + @@ -502,7 +502,7 @@ Then the result should be 120 on the screen -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") ]]> - + @@ -511,7 +511,7 @@ Then the result should be 120 on the screen -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") ]]> - + + at Pickles.TestHarness.nunit3.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit3\ScenarioOutlines.feature:line 45]]> error: @@ -539,7 +539,7 @@ The expected value: [False] ]]> - + + at Pickles.TestHarness.nunit3.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit3\ScenarioOutlines.feature:line 45]]> error: @@ -568,78 +568,443 @@ The expected value: ]]> - + - + done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0.0s) ]]> - + - + done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0.0s) And I have a field with value 'This is just a very very very veery long error message!' --> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + - + done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0.0s) ]]> - + + + + + + + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + + + + pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") +]]> + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + + + + + + + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + + + + pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + + + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + + + + pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + + + + + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +]]> + + + + + + + error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +]]> + + + + + + pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") +]]> + + + - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) ]]> - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0.0s) ]]> - + - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) ]]> - + + at Pickles.TestHarness.nunit3.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Git\pickles\test-harness\nunit3\ScenarioOutlines.feature:line 34]]> error: @@ -668,21 +1033,21 @@ The expected value: ]]> - + - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) ]]> - + @@ -693,147 +1058,147 @@ The expected value: - + - + - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 120 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0,0s) +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) ]]> - + - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '**' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '++' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '.*' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '[]' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '{}' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '()' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) ]]> - + done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '^.*(?BAR)\s[^0-9]{3,4}A+$' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?BAR)\s[...") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?BAR)\s[...") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) ]]> diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs index c0a26b56f..9cdab3bec 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs @@ -18,11 +18,9 @@ // // -------------------------------------------------------------------------------------------------------------------- - using System.Collections.Generic; using NFluent; - using PicklesDoc.Pickles.ObjectModel; namespace PicklesDoc.Pickles.TestFrameworks.UnitTests @@ -201,5 +199,236 @@ public void ThenCanReadExamplesWithLongExampleValues() TestResult exampleResult1 = results.GetExampleResult(scenarioOutline, new[] { "Please enter a valid two letter country code (e.g. DE)!", "This is just a very very very veery long error message!" }); Check.That(exampleResult1).IsEqualTo(TestResult.Passed); } + + public void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + var results = ParseResultsFile(); + + var feature = new Feature { Name = "Scenario Outlines" }; + + var scenarioOutline = new ScenarioOutline + { + Name = "Deal with duplicate values", + Feature = feature, + Examples = new List + { + new Example + { + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("pass"), + new TableRow("fail"), + new TableRow("inconclusive"), + new TableRow("pass"), + new TableRow("fail") + } + } + } + } + }; + + TestResult exampleResultOutline = results.GetScenarioOutlineResult(scenarioOutline); + Check.That(exampleResultOutline).IsEqualTo(TestResult.Failed); + + TestResult exampleResult0 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult0).IsEqualTo(TestResult.Passed); + + TestResult exampleResult1 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult1).IsEqualTo(TestResult.Failed); + + TestResult exampleResult2 = results.GetExampleResult(scenarioOutline, new[] { "inconclusive" }); + Check.That(exampleResult2).IsEqualTo(this.valueForInconclusive); + + TestResult exampleResult3 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult3).IsEqualTo(TestResult.Passed); + + TestResult exampleResult4 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult4).IsEqualTo(TestResult.Failed); + } + + public void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + var results = ParseResultsFile(); + + var feature = new Feature { Name = "Scenario Outlines" }; + + var scenarioOutline = new ScenarioOutline + { + Name = "Deal with multiple example sections with duplicate values", + Feature = feature, + Examples = new List + { + new Example + { + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("pass"), + new TableRow("fail"), + new TableRow("pass"), + } + } + }, + new Example + { + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("fail"), + new TableRow("inconclusive"), + new TableRow("fail"), + new TableRow("pass") + } + } + } + } + }; + + TestResult exampleResultOutline = results.GetScenarioOutlineResult(scenarioOutline); + Check.That(exampleResultOutline).IsEqualTo(TestResult.Failed); + + TestResult exampleResult0 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult0).IsEqualTo(TestResult.Passed); + + TestResult exampleResult1 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult1).IsEqualTo(TestResult.Failed); + + TestResult exampleResult3 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult3).IsEqualTo(TestResult.Passed); + + TestResult exampleResult4 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult4).IsEqualTo(TestResult.Failed); + + TestResult exampleResult5 = results.GetExampleResult(scenarioOutline, new[] { "inconclusive" }); + Check.That(exampleResult5).IsEqualTo(this.valueForInconclusive); + + TestResult exampleResult6 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult6).IsEqualTo(TestResult.Failed); + + TestResult exampleResult7 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult7).IsEqualTo(TestResult.Passed); + } + + public void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + var results = ParseResultsFile(); + + var feature = new Feature { Name = "Scenario Outlines" }; + + var scenarioOutline = new ScenarioOutline + { + Name = "Deal with multiple named example sections without duplicate values", + Feature = feature, + Examples = new List + { + new Example + { + Name = "First set", + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("pass"), + new TableRow("fail"), + }, + } + }, + new Example + { + Name = "Second set", + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("inconclusive"), + } + } + } + } + }; + + TestResult exampleResultOutline = results.GetScenarioOutlineResult(scenarioOutline); + Check.That(exampleResultOutline).IsEqualTo(TestResult.Failed); + + TestResult exampleResult0 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult0).IsEqualTo(TestResult.Passed); + + TestResult exampleResult1 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult1).IsEqualTo(TestResult.Failed); + + TestResult exampleResult2 = results.GetExampleResult(scenarioOutline, new[] { "inconclusive" }); + Check.That(exampleResult2).IsEqualTo(this.valueForInconclusive); + } + + public void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + var results = ParseResultsFile(); + + var feature = new Feature { Name = "Scenario Outlines" }; + + var scenarioOutline = new ScenarioOutline + { + Name = "Deal with multiple named example sections with duplicate values", + Feature = feature, + Examples = new List + { + new Example + { + Name = "First set", + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("pass"), + new TableRow("fail"), + new TableRow("pass"), + }, + } + }, + new Example + { + Name = "Second set", + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("fail"), + new TableRow("inconclusive"), + new TableRow("fail"), + new TableRow("pass") + } + } + } + } + }; + + TestResult exampleResultOutline = results.GetScenarioOutlineResult(scenarioOutline); + Check.That(exampleResultOutline).IsEqualTo(TestResult.Failed); + + TestResult exampleResult0 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult0).IsEqualTo(TestResult.Passed); + + TestResult exampleResult1 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult1).IsEqualTo(TestResult.Failed); + + TestResult exampleResult3 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult3).IsEqualTo(TestResult.Passed); + + TestResult exampleResult4 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult4).IsEqualTo(TestResult.Failed); + + TestResult exampleResult5 = results.GetExampleResult(scenarioOutline, new[] { "inconclusive" }); + Check.That(exampleResult5).IsEqualTo(this.valueForInconclusive); + + TestResult exampleResult6 = results.GetExampleResult(scenarioOutline, new[] { "fail" }); + Check.That(exampleResult6).IsEqualTo(TestResult.Failed); + + TestResult exampleResult7 = results.GetExampleResult(scenarioOutline, new[] { "pass" }); + Check.That(exampleResult7).IsEqualTo(TestResult.Passed); + } } -} +} \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingMultipleVsTestTestResultsFiles.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingMultipleVsTestTestResultsFiles.cs index f74a8276b..bf7250463 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingMultipleVsTestTestResultsFiles.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingMultipleVsTestTestResultsFiles.cs @@ -33,7 +33,7 @@ namespace PicklesDoc.Pickles.TestFrameworks.UnitTests.VsTest public class WhenParsingMultipleVsTestTestResultsFiles : WhenParsingTestResultFiles { public WhenParsingMultipleVsTestTestResultsFiles() - : base("VsTest." + "results-example-vstest - Run 1 (failing).trx;" + "MsTest." + "results-example-mstest - Run 2 (passing).trx") + : base("VsTest." + "results-example-vstest - Run 1 (failing).trx;" + "VsTest." + "results-example-vstest - Run 2 (passing).trx") { } diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs index d5c760146..7fa1712fc 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs @@ -18,7 +18,6 @@ // // -------------------------------------------------------------------------------------------------------------------- - using NUnit.Framework; using PicklesDoc.Pickles.TestFrameworks.VsTest; @@ -68,5 +67,29 @@ public WhenParsingVsTestResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } -} +} \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/results-example-vstest.trx b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/results-example-vstest.trx index ca44422f7..9e22839bc 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/results-example-vstest.trx +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/results-example-vstest.trx @@ -1,1275 +1,1848 @@ - - - - - - - - - - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 60 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0,0s) -And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) -And I have entered 130 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 260 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 40 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0,0s) -And I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) -And I have entered 90 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 180 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) -And I have entered 2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 3 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) -And I have entered 2.2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2,2) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 3.2 on the screen --> error: Input string was not in a correct format. - - Test method Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers threw exception: -System.FormatException: Input string was not in a correct format. - at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) - at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) - at System.String.System.IConvertible.ToInt32(IFormatProvider provider) - at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) - at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.ConvertSimple(Type typeToConvertTo, Object value, CultureInfo cultureInfo) - at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.ConvertSimple(IBindingType typeToConvertTo, Object value, CultureInfo cultureInfo) - at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.Convert(Object value, IBindingType typeToConvertTo, CultureInfo cultureInfo) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ConvertArg(Object value, IBindingType typeToConvertTo) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.<>c__DisplayClass5.<GetExecuteArguments>b__4(Object arg, Int32 argIndex) - at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext() - at System.Linq.Buffer`1..ctor(IEnumerable`1 source) - at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Addition.feature:line 34 - - - - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -When unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Then unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - Assert.Inconclusive failed. No matching step definition found for one or more steps. -using System; -using TechTalk.SpecFlow; - -namespace MyNamespace -{ - [Binding] - public class StepDefinitions - { - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - } -} - - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.AdditionFeature.NotAutomatedAddingTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Addition.feature:line 46 - - - - - - - Given the background step fails + + + + + + + + + + Then the scenario will 'pass_3' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +When I have special characters for regexes in the value, for example a '^.*(?<foo>BAR)\s[^0-9]{3,4}A+$' +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?<foo>BAR)\s[...") (0.0s) +Then the scenario will 'PASS' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) + + + + + Then the scenario will 'pass_2' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) + + + + + Given the background step fails -> error: The checked value is different from the expected one. The checked value: [True] The expected value: - [False] -And the calculator has clean memory --> skipped because of previous errors -Given I have entered 50 into the calculator --> skipped because of previous errors -And I have entered 70 into the calculator --> skipped because of previous errors -When I press add --> skipped because of previous errors -Then the result should be 120 on the screen + [False] +And the calculator has clean memory +-> skipped because of previous errors +Given I have entered 60 into the calculator +-> skipped because of previous errors +And I have entered 70 into the calculator +-> skipped because of previous errors +And I have entered 130 into the calculator +-> skipped because of previous errors +When I press add +-> skipped because of previous errors +Then the result should be 260 on the screen -> skipped because of previous errors - - Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers threw exception: + + Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 - at lambda_method(Closure , IContextManager ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\FailingBackground.feature:line 12 - - - - - - - Given the background step fails + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at lambda_method(Closure , IContextManager ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\FailingBackground.feature:line 19 + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60() + + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 1 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) +And I have entered 2 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 3 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0.0s) + + + + + Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: - [False] -And the calculator has clean memory --> skipped because of previous errors -Given I have entered 60 into the calculator --> skipped because of previous errors -And I have entered 70 into the calculator --> skipped because of previous errors -And I have entered 130 into the calculator --> skipped because of previous errors -When I press add --> skipped because of previous errors -Then the result should be 260 on the screen --> skipped because of previous errors - - Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60 threw exception: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Fail threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 - at lambda_method(Closure , IContextManager ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\FailingBackground.feature:line 19 - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_60() - - - - - - - Given the background step fails + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 117 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Fail() + + + + + + + Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: - [False] -And the calculator has clean memory --> skipped because of previous errors -Given I have entered 40 into the calculator --> skipped because of previous errors -And I have entered 50 into the calculator --> skipped because of previous errors -And I have entered 90 into the calculator --> skipped because of previous errors -When I press add --> skipped because of previous errors -Then the result should be 180 on the screen --> skipped because of previous errors - - Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40 threw exception: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant0 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 - at lambda_method(Closure , IContextManager ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\FailingBackground.feature:line 19 - at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40() - - - - - - - Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -When unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Then unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - Assert.Inconclusive failed. No matching step definition found for one or more steps. -using System; -using TechTalk.SpecFlow; - -namespace MyNamespace -{ - [Binding] - public class StepDefinitions - { - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - } -} - - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 9 - - - - - - - Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -When unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Then unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - Assert.Inconclusive failed. No matching step definition found for one or more steps. -using System; -using TechTalk.SpecFlow; - -namespace MyNamespace -{ - [Binding] - public class StepDefinitions - { - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - } -} - - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario2() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 14 - - - - - - - Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Given unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -When unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - -Then unimplemented step --> No matching step definition found for the step. Use the following code to create one: - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - Assert.Inconclusive failed. No matching step definition found for one or more steps. -using System; -using TechTalk.SpecFlow; - -namespace MyNamespace -{ - [Binding] - public class StepDefinitions - { - [Given(@"unimplemented step")] - public void GivenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [When(@"unimplemented step")] - public void WhenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - - [Then(@"unimplemented step")] - public void ThenUnimplementedStep() - { - ScenarioContext.Current.Pending(); - } - } -} - - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario3() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 19 - - - - - - - Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) - - - - - Then the scenario will 'pass_3' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0,0s) - - - - - Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) - - - - - Then the scenario will 'inconclusive_1' + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant0() + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant1() + + + + + + + Then the scenario will 'pass_2' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then failing step +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.MinimalFeatures.MinimalSteps.ThenFailingStep() in C:\Git\pickles\test-harness\AutomationLayer\MinimalFeatures\MinimalSteps.cs:line 24 + at lambda_method(Closure , IContextManager ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Git\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 10 + + + + + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant1 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 90 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant1() + + + + + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant4 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 90 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant4() + + + + + + + Then the scenario will 'fail_1' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1() + + + + + + + Then the scenario will 'inconclusive_1' -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") - - Assert.Inconclusive failed. One or more step definitions are not implemented yet. + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 21 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Inconclusive_1() - - - - - - - Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) - - - - - Then the scenario will 'fail_1' + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_1() + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +When I have special characters for regexes in the value, for example a '.*' +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0.0s) +Then the scenario will 'PASS' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) + + + + + Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - - Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails_Fail_1 threw exception: + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant0 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 - at lambda_method(Closure , IContextManager , String ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 34 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails_Fail_1() - - - - - - - Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) - - - - - Then the scenario will 'inconclusive_1' + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant0() + + + + + + + Then the scenario will 'inconclusive_1' -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") - - Assert.Inconclusive failed. One or more step definitions are not implemented yet. + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_1() - - - - - - - Then the scenario will 'inconclusive_2' + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 21 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Inconclusive_1() + + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +When I have special characters for regexes in the value, for example a '**' +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0.0s) +Then the scenario will 'PASS' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) + + + + + Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +When unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Then unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + Assert.Inconclusive failed. No matching step definition found for one or more steps. +using System; +using TechTalk.SpecFlow; + +namespace MyNamespace +{ + [Binding] + public class StepDefinitions + { + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + } +} + + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario2() in C:\Git\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 14 + + + + + + + When I have backslashes in the value, for example a 'c:\Temp\' +-> done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0.0s) + + + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant1 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant1() + + + + + + + Then inconclusive step +-> pending: MinimalSteps.ThenInconclusiveStep() + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + MinimalSteps.ThenInconclusiveStep() + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureInconclusiveScenario() in C:\Git\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 7 + + + + + + + Then the scenario will 'inconclusive_2' -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") - - Assert.Inconclusive failed. One or more step definitions are not implemented yet. + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_2() - - - - - - - Then the scenario will 'fail_1' + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_2() + + + + + + + Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + When I have a field with value 'Please enter a valid two letter country code (e.g. DE)!' +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0.0s) +And I have a field with value 'This is just a very very very veery long error message!' +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0.0s) +Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +When I have special characters for regexes in the value, for example a '++' +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0.0s) +Then the scenario will 'PASS' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 1 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) +And I have entered 2.2 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2.2) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 3.2 on the screen +-> error: Input string was not in a correct format. + + Test method Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers threw exception: +System.FormatException: Input string was not in a correct format. + at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) + at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) + at System.String.System.IConvertible.ToInt32(IFormatProvider provider) + at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) + at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.ConvertSimple(Type typeToConvertTo, Object value, CultureInfo cultureInfo) + at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.ConvertSimple(IBindingType typeToConvertTo, Object value, CultureInfo cultureInfo) + at TechTalk.SpecFlow.Bindings.StepArgumentTypeConverter.Convert(Object value, IBindingType typeToConvertTo, CultureInfo cultureInfo) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ConvertArg(Object value, IBindingType typeToConvertTo) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.<>c__DisplayClass5.<GetExecuteArguments>b__4(Object arg, Int32 argIndex) + at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext() + at System.Linq.Buffer`1..ctor(IEnumerable`1 source) + at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.AdditionFeature.FailToAddTwoNumbers() in C:\Git\pickles\test-harness\MsTest\Addition.feature:line 34 + + + + + + + Then the scenario will 'pass_2' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) + + + + + Given the background step fails +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +And the calculator has clean memory +-> skipped because of previous errors +Given I have entered 50 into the calculator +-> skipped because of previous errors +And I have entered 70 into the calculator +-> skipped because of previous errors +When I press add +-> skipped because of previous errors +Then the result should be 120 on the screen +-> skipped because of previous errors + + Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at lambda_method(Closure , IContextManager ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddTwoNumbers() in C:\Git\pickles\test-harness\MsTest\FailingBackground.feature:line 12 + + + + + + + Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +When unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Then unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + Assert.Inconclusive failed. No matching step definition found for one or more steps. +using System; +using TechTalk.SpecFlow; + +namespace MyNamespace +{ + [Binding] + public class StepDefinitions + { + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + } +} + + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Git\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 9 + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 40 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0.0s) +And I have entered 50 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) +And I have entered 90 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 180 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0.0s) + + + + + When I have parenthesis in the value, for example an 'This is a description (and more)' +-> done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 90 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithDuplicateValues_Variant2() + + + + + + + Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +When I have special characters for regexes in the value, for example a '()' +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0.0s) +Then the scenario will 'PASS' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Given the background step fails +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +And the calculator has clean memory +-> skipped because of previous errors +Given I have entered 40 into the calculator +-> skipped because of previous errors +And I have entered 50 into the calculator +-> skipped because of previous errors +And I have entered 90 into the calculator +-> skipped because of previous errors +When I press add +-> skipped because of previous errors +Then the result should be 180 on the screen +-> skipped because of previous errors + + Test method Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at lambda_method(Closure , IContextManager ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\FailingBackground.feature:line 19 + at Pickles.TestHarness.MsTest.FailingBackgroundFeature.AddingSeveralNumbers_40() + + + + + + + Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +When unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Then unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + Assert.Inconclusive failed. No matching step definition found for one or more steps. +using System; +using TechTalk.SpecFlow; + +namespace MyNamespace +{ + [Binding] + public class StepDefinitions + { + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + } +} + + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.NotAutomatedAtAllFeature.NotAutomatedScenario3() in C:\Git\pickles\test-harness\MsTest\NotAutomatedAtAll.feature:line 19 + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +When unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + +Then unimplemented step +-> No matching step definition found for the step. Use the following code to create one: + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + Assert.Inconclusive failed. No matching step definition found for one or more steps. +using System; +using TechTalk.SpecFlow; + +namespace MyNamespace +{ + [Binding] + public class StepDefinitions + { + [Given(@"unimplemented step")] + public void GivenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [When(@"unimplemented step")] + public void WhenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + + [Then(@"unimplemented step")] + public void ThenUnimplementedStep() + { + ScenarioContext.Current.Pending(); + } + } +} + + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.AdditionFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.AdditionFeature.NotAutomatedAddingTwoNumbers() in C:\Git\pickles\test-harness\MsTest\Addition.feature:line 46 + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant1() + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 50 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) +And I have entered 70 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 120 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0.0s) + + + + + Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - - Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1 threw exception: + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant2 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 - at lambda_method(Closure , IContextManager , String ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_1() - - - - - - - Then the scenario will 'fail_2' + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant2() + + + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) + + + + + Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'fail_1' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - - Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2 threw exception: + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails_Fail_1 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 - at lambda_method(Closure , IContextManager , String ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 - at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2() - - - - - - - When I have backslashes in the value, for example a 'c:\Temp\' --> done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0,0s) - - - - - When I have parenthesis in the value, for example an 'This is a description (and more)' --> done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0,0s) - - - - - When I have a field with value 'Please enter a valid two letter country code (e.g. DE)!' --> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0,0s) -And I have a field with value 'This is just a very very very veery long error message!' --> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0,0s) -Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) -And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 120 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -When I have special characters for regexes in the value, for example a '**' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -When I have special characters for regexes in the value, for example a '++' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -When I have special characters for regexes in the value, for example a '.*' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -When I have special characters for regexes in the value, for example a '[]' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -When I have special characters for regexes in the value, for example a '{}' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -When I have special characters for regexes in the value, for example a '()' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -When I have special characters for regexes in the value, for example a '^.*(?<foo>BAR)\s[^0-9]{3,4}A+$' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?<foo>BAR)\s[...") (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) - - - - - Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) - - - - - Then inconclusive step + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 34 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails_Fail_1() + + + + + + + Then inconclusive step -> pending: MinimalSteps.ThenInconclusiveStep() - - Assert.Inconclusive failed. One or more step definitions are not implemented yet. + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. MinimalSteps.ThenInconclusiveStep() - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureInconclusiveScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 7 - - - - - - - Then failing step + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.InconclusiveFeatureInconclusiveScenario() in C:\Git\pickles\test-harness\MsTest\Minimal Features\Inconclusive.feature:line 7 + + + + + + + Then the scenario will 'fail_2' -> error: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - - Test method Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario threw exception: + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2 threw exception: NFluent.FluentCheckException: The checked value is different from the expected one. The checked value: [True] The expected value: [False] - at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) - at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() - at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) - at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.MinimalFeatures.MinimalSteps.ThenFailingStep() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MinimalFeatures\MinimalSteps.cs:line 24 - at lambda_method(Closure , IContextManager ) - at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Minimal Features\Failing.feature:line 10 - - - - - - - Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) - - - - - Then inconclusive step --> pending: MinimalSteps.ThenInconclusiveStep() - - Assert.Inconclusive failed. One or more step definitions are not implemented yet. - MinimalSteps.ThenInconclusiveStep() - at lambda_method(Closure , String , Object[] ) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) - at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) - at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() - at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.ScenarioCleanup() - at Pickles.TestHarness.MsTest.MinimalFeatures.InconclusiveFeature.InconclusiveFeatureInconclusiveScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\MsTest\Minimal Features\Inconclusive.feature:line 7 - - - - - - - Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Test 'IgnoredAddingTwoNumbers' was skipped in the test run.Test 'NotAutomatedAddingTwoNumbers' was skipped in the test run.Test 'NotAutomatedScenario1' was skipped in the test run.Test 'NotAutomatedScenario2' was skipped in the test run.Test 'NotAutomatedScenario3' was skipped in the test run.Test 'ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Inconclusive_1' was skipped in the test run.Test 'AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_1' was skipped in the test run.Test 'AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_2' was skipped in the test run.Test 'FailingFeatureInconclusiveScenario' was skipped in the test run.Test 'InconclusiveFeatureInconclusiveScenario' was skipped in the test run. - - + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 45 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet2_Fail_2() + + + + + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant2 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 129 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant2() + + + + + + + Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + + Assert.Inconclusive failed. One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") + at lambda_method(Closure , String , Object[] ) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestInconclusive(String message) + at TechTalk.SpecFlow.UnitTestProvider.MsTestRuntimeProvider.TestPending(String message) + at TechTalk.SpecFlow.ErrorHandling.ErrorProvider.ThrowPendingError(TestStatus testStatus, String message) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 117 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_SecondSet_Inconclusive() + + + + + + + Then the scenario will 'pass_2' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 60 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0.0s) +And I have entered 70 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) +And I have entered 130 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 260 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0.0s) + + + + + Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +When I have special characters for regexes in the value, for example a '[]' +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0.0s) +Then the scenario will 'PASS' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +When I have special characters for regexes in the value, for example a '{}' +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0.0s) +Then the scenario will 'PASS' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) + + + + + Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) + + + + + Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + + Test method Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant1 threw exception: +NFluent.FluentCheckException: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] + at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.ObjectCheckExtensions.<>c__DisplayClass1`1.<IsEqualTo>b__0() + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, Object expected) + at NFluent.ObjectCheckExtensions.IsEqualTo[T](ICheck`1 check, T expected) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at lambda_method(Closure , IContextManager , String ) + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at TechTalk.SpecFlow.TestRunner.CollectScenarioErrors() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\MsTest\ScenarioOutlines.feature:line 101 + at Pickles.TestHarness.MsTest.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant1() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Test 'IgnoredAddingTwoNumbers' was skipped in the test run.Test 'NotAutomatedAddingTwoNumbers' was skipped in the test run.Test 'NotAutomatedScenario1' was skipped in the test run.Test 'NotAutomatedScenario2' was skipped in the test run.Test 'NotAutomatedScenario3' was skipped in the test run.Test 'ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Inconclusive_1' was skipped in the test run.Test 'AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_1' was skipped in the test run.Test 'AndWeCanGoTotallyBonkersWithMultipleExampleSections__ExampleSet1_Inconclusive_2' was skipped in the test run.Test 'DealWithDuplicateValues_Variant2' was skipped in the test run.Test 'DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant1' was skipped in the test run.Test 'DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_SecondSet_Inconclusive' was skipped in the test run.Test 'DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant1' was skipped in the test run.Test 'FailingFeatureInconclusiveScenario' was skipped in the test run.Test 'InconclusiveFeatureInconclusiveScenario' was skipped in the test run. + + \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/WhenParsingXUnitResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/WhenParsingXUnitResultsFileWithIndividualResults.cs index 5df1ee78d..61c232682 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/WhenParsingXUnitResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/WhenParsingXUnitResultsFileWithIndividualResults.cs @@ -18,7 +18,6 @@ // // -------------------------------------------------------------------------------------------------------------------- - using NUnit.Framework; using PicklesDoc.Pickles.TestFrameworks.XUnit.XUnit1; @@ -33,7 +32,6 @@ public WhenParsingXUnitResultsFileWithIndividualResults() { } - [Test] public new void ThenCanReadIndividualResultsFromScenarioOutline_AllPass_ShouldBeTestResultPassed() { @@ -69,5 +67,29 @@ public WhenParsingXUnitResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } } \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/results-example-xunit.xml b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/results-example-xunit.xml index dc9bb99a1..25f7c527f 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/results-example-xunit.xml +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit1/results-example-xunit.xml @@ -1,50 +1,5 @@ -IgnoredGiven the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) -And I have entered 2.2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2,2) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 3.2 on the screen --> error: Input string was not in a correct format. -System.FormatException : Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) - at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) - at System.String.System.IConvertible.ToInt32(IFormatProvider provider) - at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) - at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext() - at System.Linq.Buffer`1..ctor(IEnumerable`1 source) - at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at Pickles.TestHarness.xunit.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\Addition.feature:line 34Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 60 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0,0s) -And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) -And I have entered 130 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 260 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0,1s) -Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 40 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0,0s) -And I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) -And I have entered 90 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 180 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0,0s) -Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given unimplemented step -> No matching step definition found for the step. Use the following code to create one: [Given(@"unimplemented step")] @@ -100,17 +55,62 @@ namespace MyNamespace at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.AdditionFeature.NotAutomatedAddingTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\Addition.feature:line 46Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) + at Pickles.TestHarness.xunit.AdditionFeature.NotAutomatedAddingTwoNumbers() in C:\Git\pickles\test-harness\xunit\Addition.feature:line 46IgnoredGiven the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Given I have entered 1 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) +And I have entered 2.2 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2.2) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 3.2 on the screen +-> error: Input string was not in a correct format. +System.FormatException : Input string was not in a correct format. at System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) + at System.Number.ParseInt32(String s, NumberStyles style, NumberFormatInfo info) + at System.String.System.IConvertible.ToInt32(IFormatProvider provider) + at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider) + at System.Linq.Enumerable.<SelectIterator>d__5`2.MoveNext() + at System.Linq.Buffer`1..ctor(IEnumerable`1 source) + at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.AdditionFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.AdditionFeature.FailToAddTwoNumbers() in C:\Git\pickles\test-harness\xunit\Addition.feature:line 34Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 60 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(60) (0.0s) +And I have entered 70 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) +And I have entered 130 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(130) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 260 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(260) (0.1s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 40 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(40) (0.0s) +And I have entered 50 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) +And I have entered 90 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(90) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 180 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(180) (0.0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 1 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(1) (0.0s) And I have entered 2 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0,0s) +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(2) (0.0s) When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) +-> done: AdditionSteps.WhenIPressAdd() (0.0s) Then the result should be 3 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0,0s) -Given the background step fails +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(3) (0.0s) +Given the background step fails -> error: The checked value is different from the expected one. The checked value: @@ -136,14 +136,14 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\FailingBackground.feature:line 19Given the background step fails + at Pickles.TestHarness.xunit.FailingBackgroundFeature.AddTwoNumbers() in C:\Git\pickles\test-harness\xunit\FailingBackground.feature:line 12Given the background step fails -> error: The checked value is different from the expected one. The checked value: @@ -169,14 +169,14 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\FailingBackground.feature:line 19Given the background step fails + at Pickles.TestHarness.xunit.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\FailingBackground.feature:line 19Given the background step fails -> error: The checked value is different from the expected one. The checked value: @@ -200,14 +200,14 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.AdditionSteps.GivenTheBackgroundStepFails() in C:\Git\pickles\test-harness\AutomationLayer\AdditionSteps.cs:line 25 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.FailingBackgroundFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.FailingBackgroundFeature.AddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\FailingBackground.feature:line 12Given unimplemented step + at Pickles.TestHarness.xunit.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\FailingBackground.feature:line 19Given unimplemented step -> No matching step definition found for the step. Use the following code to create one: [Given(@"unimplemented step")] public void GivenUnimplementedStep() @@ -270,7 +270,7 @@ namespace MyNamespace at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\NotAutomatedAtAll.feature:line 9Given unimplemented step + at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.NotAutomatedScenario2() in C:\Git\pickles\test-harness\xunit\NotAutomatedAtAll.feature:line 14Given unimplemented step -> No matching step definition found for the step. Use the following code to create one: [Given(@"unimplemented step")] public void GivenUnimplementedStep() @@ -333,7 +333,7 @@ namespace MyNamespace at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.NotAutomatedScenario2() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\NotAutomatedAtAll.feature:line 14Given unimplemented step + at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Git\pickles\test-harness\xunit\NotAutomatedAtAll.feature:line 9Given unimplemented step -> No matching step definition found for the step. Use the following code to create one: [Given(@"unimplemented step")] public void GivenUnimplementedStep() @@ -396,37 +396,218 @@ namespace MyNamespace at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.NotAutomatedScenario3() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\NotAutomatedAtAll.feature:line 19When I have parenthesis in the value, for example an 'This is a description (and more)' --> done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0,0s) -Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) + at Pickles.TestHarness.xunit.NotAutomatedAtAllFeature.NotAutomatedScenario3() in C:\Git\pickles\test-harness\xunit\NotAutomatedAtAll.feature:line 19Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) +Then the scenario will 'pass_2' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) +Then the scenario will 'inconclusive_1' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") +TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 21Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 91Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") +TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 91Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 91Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) +Then the scenario will 'pass_2' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) +Then the scenario will 'fail_1' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 34When I have parenthesis in the value, for example an 'This is a description (and more)' +-> done: ScenarioOutlineSteps.WhenIHaveParenthesisInTheValueForExampleAnOverlyDescriptiveField("This is a descrip...") (0.0s) +Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) Then the scenario will 'pass_3' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0,0s) -When I have backslashes in the value, for example a 'c:\Temp\' --> done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0,0s) -When I have a field with value 'Please enter a valid two letter country code (e.g. DE)!' --> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0,0s) -And I have a field with value 'This is just a very very very veery long error message!' --> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0,0s) -Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_3") (0.0s) +When I have backslashes in the value, for example a 'c:\Temp\' +-> done: ScenarioOutlineSteps.WhenIHaveBackslashesInTheValueForExampleAFilePath("c:\Temp\") (0.0s) +Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 118Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") +TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 118Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 102Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 102Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") +TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 102Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 102Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) -Then the scenario will 'inconclusive_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0.0s) +Then the scenario will 'inconclusive_1' -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45Then the scenario will 'inconclusive_2' + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45Then the scenario will 'inconclusive_2' -> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_2") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45Then the scenario will 'fail_1' + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45Then the scenario will 'fail_1' -> error: The checked value is different from the expected one. The checked value: @@ -440,14 +621,14 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45Then the scenario will 'fail_2' + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45Then the scenario will 'fail_2' -> error: The checked value is different from the expected one. The checked value: @@ -461,18 +642,22 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) -Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) -Then the scenario will 'fail_1' + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 45When I have a field with value 'Please enter a valid two letter country code (e.g. DE)!' +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("Please enter a va...") (0.0s) +And I have a field with value 'This is just a very very very veery long error message!' +-> done: ScenarioOutlineSteps.WhenIHaveAFieldWithValue("This is just a ve...") (0.0s) +Then the scenario will 'pass_1' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) +Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Then the scenario will 'fail' -> error: The checked value is different from the expected one. The checked value: @@ -486,100 +671,139 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\ScenarioOutlines.feature:line 34Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) -Then the scenario will 'pass_2' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_2") (0,0s) -Then the scenario will 'inconclusive_1' --> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 130Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 130Then the scenario will 'inconclusive' +-> pending: ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. - ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive_1") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) + ScenarioOutlineSteps.ThenTheScenarioWill("inconclusive") at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive(String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\ScenarioOutlines.feature:line 21Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 130Then the scenario will 'fail' +-> error: +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] +NFluent.FluentCheckException : +The checked value is different from the expected one. +The checked value: + [True] +The expected value: + [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) + at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.ScenarioOutlineSteps.ThenTheScenarioWill(String result) in C:\Git\pickles\test-harness\AutomationLayer\ScenarioOutlineSteps.cs:line 19 + at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit\ScenarioOutlines.feature:line 130Then the scenario will 'pass' +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass") (0.0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Given I have entered 50 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0.0s) +And I have entered 70 into the calculator +-> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0.0s) +When I press add +-> done: AdditionSteps.WhenIPressAdd() (0.0s) +Then the result should be 120 on the screen +-> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0.0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '**' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("**") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '++' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("++") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '.*' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex(".*") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '[]' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("[]") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '{}' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("{}") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '()' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("()") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) When I have special characters for regexes in the value, for example a '^.*(?<foo>BAR)\s[^0-9]{3,4}A+$' --> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?<foo>BAR)\s[...") (0,0s) +-> done: ScenarioOutlineSteps.WhenIHaveSpecialCharactersForRegexesInTheValueForExampleARegex("^.*(?<foo>BAR)\s[...") (0.0s) Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) -Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Given I have entered 50 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(50) (0,0s) -And I have entered 70 into the calculator --> done: AdditionSteps.GivenIHaveEnteredIntoTheCalculator(70) (0,0s) -When I press add --> done: AdditionSteps.WhenIPressAdd() (0,0s) -Then the result should be 120 on the screen --> done: AdditionSteps.ThenTheResultShouldBeOnTheScreen(120) (0,0s) -Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0.0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) -Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) -Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) -Then the scenario will 'PASS' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("PASS") (0,0s) -Given the calculator has clean memory --> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0,0s) +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) Then the scenario will 'pass_1' --> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0,0s) -Then inconclusive step --> pending: MinimalSteps.ThenInconclusiveStep() -TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. - MinimalSteps.ThenInconclusiveStep() at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) - at Pickles.TestHarness.xunit.MinimalFeatures.FailingFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.MinimalFeatures.FailingFeature.FailingFeatureInconclusiveScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\Minimal Features\Failing.feature:line 7Then failing step +-> done: ScenarioOutlineSteps.ThenTheScenarioWill("pass_1") (0.0s) +Given the calculator has clean memory +-> done: AdditionSteps.GivenTheCalculatorHasCleanMemory() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) +Then failing step -> error: The checked value is different from the expected one. The checked value: @@ -593,22 +817,25 @@ The checked value: The expected value: [False] at NFluent.Helpers.EqualityHelper.IsEqualTo(Object instance, Object expected) at NFluent.Extensibility.Checker`2.ExecuteCheck(Action action, String negatedExceptionMessage) - at AutomationLayer.MarkTestAs.Failing() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 - at AutomationLayer.MinimalFeatures.MinimalSteps.ThenFailingStep() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\AutomationLayer\MinimalFeatures\MinimalSteps.cs:line 24 + at AutomationLayer.MarkTestAs.Failing() in C:\Git\pickles\test-harness\AutomationLayer\MarkTestAs.cs:line 15 + at AutomationLayer.MinimalFeatures.MinimalSteps.ThenFailingStep() in C:\Git\pickles\test-harness\AutomationLayer\MinimalFeatures\MinimalSteps.cs:line 24 at TechTalk.SpecFlow.Bindings.BindingInvoker.InvokeBinding(IBinding binding, IContextManager contextManager, Object[] arguments, ITestTracer testTracer, TimeSpan& duration) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStepMatch(BindingMatch match, Object[] arguments) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() at Pickles.TestHarness.xunit.MinimalFeatures.FailingFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\Minimal Features\Failing.feature:line 10Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) -Then inconclusive step + at Pickles.TestHarness.xunit.MinimalFeatures.FailingFeature.FailingFeatureFailingScenario() in C:\Git\pickles\test-harness\xunit\Minimal Features\Failing.feature:line 10Then inconclusive step +-> pending: MinimalSteps.ThenInconclusiveStep() +TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. + MinimalSteps.ThenInconclusiveStep() at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) + at Pickles.TestHarness.xunit.MinimalFeatures.FailingFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit.MinimalFeatures.FailingFeature.FailingFeatureInconclusiveScenario() in C:\Git\pickles\test-harness\xunit\Minimal Features\Failing.feature:line 7Then inconclusive step -> pending: MinimalSteps.ThenInconclusiveStep() TechTalk.SpecFlow.SpecFlowException : Test pending: One or more step definitions are not implemented yet. MinimalSteps.ThenInconclusiveStep() at TechTalk.SpecFlow.UnitTestProvider.XUnitRuntimeProvider.TestPending(String message) at Pickles.TestHarness.xunit.MinimalFeatures.InconclusiveFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit.MinimalFeatures.InconclusiveFeature.InconclusiveFeatureInconclusiveScenario() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit\Minimal Features\Inconclusive.feature:line 7Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) -Then passing step --> done: MinimalSteps.ThenPassingStep() (0,0s) + at Pickles.TestHarness.xunit.MinimalFeatures.InconclusiveFeature.InconclusiveFeatureInconclusiveScenario() in C:\Git\pickles\test-harness\xunit\Minimal Features\Inconclusive.feature:line 7Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) +Then passing step +-> done: MinimalSteps.ThenPassingStep() (0.0s) \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/WhenParsingXUnitResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/WhenParsingXUnitResultsFileWithIndividualResults.cs index 9e5637148..2fff604de 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/WhenParsingXUnitResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/WhenParsingXUnitResultsFileWithIndividualResults.cs @@ -18,8 +18,6 @@ // // -------------------------------------------------------------------------------------------------------------------- - - using NUnit.Framework; using PicklesDoc.Pickles.TestFrameworks.XUnit.XUnit2; @@ -34,7 +32,6 @@ public WhenParsingXUnitResultsFileWithIndividualResults() { } - [Test] public new void ThenCanReadIndividualResultsFromScenarioOutline_AllPass_ShouldBeTestResultPassed() { @@ -70,5 +67,29 @@ public WhenParsingXUnitResultsFileWithIndividualResults() { base.ThenCanReadExamplesWithLongExampleValues(); } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_ExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExamplesWithDuplicateValues_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamples_ShouldMatchExamples(); + } + + [Test] + public new void ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples() + { + base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleNamedExamplesWithDuplicateValues_ShouldMatchExamples(); + } } } \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/results-example-xunit2.xml b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/results-example-xunit2.xml index bb5d6ea0a..b3d141f53 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/results-example-xunit2.xml +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/XUnit/XUnit2/results-example-xunit2.xml @@ -1,81 +1,98 @@  - + - - + + - - + + + + + + - + - - + + + + + + - + - - + + + at Pickles.TestHarness.xunit2.NotAutomatedAtAllFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit2.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Git\pickles\test-harness\xunit2\NotAutomatedAtAll.feature:line 9]]> - + + + - + - + - + - + + + + - + - + - - - d__5`2.MoveNext() - at System.Linq.Buffer`1..ctor(IEnumerable`1 source) - at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) - at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() - at Pickles.TestHarness.xunit2.AdditionFeature.ScenarioCleanup() - at Pickles.TestHarness.xunit2.AdditionFeature.FailToAddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit2\Addition.feature:line 34]]> + + + - - + + - - + + - - - + - - + + @@ -85,10 +102,10 @@ at Pickles.TestHarness.xunit2.NotAutomatedAtAllFeature.NotAutomatedScenario2() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit2\NotAutomatedAtAll.feature:line 14]]> - + - - + + @@ -98,10 +115,10 @@ at Pickles.TestHarness.xunit2.NotAutomatedAtAllFeature.NotAutomatedScenario3() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit2\NotAutomatedAtAll.feature:line 19]]> - + - - + + @@ -111,12 +128,10 @@ at Pickles.TestHarness.xunit2.NotAutomatedAtAllFeature.NotAutomatedScenario1() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit2\NotAutomatedAtAll.feature:line 9]]> - - - + - - + + @@ -132,29 +147,29 @@ at Pickles.TestHarness.xunit2.FailingBackgroundFeature.AddingSeveralNumbers(String firstNumber, String secondNumber, String thirdNumber, String result, String[] exampleTags) in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit2\FailingBackground.feature:line 19]]> - + - - + + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.ThisIsAScenarioOutlineWhereOneScenarioFails(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 34]]> - + - - + + @@ -170,312 +185,616 @@ at Pickles.TestHarness.xunit2.FailingBackgroundFeature.AddTwoNumbers() in C:\Dev\Code\GitHub\DirkRombauts\pickles\test-harness\xunit2\FailingBackground.feature:line 12]]> - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - + + + + + + - + - - + + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.AndWeCanGoTotallyBonkersWithMultipleExampleSections_(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 45]]> - + - - + + - - - + + + - - - + - - + + - + - - + + + + + + + + + + + + - + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.DealWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 91]]> - - - + - + - + - + + + + + - + - + - + - + - + - + - + - + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 130]]> - + - + - + - + + + + + - + - + + + + + - + - + - - - + + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 130]]> - + - + - + - + - + - + - - - + + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 102]]> - + - + + + + + + + + + + + + + + + + + - + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 102]]> - + - + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.DealWithMultipleExampleSectionsWithDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 102]]> - + - + + + + + + + + + + + + + + at Pickles.TestHarness.xunit2.ScenarioOutlinesFeature.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(String result, String[] exampleTags) in C:\Git\pickles\test-harness\xunit2\ScenarioOutlines.feature:line 118]]> - + - + + + + + - + + + - - + + - - + + - + - + - + - + - + - + - + - + - + - + - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + d__5`2.MoveNext() + at System.Linq.Buffer`1..ctor(IEnumerable`1 source) + at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.GetExecuteArguments(BindingMatch match) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.ExecuteStep(StepInstance stepInstance) + at TechTalk.SpecFlow.Infrastructure.TestExecutionEngine.OnAfterLastStep() + at Pickles.TestHarness.xunit2.AdditionFeature.ScenarioCleanup() + at Pickles.TestHarness.xunit2.AdditionFeature.FailToAddTwoNumbers() in C:\Git\pickles\test-harness\xunit2\Addition.feature:line 34]]> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestElementExtensions.cs b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestElementExtensions.cs index 01d158868..549fe60d0 100644 --- a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestElementExtensions.cs +++ b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestElementExtensions.cs @@ -33,22 +33,26 @@ internal static class VsTestElementExtensions private static readonly XNamespace Ns = @"http://microsoft.com/schemas/VisualStudio/TeamTest/2010"; - internal static bool BelongsToFeature(this XElement parentElement, string featureTitle) + internal static string Feature(this XElement parentElement) { //// //// //// - var propertiesElement = parentElement.Element(Ns + "TestMethod"); + var className = parentElement + .Element(Ns + "TestMethod") + ?.Attributes("className") + ?.FirstOrDefault() + ?.Value; - if (propertiesElement == null) + if (className == null || !className.EndsWith("Feature", StringComparison.OrdinalIgnoreCase)) { - return false; + return null; } - var attributes = propertiesElement.Attributes("className"); - bool b = attributes.Any(a => a.Value.ToUpperInvariant().Contains(TransformName(featureTitle) + "FEATURE")); - return b; + var feature = className.Substring(0, className.LastIndexOf("Feature", StringComparison.OrdinalIgnoreCase)).Split('.').Last(); + + return feature; } internal static string Name(this XElement scenario) diff --git a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs index 8f873685f..6a09f0650 100644 --- a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs +++ b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs @@ -18,30 +18,173 @@ // // -------------------------------------------------------------------------------------------------------------------- +using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; using System.Xml.Linq; - using PicklesDoc.Pickles.ObjectModel; namespace PicklesDoc.Pickles.TestFrameworks.VsTest { public class VsTestScenarioOutlineExampleMatcher : IScenarioOutlineExampleMatcher { - private static readonly Regex VariantRegex = new Regex(@"(.*)_Variant([\d*])", RegexOptions.Compiled | RegexOptions.IgnoreCase); - private const int VariantNumberGroup = 2; + private static readonly Regex VariantWithExampleGroupRegex = new Regex(@"(?:[\S]+)_ExampleSet([\d]+)_Variant([\d]+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex VariantRegex = new Regex(@"(?:[\S]+)_Variant([\d]+)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private static readonly Regex ExampleGroupRegex = new Regex(@"(?:[^_\s]+)_([^_\s]+)_([\S]*)$", RegexOptions.Compiled | RegexOptions.IgnoreCase); public bool IsMatch(ScenarioOutline scenarioOutline, string[] exampleValues, object scenarioElement) { var element = (XElement)scenarioElement; + var elementName = element.Name().ToUpperInvariant(); + + bool isMatch; + + if (IsVariantWithExampleGroupMatch(scenarioOutline, exampleValues, elementName, out isMatch)) + { + return isMatch; + } + + if (IsVariantWithoutExampleGroupMatch(scenarioOutline, exampleValues, elementName, out isMatch)) + { + return isMatch; + } + + if (IsExampleGroupMatch(scenarioOutline, exampleValues, elementName, out isMatch)) + { + return isMatch; + } + + var matchValue = Normalize(exampleValues[0]); + + isMatch = element.Name().ToUpperInvariant() + .EndsWith(matchValue); + + return isMatch; + } + + private bool IsVariantWithExampleGroupMatch(ScenarioOutline scenarioOutline, string[] exampleValues, string elementName, out bool isMatch) + { + const int ExampleGroup = 1; + const int VariantNumberGroup = 2; + + var match = VariantWithExampleGroupRegex.Match(elementName); + + if (match.Success) + { + int exampleGroupNumber = int.Parse(match.Groups[ExampleGroup].Value); - var matchValue = exampleValues[0] + var exampleSet = scenarioOutline.Examples?[exampleGroupNumber]; + if (exampleSet != null) + { + int variantNumber; + if (int.TryParse(match.Groups[VariantNumberGroup].Value, out variantNumber)) + { + var examples = exampleSet.TableArgument.DataRows; + var example = examples[variantNumber]; + + isMatch = example.Cells.SequenceEqual(exampleValues); + + return true; + } + } + } + + isMatch = false; + + return false; + } + + private bool IsVariantWithoutExampleGroupMatch(ScenarioOutline scenarioOutline, string[] exampleValues, string elementName, out bool isMatch) + { + const int VariantNumberGroup = 1; + + var match = VariantRegex.Match(elementName); + if (match.Success) + { + int variantNumber; + if (int.TryParse(match.Groups[VariantNumberGroup].Value, out variantNumber)) + { + List examples = null; + if (scenarioOutline.Examples?.Count == 1) + { + examples = scenarioOutline.Examples[0].TableArgument.DataRows; + } + else if (scenarioOutline.Examples?.Any(x => x.Name == string.Empty) == true) + { + examples = scenarioOutline.Examples?.First(x => x.Name == string.Empty).TableArgument.DataRows; + } + else + { + isMatch = false; + return false; + } + + var example = examples[variantNumber]; + + isMatch = example.Cells.SequenceEqual(exampleValues); + + return true; + } + } + + isMatch = false; + return false; + } + + private bool IsExampleGroupMatch(ScenarioOutline scenarioOutline, string[] exampleValues, string elementName, out bool isMatch) + { + const int ExampleGroupNameGroup = 1; + const int MatchValueGroup = 2; + const int VariantNumberGroup = 1; + + var match = ExampleGroupRegex.Match(elementName); + if (match.Success) + { + string exampleGroupName = match.Groups[ExampleGroupNameGroup].Value; + + var exampleSet = scenarioOutline.Examples?.FirstOrDefault(x => Normalize(x.Name) == exampleGroupName); + + var variantMatch = VariantRegex.Match(elementName); + if (variantMatch.Success) + { + int variantNumber; + if (int.TryParse(variantMatch.Groups[VariantNumberGroup].Value, out variantNumber)) + { + isMatch = exampleSet.TableArgument.DataRows[variantNumber].Cells.SequenceEqual(exampleValues); + return true; + } + + isMatch = false; + return false; + } + + if (exampleSet != null) + { + var matchValue = match.Groups[MatchValueGroup].Value; + var examples = exampleSet.TableArgument.DataRows; + + var example = examples.Single(x => Normalize(x.Cells[0]) == matchValue); + isMatch = example.Cells.SequenceEqual(exampleValues); + + return true; + } + } + + isMatch = false; + return false; + } + + private string Normalize(string value) + { + return value? .Replace(" ", string.Empty) .Replace(":", string.Empty) .Replace("\\", string.Empty) .Replace("(", string.Empty) .Replace(")", string.Empty) .Replace(".", "_") + .Replace("-", "_") + .Replace(",", string.Empty) .Replace("!", string.Empty) .Replace("&", string.Empty) .ToUpperInvariant() @@ -55,27 +198,6 @@ public bool IsMatch(ScenarioOutline scenarioOutline, string[] exampleValues, obj .Replace("Æ", "AE") .Replace('Ø', 'O') .Replace('Å', 'A'); - - var variantMatch = VariantRegex.Match(element.Name().ToUpperInvariant()); - if (variantMatch.Success) - { - int variantNumber; - if (int.TryParse(variantMatch.Groups[VariantNumberGroup].Value, out variantNumber)) - { - if (scenarioOutline.Examples?.Count > 0) - { - var allExamples = scenarioOutline.Examples.SelectMany(x => x.TableArgument.DataRows); - var example = allExamples.ElementAt(variantNumber); - - return example.Cells.SequenceEqual(exampleValues); - } - } - } - - var isMatch = element.Name().ToUpperInvariant() - .EndsWith(matchValue); - - return isMatch; } } -} +} \ No newline at end of file diff --git a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestSingleResults.cs b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestSingleResults.cs index 801f1e811..2d3e52bc7 100644 --- a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestSingleResults.cs +++ b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestSingleResults.cs @@ -41,9 +41,30 @@ public class VsTestSingleResults : SingleTestRunBase { private readonly XDocument resultsDocument; + private readonly ILookup featureScenarios; + + private readonly IDictionary executionOutcomes; + public VsTestSingleResults(XDocument resultsDocument) { this.resultsDocument = resultsDocument; + + this.featureScenarios = this.resultsDocument.AllScenarios() + .Select(x => new + { + Feature = x.Feature(), + Scenario = x + }) + .Where(x => x.Feature != null) + .ToLookup( + x => x.Feature, + x => x.Scenario, + StringComparer.OrdinalIgnoreCase); + + this.executionOutcomes = this.resultsDocument.AllExecutionResults() + .ToDictionary( + x => x.ExecutionIdAttribute(), + x => x.Outcome()); } public override TestResult GetFeatureResult(Feature feature) @@ -65,11 +86,7 @@ public override TestResult GetFeatureResult(Feature feature) /// that belong to the specified feature. private IEnumerable GetScenariosForFeature(Feature feature) { - var scenarios = from scenario in this.resultsDocument.AllScenarios() - where scenario.BelongsToFeature(feature.Name) - select scenario; - - return scenarios; + return this.featureScenarios[SpecFlowNameMapping.Build(feature.Name)]; } private TestResult GetExecutionResult(IEnumerable featureExecutionIds) @@ -80,12 +97,8 @@ private TestResult GetExecutionResult(IEnumerable featureExecutionIds) private TestResult GetExecutionResult(Guid scenarioExecutionId) { - var query = - this.resultsDocument.AllExecutionResults() - .Where(er => er.ExecutionIdAttribute() == scenarioExecutionId) - .Select(sr => sr.Outcome()); - - var result = query.FirstOrDefault(); + TestResult result; + this.executionOutcomes.TryGetValue(scenarioExecutionId, out result); return result; } diff --git a/src/Pickles/Pickles.UserInterface/NLog.xsd b/src/Pickles/Pickles.UserInterface/NLog.xsd index 0a1daf804..f2eed48d6 100644 --- a/src/Pickles/Pickles.UserInterface/NLog.xsd +++ b/src/Pickles/Pickles.UserInterface/NLog.xsd @@ -1369,6 +1369,21 @@ Delay in milliseconds to wait before attempting to write to the file again. + + + Value indicationg whether file creation calls should be synchronized by a system global mutex. + + + + + Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write + + + + + Delay in milliseconds to wait before attempting to write to the file again. + + Indicates whether to replace file contents on each write instead of appending log message at the end. diff --git a/src/Pickles/Pickles.sln b/src/Pickles/Pickles.sln index 76a92668b..bb9109671 100644 --- a/src/Pickles/Pickles.sln +++ b/src/Pickles/Pickles.sln @@ -107,6 +107,12 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Build Scripts", "Build Scri EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pickles.UserInterface.UnitTests", "Pickles.UserInterface.UnitTests\Pickles.UserInterface.UnitTests.csproj", "{BF20B6BD-8712-4102-A05D-1CCB37BD6CF0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pickles.DocumentationBuilders.Markdown.UnitTests", "Pickles.DocumentationBuilders.Markdown.UnitTests\Pickles.DocumentationBuilders.Markdown.UnitTests.csproj", "{AC207FEA-CE9B-4C03-8A29-659E95C17BEE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pickles.DocumentationBuilders.Markdown.AcceptanceTests", "Pickles.DocumentationBuilders.Markdown.AcceptanceTests\Pickles.DocumentationBuilders.Markdown.AcceptanceTests.csproj", "{81553C19-A9BB-4945-AE6A-A9616EAAA52C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Pickles.DocumentationBuilders.Markdown", "Pickles.DocumentationBuilders.Markdown\Pickles.DocumentationBuilders.Markdown.csproj", "{732039F2-CAD8-44BC-9647-EC0ACAF59632}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -209,6 +215,18 @@ Global {BF20B6BD-8712-4102-A05D-1CCB37BD6CF0}.Debug|Any CPU.Build.0 = Debug|Any CPU {BF20B6BD-8712-4102-A05D-1CCB37BD6CF0}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF20B6BD-8712-4102-A05D-1CCB37BD6CF0}.Release|Any CPU.Build.0 = Release|Any CPU + {AC207FEA-CE9B-4C03-8A29-659E95C17BEE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC207FEA-CE9B-4C03-8A29-659E95C17BEE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC207FEA-CE9B-4C03-8A29-659E95C17BEE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC207FEA-CE9B-4C03-8A29-659E95C17BEE}.Release|Any CPU.Build.0 = Release|Any CPU + {81553C19-A9BB-4945-AE6A-A9616EAAA52C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {81553C19-A9BB-4945-AE6A-A9616EAAA52C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {81553C19-A9BB-4945-AE6A-A9616EAAA52C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {81553C19-A9BB-4945-AE6A-A9616EAAA52C}.Release|Any CPU.Build.0 = Release|Any CPU + {732039F2-CAD8-44BC-9647-EC0ACAF59632}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {732039F2-CAD8-44BC-9647-EC0ACAF59632}.Debug|Any CPU.Build.0 = Debug|Any CPU + {732039F2-CAD8-44BC-9647-EC0ACAF59632}.Release|Any CPU.ActiveCfg = Release|Any CPU + {732039F2-CAD8-44BC-9647-EC0ACAF59632}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Pickles/Pickles/Pickles.csproj b/src/Pickles/Pickles/Pickles.csproj index d6ff47f7e..8d98a6eca 100644 --- a/src/Pickles/Pickles/Pickles.csproj +++ b/src/Pickles/Pickles/Pickles.csproj @@ -157,6 +157,10 @@ {836020D1-A309-4367-9654-EBB7C3F60D97} Pickles.DocumentationBuilders.Json + + {732039f2-cad8-44bc-9647-ec0acaf59632} + Pickles.DocumentationBuilders.Markdown + {BDD5290E-BF98-436B-ADEE-A7479E22A875} Pickles.DocumentationBuilders.Word diff --git a/src/Pickles/Pickles/PicklesModule.cs b/src/Pickles/Pickles/PicklesModule.cs index 965b5e773..433126ee1 100644 --- a/src/Pickles/Pickles/PicklesModule.cs +++ b/src/Pickles/Pickles/PicklesModule.cs @@ -26,6 +26,7 @@ using PicklesDoc.Pickles.DocumentationBuilders.Excel; using PicklesDoc.Pickles.DocumentationBuilders.Html; using PicklesDoc.Pickles.DocumentationBuilders.Json; +using PicklesDoc.Pickles.DocumentationBuilders.Markdown; using PicklesDoc.Pickles.DocumentationBuilders.Word; using PicklesDoc.Pickles.FeatureToggles; using PicklesDoc.Pickles.ObjectModel; @@ -51,6 +52,7 @@ protected override void Load(ContainerBuilder builder) builder.RegisterType().SingleInstance(); builder.RegisterType().SingleInstance(); builder.RegisterType().SingleInstance(); + builder.RegisterType().SingleInstance(); builder.RegisterModule(); builder.RegisterModule(); @@ -75,6 +77,8 @@ protected override void Load(ContainerBuilder builder) return c.Resolve(); case DocumentationFormat.Cucumber: return c.Resolve(); + case DocumentationFormat.Markdown: + return c.Resolve(); default: return c.Resolve(); } diff --git a/src/Pickles/VersionInfo.cs b/src/Pickles/VersionInfo.cs index 3bf0059c1..56d58d06f 100644 --- a/src/Pickles/VersionInfo.cs +++ b/src/Pickles/VersionInfo.cs @@ -8,8 +8,8 @@ [assembly: AssemblyTrademarkAttribute("")] [assembly: AssemblyCultureAttribute("")] [assembly: ComVisibleAttribute(false)] -[assembly: AssemblyVersionAttribute("2.20.1")] -[assembly: AssemblyFileVersionAttribute("2.20.1")] +[assembly: AssemblyVersionAttribute("2.21.0")] +[assembly: AssemblyFileVersionAttribute("2.21.0")] namespace System { internal static class AssemblyVersionInformation { internal const System.String AssemblyProduct = "Pickles"; @@ -18,7 +18,7 @@ internal static class AssemblyVersionInformation { internal const System.String AssemblyTrademark = ""; internal const System.String AssemblyCulture = ""; internal const System.Boolean ComVisible = false; - internal const System.String AssemblyVersion = "2.20.1"; - internal const System.String AssemblyFileVersion = "2.20.1"; + internal const System.String AssemblyVersion = "2.21.0"; + internal const System.String AssemblyFileVersion = "2.21.0"; } } diff --git a/test-harness/Cucumber/features/ScenarioOutlines.feature b/test-harness/Cucumber/features/ScenarioOutlines.feature index 68462e674..978703172 100644 --- a/test-harness/Cucumber/features/ScenarioOutlines.feature +++ b/test-harness/Cucumber/features/ScenarioOutlines.feature @@ -78,11 +78,66 @@ Scenario Outline: Deal correctly with parenthesis in the examples | This is a description (and more) | Scenario Outline: Deal correctly with overlong example values - + When I have a field with value '' And I have a field with value '' Then the scenario will 'pass_1' - + Examples: | value1 | value2 | - | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | \ No newline at end of file + | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | + + Scenario Outline: Deal with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | inconclusive | + | pass | + | fail | + + Scenario Outline: Deal with multiple example sections with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | pass | + + Examples: + | result | + | fail | + | inconclusive | + | fail | + | pass | + + Scenario Outline: Deal with multiple named example sections without duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + + Examples: Second set + | result | + | inconclusive | + + Scenario Outline: Deal with multiple named example sections with duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + | pass | + + Examples: Second set + | result | + | fail | + | inconclusive | + | fail | + | pass | diff --git a/test-harness/Cucumber/features/step_definitions/ScenarioOutlineSteps.rb b/test-harness/Cucumber/features/step_definitions/ScenarioOutlineSteps.rb index 37675d8ae..36ccc28d8 100644 --- a/test-harness/Cucumber/features/step_definitions/ScenarioOutlineSteps.rb +++ b/test-harness/Cucumber/features/step_definitions/ScenarioOutlineSteps.rb @@ -10,6 +10,18 @@ expect("true").to eql("false") end +Then(/^the scenario will 'pass'$/) do + # Nothing to be done here +end + +Then(/^the scenario will 'inconclusive'$/) do + pending # We want pending here +end + +Then(/^the scenario will 'fail'$/) do + expect("true").to eql("false") +end + When(/^I have backslashes in the value, for example a 'c:\\Temp\\'$/) do # Nothing to be done here end @@ -24,4 +36,4 @@ When(/^I have a field with value '(.*)'$/) do |arg1| #Nothing to be done here -end \ No newline at end of file +end diff --git a/test-harness/CucumberJS/features/ScenarioOutlines.feature b/test-harness/CucumberJS/features/ScenarioOutlines.feature index 68462e674..978703172 100644 --- a/test-harness/CucumberJS/features/ScenarioOutlines.feature +++ b/test-harness/CucumberJS/features/ScenarioOutlines.feature @@ -78,11 +78,66 @@ Scenario Outline: Deal correctly with parenthesis in the examples | This is a description (and more) | Scenario Outline: Deal correctly with overlong example values - + When I have a field with value '' And I have a field with value '' Then the scenario will 'pass_1' - + Examples: | value1 | value2 | - | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | \ No newline at end of file + | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | + + Scenario Outline: Deal with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | inconclusive | + | pass | + | fail | + + Scenario Outline: Deal with multiple example sections with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | pass | + + Examples: + | result | + | fail | + | inconclusive | + | fail | + | pass | + + Scenario Outline: Deal with multiple named example sections without duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + + Examples: Second set + | result | + | inconclusive | + + Scenario Outline: Deal with multiple named example sections with duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + | pass | + + Examples: Second set + | result | + | fail | + | inconclusive | + | fail | + | pass | diff --git a/test-harness/CucumberJS/features/stepdefinitions/ScenarioOutlineSteps.js b/test-harness/CucumberJS/features/stepdefinitions/ScenarioOutlineSteps.js index 994bee850..952de564b 100644 --- a/test-harness/CucumberJS/features/stepdefinitions/ScenarioOutlineSteps.js +++ b/test-harness/CucumberJS/features/stepdefinitions/ScenarioOutlineSteps.js @@ -20,6 +20,21 @@ defineSupportCode(function({Then, When}) { callback(); }); + Then(/^the scenario will 'pass'$/, function (callback) { + // nothing to be done here + callback(); + }); + + Then(/^the scenario will 'inconclusive'$/, function (callback) { + // we want pending here + callback(null, 'pending'); + }); + + Then(/^the scenario will 'fail'$/, function (callback) { + assert.equal("true", "false"); + callback(); + }); + When(/^I have backslashes in the value, for example a '(.*)'$/, function (filePath, callback) { // nothing to be done here callback(); diff --git a/test-harness/MsTest/ScenarioOutlines.feature b/test-harness/MsTest/ScenarioOutlines.feature index 00efa6fc5..83b9ba106 100644 --- a/test-harness/MsTest/ScenarioOutlines.feature +++ b/test-harness/MsTest/ScenarioOutlines.feature @@ -59,7 +59,6 @@ Scenario Outline: And we can go totally bonkers with multiple example sections. | fail_1 | | fail_2 | - Scenario Outline: Deal correctly with backslashes in the examples When I have backslashes in the value, for example a '' @@ -85,4 +84,59 @@ Scenario Outline: Deal correctly with overlong example values Examples: | value1 | value2 | - | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | \ No newline at end of file + | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | + +Scenario Outline: Deal with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | inconclusive | + | pass | + | fail | + +Scenario Outline: Deal with multiple example sections with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | pass | + + Examples: + | result | + | fail | + | inconclusive | + | fail | + | pass | + +Scenario Outline: Deal with multiple named example sections without duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + + Examples: Second set + | result | + | inconclusive | + +Scenario Outline: Deal with multiple named example sections with duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + | pass | + + Examples: Second set + | result | + | fail | + | inconclusive | + | fail | + | pass | \ No newline at end of file diff --git a/test-harness/MsTest/ScenarioOutlines.feature.cs b/test-harness/MsTest/ScenarioOutlines.feature.cs index 843eb79b8..7d25ba657 100644 --- a/test-harness/MsTest/ScenarioOutlines.feature.cs +++ b/test-harness/MsTest/ScenarioOutlines.feature.cs @@ -265,9 +265,9 @@ public virtual void AndWeCanGoTotallyBonkersWithMultipleExampleSections__Example public virtual void DealCorrectlyWithBackslashesInTheExamples(string filePath, string[] exampleTags) { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal correctly with backslashes in the examples", exampleTags); -#line 63 +#line 62 this.ScenarioSetup(scenarioInfo); -#line 65 +#line 64 testRunner.When(string.Format("I have backslashes in the value, for example a \'{0}\'", filePath), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden this.ScenarioCleanup(); @@ -286,9 +286,9 @@ public virtual void DealCorrectlyWithBackslashesInTheExamples_CTemp() public virtual void DealCorrectlyWithParenthesisInTheExamples(string overlyDescriptiveField, string[] exampleTags) { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal correctly with parenthesis in the examples", exampleTags); -#line 72 +#line 71 this.ScenarioSetup(scenarioInfo); -#line 74 +#line 73 testRunner.When(string.Format("I have parenthesis in the value, for example an \'{0}\'", overlyDescriptiveField), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); #line hidden this.ScenarioCleanup(); @@ -307,13 +307,13 @@ public virtual void DealCorrectlyWithParenthesisInTheExamples_ThisIsADescription public virtual void DealCorrectlyWithOverlongExampleValues(string value1, string value2, string[] exampleTags) { TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal correctly with overlong example values", exampleTags); -#line 80 +#line 79 this.ScenarioSetup(scenarioInfo); -#line 82 +#line 81 testRunner.When(string.Format("I have a field with value \'{0}\'", value1), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "When "); -#line 83 +#line 82 testRunner.And(string.Format("I have a field with value \'{0}\'", value2), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); -#line 84 +#line 83 testRunner.Then("the scenario will \'pass_1\'", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden this.ScenarioCleanup(); @@ -329,6 +329,280 @@ public virtual void DealCorrectlyWithOverlongExampleValues_PleaseEnterAValidTwoL { this.DealCorrectlyWithOverlongExampleValues("Please enter a valid two letter country code (e.g. DE)!", "This is just a very very very veery long error message!", ((string[])(null))); } + + public virtual void DealWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with duplicate values", exampleTags); +#line 89 +this.ScenarioSetup(scenarioInfo); +#line 90 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 0")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithDuplicateValues_Variant0() + { + this.DealWithDuplicateValues("pass", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 1")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithDuplicateValues_Variant1() + { + this.DealWithDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 2")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "inconclusive")] + public virtual void DealWithDuplicateValues_Variant2() + { + this.DealWithDuplicateValues("inconclusive", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 3")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithDuplicateValues_Variant3() + { + this.DealWithDuplicateValues("pass", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 4")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithDuplicateValues_Variant4() + { + this.DealWithDuplicateValues("fail", ((string[])(null))); + } + + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple example sections with duplicate values", exampleTags); +#line 100 +this.ScenarioSetup(scenarioInfo); +#line 101 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 0")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant0() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 1")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant1() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 2")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant2() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 0")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant0() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 1")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "inconclusive")] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant1() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("inconclusive", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 2")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant2() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 3")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant3() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections without duplicate values", exampleTags); +#line 116 +this.ScenarioSetup(scenarioInfo); +#line 117 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections without duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "First set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "pass")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Pass() + { + this.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues("pass", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections without duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "First set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "fail")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Fail() + { + this.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections without duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "Second set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "inconclusive")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "inconclusive")] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_SecondSet_Inconclusive() + { + this.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues("inconclusive", ((string[])(null))); + } + + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections with duplicate values", exampleTags); +#line 128 +this.ScenarioSetup(scenarioInfo); +#line 129 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "First set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 0")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant0() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "First set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 1")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant1() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "First set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 2")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant2() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "Second set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 0")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant0() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "Second set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 1")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "inconclusive")] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant1() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("inconclusive", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "Second set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 2")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "fail")] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant2() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [Microsoft.VisualStudio.TestTools.UnitTesting.TestMethodAttribute()] + [Microsoft.VisualStudio.TestTools.UnitTesting.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("FeatureTitle", "Scenario Outlines")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("ExampleSetName", "Second set")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("VariantName", "Variant 3")] + [Microsoft.VisualStudio.TestTools.UnitTesting.TestPropertyAttribute("Parameter:result", "pass")] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant3() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } } } #pragma warning restore diff --git a/test-harness/SpecRun/ScenarioOutlines.feature b/test-harness/SpecRun/ScenarioOutlines.feature index a2efda16a..67d3c9e8c 100644 --- a/test-harness/SpecRun/ScenarioOutlines.feature +++ b/test-harness/SpecRun/ScenarioOutlines.feature @@ -84,4 +84,59 @@ Scenario Outline: Deal correctly with parenthesis in the examples Examples: | value1 | value2 | - | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | \ No newline at end of file + | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | + +Scenario Outline: Deal with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | inconclusive | + | pass | + | fail | + +Scenario Outline: Deal with multiple example sections with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | pass | + + Examples: + | result | + | fail | + | inconclusive | + | fail | + | pass | + +Scenario Outline: Deal with multiple named example sections without duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + + Examples: Second set + | result | + | inconclusive | + +Scenario Outline: Deal with multiple named example sections with duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + | pass | + + Examples: Second set + | result | + | fail | + | inconclusive | + | fail | + | pass | \ No newline at end of file diff --git a/test-harness/SpecRun/ScenarioOutlines.feature.cs b/test-harness/SpecRun/ScenarioOutlines.feature.cs index 15ee1c0b9..6dc82d378 100644 --- a/test-harness/SpecRun/ScenarioOutlines.feature.cs +++ b/test-harness/SpecRun/ScenarioOutlines.feature.cs @@ -73,19 +73,19 @@ public virtual void ThisIsAScenarioOutlineWhereAllScenariosPass(string result, s this.ScenarioCleanup(); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where all scenarios pass, pass_1", Description="\nThis means the entire scenario outline passes.", SourceLine=11)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where all scenarios pass, pass_1", Description="\r\nThis means the entire scenario outline passes.", SourceLine=11)] public virtual void ThisIsAScenarioOutlineWhereAllScenariosPass_Pass_1() { this.ThisIsAScenarioOutlineWhereAllScenariosPass("pass_1", ((string[])(null))); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where all scenarios pass, pass_2", Description="\nThis means the entire scenario outline passes.", SourceLine=12)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where all scenarios pass, pass_2", Description="\r\nThis means the entire scenario outline passes.", SourceLine=12)] public virtual void ThisIsAScenarioOutlineWhereAllScenariosPass_Pass_2() { this.ThisIsAScenarioOutlineWhereAllScenariosPass("pass_2", ((string[])(null))); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where all scenarios pass, pass_3", Description="\nThis means the entire scenario outline passes.", SourceLine=13)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where all scenarios pass, pass_3", Description="\r\nThis means the entire scenario outline passes.", SourceLine=13)] public virtual void ThisIsAScenarioOutlineWhereAllScenariosPass_Pass_3() { this.ThisIsAScenarioOutlineWhereAllScenariosPass("pass_3", ((string[])(null))); @@ -102,19 +102,19 @@ public virtual void ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive(string this.ScenarioCleanup(); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario is inconclusive, pass_1", Description="\nThis means the entire scenario outline is inconclusive.", SourceLine=24)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario is inconclusive, pass_1", Description="\r\nThis means the entire scenario outline is inconclusive.", SourceLine=24)] public virtual void ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Pass_1() { this.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive("pass_1", ((string[])(null))); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario is inconclusive, pass_2", Description="\nThis means the entire scenario outline is inconclusive.", SourceLine=25)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario is inconclusive, pass_2", Description="\r\nThis means the entire scenario outline is inconclusive.", SourceLine=25)] public virtual void ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Pass_2() { this.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive("pass_2", ((string[])(null))); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario is inconclusive, inconclusive_1", Description="\nThis means the entire scenario outline is inconclusive.", SourceLine=26)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario is inconclusive, inconclusive_1", Description="\r\nThis means the entire scenario outline is inconclusive.", SourceLine=26)] public virtual void ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive_Inconclusive_1() { this.ThisIsAScenarioOutlineWhereOneScenarioIsInconclusive("inconclusive_1", ((string[])(null))); @@ -131,19 +131,19 @@ public virtual void ThisIsAScenarioOutlineWhereOneScenarioFails(string result, s this.ScenarioCleanup(); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario fails, pass_1", Description="\nThis means the entire scenario outline fails.", SourceLine=37)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario fails, pass_1", Description="\r\nThis means the entire scenario outline fails.", SourceLine=37)] public virtual void ThisIsAScenarioOutlineWhereOneScenarioFails_Pass_1() { this.ThisIsAScenarioOutlineWhereOneScenarioFails("pass_1", ((string[])(null))); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario fails, pass_2", Description="\nThis means the entire scenario outline fails.", SourceLine=38)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario fails, pass_2", Description="\r\nThis means the entire scenario outline fails.", SourceLine=38)] public virtual void ThisIsAScenarioOutlineWhereOneScenarioFails_Pass_2() { this.ThisIsAScenarioOutlineWhereOneScenarioFails("pass_2", ((string[])(null))); } - [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario fails, fail_1", Description="\nThis means the entire scenario outline fails.", SourceLine=39)] + [TechTalk.SpecRun.ScenarioAttribute("This is a scenario outline where one scenario fails, fail_1", Description="\r\nThis means the entire scenario outline fails.", SourceLine=39)] public virtual void ThisIsAScenarioOutlineWhereOneScenarioFails_Fail_1() { this.ThisIsAScenarioOutlineWhereOneScenarioFails("fail_1", ((string[])(null))); @@ -257,6 +257,192 @@ public virtual void DealCorrectlyWithOverlongExampleValues_PleaseEnterAValidTwoL this.DealCorrectlyWithOverlongExampleValues("Please enter a valid two letter country code (e.g. DE)!", "This is just a very very very veery long error message!", ((string[])(null))); } + public virtual void DealWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with duplicate values", exampleTags); +#line 89 +this.ScenarioSetup(scenarioInfo); +#line 90 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with duplicate values, Variant 0", SourceLine=93)] + public virtual void DealWithDuplicateValues_Variant0() + { + this.DealWithDuplicateValues("pass", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with duplicate values, Variant 1", SourceLine=94)] + public virtual void DealWithDuplicateValues_Variant1() + { + this.DealWithDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with duplicate values, Variant 2", SourceLine=95)] + public virtual void DealWithDuplicateValues_Variant2() + { + this.DealWithDuplicateValues("inconclusive", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with duplicate values, Variant 3", SourceLine=96)] + public virtual void DealWithDuplicateValues_Variant3() + { + this.DealWithDuplicateValues("pass", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with duplicate values, Variant 4", SourceLine=97)] + public virtual void DealWithDuplicateValues_Variant4() + { + this.DealWithDuplicateValues("fail", ((string[])(null))); + } + + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple example sections with duplicate values", exampleTags); +#line 100 +this.ScenarioSetup(scenarioInfo); +#line 101 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple example sections with duplicate values, Examples 1, Variant 0", SourceLine=104)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant0() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple example sections with duplicate values, Examples 1, Variant 1", SourceLine=105)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant1() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple example sections with duplicate values, Examples 1, Variant 2", SourceLine=106)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet0_Variant2() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple example sections with duplicate values, Examples 2, Variant 0", SourceLine=110)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant0() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple example sections with duplicate values, Examples 2, Variant 1", SourceLine=111)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant1() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("inconclusive", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple example sections with duplicate values, Examples 2, Variant 2", SourceLine=112)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant2() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple example sections with duplicate values, Examples 2, Variant 3", SourceLine=113)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues_ExampleSet1_Variant3() + { + this.DealWithMultipleExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections without duplicate values", exampleTags); +#line 116 +this.ScenarioSetup(scenarioInfo); +#line 117 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections without duplicate values, First set, pa" + + "ss", SourceLine=120)] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Pass() + { + this.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues("pass", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections without duplicate values, First set, fa" + + "il", SourceLine=121)] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_FirstSet_Fail() + { + this.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections without duplicate values, Second set, i" + + "nconclusive", SourceLine=125)] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues_SecondSet_Inconclusive() + { + this.DealWithMultipleNamedExampleSectionsWithoutDuplicateValues("inconclusive", ((string[])(null))); + } + + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections with duplicate values", exampleTags); +#line 128 +this.ScenarioSetup(scenarioInfo); +#line 129 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections with duplicate values, First set, Varia" + + "nt 0", SourceLine=132)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant0() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections with duplicate values, First set, Varia" + + "nt 1", SourceLine=133)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant1() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections with duplicate values, First set, Varia" + + "nt 2", SourceLine=134)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_FirstSet_Variant2() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections with duplicate values, Second set, Vari" + + "ant 0", SourceLine=138)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant0() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections with duplicate values, Second set, Vari" + + "ant 1", SourceLine=139)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant1() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("inconclusive", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections with duplicate values, Second set, Vari" + + "ant 2", SourceLine=140)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant2() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("fail", ((string[])(null))); + } + + [TechTalk.SpecRun.ScenarioAttribute("Deal with multiple named example sections with duplicate values, Second set, Vari" + + "ant 3", SourceLine=141)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues_SecondSet_Variant3() + { + this.DealWithMultipleNamedExampleSectionsWithDuplicateValues("pass", ((string[])(null))); + } + [TechTalk.SpecRun.TestRunCleanup()] public virtual void TestRunCleanup() { diff --git a/test-harness/nunit/ScenarioOutlines.feature b/test-harness/nunit/ScenarioOutlines.feature index 00efa6fc5..74f50e2af 100644 --- a/test-harness/nunit/ScenarioOutlines.feature +++ b/test-harness/nunit/ScenarioOutlines.feature @@ -85,4 +85,59 @@ Scenario Outline: Deal correctly with overlong example values Examples: | value1 | value2 | - | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | \ No newline at end of file + | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | + +Scenario Outline: Deal with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | inconclusive | + | pass | + | fail | + +Scenario Outline: Deal with multiple example sections with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | pass | + + Examples: + | result | + | fail | + | inconclusive | + | fail | + | pass | + +Scenario Outline: Deal with multiple named example sections without duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + + Examples: Second set + | result | + | inconclusive | + +Scenario Outline: Deal with multiple named example sections with duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + | pass | + + Examples: Second set + | result | + | fail | + | inconclusive | + | fail | + | pass | \ No newline at end of file diff --git a/test-harness/nunit/ScenarioOutlines.feature.cs b/test-harness/nunit/ScenarioOutlines.feature.cs index 781cc3c1d..f53655b02 100644 --- a/test-harness/nunit/ScenarioOutlines.feature.cs +++ b/test-harness/nunit/ScenarioOutlines.feature.cs @@ -173,6 +173,80 @@ public virtual void DealCorrectlyWithOverlongExampleValues(string value1, string testRunner.And(string.Format("I have a field with value \'{0}\'", value2), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 84 testRunner.Then("the scenario will \'pass_1\'", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + public virtual void DealWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with duplicate values", exampleTags); +#line 90 +this.ScenarioSetup(scenarioInfo); +#line 91 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple example sections with duplicate values", exampleTags); +#line 101 +this.ScenarioSetup(scenarioInfo); +#line 102 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with multiple named example sections without duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections without duplicate values", exampleTags); +#line 117 +this.ScenarioSetup(scenarioInfo); +#line 118 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections with duplicate values", exampleTags); +#line 129 +this.ScenarioSetup(scenarioInfo); +#line 130 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden this.ScenarioCleanup(); } diff --git a/test-harness/nunit/nunit.csproj b/test-harness/nunit/nunit.csproj index 22fa5ab23..5f3832088 100644 --- a/test-harness/nunit/nunit.csproj +++ b/test-harness/nunit/nunit.csproj @@ -32,9 +32,8 @@ 4 - - False - ..\packages\NUnit.2.6.3\lib\nunit.framework.dll + + ..\packages\NUnit.2.7.0\lib\nunit.framework.dll diff --git a/test-harness/nunit/packages.config b/test-harness/nunit/packages.config index b8534f0c7..26ecd1153 100644 --- a/test-harness/nunit/packages.config +++ b/test-harness/nunit/packages.config @@ -1,7 +1,7 @@  - - + + \ No newline at end of file diff --git a/test-harness/nunit3/Addition.feature.cs b/test-harness/nunit3/Addition.feature.cs index 225fe90ea..27fd91d89 100644 --- a/test-harness/nunit3/Addition.feature.cs +++ b/test-harness/nunit3/Addition.feature.cs @@ -28,7 +28,7 @@ public partial class AdditionFeature #line 1 "Addition.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -37,7 +37,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); diff --git a/test-harness/nunit3/FailingBackground.feature.cs b/test-harness/nunit3/FailingBackground.feature.cs index 74c03e4c4..735588239 100644 --- a/test-harness/nunit3/FailingBackground.feature.cs +++ b/test-harness/nunit3/FailingBackground.feature.cs @@ -28,7 +28,7 @@ public partial class FailingBackgroundFeature #line 1 "FailingBackground.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -36,7 +36,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); diff --git a/test-harness/nunit3/Minimal Features/Failing.feature.cs b/test-harness/nunit3/Minimal Features/Failing.feature.cs index 197f12476..022a994b3 100644 --- a/test-harness/nunit3/Minimal Features/Failing.feature.cs +++ b/test-harness/nunit3/Minimal Features/Failing.feature.cs @@ -28,7 +28,7 @@ public partial class FailingFeature #line 1 "Failing.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -36,7 +36,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); diff --git a/test-harness/nunit3/Minimal Features/Inconclusive.feature.cs b/test-harness/nunit3/Minimal Features/Inconclusive.feature.cs index 315c63692..bbfc5bdf2 100644 --- a/test-harness/nunit3/Minimal Features/Inconclusive.feature.cs +++ b/test-harness/nunit3/Minimal Features/Inconclusive.feature.cs @@ -28,7 +28,7 @@ public partial class InconclusiveFeature #line 1 "Inconclusive.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -36,7 +36,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); diff --git a/test-harness/nunit3/Minimal Features/Passing.feature.cs b/test-harness/nunit3/Minimal Features/Passing.feature.cs index 4618b0150..f38719008 100644 --- a/test-harness/nunit3/Minimal Features/Passing.feature.cs +++ b/test-harness/nunit3/Minimal Features/Passing.feature.cs @@ -28,7 +28,7 @@ public partial class PassingFeature #line 1 "Passing.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -36,7 +36,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); diff --git a/test-harness/nunit3/NotAutomatedAtAll.feature.cs b/test-harness/nunit3/NotAutomatedAtAll.feature.cs index e6f2083b3..0b9cb48b5 100644 --- a/test-harness/nunit3/NotAutomatedAtAll.feature.cs +++ b/test-harness/nunit3/NotAutomatedAtAll.feature.cs @@ -28,7 +28,7 @@ public partial class NotAutomatedAtAllFeature #line 1 "NotAutomatedAtAll.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -37,7 +37,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); diff --git a/test-harness/nunit3/ScenarioOutlines.feature b/test-harness/nunit3/ScenarioOutlines.feature index 00efa6fc5..74f50e2af 100644 --- a/test-harness/nunit3/ScenarioOutlines.feature +++ b/test-harness/nunit3/ScenarioOutlines.feature @@ -85,4 +85,59 @@ Scenario Outline: Deal correctly with overlong example values Examples: | value1 | value2 | - | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | \ No newline at end of file + | Please enter a valid two letter country code (e.g. DE)! | This is just a very very very veery long error message! | + +Scenario Outline: Deal with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | inconclusive | + | pass | + | fail | + +Scenario Outline: Deal with multiple example sections with duplicate values + Then the scenario will '' + + Examples: + | result | + | pass | + | fail | + | pass | + + Examples: + | result | + | fail | + | inconclusive | + | fail | + | pass | + +Scenario Outline: Deal with multiple named example sections without duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + + Examples: Second set + | result | + | inconclusive | + +Scenario Outline: Deal with multiple named example sections with duplicate values + Then the scenario will '' + + Examples: First set + | result | + | pass | + | fail | + | pass | + + Examples: Second set + | result | + | fail | + | inconclusive | + | fail | + | pass | \ No newline at end of file diff --git a/test-harness/nunit3/ScenarioOutlines.feature.cs b/test-harness/nunit3/ScenarioOutlines.feature.cs index 33f0a8a86..5fbcee27d 100644 --- a/test-harness/nunit3/ScenarioOutlines.feature.cs +++ b/test-harness/nunit3/ScenarioOutlines.feature.cs @@ -28,7 +28,7 @@ public partial class ScenarioOutlinesFeature #line 1 "ScenarioOutlines.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -36,7 +36,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); @@ -173,6 +173,80 @@ public virtual void DealCorrectlyWithOverlongExampleValues(string value1, string testRunner.And(string.Format("I have a field with value \'{0}\'", value2), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "And "); #line 84 testRunner.Then("the scenario will \'pass_1\'", ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + public virtual void DealWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with duplicate values", exampleTags); +#line 90 +this.ScenarioSetup(scenarioInfo); +#line 91 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with multiple example sections with duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + public virtual void DealWithMultipleExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple example sections with duplicate values", exampleTags); +#line 101 +this.ScenarioSetup(scenarioInfo); +#line 102 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with multiple named example sections without duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + public virtual void DealWithMultipleNamedExampleSectionsWithoutDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections without duplicate values", exampleTags); +#line 117 +this.ScenarioSetup(scenarioInfo); +#line 118 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); +#line hidden + this.ScenarioCleanup(); + } + + [NUnit.Framework.TestAttribute()] + [NUnit.Framework.DescriptionAttribute("Deal with multiple named example sections with duplicate values")] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("inconclusive", null)] + [NUnit.Framework.TestCaseAttribute("fail", null)] + [NUnit.Framework.TestCaseAttribute("pass", null)] + public virtual void DealWithMultipleNamedExampleSectionsWithDuplicateValues(string result, string[] exampleTags) + { + TechTalk.SpecFlow.ScenarioInfo scenarioInfo = new TechTalk.SpecFlow.ScenarioInfo("Deal with multiple named example sections with duplicate values", exampleTags); +#line 129 +this.ScenarioSetup(scenarioInfo); +#line 130 + testRunner.Then(string.Format("the scenario will \'{0}\'", result), ((string)(null)), ((TechTalk.SpecFlow.Table)(null)), "Then "); #line hidden this.ScenarioCleanup(); } diff --git a/test-harness/nunit3/ScenariosWithSpecialCharacters.feature.cs b/test-harness/nunit3/ScenariosWithSpecialCharacters.feature.cs index 8a31e3212..9e8276398 100644 --- a/test-harness/nunit3/ScenariosWithSpecialCharacters.feature.cs +++ b/test-harness/nunit3/ScenariosWithSpecialCharacters.feature.cs @@ -28,7 +28,7 @@ public partial class ScenariosWithSpecialCharactersFeature #line 1 "ScenariosWithSpecialCharacters.feature" #line hidden - [NUnit.Framework.TestFixtureSetUpAttribute()] + [NUnit.Framework.OneTimeSetUpAttribute()] public virtual void FeatureSetup() { testRunner = TechTalk.SpecFlow.TestRunnerManager.GetTestRunner(); @@ -36,7 +36,7 @@ public virtual void FeatureSetup() testRunner.OnFeatureStart(featureInfo); } - [NUnit.Framework.TestFixtureTearDownAttribute()] + [NUnit.Framework.OneTimeTearDownAttribute()] public virtual void FeatureTearDown() { testRunner.OnFeatureEnd(); diff --git a/test-harness/nunit3/nunit3.csproj b/test-harness/nunit3/nunit3.csproj index 8c91a4e29..0fadf8e36 100644 --- a/test-harness/nunit3/nunit3.csproj +++ b/test-harness/nunit3/nunit3.csproj @@ -1,5 +1,6 @@  + Debug @@ -11,6 +12,8 @@ nunit3Harness v4.5 512 + + true @@ -30,9 +33,8 @@ 4 - - ..\packages\NUnit.3.6.0\lib\net45\nunit.framework.dll - True + + ..\packages\NUnit.3.11.0\lib\net45\nunit.framework.dll @@ -136,6 +138,12 @@ + + + This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + + +