From 190a8d31e02fdd97c30c131e0206156c0992b2d3 Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Tue, 11 May 2021 16:19:10 +0200 Subject: [PATCH 1/6] implemented ConditionalOuterLoopAttribute, which conditionally sets OuterLoop category --- .../ConditionalOuterLoopAttribute.cs | 29 +++++++++++ .../src/DiscovererHelpers.cs | 50 +++++++++++++++++- .../src/Discoverers/ActiveIssueDiscoverer.cs | 51 +------------------ .../ConditionalOuterLoopTestsDiscoverer.cs | 32 ++++++++++++ .../tests/ConditionalAttributeTests.cs | 14 +++++ 5 files changed, 125 insertions(+), 51 deletions(-) create mode 100644 src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs create mode 100644 src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs new file mode 100644 index 00000000000..951669817a1 --- /dev/null +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs @@ -0,0 +1,29 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System; +using Xunit.Sdk; + +namespace Xunit +{ + /// + /// Apply this attribute to your test method to specify a outer-loop category. + /// + [TraitDiscoverer("Microsoft.DotNet.XUnitExtensions.ConditionalOuterLoopTestsDiscoverer", "Microsoft.DotNet.XUnitExtensions")] + [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] + public class ConditionalOuterLoopAttribute : Attribute, ITraitAttribute + { + public Type CalleeType { get; private set; } + public string[] ConditionMemberNames { get; private set; } + + public ConditionalOuterLoopAttribute(string reason, TestPlatforms platforms) { } + public ConditionalOuterLoopAttribute(string reason, TargetFrameworkMonikers framework) { } + public ConditionalOuterLoopAttribute(string reason, TestRuntimes runtimes) { } + public ConditionalOuterLoopAttribute(string reason, TestPlatforms platforms = TestPlatforms.Any, TargetFrameworkMonikers framework = TargetFrameworkMonikers.Any, TestRuntimes runtimes = TestRuntimes.Any) { } + public ConditionalOuterLoopAttribute(string isreasonsue, Type calleeType, params string[] conditionMemberNames) + { + CalleeType = calleeType; + ConditionMemberNames = conditionMemberNames; + } + } +} diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs index dbb0dfd1459..4887e9e27bc 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/DiscovererHelpers.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; -using System.Reflection; using System.Runtime.InteropServices; using Xunit; @@ -59,5 +58,54 @@ internal static bool Evaluate(Type calleeType, string[] conditionMemberNames) return true; } + + internal static IEnumerable> EvaluateArguments(IEnumerable ctorArgs,string category, int skipFirst=1) + { + Debug.Assert(ctorArgs.Count() >= 2); + + TestPlatforms platforms = TestPlatforms.Any; + TargetFrameworkMonikers frameworks = TargetFrameworkMonikers.Any; + TestRuntimes runtimes = TestRuntimes.Any; + Type calleeType = null; + string[] conditionMemberNames = null; + + foreach (object arg in ctorArgs.Skip(skipFirst)) // First argument is the issue number or reason. + { + if (arg is TestPlatforms) + { + platforms = (TestPlatforms)arg; + } + else if (arg is TargetFrameworkMonikers) + { + frameworks = (TargetFrameworkMonikers)arg; + } + else if (arg is TestRuntimes) + { + runtimes = (TestRuntimes)arg; + } + else if (arg is Type) + { + calleeType = (Type)arg; + } + else if (arg is string[]) + { + conditionMemberNames = (string[])arg; + } + } + + if (calleeType != null && conditionMemberNames != null) + { + if (DiscovererHelpers.Evaluate(calleeType, conditionMemberNames)) + { + yield return new KeyValuePair(XunitConstants.Category, category); + } + } + else if (DiscovererHelpers.TestPlatformApplies(platforms) && + DiscovererHelpers.TestRuntimeApplies(runtimes) && + DiscovererHelpers.TestFrameworkApplies(frameworks)) + { + yield return new KeyValuePair(XunitConstants.Category, category); + } + } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs index 201df537d14..8e9ec7fc725 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ActiveIssueDiscoverer.cs @@ -1,11 +1,7 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. -using System; using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using Xunit; using Xunit.Abstractions; using Xunit.Sdk; @@ -25,52 +21,7 @@ public class ActiveIssueDiscoverer : ITraitDiscoverer public IEnumerable> GetTraits(IAttributeInfo traitAttribute) { IEnumerable ctorArgs = traitAttribute.GetConstructorArguments(); - Debug.Assert(ctorArgs.Count() >= 2); - - string issue = ctorArgs.First().ToString(); - TestPlatforms platforms = TestPlatforms.Any; - TargetFrameworkMonikers frameworks = TargetFrameworkMonikers.Any; - TestRuntimes runtimes = TestRuntimes.Any; - Type calleeType = null; - string[] conditionMemberNames = null; - - foreach (object arg in ctorArgs.Skip(1)) // First argument is the issue number. - { - if (arg is TestPlatforms) - { - platforms = (TestPlatforms)arg; - } - else if (arg is TargetFrameworkMonikers) - { - frameworks = (TargetFrameworkMonikers)arg; - } - else if (arg is TestRuntimes) - { - runtimes = (TestRuntimes)arg; - } - else if (arg is Type) - { - calleeType = (Type)arg; - } - else if (arg is string[]) - { - conditionMemberNames = (string[])arg; - } - } - - if (calleeType != null && conditionMemberNames != null) - { - if (DiscovererHelpers.Evaluate(calleeType, conditionMemberNames)) - { - yield return new KeyValuePair(XunitConstants.Category, XunitConstants.Failing); - } - } - else if (DiscovererHelpers.TestPlatformApplies(platforms) && - DiscovererHelpers.TestRuntimeApplies(runtimes) && - DiscovererHelpers.TestFrameworkApplies(frameworks)) - { - yield return new KeyValuePair(XunitConstants.Category, XunitConstants.Failing); - } + return DiscovererHelpers.EvaluateArguments(ctorArgs, XunitConstants.Failing); } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs new file mode 100644 index 00000000000..7874a6a82a3 --- /dev/null +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs @@ -0,0 +1,32 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +using System.Collections.Generic; +using Xunit.Abstractions; +using Xunit.Sdk; +using System.Linq; + +namespace Microsoft.DotNet.XUnitExtensions +{ + /// + /// This class discovers all of the tests and test classes that have + /// applied the OuterLoop attribute + /// + public class ConditionalOuterLoopTestsDiscoverer : ITraitDiscoverer + { + /// + /// Gets the trait values from the Category attribute. + /// + /// The trait attribute containing the trait values. + /// The trait values. + public IEnumerable> GetTraits(IAttributeInfo traitAttribute) + { + IEnumerable ctorArgs = traitAttribute.GetConstructorArguments(); + if (ctorArgs.Count() <= 2) + { + return new[] { new KeyValuePair(XunitConstants.Category, XunitConstants.OuterLoop) }; + } + return DiscovererHelpers.EvaluateArguments(ctorArgs, XunitConstants.OuterLoop); + } + } +} diff --git a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs index 4981ba5d643..36785c328e6 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs @@ -13,6 +13,7 @@ public class ConditionalAttributeTests // This test class is test order dependent so do not rename the tests. // If new tests need to be added, follow the same naming pattern ConditionalAttribute{LetterToOrderTest} and then add a Validate{TestName}. + private static bool s_conditionalOuterLoop; private static bool s_conditionalFactExecuted; private static int s_conditionalTheoryCount; @@ -24,6 +25,13 @@ public void ConditionalAttributeA() s_conditionalFactExecuted = true; } + [Fact] + [ConditionalOuterLoop("never outer loop", TestPlatforms.Any & ~TestPlatforms.Any)] + public void ConditionalOuterLoopAttribute() + { + s_conditionalOuterLoop = true; + } + [ConditionalTheory(nameof(AlwaysTrue))] [InlineData(1)] [InlineData(2)] @@ -41,6 +49,12 @@ public void ValidateConditionalFact() Assert.True(s_conditionalFactExecuted); } + [Fact] + public void ValidateConditionalOuterLoop() + { + Assert.True(s_conditionalOuterLoop); + } + [Fact] public void ValidateConditionalTheory() { From 72d52cb699c93d2937cfa3b1b8d4f2eb6881656f Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Tue, 11 May 2021 17:07:12 +0200 Subject: [PATCH 2/6] fix --- .../src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs index 7874a6a82a3..dd4fe18e56c 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs @@ -5,6 +5,7 @@ using Xunit.Abstractions; using Xunit.Sdk; using System.Linq; +using System.Diagnostics; namespace Microsoft.DotNet.XUnitExtensions { @@ -22,10 +23,6 @@ public class ConditionalOuterLoopTestsDiscoverer : ITraitDiscoverer public IEnumerable> GetTraits(IAttributeInfo traitAttribute) { IEnumerable ctorArgs = traitAttribute.GetConstructorArguments(); - if (ctorArgs.Count() <= 2) - { - return new[] { new KeyValuePair(XunitConstants.Category, XunitConstants.OuterLoop) }; - } return DiscovererHelpers.EvaluateArguments(ctorArgs, XunitConstants.OuterLoop); } } From 09d9f29a008f480b9d48974aa14de408d8607325 Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Wed, 12 May 2021 12:39:21 +0200 Subject: [PATCH 3/6] typo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Alexander Köplinger --- .../src/Attributes/ConditionalOuterLoopAttribute.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs index 951669817a1..f1f99a4f19f 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs @@ -20,7 +20,7 @@ public ConditionalOuterLoopAttribute(string reason, TestPlatforms platforms) { } public ConditionalOuterLoopAttribute(string reason, TargetFrameworkMonikers framework) { } public ConditionalOuterLoopAttribute(string reason, TestRuntimes runtimes) { } public ConditionalOuterLoopAttribute(string reason, TestPlatforms platforms = TestPlatforms.Any, TargetFrameworkMonikers framework = TargetFrameworkMonikers.Any, TestRuntimes runtimes = TestRuntimes.Any) { } - public ConditionalOuterLoopAttribute(string isreasonsue, Type calleeType, params string[] conditionMemberNames) + public ConditionalOuterLoopAttribute(string reason, Type calleeType, params string[] conditionMemberNames) { CalleeType = calleeType; ConditionMemberNames = conditionMemberNames; From 4331b0acdd32a56470452c6d0843703eceff7601 Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Wed, 12 May 2021 18:32:17 +0200 Subject: [PATCH 4/6] unified into existing [OuterLoop] attribute --- .../ConditionalOuterLoopAttribute.cs | 29 ------------------- .../src/Attributes/OuterLoopAttribute.cs | 12 ++++++++ .../ConditionalOuterLoopTestsDiscoverer.cs | 29 ------------------- .../Discoverers/OuterLoopTestsDiscoverer.cs | 8 ++++- .../tests/ConditionalAttributeTests.cs | 2 +- 5 files changed, 20 insertions(+), 60 deletions(-) delete mode 100644 src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs delete mode 100644 src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs deleted file mode 100644 index f1f99a4f19f..00000000000 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/ConditionalOuterLoopAttribute.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System; -using Xunit.Sdk; - -namespace Xunit -{ - /// - /// Apply this attribute to your test method to specify a outer-loop category. - /// - [TraitDiscoverer("Microsoft.DotNet.XUnitExtensions.ConditionalOuterLoopTestsDiscoverer", "Microsoft.DotNet.XUnitExtensions")] - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] - public class ConditionalOuterLoopAttribute : Attribute, ITraitAttribute - { - public Type CalleeType { get; private set; } - public string[] ConditionMemberNames { get; private set; } - - public ConditionalOuterLoopAttribute(string reason, TestPlatforms platforms) { } - public ConditionalOuterLoopAttribute(string reason, TargetFrameworkMonikers framework) { } - public ConditionalOuterLoopAttribute(string reason, TestRuntimes runtimes) { } - public ConditionalOuterLoopAttribute(string reason, TestPlatforms platforms = TestPlatforms.Any, TargetFrameworkMonikers framework = TargetFrameworkMonikers.Any, TestRuntimes runtimes = TestRuntimes.Any) { } - public ConditionalOuterLoopAttribute(string reason, Type calleeType, params string[] conditionMemberNames) - { - CalleeType = calleeType; - ConditionMemberNames = conditionMemberNames; - } - } -} diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs index 753c4531876..a444463bc22 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Attributes/OuterLoopAttribute.cs @@ -13,7 +13,19 @@ namespace Xunit [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = true)] public class OuterLoopAttribute : Attribute, ITraitAttribute { + public Type CalleeType { get; private set; } + public string[] ConditionMemberNames { get; private set; } + public OuterLoopAttribute() { } public OuterLoopAttribute(string reason) { } + public OuterLoopAttribute(string reason, TestPlatforms platforms) { } + public OuterLoopAttribute(string reason, TargetFrameworkMonikers framework) { } + public OuterLoopAttribute(string reason, TestRuntimes runtimes) { } + public OuterLoopAttribute(string reason, TestPlatforms platforms = TestPlatforms.Any, TargetFrameworkMonikers framework = TargetFrameworkMonikers.Any, TestRuntimes runtimes = TestRuntimes.Any) { } + public OuterLoopAttribute(string reason, Type calleeType, params string[] conditionMemberNames) + { + CalleeType = calleeType; + ConditionMemberNames = conditionMemberNames; + } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs deleted file mode 100644 index dd4fe18e56c..00000000000 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/ConditionalOuterLoopTestsDiscoverer.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -using System.Collections.Generic; -using Xunit.Abstractions; -using Xunit.Sdk; -using System.Linq; -using System.Diagnostics; - -namespace Microsoft.DotNet.XUnitExtensions -{ - /// - /// This class discovers all of the tests and test classes that have - /// applied the OuterLoop attribute - /// - public class ConditionalOuterLoopTestsDiscoverer : ITraitDiscoverer - { - /// - /// Gets the trait values from the Category attribute. - /// - /// The trait attribute containing the trait values. - /// The trait values. - public IEnumerable> GetTraits(IAttributeInfo traitAttribute) - { - IEnumerable ctorArgs = traitAttribute.GetConstructorArguments(); - return DiscovererHelpers.EvaluateArguments(ctorArgs, XunitConstants.OuterLoop); - } - } -} diff --git a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs index b7672c43c96..22c829fb0e4 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/src/Discoverers/OuterLoopTestsDiscoverer.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; +using System.Linq; using Xunit.Abstractions; using Xunit.Sdk; @@ -20,7 +21,12 @@ public class OuterLoopTestsDiscoverer : ITraitDiscoverer /// The trait values. public IEnumerable> GetTraits(IAttributeInfo traitAttribute) { - yield return new KeyValuePair(XunitConstants.Category, XunitConstants.OuterLoop); + IEnumerable ctorArgs = traitAttribute.GetConstructorArguments(); + if (ctorArgs.Count() < 2) + { + return new[] { new KeyValuePair(XunitConstants.Category, XunitConstants.OuterLoop) }; + } + return DiscovererHelpers.EvaluateArguments(ctorArgs, XunitConstants.OuterLoop); } } } diff --git a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs index 36785c328e6..62a15d2b8de 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs @@ -26,7 +26,7 @@ public void ConditionalAttributeA() } [Fact] - [ConditionalOuterLoop("never outer loop", TestPlatforms.Any & ~TestPlatforms.Any)] + [OuterLoop("never outer loop", TestPlatforms.Any & ~TestPlatforms.Any)] public void ConditionalOuterLoopAttribute() { s_conditionalOuterLoop = true; From 36016296ca290e2a521ab709f34fe4a7824e098b Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Wed, 12 May 2021 19:26:58 +0200 Subject: [PATCH 5/6] improved testing --- .../tests/ConditionalAttributeTests.cs | 45 +++++++++++++++---- 1 file changed, 36 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs index 62a15d2b8de..dcc3ef7f75f 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs @@ -2,6 +2,9 @@ // The .NET Foundation licenses this file to you under the MIT license. using Xunit; +using System.Linq; +using Xunit.Sdk; +using System.Reflection; namespace Microsoft.DotNet.XUnitExtensions.Tests { @@ -13,7 +16,6 @@ public class ConditionalAttributeTests // This test class is test order dependent so do not rename the tests. // If new tests need to be added, follow the same naming pattern ConditionalAttribute{LetterToOrderTest} and then add a Validate{TestName}. - private static bool s_conditionalOuterLoop; private static bool s_conditionalFactExecuted; private static int s_conditionalTheoryCount; @@ -27,9 +29,40 @@ public void ConditionalAttributeA() [Fact] [OuterLoop("never outer loop", TestPlatforms.Any & ~TestPlatforms.Any)] - public void ConditionalOuterLoopAttribute() + public void NeverConditionalOuterLoopAttribute() { - s_conditionalOuterLoop = true; + var method = System.Reflection.MethodBase.GetCurrentMethod(); + var attribute = CustomAttributeData.GetCustomAttributes(method).Where(attr => attr.AttributeType == typeof(OuterLoopAttribute)).Single(); + var disco = new OuterLoopTestsDiscoverer(); + var res = disco.GetTraits(new ReflectionAttributeInfo(attribute)).ToList(); + + Assert.Empty(res); + } + + [Fact] + [OuterLoop("always outer loop", TestPlatforms.Any)] + public void AlwaysConditionalOuterLoopAttribute() + { + var method = System.Reflection.MethodBase.GetCurrentMethod(); + var attribute = CustomAttributeData.GetCustomAttributes(method).Where(attr => attr.AttributeType == typeof(OuterLoopAttribute)).Single(); + var disco = new OuterLoopTestsDiscoverer(); + var res = disco.GetTraits(new ReflectionAttributeInfo(attribute)).ToList(); + + Assert.Single(res); + Assert.Equal("outerloop", res[0].Value); + } + + [Fact] + [OuterLoop("always outer loop")] + public void AlwaysOuterLoopAttribute() + { + var method = System.Reflection.MethodBase.GetCurrentMethod(); + var attribute = CustomAttributeData.GetCustomAttributes(method).Where(attr => attr.AttributeType == typeof(OuterLoopAttribute)).Single(); + var disco = new OuterLoopTestsDiscoverer(); + var res = disco.GetTraits(new ReflectionAttributeInfo(attribute)).ToList(); + + Assert.Single(res); + Assert.Equal("outerloop", res[0].Value); } [ConditionalTheory(nameof(AlwaysTrue))] @@ -49,12 +82,6 @@ public void ValidateConditionalFact() Assert.True(s_conditionalFactExecuted); } - [Fact] - public void ValidateConditionalOuterLoop() - { - Assert.True(s_conditionalOuterLoop); - } - [Fact] public void ValidateConditionalTheory() { From 474ac91e3d1150e46df7c671096626aba2e3a79b Mon Sep 17 00:00:00 2001 From: Pavel Savara Date: Thu, 13 May 2021 09:27:24 +0200 Subject: [PATCH 6/6] code review feedback --- .../tests/ConditionalAttributeTests.cs | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs index dcc3ef7f75f..3624a069c9c 100644 --- a/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs +++ b/src/Microsoft.DotNet.XUnitExtensions/tests/ConditionalAttributeTests.cs @@ -2,9 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using Xunit; -using System.Linq; using Xunit.Sdk; -using System.Reflection; namespace Microsoft.DotNet.XUnitExtensions.Tests { @@ -32,9 +30,7 @@ public void ConditionalAttributeA() public void NeverConditionalOuterLoopAttribute() { var method = System.Reflection.MethodBase.GetCurrentMethod(); - var attribute = CustomAttributeData.GetCustomAttributes(method).Where(attr => attr.AttributeType == typeof(OuterLoopAttribute)).Single(); - var disco = new OuterLoopTestsDiscoverer(); - var res = disco.GetTraits(new ReflectionAttributeInfo(attribute)).ToList(); + var res = TraitHelper.GetTraits(method); Assert.Empty(res); } @@ -44,9 +40,7 @@ public void NeverConditionalOuterLoopAttribute() public void AlwaysConditionalOuterLoopAttribute() { var method = System.Reflection.MethodBase.GetCurrentMethod(); - var attribute = CustomAttributeData.GetCustomAttributes(method).Where(attr => attr.AttributeType == typeof(OuterLoopAttribute)).Single(); - var disco = new OuterLoopTestsDiscoverer(); - var res = disco.GetTraits(new ReflectionAttributeInfo(attribute)).ToList(); + var res = TraitHelper.GetTraits(method); Assert.Single(res); Assert.Equal("outerloop", res[0].Value); @@ -57,9 +51,7 @@ public void AlwaysConditionalOuterLoopAttribute() public void AlwaysOuterLoopAttribute() { var method = System.Reflection.MethodBase.GetCurrentMethod(); - var attribute = CustomAttributeData.GetCustomAttributes(method).Where(attr => attr.AttributeType == typeof(OuterLoopAttribute)).Single(); - var disco = new OuterLoopTestsDiscoverer(); - var res = disco.GetTraits(new ReflectionAttributeInfo(attribute)).ToList(); + var res = TraitHelper.GetTraits(method); Assert.Single(res); Assert.Equal("outerloop", res[0].Value);