From e8357e6ae47247a08b8898e26593b94a1345fa48 Mon Sep 17 00:00:00 2001 From: Jorrit Date: Sun, 14 Apr 2024 15:36:17 +0200 Subject: [PATCH 1/2] Added enumeration predicates and conditions because enumerations are also seen as classes. --- src/NetArchTest.Rules/Conditions.cs | 20 +++++++++++++ src/NetArchTest.Rules/FunctionDelegates.cs | 10 +++++++ src/NetArchTest.Rules/Predicates.cs | 20 +++++++++++++ .../ConditionTests.cs | 30 +++++++++++++++++++ .../PredicateTests.cs | 30 +++++++++++++++++++ .../Classes/ExampleEnum.cs | 6 ++++ .../Enumerations/ExampleEnum.cs | 6 ++++ .../Enumerations/FlagEnum.cs | 9 ++++++ .../Enumerations/NoEnum.cs | 6 ++++ 9 files changed, 137 insertions(+) create mode 100644 test/NetArchTest.TestStructure/Classes/ExampleEnum.cs create mode 100644 test/NetArchTest.TestStructure/Enumerations/ExampleEnum.cs create mode 100644 test/NetArchTest.TestStructure/Enumerations/FlagEnum.cs create mode 100644 test/NetArchTest.TestStructure/Enumerations/NoEnum.cs diff --git a/src/NetArchTest.Rules/Conditions.cs b/src/NetArchTest.Rules/Conditions.cs index 0d36634..db7ebea 100644 --- a/src/NetArchTest.Rules/Conditions.cs +++ b/src/NetArchTest.Rules/Conditions.cs @@ -717,5 +717,25 @@ public ConditionList MeetCustomRule(ICustomRule rule) _sequence.AddFunctionCall(FunctionDelegates.MeetCustomRule, rule, true); return new ConditionList(_types, _should, _sequence); } + + /// + /// Selects types that are enumerations. + /// + /// An updated set of conditions that can be applied to a list of types. + public ConditionList BeEnums() + { + _sequence.AddFunctionCall(FunctionDelegates.BeEnum, true, true); + return new ConditionList(_types, _should, _sequence); + } + + /// + /// Selects types that are not enumerations. + /// + /// An updated set of conditions that can be applied to a list of types. + public ConditionList NotBeEnums() + { + _sequence.AddFunctionCall(FunctionDelegates.BeEnum, true, false); + return new ConditionList(_types, _should, _sequence); + } } } diff --git a/src/NetArchTest.Rules/FunctionDelegates.cs b/src/NetArchTest.Rules/FunctionDelegates.cs index 9bbe775..f4c5101 100644 --- a/src/NetArchTest.Rules/FunctionDelegates.cs +++ b/src/NetArchTest.Rules/FunctionDelegates.cs @@ -322,5 +322,15 @@ bool ClassIsStatic(TypeDefinition c) => { return input.Where(t => rule.MeetsRule(t) == condition); }; + + + /// + /// Function for finding enumerations. + /// + internal static readonly FunctionDelegate BeEnum = + delegate (IEnumerable input, bool dummy, bool condition) + { + return input.Where(c => c.IsEnum == condition); + }; } } \ No newline at end of file diff --git a/src/NetArchTest.Rules/Predicates.cs b/src/NetArchTest.Rules/Predicates.cs index 5d53570..5bb2b1e 100644 --- a/src/NetArchTest.Rules/Predicates.cs +++ b/src/NetArchTest.Rules/Predicates.cs @@ -734,5 +734,25 @@ public PredicateList MeetCustomRule(ICustomRule rule) _sequence.AddFunctionCall(FunctionDelegates.MeetCustomRule, rule, true); return new PredicateList(_types, _sequence); } + + /// + /// Selects types that are enumerations. + /// + /// An updated set of predicates that can be applied to a list of types. + public PredicateList AreEnums() + { + _sequence.AddFunctionCall(FunctionDelegates.BeEnum, true, true); + return new PredicateList(_types, _sequence); + } + + /// + /// Selects types that are not enumerations. + /// + /// An updated set of predicates that can be applied to a list of types. + public PredicateList AreNotEnums() + { + _sequence.AddFunctionCall(FunctionDelegates.BeEnum, true, false); + return new PredicateList(_types, _sequence); + } } } diff --git a/test/NetArchTest.Rules.UnitTests/ConditionTests.cs b/test/NetArchTest.Rules.UnitTests/ConditionTests.cs index 77bbad5..295c204 100644 --- a/test/NetArchTest.Rules.UnitTests/ConditionTests.cs +++ b/test/NetArchTest.Rules.UnitTests/ConditionTests.cs @@ -984,5 +984,35 @@ public void MeetCustomRule_MatchesFound_ClassSelected() // The custom rule was executed at least once Assert.True(rule.TestMethodCalled); } + + [Fact(DisplayName = "Types can be selected if they are enumerations.")] + public void AreEnums_MatchesFound_EnumsSelected() + { + var result = Types + .InAssembly(Assembly.GetAssembly(typeof(ClassA1))) + .That() + .ResideInNamespace("NetArchTest.TestStructure.Enumerations") + .And() + .DoNotHaveName("NoEnum") + .Should() + .BeEnums().GetResult(); + + Assert.True(result.IsSuccessful); + } + + [Fact(DisplayName = "Types can be selected if they are not enumerations.")] + public void AreNotEnums_MatchesFound_EnumsSelected() + { + var result = Types + .InAssembly(Assembly.GetAssembly(typeof(ClassA1))) + .That() + .ResideInNamespace("NetArchTest.TestStructure.Enumerations") + .And() + .HaveName("NoEnum") + .Should() + .NotBeEnums().GetResult(); + + Assert.True(result.IsSuccessful); + } } } diff --git a/test/NetArchTest.Rules.UnitTests/PredicateTests.cs b/test/NetArchTest.Rules.UnitTests/PredicateTests.cs index 6ccd57a..a5feb97 100644 --- a/test/NetArchTest.Rules.UnitTests/PredicateTests.cs +++ b/test/NetArchTest.Rules.UnitTests/PredicateTests.cs @@ -29,6 +29,7 @@ namespace NetArchTest.Rules.UnitTests using Xunit; using NetArchTest.TestStructure.Nullable; using NetArchTest.TestStructure.Dependencies.Examples; + using NetArchTest.TestStructure.Enumerations; public class PredicateTests { @@ -1096,5 +1097,34 @@ public void GetResult_Doesnt_Evaluate_Twice() Assert.True(customRule.TimesTimesCalled == 1); } + + [Fact(DisplayName = "Types can be selected if they are enumerations.")] + public void AreEnums_MatchesFound_EnumsSelected() + { + var result = Types + .InAssembly(Assembly.GetAssembly(typeof(ClassA1))) + .That() + .ResideInNamespace("NetArchTest.TestStructure.Enumerations") + .And() + .AreEnums().GetTypes(); + + Assert.Equal(2, result.Count()); // Two types found + Assert.Contains(typeof(ExampleEnum), result); + Assert.Contains(typeof(FlagEnum), result); + } + + [Fact(DisplayName = "Types can be selected if they are not enumerations.")] + public void AreNotEnums_MatchesFound_EnumsSelected() + { + var result = Types + .InAssembly(Assembly.GetAssembly(typeof(ClassA1))) + .That() + .ResideInNamespace("NetArchTest.TestStructure.Enumerations") + .And() + .AreNotEnums().GetTypes(); + + Assert.Single(result); // One type found + Assert.Contains(typeof(NoEnum), result); + } } } diff --git a/test/NetArchTest.TestStructure/Classes/ExampleEnum.cs b/test/NetArchTest.TestStructure/Classes/ExampleEnum.cs new file mode 100644 index 0000000..4d78609 --- /dev/null +++ b/test/NetArchTest.TestStructure/Classes/ExampleEnum.cs @@ -0,0 +1,6 @@ +namespace NetArchTest.TestStructure.Classes +{ + public enum ExampleEnum2 + { + } +} diff --git a/test/NetArchTest.TestStructure/Enumerations/ExampleEnum.cs b/test/NetArchTest.TestStructure/Enumerations/ExampleEnum.cs new file mode 100644 index 0000000..d8c2a8d --- /dev/null +++ b/test/NetArchTest.TestStructure/Enumerations/ExampleEnum.cs @@ -0,0 +1,6 @@ +namespace NetArchTest.TestStructure.Enumerations +{ + public enum ExampleEnum + { + } +} diff --git a/test/NetArchTest.TestStructure/Enumerations/FlagEnum.cs b/test/NetArchTest.TestStructure/Enumerations/FlagEnum.cs new file mode 100644 index 0000000..e34b182 --- /dev/null +++ b/test/NetArchTest.TestStructure/Enumerations/FlagEnum.cs @@ -0,0 +1,9 @@ +using System; + +namespace NetArchTest.TestStructure.Enumerations +{ + [Flags] + public enum FlagEnum + { + } +} diff --git a/test/NetArchTest.TestStructure/Enumerations/NoEnum.cs b/test/NetArchTest.TestStructure/Enumerations/NoEnum.cs new file mode 100644 index 0000000..b09682d --- /dev/null +++ b/test/NetArchTest.TestStructure/Enumerations/NoEnum.cs @@ -0,0 +1,6 @@ +namespace NetArchTest.TestStructure.Enumerations +{ + public class NoEnum + { + } +} From e1e1a11651dff82d74e116383708e68c362bb3c3 Mon Sep 17 00:00:00 2001 From: Jorrit Date: Sun, 14 Apr 2024 16:04:52 +0200 Subject: [PATCH 2/2] Some cleaning up. --- src/NetArchTest.Rules/FunctionDelegates.cs | 1 - test/NetArchTest.TestStructure/Classes/ExampleEnum.cs | 6 ------ 2 files changed, 7 deletions(-) delete mode 100644 test/NetArchTest.TestStructure/Classes/ExampleEnum.cs diff --git a/src/NetArchTest.Rules/FunctionDelegates.cs b/src/NetArchTest.Rules/FunctionDelegates.cs index f4c5101..72e54c7 100644 --- a/src/NetArchTest.Rules/FunctionDelegates.cs +++ b/src/NetArchTest.Rules/FunctionDelegates.cs @@ -323,7 +323,6 @@ bool ClassIsStatic(TypeDefinition c) => return input.Where(t => rule.MeetsRule(t) == condition); }; - /// /// Function for finding enumerations. /// diff --git a/test/NetArchTest.TestStructure/Classes/ExampleEnum.cs b/test/NetArchTest.TestStructure/Classes/ExampleEnum.cs deleted file mode 100644 index 4d78609..0000000 --- a/test/NetArchTest.TestStructure/Classes/ExampleEnum.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace NetArchTest.TestStructure.Classes -{ - public enum ExampleEnum2 - { - } -}