From 33bb2c73045cd8bec4ef2c083760036d49e62bdf Mon Sep 17 00:00:00 2001 From: Jos van der Til Date: Wed, 23 May 2018 23:04:16 +0200 Subject: [PATCH] Add matching of VSTest _Variant results. Implements the VsTestScenarioOutlineExampleMatcher to detect _Variant style examples. These occur when there are examples which contain characters that are illegal for method names, or when examples contain duplicate values in the first column. Fixes #507 --- .../StandardTestSuiteForScenarioOutlines.cs | 26 ++++++++++++++++++- ...gVsTestResultsFileWithIndividualResults.cs | 6 +++++ .../VsTestScenarioOutlineExampleMatcher.cs | 23 +++++++++++++++- 3 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs index 526a0652c..c0a26b56f 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/StandardTestSuiteForScenarioOutlines.cs @@ -19,6 +19,7 @@ // -------------------------------------------------------------------------------------------------------------------- +using System.Collections.Generic; using NFluent; @@ -136,7 +137,30 @@ public void ThenCanReadExamplesWithRegexValuesFromScenarioOutline_ShouldBeTestRe var feature = new Feature { Name = "Scenarios With Special Characters" }; - var scenarioOutline = new ScenarioOutline { Name = "This scenario contains examples with Regex-special characters", Feature = feature }; + var scenarioOutline = new ScenarioOutline + { + Name = "This scenario contains examples with Regex-special characters", + Feature = feature, + Examples = new List + { + new Example + { + TableArgument = new ExampleTable + { + DataRows = new List + { + new TableRow("**"), + new TableRow("++"), + new TableRow(".*"), + new TableRow("[]"), + new TableRow("{}"), + new TableRow("()"), + new TableRow(@"^.*(?BAR)\s[^0-9]{3,4}A+$"), + } + } + } + } + }; TestResult exampleResultOutline = results.GetScenarioOutlineResult(scenarioOutline); Check.That(exampleResultOutline).IsEqualTo(TestResult.Passed); diff --git a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs index c93cdcac0..d5c760146 100644 --- a/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs +++ b/src/Pickles/Pickles.TestFrameworks.UnitTests/VsTest/WhenParsingVsTestResultsFileWithIndividualResults.cs @@ -57,6 +57,12 @@ public WhenParsingVsTestResultsFileWithIndividualResults() base.ThenCanReadIndividualResultsFromScenarioOutline_MultipleExampleSections_ShouldBeTestResultFailed(); } + [Test] + public new void ThenCanReadExamplesWithRegexValuesFromScenarioOutline_ShouldBeTestResultPassed() + { + base.ThenCanReadExamplesWithRegexValuesFromScenarioOutline_ShouldBeTestResultPassed(); + } + [Test] public new void ThenCanReadExamplesWithLongExampleValues() { diff --git a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs index 913cdf2eb..8f873685f 100644 --- a/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs +++ b/src/Pickles/Pickles.TestFrameworks/VsTest/VsTestScenarioOutlineExampleMatcher.cs @@ -18,6 +18,8 @@ // // -------------------------------------------------------------------------------------------------------------------- +using System.Linq; +using System.Text.RegularExpressions; using System.Xml.Linq; using PicklesDoc.Pickles.ObjectModel; @@ -26,6 +28,9 @@ 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; + public bool IsMatch(ScenarioOutline scenarioOutline, string[] exampleValues, object scenarioElement) { var element = (XElement)scenarioElement; @@ -51,7 +56,23 @@ public bool IsMatch(ScenarioOutline scenarioOutline, string[] exampleValues, obj .Replace('Ø', 'O') .Replace('Å', 'A'); - var isMatch = element.Name().ToUpperInvariant() + 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;