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(); 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..5d4a8850d3 --- /dev/null +++ b/src/NUnitFramework/tests/Issue4584.cs @@ -0,0 +1,34 @@ +// 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) + { + 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)); + } + } + } +}