From f0b073f41e4273c943048af88a8fb4598772f4d0 Mon Sep 17 00:00:00 2001 From: Fedor Date: Mon, 31 Jul 2017 17:39:49 +1200 Subject: [PATCH 1/3] - added a specific message Added ArgumentException with a message to let user know that parameter name conflicts with header name in ExampleTable --- .../Scanners/StepScanners/Fluent/FluentScanner.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs b/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs index 92e5f393..48f6d344 100644 --- a/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs +++ b/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs @@ -203,9 +203,15 @@ private StepTitle CreateTitle(string stepTextTemplate, bool includeInputsInStepT { if (_testContext.Examples != null) { - var matchingHeader = _testContext.Examples.Headers - .SingleOrDefault(header => ExampleTable.HeaderMatches(header, i.ParameterName) || - ExampleTable.HeaderMatches(header, i.Value.Name)); + var matchingHeaders = _testContext.Examples.Headers + .Where(header => ExampleTable.HeaderMatches(header, i.ParameterName) || + ExampleTable.HeaderMatches(header, i.Value.Name)) + .ToList(); + + if (matchingHeaders.Count > 1) + throw new ArgumentException($"Cannot uniquely distinguish parameter name between '{methodInfo.Name}' method's parameter name '{i.ParameterName}' and header's name '{i.Value.Name}'"); + + var matchingHeader = matchingHeaders.SingleOrDefault(); if (matchingHeader != null) return string.Format("<{0}>", matchingHeader); } From ab8ca7b17c6bca84bbe648a66cfe1a921d884eea Mon Sep 17 00:00:00 2001 From: Gurpreet Singh Date: Sat, 25 Oct 2025 20:28:08 +0000 Subject: [PATCH 2/3] throw exception on ambiguous match for headers --- .../Scanners/StepScanners/Fluent/FluentScanner.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs b/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs index 607d9d2b..1a09ab1d 100644 --- a/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs +++ b/src/TestStack.BDDfy/Scanners/StepScanners/Fluent/FluentScanner.cs @@ -209,7 +209,7 @@ private StepTitle CreateTitle(string stepTextTemplate, bool includeInputsInStepT .ToList(); if (matchingHeaders.Count > 1) - throw new ArgumentException($"Cannot uniquely distinguish parameter name between '{methodInfo.Name}' method's parameter name '{i.ParameterName}' and header's name '{i.Value.Name}'"); + throw new AmbiguousMatchException ($"More than one headers for examples, match the parameter '{i.ParameterName}' provided for '{methodInfo.Name}'"); var matchingHeader = matchingHeaders.SingleOrDefault(); if (matchingHeader != null) From 5e85bc444abe2c324fc5dc85072fca0ffb2083ea Mon Sep 17 00:00:00 2001 From: Gurpreet Singh Date: Sat, 25 Oct 2025 20:52:24 +0000 Subject: [PATCH 3/3] added unit tests for changes --- .../AmbiguousHeaderMatchTests.cs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 src/TestStack.BDDfy.Tests/Scanner/FluentScanner/AmbiguousHeaderMatchTests.cs diff --git a/src/TestStack.BDDfy.Tests/Scanner/FluentScanner/AmbiguousHeaderMatchTests.cs b/src/TestStack.BDDfy.Tests/Scanner/FluentScanner/AmbiguousHeaderMatchTests.cs new file mode 100644 index 00000000..7e530df0 --- /dev/null +++ b/src/TestStack.BDDfy.Tests/Scanner/FluentScanner/AmbiguousHeaderMatchTests.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using Shouldly; +using Xunit; + +namespace TestStack.BDDfy.Tests.Scanner.FluentScanner +{ + public class AmbiguousHeaderMatchTests + { + private int _count; + + [Fact] + public void ThrowsWhenMultipleHeadersMatchParameterName() + { + // Act & Assert + var exception = Should.Throw(() => + { + this.Given(_ => GivenInput(_count)) // Will try to bind _count to both "count" and "Count" headers + .WithExamples(new ExampleTable("count", "Count") // Deliberately ambiguous headers + { + { 5, 10 } + }) + .BDDfy(); + }); + + exception.Message.ShouldBe("More than one headers for examples, match the parameter 'count' provided for 'GivenInput'"); + } + + private void GivenInput(int count) + { + // The method exists just to trigger the ambiguous header match + } + } +} \ No newline at end of file