diff --git a/src/NUnitFramework/framework/Internal/TestNameGenerator.cs b/src/NUnitFramework/framework/Internal/TestNameGenerator.cs index 2c6b8a01dd..fe4484e42b 100644 --- a/src/NUnitFramework/framework/Internal/TestNameGenerator.cs +++ b/src/NUnitFramework/framework/Internal/TestNameGenerator.cs @@ -116,6 +116,12 @@ private static List BuildFragmentList(string pattern) case "{C}": fragments.Add(new ClassFullNameFragment()); break; + case "{d}": + fragments.Add(new DerivedClassNameFragment()); + break; + case "{D}": + fragments.Add(new DerivedClassFullNameFragment()); + break; case "{M}": fragments.Add(new MethodFullNameFragment()); break; @@ -177,12 +183,7 @@ private abstract class NameFragment { private const string THREE_DOTS = "..."; - public virtual void AppendTextTo(StringBuilder sb, TestMethod testMethod, object?[]? args) - { - AppendTextTo(sb, testMethod.Method.MethodInfo, args); - } - - public abstract void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args); + public abstract void AppendTextTo(StringBuilder sb, TestMethod testMethod, object?[]? args); protected static void AppendGenericTypeNames(StringBuilder sb, MethodInfo method) { @@ -203,13 +204,18 @@ protected static string GetDisplayString(object? arg, int stringMax) } } - private sealed class TestIDFragment : NameFragment + private abstract class NameFromMethodInfoFragment : NameFragment { - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + public sealed override void AppendTextTo(StringBuilder sb, TestMethod testMethod, object?[]? args) { - sb.Append("{i}"); // No id available using MethodInfo + AppendTextTo(sb, testMethod.Method.MethodInfo, args); } + protected abstract void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args); + } + + private sealed class TestIDFragment : NameFragment + { public override void AppendTextTo(StringBuilder sb, TestMethod testMethod, object?[]? args) { sb.Append(testMethod.Id); @@ -225,15 +231,15 @@ public FixedTextFragment(string text) _text = text; } - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + public override void AppendTextTo(StringBuilder sb, TestMethod testMethod, object?[]? args) { sb.Append(_text); } } - private sealed class MethodNameFragment : NameFragment + private sealed class MethodNameFragment : NameFromMethodInfoFragment { - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) { sb.Append(method.Name); @@ -242,17 +248,17 @@ public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[] } } - private sealed class NamespaceFragment : NameFragment + private sealed class NamespaceFragment : NameFromMethodInfoFragment { - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) { sb.Append(method.DeclaringType!.Namespace); } } - private sealed class MethodFullNameFragment : NameFragment + private sealed class MethodFullNameFragment : NameFromMethodInfoFragment { - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) { sb.Append(method.DeclaringType!.FullName); sb.Append('.'); @@ -263,23 +269,40 @@ public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[] } } - private sealed class ClassNameFragment : NameFragment + private sealed class ClassNameFragment : NameFromMethodInfoFragment { - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) { sb.Append(method.DeclaringType!.Name); } } - private sealed class ClassFullNameFragment : NameFragment + private sealed class ClassFullNameFragment : NameFromMethodInfoFragment { - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) { sb.Append(method.DeclaringType!.FullName); } } - private sealed class ArgListFragment : NameFragment + // TODO: Don't think this quite works yet. + private sealed class DerivedClassNameFragment : NameFragment + { + public override void AppendTextTo(StringBuilder sb, TestMethod testMethod, object?[]? args) + { + sb.Append(testMethod.TypeInfo!.Name); + } + } + + private sealed class DerivedClassFullNameFragment : NameFragment + { + public override void AppendTextTo(StringBuilder sb, TestMethod testMethod, object?[]? args) + { + sb.Append(testMethod.TypeInfo?.FullName); + } + } + + private sealed class ArgListFragment : NameFromMethodInfoFragment { private readonly int _maxStringLength; @@ -288,7 +311,7 @@ public ArgListFragment(int maxStringLength) _maxStringLength = maxStringLength; } - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? arglist) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? arglist) { if (arglist is not null) { @@ -306,7 +329,7 @@ public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[] } } - private sealed class ArgumentFragment : NameFragment + private sealed class ArgumentFragment : NameFromMethodInfoFragment { private readonly int _index; private readonly int _maxStringLength; @@ -317,14 +340,14 @@ public ArgumentFragment(int index, int maxStringLength) _maxStringLength = maxStringLength; } - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) { if (args is not null && _index < args.Length) sb.Append(GetDisplayString(args[_index], _maxStringLength)); } } - private sealed class ParamArgListFragment : NameFragment + private sealed class ParamArgListFragment : NameFromMethodInfoFragment { private readonly int _maxStringLength; @@ -333,7 +356,7 @@ public ParamArgListFragment(int maxStringLength) _maxStringLength = maxStringLength; } - public override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) + protected override void AppendTextTo(StringBuilder sb, MethodInfo method, object?[]? args) { if (args is not null) { diff --git a/src/NUnitFramework/tests/Internal/TestNameGeneratorTests.cs b/src/NUnitFramework/tests/Internal/TestNameGeneratorTests.cs index 978f009d31..6bbc2e7499 100644 --- a/src/NUnitFramework/tests/Internal/TestNameGeneratorTests.cs +++ b/src/NUnitFramework/tests/Internal/TestNameGeneratorTests.cs @@ -10,6 +10,7 @@ public class TestNameGeneratorTests private TestMethod _simpleTest; private TestMethod _simpleTestWithArgs; private TestMethod _genericTest; + private TestMethod _derivedTest; [SetUp] public void InitializeMethodInfos() @@ -18,6 +19,7 @@ public void InitializeMethodInfos() _simpleTest = new TestMethod(new MethodWrapper(thisType, nameof(TestMethod))); _simpleTestWithArgs = new TestMethod(new MethodWrapper(thisType, nameof(TestMethodWithArgs))); _genericTest = new TestMethod(new MethodWrapper(thisType, nameof(GenericTest))); + _derivedTest = new TestMethod(new MethodWrapper(typeof(Derived), nameof(Base.DerivedMethod))); _simpleTest.Id = "THE_ID"; } @@ -26,6 +28,8 @@ public void InitializeMethodInfos() [TestCase("{n}", ExpectedResult = "NUnit.Framework.Tests.Internal")] [TestCase("{c}", ExpectedResult = "TestNameGeneratorTests")] [TestCase("{C}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests")] + [TestCase("{d}", ExpectedResult = "TestNameGeneratorTests")] + [TestCase("{D}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests")] [TestCase("{M}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests.TestMethod")] [TestCase("{m}_SpecialCase", ExpectedResult = "TestMethod_SpecialCase")] [TestCase("{n}.{c}.{m}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests.TestMethod")] @@ -79,6 +83,8 @@ public string ParameterizedTestsWithArgs(string pattern, object[] args) [TestCase("{n}", ExpectedResult = "NUnit.Framework.Tests.Internal")] [TestCase("{c}", ExpectedResult = "TestNameGeneratorTests")] [TestCase("{C}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests")] + [TestCase("{d}", ExpectedResult = "TestNameGeneratorTests")] + [TestCase("{D}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests")] [TestCase("{M}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests.GenericTest")] [TestCase("{m}_SpecialCase", ExpectedResult = "GenericTest_SpecialCase")] [TestCase("{n}.{c}.{m}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests.GenericTest")] @@ -87,6 +93,14 @@ public string GenericTestNames(string pattern) return new TestNameGenerator(pattern).GetDisplayName(_genericTest); } + [TestCase("{d}", ExpectedResult = "Derived")] + [TestCase("{D}", ExpectedResult = "NUnit.Framework.Tests.Internal.TestNameGeneratorTests.Derived")] + public string DerivedClassNames(string pattern) + { + var derivedClassNames = new TestNameGenerator(pattern).GetDisplayName(_derivedTest); + return derivedClassNames; + } + [TestCase("{x}", ExpectedResult = "{x}")] [TestCase("{xy}", ExpectedResult = "{xy}")] [TestCase("{x:}", ExpectedResult = "{x:}")] @@ -146,6 +160,17 @@ private void GenericTest() { } + public class Base + { + public void DerivedMethod() + { + } + } + + public sealed class Derived : Base + { + } + #endregion } }