From 0cacb359b2e72396a0c826e1daac632814cc9294 Mon Sep 17 00:00:00 2001 From: Manfred Brands Date: Fri, 2 Aug 2024 11:46:09 +0800 Subject: [PATCH 1/3] Added test to show issue with \r in Test Names --- .../framework/Internal/DisplayName.cs | 16 +++++++++ .../TestCaseSourceAttributeFixture.cs | 23 ++++++++++++ src/NUnitFramework/tests/Issue4584.cs | 36 +++++++++++++++++++ 3 files changed, 75 insertions(+) create mode 100644 src/NUnitFramework/tests/Issue4584.cs diff --git a/src/NUnitFramework/framework/Internal/DisplayName.cs b/src/NUnitFramework/framework/Internal/DisplayName.cs index 21ae53ede2..50f3114d2f 100644 --- a/src/NUnitFramework/framework/Internal/DisplayName.cs +++ b/src/NUnitFramework/framework/Internal/DisplayName.cs @@ -223,6 +223,22 @@ public static string GetValueString(object? arg, int stringMax) return display; } + public static string EscapeControlChars(string s) + { + if (MayNeedEscape(s)) + { + // cleanup + var sb = new StringBuilder(); + foreach (char c in s) + { + sb.Append(EscapeControlChar(c)); + } + s = sb.ToString(); + } + + return s; + } + private static string FormatException(Exception ex) { var builder = new StringBuilder(); diff --git a/src/NUnitFramework/testdata/TestCaseSourceAttributeFixture.cs b/src/NUnitFramework/testdata/TestCaseSourceAttributeFixture.cs index b566e45989..678dd4eef8 100644 --- a/src/NUnitFramework/testdata/TestCaseSourceAttributeFixture.cs +++ b/src/NUnitFramework/testdata/TestCaseSourceAttributeFixture.cs @@ -217,5 +217,28 @@ from spec in TestDataSpec.Specs .SetProperty("ExpectedTestName", spec.GetTestCaseName(nameof(TestCaseNameTestDataMethod))); #endregion + + #region Multiline selection failure + [TestFixture(Description = "https://github.com/nunit/nunit/issues/4584")] + public class SelectionFail + { + [TestCaseSource(nameof(Data))] + public static void Test(int actual, int expected) + { + Assert.That(actual, Is.EqualTo(expected)); + } + + public static IEnumerable Data + { + get + { + yield return new TestCaseData(42, 42); + yield return new TestCaseData(42, 42).SetName("42 == 42"); + yield return new TestCaseData(42, 42).SetName("42\r\n42"); + yield return new TestCaseData(42, 42).SetArgDisplayNames("42\n", "42\r\n"); + } + } + } + #endregion } } diff --git a/src/NUnitFramework/tests/Issue4584.cs b/src/NUnitFramework/tests/Issue4584.cs new file mode 100644 index 0000000000..423ba8328a --- /dev/null +++ b/src/NUnitFramework/tests/Issue4584.cs @@ -0,0 +1,36 @@ +// Copyright (c) Charlie Poole, Rob Prouse and Contributors. MIT License - see LICENSE.txt + +using NUnit.Framework.Internal; +using NUnit.Framework.Internal.Execution; +using NUnit.Framework.Tests.TestUtilities; +using NUnit.TestData.TestCaseSourceAttributeFixture; + +namespace NUnit.Framework.Tests +{ + [TestFixture] + public class Issue4584 + { + [Test] + public void DiscoverAndExecution() + { + var fixtureType = typeof(TestCaseSourceAttributeFixture.SelectionFail); + var methodName = nameof(TestCaseSourceAttributeFixture.SelectionFail.Test); + var fixture = TestBuilder.MakeTestFromMethod(fixtureType, methodName); + + foreach (var test in fixture.Tests) + { + TestContext.Out.WriteLine($"Test: {DisplayName.EscapeControlChars(test.Name)}"); + + var filter = TestFilter.FromXml( + $"{test.Name}"); + WorkItem? workItem = WorkItemBuilder.CreateWorkItem(fixture, filter, recursive: true); + + Assert.That(workItem, Is.Not.Null); + Assert.That(workItem, Is.InstanceOf()); + + var compositeWorkItem = (CompositeWorkItem)workItem; + Assert.That(compositeWorkItem.Children, Has.Count.EqualTo(1)); + } + } + } +} From 1b3b1cc6f620035eaf09e343af4a799584604edc Mon Sep 17 00:00:00 2001 From: Manfred Brands Date: Fri, 2 Aug 2024 11:46:43 +0800 Subject: [PATCH 2/3] Fix from Steven to keep \r in Xml values. --- src/NUnitFramework/framework/Interfaces/TNode.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/NUnitFramework/framework/Interfaces/TNode.cs b/src/NUnitFramework/framework/Interfaces/TNode.cs index aac2973e01..6347de6977 100644 --- a/src/NUnitFramework/framework/Interfaces/TNode.cs +++ b/src/NUnitFramework/framework/Interfaces/TNode.cs @@ -120,7 +120,10 @@ public string OuterXml public static TNode FromXml(string xmlText) { using var stringReader = new StringReader(xmlText); - using var reader = XmlReader.Create(stringReader); + using var reader = new XmlTextReader(stringReader) + { + Normalization = false + }; // go to starting point reader.MoveToContent(); From 7ffb366d793d7215d427a057815c977b7c99763f Mon Sep 17 00:00:00 2001 From: Manfred Brands Date: Sun, 4 Aug 2024 09:43:16 +0800 Subject: [PATCH 3/3] Remove unnecessary method and verbosity in unit test --- .../framework/Internal/DisplayName.cs | 16 ---------------- src/NUnitFramework/tests/Issue4584.cs | 2 -- 2 files changed, 18 deletions(-) diff --git a/src/NUnitFramework/framework/Internal/DisplayName.cs b/src/NUnitFramework/framework/Internal/DisplayName.cs index 50f3114d2f..21ae53ede2 100644 --- a/src/NUnitFramework/framework/Internal/DisplayName.cs +++ b/src/NUnitFramework/framework/Internal/DisplayName.cs @@ -223,22 +223,6 @@ public static string GetValueString(object? arg, int stringMax) return display; } - public static string EscapeControlChars(string s) - { - if (MayNeedEscape(s)) - { - // cleanup - var sb = new StringBuilder(); - foreach (char c in s) - { - sb.Append(EscapeControlChar(c)); - } - s = sb.ToString(); - } - - return s; - } - private static string FormatException(Exception ex) { var builder = new StringBuilder(); diff --git a/src/NUnitFramework/tests/Issue4584.cs b/src/NUnitFramework/tests/Issue4584.cs index 423ba8328a..5d4a8850d3 100644 --- a/src/NUnitFramework/tests/Issue4584.cs +++ b/src/NUnitFramework/tests/Issue4584.cs @@ -19,8 +19,6 @@ public void DiscoverAndExecution() foreach (var test in fixture.Tests) { - TestContext.Out.WriteLine($"Test: {DisplayName.EscapeControlChars(test.Name)}"); - var filter = TestFilter.FromXml( $"{test.Name}"); WorkItem? workItem = WorkItemBuilder.CreateWorkItem(fixture, filter, recursive: true);