diff --git a/ArchUnit.sln.DotSettings b/ArchUnit.sln.DotSettings index f430f615e..7a18ebc4f 100644 --- a/ArchUnit.sln.DotSettings +++ b/ArchUnit.sln.DotSettings @@ -4,12 +4,13 @@ Required Required Copyright 2019 Florian Gather <florian.gather@tngtech.com> - Copyright 2019 Paula Ruiz <paularuiz22@gmail.com> Copyright 2019 Fritz Brandhuber <fritz.brandhuber@tngtech.com> + Copyright 2020 Pavel Fischer <rubbiroid@gmail.com> SPDX-License-Identifier: Apache-2.0 False + True True True diff --git a/ArchUnitNET.NUnit/ArchRuleAssert.cs b/ArchUnitNET.NUnit/ArchRuleAssert.cs index dcae9c895..45ba19840 100644 --- a/ArchUnitNET.NUnit/ArchRuleAssert.cs +++ b/ArchUnitNET.NUnit/ArchRuleAssert.cs @@ -20,9 +20,9 @@ public static class ArchRuleAssert /// The rule to test the architecture with public static void FulfilsRule(Architecture architecture, IArchRule archRule) { - if (!architecture.FulfilsRule(archRule)) + if (!archRule.HasNoViolations(architecture)) { - Assert.Fail(architecture.EvaluateRule(archRule).ToErrorMessage()); + Assert.Fail(archRule.Evaluate(architecture).ToErrorMessage()); } } } diff --git a/ArchUnitNET.NUnitTests/RuleEvaluationTests.cs b/ArchUnitNET.NUnitTests/RuleEvaluationTests.cs index 257d2b09e..2379d2fc7 100644 --- a/ArchUnitNET.NUnitTests/RuleEvaluationTests.cs +++ b/ArchUnitNET.NUnitTests/RuleEvaluationTests.cs @@ -4,10 +4,10 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.Core; using ArchUnitNET.Domain; using ArchUnitNET.Fluent; using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Loader; using ArchUnitNET.NUnit; using NUnit.Framework; using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ArchUnitNET.xUnit/Asserts/ArchRuleAsserts.cs b/ArchUnitNET.xUnit/Asserts/ArchRuleAsserts.cs index 91a2893a9..8769fa318 100644 --- a/ArchUnitNET.xUnit/Asserts/ArchRuleAsserts.cs +++ b/ArchUnitNET.xUnit/Asserts/ArchRuleAsserts.cs @@ -22,7 +22,7 @@ partial class Assert /// Thrown if the rule is violated public static void ArchRule(Architecture architecture, IArchRule archRule) { - if (!architecture.FulfilsRule(archRule)) + if (!archRule.HasNoViolations(architecture)) { throw new FailedArchRuleException(architecture, archRule); } diff --git a/ArchUnitNET.xUnit/Asserts/Sdk/Exceptions/FailedArchRuleException.cs b/ArchUnitNET.xUnit/Asserts/Sdk/Exceptions/FailedArchRuleException.cs index c7e1959c0..02c4fca35 100644 --- a/ArchUnitNET.xUnit/Asserts/Sdk/Exceptions/FailedArchRuleException.cs +++ b/ArchUnitNET.xUnit/Asserts/Sdk/Exceptions/FailedArchRuleException.cs @@ -20,7 +20,7 @@ public class FailedArchRuleException : XunitException /// The architecture which was tested /// The archrule that failed public FailedArchRuleException(Architecture architecture, IArchRule archRule) - : this(architecture.EvaluateRule(archRule)) + : this(archRule.Evaluate(architecture)) { } diff --git a/ArchUnitNET/ArchUnitNET.csproj b/ArchUnitNET/ArchUnitNET.csproj index a02db2cce..4cf525ee2 100644 --- a/ArchUnitNET/ArchUnitNET.csproj +++ b/ArchUnitNET/ArchUnitNET.csproj @@ -6,7 +6,7 @@ ArchUnitNET TngTech.ArchUnitNET ArchUnit C# - Florian Gather, Paula Ruiz, Fritz Brandhuber + Florian Gather, Paula Ruiz, Fritz Brandhuber, Pavel Fischer TNG Technology Consulting GmbH C# Version of ArchUnit (see: archunit.org) https://apache.org/licenses/LICENSE-2.0 diff --git a/ArchUnitNET/ArchitectureExceptions/ArchitectureException.cs b/ArchUnitNET/ArchitectureExceptions/ArchitectureException.cs deleted file mode 100644 index 9ab43bb72..000000000 --- a/ArchUnitNET/ArchitectureExceptions/ArchitectureException.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System; - -namespace ArchUnitNET.ArchitectureExceptions -{ - public class ArchitectureException : Exception - { - public ArchitectureException(string firstFullName) : base(firstFullName) - { - } - } -} \ No newline at end of file diff --git a/ArchUnitNET/Domain/Architecture.cs b/ArchUnitNET/Domain/Architecture.cs index a3b9b6be0..1f5ea465f 100644 --- a/ArchUnitNET/Domain/Architecture.cs +++ b/ArchUnitNET/Domain/Architecture.cs @@ -26,11 +26,8 @@ public Architecture(IEnumerable allAssemblies, IEnumerable } public IEnumerable Assemblies => _allAssemblies.Where(assembly => !assembly.IsOnlyReferenced); - public IEnumerable Namespaces { get; } - public IEnumerable Types { get; } - public IEnumerable Classes => Types.OfType(); public IEnumerable Interfaces => Types.OfType(); public IEnumerable Attributes => Types.OfType(); @@ -39,22 +36,12 @@ public Architecture(IEnumerable allAssemblies, IEnumerable public IEnumerable MethodMembers => Members.OfType(); public IEnumerable Members => Types.SelectMany(type => type.Members); - public bool FulfilsRule(IArchRule archRule) - { - return archRule.HasNoViolations(this); - } - public IEnumerable GetOrCreateObjects(IObjectProvider objectProvider, Func> providingFunction) where T : ICanBeAnalyzed { return _objectProviderCache.GetOrCreateObjects(objectProvider, providingFunction); } - public IEnumerable EvaluateRule(IArchRule archRule) - { - return archRule.Evaluate(this); - } - public override bool Equals(object obj) { if (ReferenceEquals(null, obj)) diff --git a/ArchUnitNET/Domain/ArchitectureCacheKey.cs b/ArchUnitNET/Domain/ArchitectureCacheKey.cs index efe48109c..9acfae4d2 100644 --- a/ArchUnitNET/Domain/ArchitectureCacheKey.cs +++ b/ArchUnitNET/Domain/ArchitectureCacheKey.cs @@ -7,7 +7,7 @@ using System; using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; namespace ArchUnitNET.Domain { diff --git a/ArchUnitNET/Domain/Class.cs b/ArchUnitNET/Domain/Class.cs index 6542f02bb..0b17f2a44 100644 --- a/ArchUnitNET/Domain/Class.cs +++ b/ArchUnitNET/Domain/Class.cs @@ -6,8 +6,8 @@ using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using JetBrains.Annotations; namespace ArchUnitNET.Domain @@ -101,7 +101,7 @@ public bool IsAssignableTo(IType assignableToType) public bool IsAssignableTo(string pattern, bool useRegularExpressions = false) { return pattern != null && this.GetAssignableTypes() - .Any(type => type.FullNameMatches(pattern, useRegularExpressions)); + .Any(type => type.FullNameMatches(pattern, useRegularExpressions)); } public override string ToString() diff --git a/ArchUnitNET/Domain/Dependencies/Members/AttributeMemberDependency.cs b/ArchUnitNET/Domain/Dependencies/AttributeMemberDependency.cs similarity index 97% rename from ArchUnitNET/Domain/Dependencies/Members/AttributeMemberDependency.cs rename to ArchUnitNET/Domain/Dependencies/AttributeMemberDependency.cs index 9f4a4fbd3..99e8736be 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/AttributeMemberDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/AttributeMemberDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public class AttributeMemberDependency : MemberwiseEquatable, IMemberTypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Types/AttributeTypeDependency.cs b/ArchUnitNET/Domain/Dependencies/AttributeTypeDependency.cs similarity index 92% rename from ArchUnitNET/Domain/Dependencies/Types/AttributeTypeDependency.cs rename to ArchUnitNET/Domain/Dependencies/AttributeTypeDependency.cs index e8f70e84a..f117f1c9a 100644 --- a/ArchUnitNET/Domain/Dependencies/Types/AttributeTypeDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/AttributeTypeDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Types +namespace ArchUnitNET.Domain.Dependencies { public class AttributeTypeDependency : MemberwiseEquatable, ITypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Members/BodyTypeMemberDependency.cs b/ArchUnitNET/Domain/Dependencies/BodyTypeMemberDependency.cs similarity index 97% rename from ArchUnitNET/Domain/Dependencies/Members/BodyTypeMemberDependency.cs rename to ArchUnitNET/Domain/Dependencies/BodyTypeMemberDependency.cs index 05bc396aa..58282c801 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/BodyTypeMemberDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/BodyTypeMemberDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public class BodyTypeMemberDependency : MemberwiseEquatable, IMemberTypeDependency diff --git a/ArchUnitNET/Domain/Dependencies/Members/FieldTypeDependency.cs b/ArchUnitNET/Domain/Dependencies/FieldTypeDependency.cs similarity index 97% rename from ArchUnitNET/Domain/Dependencies/Members/FieldTypeDependency.cs rename to ArchUnitNET/Domain/Dependencies/FieldTypeDependency.cs index 971af02ac..fe0927285 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/FieldTypeDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/FieldTypeDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public class FieldTypeDependency : MemberwiseEquatable, IMemberTypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Members/IMemberMemberDependency.cs b/ArchUnitNET/Domain/Dependencies/IMemberMemberDependency.cs similarity index 87% rename from ArchUnitNET/Domain/Dependencies/Members/IMemberMemberDependency.cs rename to ArchUnitNET/Domain/Dependencies/IMemberMemberDependency.cs index 530bfae84..cb0bf2ece 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/IMemberMemberDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/IMemberMemberDependency.cs @@ -4,7 +4,7 @@ // // SPDX-License-Identifier: Apache-2.0 -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public interface IMemberMemberDependency : IMemberTypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Members/IMemberTypeDependency.cs b/ArchUnitNET/Domain/Dependencies/IMemberTypeDependency.cs similarity index 78% rename from ArchUnitNET/Domain/Dependencies/Members/IMemberTypeDependency.cs rename to ArchUnitNET/Domain/Dependencies/IMemberTypeDependency.cs index b6d8e8047..95f770753 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/IMemberTypeDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/IMemberTypeDependency.cs @@ -4,9 +4,7 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.Domain.Dependencies.Types; - -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public interface IMemberTypeDependency : ITypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Types/ITypeDependency.cs b/ArchUnitNET/Domain/Dependencies/ITypeDependency.cs similarity index 87% rename from ArchUnitNET/Domain/Dependencies/Types/ITypeDependency.cs rename to ArchUnitNET/Domain/Dependencies/ITypeDependency.cs index 28e14b2e2..a1d22a9d9 100644 --- a/ArchUnitNET/Domain/Dependencies/Types/ITypeDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/ITypeDependency.cs @@ -4,7 +4,7 @@ // // SPDX-License-Identifier: Apache-2.0 -namespace ArchUnitNET.Domain.Dependencies.Types +namespace ArchUnitNET.Domain.Dependencies { public interface ITypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Types/ImplementsInterfaceDependency.cs b/ArchUnitNET/Domain/Dependencies/ImplementsInterfaceDependency.cs similarity index 92% rename from ArchUnitNET/Domain/Dependencies/Types/ImplementsInterfaceDependency.cs rename to ArchUnitNET/Domain/Dependencies/ImplementsInterfaceDependency.cs index dccdb5a32..c76243607 100644 --- a/ArchUnitNET/Domain/Dependencies/Types/ImplementsInterfaceDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/ImplementsInterfaceDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Types +namespace ArchUnitNET.Domain.Dependencies { public class ImplementsInterfaceDependency : MemberwiseEquatable, ITypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Types/InheritsBaseClassDependency.cs b/ArchUnitNET/Domain/Dependencies/InheritsBaseClassDependency.cs similarity index 92% rename from ArchUnitNET/Domain/Dependencies/Types/InheritsBaseClassDependency.cs rename to ArchUnitNET/Domain/Dependencies/InheritsBaseClassDependency.cs index 7869590c0..8c6c52c66 100644 --- a/ArchUnitNET/Domain/Dependencies/Types/InheritsBaseClassDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/InheritsBaseClassDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Types +namespace ArchUnitNET.Domain.Dependencies { public class InheritsBaseClassDependency : MemberwiseEquatable, ITypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Members/MethodCallDependency.cs b/ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs similarity index 96% rename from ArchUnitNET/Domain/Dependencies/Members/MethodCallDependency.cs rename to ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs index a332d9753..bc41be84a 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/MethodCallDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/MethodCallDependency.cs @@ -4,7 +4,7 @@ // // SPDX-License-Identifier: Apache-2.0 -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public class MethodCallDependency : IMemberMemberDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Members/MethodSignatureDependency.cs b/ArchUnitNET/Domain/Dependencies/MethodSignatureDependency.cs similarity index 97% rename from ArchUnitNET/Domain/Dependencies/Members/MethodSignatureDependency.cs rename to ArchUnitNET/Domain/Dependencies/MethodSignatureDependency.cs index 474611537..023fe27e9 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/MethodSignatureDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/MethodSignatureDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public class MethodSignatureDependency : MemberwiseEquatable, IMemberTypeDependency diff --git a/ArchUnitNET/Domain/Dependencies/Members/PropertyTypeDependency.cs b/ArchUnitNET/Domain/Dependencies/PropertyTypeDependency.cs similarity index 97% rename from ArchUnitNET/Domain/Dependencies/Members/PropertyTypeDependency.cs rename to ArchUnitNET/Domain/Dependencies/PropertyTypeDependency.cs index 27539403b..3d8ae5da0 100644 --- a/ArchUnitNET/Domain/Dependencies/Members/PropertyTypeDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/PropertyTypeDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Members +namespace ArchUnitNET.Domain.Dependencies { public class PropertyTypeDependency : MemberwiseEquatable, IMemberTypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Types/TypeReferenceDependency.cs b/ArchUnitNET/Domain/Dependencies/TypeReferenceDependency.cs similarity index 92% rename from ArchUnitNET/Domain/Dependencies/Types/TypeReferenceDependency.cs rename to ArchUnitNET/Domain/Dependencies/TypeReferenceDependency.cs index 7971ea459..ed35839f5 100644 --- a/ArchUnitNET/Domain/Dependencies/Types/TypeReferenceDependency.cs +++ b/ArchUnitNET/Domain/Dependencies/TypeReferenceDependency.cs @@ -6,7 +6,7 @@ using Equ; -namespace ArchUnitNET.Domain.Dependencies.Types +namespace ArchUnitNET.Domain.Dependencies { public class TypeReferenceDependency : MemberwiseEquatable, ITypeDependency { diff --git a/ArchUnitNET/Domain/Dependencies/Types/AttributeAssemblyDependency.cs b/ArchUnitNET/Domain/Dependencies/Types/AttributeAssemblyDependency.cs deleted file mode 100644 index 95b9b7112..000000000 --- a/ArchUnitNET/Domain/Dependencies/Types/AttributeAssemblyDependency.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using Equ; - -namespace ArchUnitNET.Domain.Dependencies.Types -{ - public class AttributeAssemblyDependency : MemberwiseEquatable - { -// public AttributeAssemblyDependency(Attribute origin, Assembly target) -// { -// Origin = origin; -// Target = target; -// } -// public Attribute Origin { get; } -// -// //what should the type of Target be to include assemblies and modules? -// public IType Target { get; } - } -} \ No newline at end of file diff --git a/ArchUnitNET/ArchitectureExceptions/AssemblyDoesNotExistInArchitecture.cs b/ArchUnitNET/Domain/Exceptions/AssemblyDoesNotExistInArchitecture.cs similarity index 67% rename from ArchUnitNET/ArchitectureExceptions/AssemblyDoesNotExistInArchitecture.cs rename to ArchUnitNET/Domain/Exceptions/AssemblyDoesNotExistInArchitecture.cs index 201746e58..2e1d71335 100644 --- a/ArchUnitNET/ArchitectureExceptions/AssemblyDoesNotExistInArchitecture.cs +++ b/ArchUnitNET/Domain/Exceptions/AssemblyDoesNotExistInArchitecture.cs @@ -6,17 +6,12 @@ using System; -namespace ArchUnitNET.ArchitectureExceptions +namespace ArchUnitNET.Domain.Exceptions { public class AssemblyDoesNotExistInArchitecture : Exception { public AssemblyDoesNotExistInArchitecture(string message) : base(message) { } - - public AssemblyDoesNotExistInArchitecture(string message, Exception innerException) : base(message, - innerException) - { - } } } \ No newline at end of file diff --git a/ArchUnitNET/ArchitectureExceptions/InvalidStateException.cs b/ArchUnitNET/Domain/Exceptions/InvalidStateException.cs similarity index 89% rename from ArchUnitNET/ArchitectureExceptions/InvalidStateException.cs rename to ArchUnitNET/Domain/Exceptions/InvalidStateException.cs index 00b3c33e8..fb856f72f 100644 --- a/ArchUnitNET/ArchitectureExceptions/InvalidStateException.cs +++ b/ArchUnitNET/Domain/Exceptions/InvalidStateException.cs @@ -6,7 +6,7 @@ using System; -namespace ArchUnitNET.ArchitectureExceptions +namespace ArchUnitNET.Domain.Exceptions { public class InvalidStateException : Exception { diff --git a/ArchUnitNET/ArchitectureExceptions/MultipleOccurrencesInSequenceException.cs b/ArchUnitNET/Domain/Exceptions/MultipleOccurrencesInSequenceException.cs similarity index 67% rename from ArchUnitNET/ArchitectureExceptions/MultipleOccurrencesInSequenceException.cs rename to ArchUnitNET/Domain/Exceptions/MultipleOccurrencesInSequenceException.cs index 78ea31114..f3c9f36ad 100644 --- a/ArchUnitNET/ArchitectureExceptions/MultipleOccurrencesInSequenceException.cs +++ b/ArchUnitNET/Domain/Exceptions/MultipleOccurrencesInSequenceException.cs @@ -6,17 +6,12 @@ using System; -namespace ArchUnitNET.ArchitectureExceptions +namespace ArchUnitNET.Domain.Exceptions { public class MultipleOccurrencesInSequenceException : Exception { public MultipleOccurrencesInSequenceException(string message) : base(message) { } - - public MultipleOccurrencesInSequenceException(string message, Exception innerException) : base(message, - innerException) - { - } } } \ No newline at end of file diff --git a/ArchUnitNET/ArchitectureExceptions/TypeDoesNotExistInArchitecture.cs b/ArchUnitNET/Domain/Exceptions/TypeDoesNotExistInArchitecture.cs similarity index 69% rename from ArchUnitNET/ArchitectureExceptions/TypeDoesNotExistInArchitecture.cs rename to ArchUnitNET/Domain/Exceptions/TypeDoesNotExistInArchitecture.cs index 28315ea82..ca1be47c1 100644 --- a/ArchUnitNET/ArchitectureExceptions/TypeDoesNotExistInArchitecture.cs +++ b/ArchUnitNET/Domain/Exceptions/TypeDoesNotExistInArchitecture.cs @@ -6,16 +6,12 @@ using System; -namespace ArchUnitNET.ArchitectureExceptions +namespace ArchUnitNET.Domain.Exceptions { public class TypeDoesNotExistInArchitecture : Exception { public TypeDoesNotExistInArchitecture(string message) : base(message) { } - - public TypeDoesNotExistInArchitecture(string message, Exception innerException) : base(message, innerException) - { - } } } \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Extensions/ArchitectureExtensions.cs b/ArchUnitNET/Domain/Extensions/ArchitectureExtensions.cs similarity index 96% rename from ArchUnitNET/Fluent/Extensions/ArchitectureExtensions.cs rename to ArchUnitNET/Domain/Extensions/ArchitectureExtensions.cs index 4d502fd1f..be9729e5e 100644 --- a/ArchUnitNET/Fluent/Extensions/ArchitectureExtensions.cs +++ b/ArchUnitNET/Domain/Extensions/ArchitectureExtensions.cs @@ -5,12 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 using System; -using ArchUnitNET.ArchitectureExceptions; -using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Exceptions; using JetBrains.Annotations; -using Attribute = ArchUnitNET.Domain.Attribute; -namespace ArchUnitNET.Fluent.Extensions +namespace ArchUnitNET.Domain.Extensions { public static class ArchitectureExtensions { diff --git a/ArchUnitNET/Domain/Extensions/AttributeExtensions.cs b/ArchUnitNET/Domain/Extensions/AttributeExtensions.cs new file mode 100644 index 000000000..cde988ae3 --- /dev/null +++ b/ArchUnitNET/Domain/Extensions/AttributeExtensions.cs @@ -0,0 +1,25 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Fritz Brandhuber +// Copyright 2020 Pavel Fischer +// +// SPDX-License-Identifier: Apache-2.0 +// + +using System.Linq; + +namespace ArchUnitNET.Domain.Extensions +{ + public static class AttributeExtensions + { + public static bool HasAttribute(this IHasAttributes a, string pattern, bool useRegularExpressions = false) + { + return a.Attributes.Any(attribute => attribute.FullNameMatches(pattern, useRegularExpressions)); + } + + public static bool OnlyHasAttributes(this IHasAttributes a, string pattern, bool useRegularExpressions = false) + { + return a.Attributes.IsNullOrEmpty() || + a.Attributes.All(attribute => attribute.FullNameMatches(pattern, useRegularExpressions)); + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Domain/Extensions/DependencyExtensions.cs b/ArchUnitNET/Domain/Extensions/DependencyExtensions.cs new file mode 100644 index 000000000..6a6f03967 --- /dev/null +++ b/ArchUnitNET/Domain/Extensions/DependencyExtensions.cs @@ -0,0 +1,56 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Fritz Brandhuber +// Copyright 2020 Pavel Fischer +// +// SPDX-License-Identifier: Apache-2.0 +// + +using System.Collections.Generic; +using System.Linq; +using ArchUnitNET.Domain.Dependencies; + +namespace ArchUnitNET.Domain.Extensions +{ + public static class DependencyExtensions + { + public static bool CallsMethod(this IHasDependencies type, string pattern, bool useRegularExpressions = false) + { + return type.GetCalledMethods().Any(member => member.FullNameMatches(pattern, useRegularExpressions)); + } + + public static IEnumerable GetCalledMethods(this IHasDependencies type) + { + return type.Dependencies.OfType() + .Select(dependency => (MethodMember) dependency.TargetMember); + } + + public static bool DependsOn(this IHasDependencies c, string pattern, bool useRegularExpressions = false) + { + return c.GetTypeDependencies().Any(d => d.FullNameMatches(pattern, useRegularExpressions)); + } + + + public static bool OnlyDependsOn(this IHasDependencies c, string pattern, bool useRegularExpressions = false) + { + return c.GetTypeDependencies().All(d => d.FullNameMatches(pattern, useRegularExpressions)); + } + + public static IEnumerable GetTypeDependencies(this IHasDependencies c) + { + return c.Dependencies.Select(dependency => dependency.Target); + } + + public static IEnumerable GetTypeDependencies(this IHasDependencies c, Architecture architecture) + { + return c.Dependencies.Select(dependency => dependency.Target).Intersect(architecture.Types); + } + + public static IEnumerable GetFieldTypeDependencies(this IHasDependencies type, + bool getBackwardsDependencies = false) + { + return getBackwardsDependencies + ? type.BackwardsDependencies.OfType() + : type.Dependencies.OfType(); + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Domain/Extensions/EnumerableExtensions.cs b/ArchUnitNET/Domain/Extensions/EnumerableExtensions.cs new file mode 100644 index 000000000..3f28d866a --- /dev/null +++ b/ArchUnitNET/Domain/Extensions/EnumerableExtensions.cs @@ -0,0 +1,28 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Paula Ruiz +// Copyright 2019 Fritz Brandhuber +// +// SPDX-License-Identifier: Apache-2.0 + +using System; +using System.Collections.Generic; +using System.Linq; + +namespace ArchUnitNET.Domain.Extensions +{ + public static class EnumerableExtensions + { + public static void ForEach(this IEnumerable source, Action action) + { + foreach (var element in source) + { + action(element); + } + } + + public static bool IsNullOrEmpty(this IEnumerable source) + { + return source == null || !source.Any(); + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Extensions/MemberExtensions.cs b/ArchUnitNET/Domain/Extensions/MemberExtensions.cs similarity index 83% rename from ArchUnitNET/Fluent/Extensions/MemberExtensions.cs rename to ArchUnitNET/Domain/Extensions/MemberExtensions.cs index 35bbbade9..ceebd354c 100644 --- a/ArchUnitNET/Fluent/Extensions/MemberExtensions.cs +++ b/ArchUnitNET/Domain/Extensions/MemberExtensions.cs @@ -6,11 +6,9 @@ using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; -namespace ArchUnitNET.Fluent.Extensions +namespace ArchUnitNET.Domain.Extensions { public static class MemberExtensions { @@ -69,14 +67,6 @@ public static bool HasDependencyInMethodBodyTo(this MethodMember member, string dependency.Target.FullNameMatches(pattern, useRegularExpressions)); } - public static IEnumerable GetFieldTypeDependencies(this IHasDependencies type, - bool getBackwardsDependencies = false) - { - return getBackwardsDependencies - ? type.BackwardsDependencies.OfType() - : type.Dependencies.OfType(); - } - public static bool HasFieldTypeDependencies(this IMember member, bool getBackwardsDependencies = false) { return member.GetFieldTypeDependencies(getBackwardsDependencies).Any(); @@ -87,14 +77,6 @@ public static Attribute GetAttributeFromMember(this IMember member, Class attrib return member.Attributes.Find(attribute => attribute.FullName.Equals(attributeClass.FullName)); } - public static IEnumerable GetAttributeMemberDependencies( - this IHasDependencies member, bool getBackwardsDependencies = false) - { - return getBackwardsDependencies - ? member.BackwardsDependencies.OfType() - : member.Dependencies.OfType(); - } - public static bool HasMethodSignatureDependency(this IMember member, MethodSignatureDependency methodSignatureDependency, bool getBackwardsDependencies = false) { diff --git a/ArchUnitNET/Domain/Extensions/NamingExtensions.cs b/ArchUnitNET/Domain/Extensions/NamingExtensions.cs new file mode 100644 index 000000000..110eecc8c --- /dev/null +++ b/ArchUnitNET/Domain/Extensions/NamingExtensions.cs @@ -0,0 +1,81 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Fritz Brandhuber +// Copyright 2020 Pavel Fischer +// +// SPDX-License-Identifier: Apache-2.0 +// + +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; +using ArchUnitNET.Domain.Exceptions; +using JetBrains.Annotations; + +namespace ArchUnitNET.Domain.Extensions +{ + public static class NamingExtensions + { + public static bool NameEndsWith(this IHasName cls, string pattern) + { + return cls.Name.ToLower().EndsWith(pattern.ToLower()); + } + + public static bool NameStartsWith(this IHasName cls, string pattern) + { + return cls.Name.ToLower().StartsWith(pattern.ToLower()); + } + + public static bool NameContains(this IHasName cls, string pattern) + { + return pattern != null && cls.Name.ToLower().Contains(pattern.ToLower()); + } + + public static bool NameMatches(this IHasName cls, string pattern, bool useRegularExpressions = false) + { + if (useRegularExpressions) + { + return pattern != null && Regex.IsMatch(cls.Name, pattern); + } + + return cls.NameContains(pattern); + } + + public static bool FullNameMatches(this IHasName cls, string pattern, bool useRegularExpressions = false) + { + if (useRegularExpressions) + { + return pattern != null && Regex.IsMatch(cls.FullName, pattern); + } + + return cls.FullNameContains(pattern); + } + + public static bool FullNameContains(this IHasName cls, string pattern) + { + return pattern != null && cls.FullName.ToLower().Contains(pattern.ToLower()); + } + + [NotNull] + public static IEnumerable WhereNameIs(this IEnumerable source, string name) + where TType : IHasName + { + return source.Where(hasName => hasName.Name == name); + } + + [CanBeNull] + public static TType WhereFullNameIs(this IEnumerable source, string fullName) + where TType : IHasName + { + var withFullName = source.Where(type => type.FullName == fullName).ToList(); + + if (withFullName.Count > 1) + { + throw new MultipleOccurrencesInSequenceException( + $"Full name {fullName} found multiple times in provided types. Please use extern " + + "alias to reference assemblies that have the same fully-qualified type names."); + } + + return withFullName.FirstOrDefault(); + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Extensions/NullableExtensions.cs b/ArchUnitNET/Domain/Extensions/NullableExtensions.cs similarity index 86% rename from ArchUnitNET/Fluent/Extensions/NullableExtensions.cs rename to ArchUnitNET/Domain/Extensions/NullableExtensions.cs index 48234e8b7..b582f67d2 100644 --- a/ArchUnitNET/Fluent/Extensions/NullableExtensions.cs +++ b/ArchUnitNET/Domain/Extensions/NullableExtensions.cs @@ -4,9 +4,9 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.ArchitectureExceptions; +using ArchUnitNET.Domain.Exceptions; -namespace ArchUnitNET.Fluent.Extensions +namespace ArchUnitNET.Domain.Extensions { public static class NullableExtensions { diff --git a/ArchUnitNET/Domain/Extensions/TypeExtensions.cs b/ArchUnitNET/Domain/Extensions/TypeExtensions.cs new file mode 100644 index 000000000..df73463f5 --- /dev/null +++ b/ArchUnitNET/Domain/Extensions/TypeExtensions.cs @@ -0,0 +1,189 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Paula Ruiz +// Copyright 2019 Fritz Brandhuber +// +// SPDX-License-Identifier: Apache-2.0 + +using System.Collections.Generic; +using System.Linq; +using ArchUnitNET.Domain.Dependencies; + +namespace ArchUnitNET.Domain.Extensions +{ + public static class TypeExtensions + { + public static IEnumerable> SlicedBy(this IEnumerable source, string fullName) + { + return source.GroupBy(type => type.FullName) + .Select(sliceItems => new Slice(sliceItems.Key, sliceItems.ToList())); + } + + public static IEnumerable GetAssignableTypes(this IType type) + { + switch (type) + { + case Interface intf: + return intf.ImplementedInterfaces.Append(intf); + case Class cls: + return cls.InheritedClasses.Append(cls).Concat(cls.ImplementedInterfaces); + default: + return Enumerable.Empty(); + } + } + + public static IEnumerable GetPropertyMembersWithName(this IType type, string name) + { + return type.GetPropertyMembers().WhereNameIs(name); + } + + public static bool HasPropertyMemberWithName(this IType type, string name) + { + return !type.GetPropertyMembersWithName(name).IsNullOrEmpty(); + } + + public static IEnumerable GetFieldMembersWithName(this IType type, string name) + { + return type.GetFieldMembers().WhereNameIs(name); + } + + public static bool HasFieldMemberWithName(this IType type, string name) + { + return !type.GetFieldMembersWithName(name).IsNullOrEmpty(); + } + + public static IEnumerable GetMethodMembersWithName(this IType type, string name) + { + return type.GetMethodMembers().WhereNameIs(name); + } + + public static bool HasMethodMemberWithName(this IType type, string name) + { + return !type.GetMethodMembersWithName(name).IsNullOrEmpty(); + } + + public static IEnumerable GetMembersWithName(this IType type, string name) + { + return type.Members.WhereNameIs(name); + } + + public static bool HasMemberWithName(this IType type, string name) + { + return !type.GetMembersWithName(name).IsNullOrEmpty(); + } + + public static PropertyMember GetPropertyMemberWithFullName(this IType type, string fullName) + { + return type.GetPropertyMembers().WhereFullNameIs(fullName); + } + + public static bool HasPropertyMemberWithFullName(this IType type, string fullname) + { + return type.GetPropertyMemberWithFullName(fullname) != null; + } + + public static MethodMember GetMethodMemberWithFullName(this IType type, string fullName) + { + return type.GetMethodMembers().WhereFullNameIs(fullName); + } + + public static bool HasMethodMemberWithFullName(this IType type, string fullname) + { + return type.GetMethodMemberWithFullName(fullname) != null; + } + + public static FieldMember GetFieldMemberWithFullName(this IType type, string fullName) + { + return type.GetFieldMembers().WhereFullNameIs(fullName); + } + + public static bool HasFieldMemberWithFullName(this IType type, string fullname) + { + return type.GetFieldMemberWithFullName(fullname) != null; + } + + public static IMember GetMemberWithFullName(this IType type, string fullName) + { + return type.Members.WhereFullNameIs(fullName); + } + + public static bool HasMemberWithFullName(this IType type, string fullname) + { + return type.GetMemberWithFullName(fullname) != null; + } + + public static Attribute GetAttributeOfType(this IType type, Class attributeClass) + { + return type.Attributes.Find(attribute => attribute.FullName.Equals(attributeClass.FullName)); + } + + public static bool ResidesInNamespace(this IType e, string pattern, bool useRegularExpressions = false) + { + return e.Namespace.FullNameMatches(pattern, useRegularExpressions); + } + + public static bool ResidesInAssembly(this IType e, string pattern, bool useRegularExpressions = false) + { + return e.Assembly.FullNameMatches(pattern, useRegularExpressions); + } + + public static bool IsDeclaredAsFieldIn(this IType type, string pattern, bool useRegularExpressions = false) + { + return type.GetFieldTypeDependencies(true).Any(dependency => + dependency.Target.FullNameMatches(pattern, useRegularExpressions)); + } + + public static bool HasDependency(this IType type, ITypeDependency dependency) + { + return type.Dependencies.Contains(dependency); + } + + public static bool HasDependencies(this IType type, IEnumerable dependencies) + { + return dependencies.All(dependency => type.Dependencies.Contains(dependency)); + } + + public static IEnumerable GetPropertyMembers(this IType type) + { + return type.Members.OfType(); + } + + public static IEnumerable GetFieldMembers(this IType type) + { + return type.Members.OfType(); + } + + public static IEnumerable GetMethodMembers(this IType type) + { + return type.Members.OfType(); + } + + public static IEnumerable GetConstructors(this IType type) + { + return type.GetMethodMembers().Where(method => method.IsConstructor()); + } + + public static IEnumerable GetAttributeTypeDependencies(this IType type, + bool getBackwardsDependencies = false) + { + return getBackwardsDependencies + ? type.BackwardsDependencies.OfType() + : type.Dependencies.OfType(); + } + + public static IEnumerable GetImplementsInterfaceDependencies(this IType type, + bool getBackwardsDependencies = false) + { + return getBackwardsDependencies + ? type.BackwardsDependencies.OfType() + : type.Dependencies.OfType(); + } + + public static IEnumerable GetInheritsBaseClassDependencies(this IType type, + bool getBackwardsDependencies = false) + { + return getBackwardsDependencies + ? type.BackwardsDependencies.OfType() + : type.Dependencies.OfType(); + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Domain/FieldMember.cs b/ArchUnitNET/Domain/FieldMember.cs index 2ad9e63ff..144f5018e 100644 --- a/ArchUnitNET/Domain/FieldMember.cs +++ b/ArchUnitNET/Domain/FieldMember.cs @@ -5,8 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; namespace ArchUnitNET.Domain { diff --git a/ArchUnitNET/Domain/IHasDependencies.cs b/ArchUnitNET/Domain/IHasDependencies.cs index 195d4cb55..29fa98b34 100644 --- a/ArchUnitNET/Domain/IHasDependencies.cs +++ b/ArchUnitNET/Domain/IHasDependencies.cs @@ -5,7 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; namespace ArchUnitNET.Domain { diff --git a/ArchUnitNET/Domain/IMember.cs b/ArchUnitNET/Domain/IMember.cs index e79351722..f497db8cc 100644 --- a/ArchUnitNET/Domain/IMember.cs +++ b/ArchUnitNET/Domain/IMember.cs @@ -5,7 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; -using ArchUnitNET.Domain.Dependencies.Members; +using ArchUnitNET.Domain.Dependencies; namespace ArchUnitNET.Domain { diff --git a/ArchUnitNET/Domain/Interface.cs b/ArchUnitNET/Domain/Interface.cs index 67f526a3e..b2128bd8f 100644 --- a/ArchUnitNET/Domain/Interface.cs +++ b/ArchUnitNET/Domain/Interface.cs @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; namespace ArchUnitNET.Domain { diff --git a/ArchUnitNET/Domain/MemberList.cs b/ArchUnitNET/Domain/MemberList.cs index 894c85686..90745c802 100644 --- a/ArchUnitNET/Domain/MemberList.cs +++ b/ArchUnitNET/Domain/MemberList.cs @@ -7,7 +7,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using Equ; namespace ArchUnitNET.Domain diff --git a/ArchUnitNET/Domain/MethodMember.cs b/ArchUnitNET/Domain/MethodMember.cs index 41ab5e0d2..7f3c2ae7b 100644 --- a/ArchUnitNET/Domain/MethodMember.cs +++ b/ArchUnitNET/Domain/MethodMember.cs @@ -5,8 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; namespace ArchUnitNET.Domain { diff --git a/ArchUnitNET/Domain/PropertyMember.cs b/ArchUnitNET/Domain/PropertyMember.cs index 05aa95e61..3913242d3 100644 --- a/ArchUnitNET/Domain/PropertyMember.cs +++ b/ArchUnitNET/Domain/PropertyMember.cs @@ -5,8 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 using System.Collections.Generic; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; using Equ; using JetBrains.Annotations; using static ArchUnitNET.Domain.Visibility; @@ -32,8 +31,12 @@ public PropertyMember(IType declaringType, string name, string fullName, IType t public Visibility SetterVisibility => Setter?.Visibility ?? NotAccessible; public Visibility GetterVisibility => Getter?.Visibility ?? NotAccessible; - [CanBeNull] public MethodMember Getter { get; } - [CanBeNull] public MethodMember Setter { get; } + [CanBeNull] + public MethodMember Getter { get; } + + [CanBeNull] + public MethodMember Setter { get; } + public FieldMember BackingField { get; internal set; } public Visibility Visibility => GetterVisibility < SetterVisibility ? GetterVisibility : SetterVisibility; diff --git a/ArchUnitNET/Domain/Slice.cs b/ArchUnitNET/Domain/Slice.cs index cac95a640..6dffb3e66 100644 --- a/ArchUnitNET/Domain/Slice.cs +++ b/ArchUnitNET/Domain/Slice.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; using Equ; namespace ArchUnitNET.Domain diff --git a/ArchUnitNET/Fluent/Extensions/StaticConstants.cs b/ArchUnitNET/Domain/StaticConstants.cs similarity index 55% rename from ArchUnitNET/Fluent/Extensions/StaticConstants.cs rename to ArchUnitNET/Domain/StaticConstants.cs index 63ad9fa7f..b4c614628 100644 --- a/ArchUnitNET/Fluent/Extensions/StaticConstants.cs +++ b/ArchUnitNET/Domain/StaticConstants.cs @@ -6,19 +6,12 @@ // ReSharper disable InconsistentNaming -namespace ArchUnitNET.Fluent.Extensions +namespace ArchUnitNET.Domain { public static class StaticConstants { public const string BackingField = "k__BackingField"; public const string ConstructorNameBase = ".ctor"; - public const string ArchUnitNETTestsFluentNamespace = "ArchUnitNETTests.Fluent"; - - public const string ArchUnitNETTestsDependenciesAttributesNamespace = - "ArchUnitNETTests.Dependencies.Attributes"; - public const string SystemNamespace = "System"; - public const string GuidClassName = "Guid"; - public const string SystemGuidFullName = SystemNamespace + "." + GuidClassName; } } \ No newline at end of file diff --git a/ArchUnitNET/Domain/TypeDependencyComparer.cs b/ArchUnitNET/Domain/TypeDependencyComparer.cs index 983fe29e5..e73e3d248 100644 --- a/ArchUnitNET/Domain/TypeDependencyComparer.cs +++ b/ArchUnitNET/Domain/TypeDependencyComparer.cs @@ -6,7 +6,7 @@ // using System.Collections.Generic; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; namespace ArchUnitNET.Domain { diff --git a/ArchUnitNET/Domain/TypeList.cs b/ArchUnitNET/Domain/TypeList.cs deleted file mode 100644 index 9cc58545b..000000000 --- a/ArchUnitNET/Domain/TypeList.cs +++ /dev/null @@ -1,387 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using ArchUnitNET.Fluent; -using ArchUnitNET.Fluent.Extensions; -using Equ; -using JetBrains.Annotations; - -namespace ArchUnitNET.Domain -{ - public class TypeList : MemberwiseEquatable, IList>, IObjectProvider - { - private readonly IList> _typeProviderList; - [CanBeNull] private string _customDescription; - - public TypeList() - { - _typeProviderList = new List>(); - } - - public TypeList(IList> typeProviderList, string description = null) - { - _typeProviderList = typeProviderList; - _customDescription = description; - } - - public TypeList(Type firstType, params Type[] moreTypes) : this() - { - Add(firstType, moreTypes); - } - - public TypeList(IEnumerable types) : this() - { - Add(types); - } - - public TypeList(IType firstType, params IType[] moreTypes) : this() - { - Add(firstType, moreTypes); - } - - public TypeList(IEnumerable types) : this() - { - Add(types); - } - - public TypeList(IEnumerable patterns, bool useRegularExpressions = false) : this() - { - Add(patterns, useRegularExpressions); - } - - public TypeList(string pattern, bool useRegularExpressions = false) : this() - { - Add(pattern, useRegularExpressions); - } - - public TypeList(string pattern, params string[] morePatterns) : this() - { - Add(pattern, morePatterns); - } - - public void Add(IObjectProvider typeProvider) - { - _typeProviderList.Add(typeProvider); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return _typeProviderList.GetEnumerator(); - } - - public IEnumerator> GetEnumerator() - { - return _typeProviderList.GetEnumerator(); - } - - public void Clear() - { - _typeProviderList.Clear(); - } - - public bool Contains(IObjectProvider item) - { - return _typeProviderList.Contains(item); - } - - public void CopyTo(IObjectProvider[] array, int arrayIndex) - { - _typeProviderList.CopyTo(array, arrayIndex); - } - - public bool Remove(IObjectProvider item) - { - return _typeProviderList.Remove(item); - } - - public int Count => _typeProviderList.Count; - public bool IsReadOnly => _typeProviderList.IsReadOnly; - - public int IndexOf(IObjectProvider item) - { - return _typeProviderList.IndexOf(item); - } - - public void Insert(int index, IObjectProvider item) - { - _typeProviderList.Insert(index, item); - } - - public void RemoveAt(int index) - { - _typeProviderList.RemoveAt(index); - } - - public IObjectProvider this[int index] - { - get => _typeProviderList[index]; - set => _typeProviderList[index] = value; - } - - public string Description => _customDescription ?? _typeProviderList - .Aggregate("", - (current, typeProvider) => current + "\r\n" + typeProvider.Description) - .Remove(0, 2); - - public IEnumerable GetObjects(Architecture architecture) - { - return architecture.GetOrCreateObjects(this, - arch => _typeProviderList.SelectMany(provider => provider.GetObjects(arch)).Distinct()); - } - - public TypeList As(string description) - { - _customDescription = description; - return this; - } - - public void Add(Type firstType, params Type[] moreTypes) - { - Add(new TypeCollection(firstType, moreTypes)); - } - - public void Add(IEnumerable types) - { - Add(new TypeCollection(types)); - } - - public void Add(IType firstType, params IType[] moreTypes) - { - Add(new ArchTypeCollection(firstType, moreTypes)); - } - - public void Add(IEnumerable types) - { - Add(new ArchTypeCollection(types)); - } - - public void Add(IEnumerable patterns, bool useRegularExpressions = false) - { - Add(new PatternCollection(patterns, useRegularExpressions)); - } - - public void Add(string pattern, params string[] morePatterns) - { - Add(new PatternCollection(pattern, morePatterns)); - } - - public void Add(string pattern, bool useRegularExpressions = false) - { - Add(new PatternCollection(pattern, useRegularExpressions)); - } - - private new bool Equals(TypeList other) - { - if (ReferenceEquals(null, other)) - { - return false; - } - - if (ReferenceEquals(this, other)) - { - return true; - } - - return base.Equals(other) && - _typeProviderList.SequenceEqual(other._typeProviderList) && - _customDescription == other._customDescription; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((TypeList) obj); - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = base.GetHashCode(); - hashCode = (hashCode * 397) ^ (_customDescription != null ? _customDescription.GetHashCode() : 0); - _typeProviderList.Aggregate(hashCode, - (current, predicateElement) => - (current * 397) ^ (predicateElement != null ? predicateElement.GetHashCode() : 0)); - return hashCode; - } - } - - private abstract class Collection : IObjectProvider - { - protected readonly List Items; - - protected Collection(IEnumerable item) - { - Items = item.ToList(); - } - - protected Collection(T firstItem, params T[] moreItems) - { - Items = new List {firstItem}; - Items.AddRange(moreItems); - } - - public abstract string Description { get; } - public abstract IEnumerable GetObjects(Architecture architecture); - - public override string ToString() - { - return Description; - } - - protected bool Equals(Collection other) - { - return Items.SequenceEqual(other.Items); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((Collection) obj); - } - - public override int GetHashCode() - { - unchecked - { - return Items != null - ? Items.Aggregate(397, - (current, item) => (current * 397) ^ (item != null ? item.GetHashCode() : 0)) - : 0; - } - } - } - - private class TypeCollection : Collection - { - public TypeCollection(IEnumerable types) : base(types) - { - } - - public TypeCollection(Type firstType, params Type[] moreTypes) : base(firstType, moreTypes) - { - } - - public override string Description => Items - .Aggregate("", (current, type) => current + ", " + type.Name).Remove(0, 2); - - public override IEnumerable GetObjects(Architecture architecture) - { - return architecture.GetOrCreateObjects(this, arch => Items.Select(arch.GetITypeOfType).Distinct()); - } - } - - private class ArchTypeCollection : Collection - { - public ArchTypeCollection(IEnumerable types) : base(types) - { - } - - public ArchTypeCollection(IType firstType, params IType[] moreTypes) : base(firstType, moreTypes) - { - } - - public override string Description => Items - .Aggregate("", (current, type) => current + ", " + type.Name).Remove(0, 2); - - public override IEnumerable GetObjects(Architecture architecture) - { - return Items.Distinct(); - } - } - - private class PatternCollection : Collection - { - private readonly bool _useRegularExpressions; - - public PatternCollection(IEnumerable patterns, bool useRegularExpressions = false) : base(patterns) - { - _useRegularExpressions = useRegularExpressions; - } - - public PatternCollection(string pattern, params string[] morePatterns) : base(pattern, morePatterns) - { - _useRegularExpressions = false; - } - - public PatternCollection(string pattern, bool useRegularExpressions = false) : base(pattern) - { - _useRegularExpressions = useRegularExpressions; - } - - - public override string Description => Items - .Aggregate("", (current, pattern) => current + ", \"" + pattern + "\"").Remove(0, 2); - - public override IEnumerable GetObjects(Architecture architecture) - { - IEnumerable CreateFunction(Architecture arch) - { - var types = new List(); - foreach (var pattern in Items) - { - types.AddRange(arch.Types.Where(type => - type.FullNameMatches(pattern, _useRegularExpressions))); - } - - return types.Distinct(); - } - - return architecture.GetOrCreateObjects(this, CreateFunction); - } - - private bool Equals(PatternCollection other) - { - return base.Equals(other) && _useRegularExpressions == other._useRegularExpressions; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((PatternCollection) obj); - } - - public override int GetHashCode() - { - unchecked - { - return (base.GetHashCode() * 397) ^ _useRegularExpressions.GetHashCode(); - } - } - } - } -} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/ArchRuleCreator.ConditionManager.cs b/ArchUnitNET/Fluent/ArchRuleCreator.ConditionManager.cs deleted file mode 100644 index 4a1e325b6..000000000 --- a/ArchUnitNET/Fluent/ArchRuleCreator.ConditionManager.cs +++ /dev/null @@ -1,311 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System; -using System.Collections.Generic; -using System.Linq; -using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Conditions; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNET.Fluent.Predicates; -using JetBrains.Annotations; - -namespace ArchUnitNET.Fluent -{ - public partial class ArchRuleCreator - { - private class ConditionManager : IHasDescription where T : ICanBeAnalyzed - { - private readonly List> _conditionElements; - private Type _referenceTypeTemp; - private object _relatedObjectsTemp; - private object _relationConditionTemp; - - public ConditionManager() - { - _conditionElements = new List> - { - new ConditionElement(LogicalConjunctionDefinition.ForwardSecondValue) - }; - } - - public string Description => _conditionElements - .Aggregate("", (current, conditionElement) => current + " " + conditionElement.Description).Trim(); - - public void BeginComplexCondition(IObjectProvider relatedObjects, - RelationCondition relationCondition) - where TRelatedType : ICanBeAnalyzed - { - _relatedObjectsTemp = relatedObjects; - _relationConditionTemp = relationCondition; - _referenceTypeTemp = typeof(TRelatedType); - } - - public void ContinueComplexCondition(IPredicate filter) - where TRelatedType : ICanBeAnalyzed - { - if (typeof(TRelatedType) == _referenceTypeTemp) - { - AddCondition( - new ComplexCondition((IObjectProvider) _relatedObjectsTemp, - (RelationCondition) _relationConditionTemp, filter)); - } - else - { - throw new InvalidCastException( - "ContinueComplexCondition() has to be called with the same generic type argument that was used for BeginComplexCondition()."); - } - } - - public void AddCondition(ICondition condition) - { - _conditionElements.Last().SetCondition(condition); - } - - public void AddReason(string reason) - { - _conditionElements.Last().AddReason(reason); - } - - public void SetCustomDescription(string description) - { - _conditionElements.ForEach(conditionElement => conditionElement.SetCustomDescription("")); - _conditionElements.Last().SetCustomDescription(description); - } - - public void SetNextLogicalConjunction(LogicalConjunction logicalConjunction) - { - _conditionElements.Add(new ConditionElement(logicalConjunction)); - } - - private bool CheckEmpty() - { - return _conditionElements.Aggregate(true, - (currentResult, conditionElement) => conditionElement.CheckEmpty(currentResult)); - } - - public IEnumerable EvaluateConditions(IEnumerable filteredObjects, - Architecture architecture, ICanBeEvaluated archRuleCreator) - { - var filteredObjectsList = filteredObjects.ToList(); - if (filteredObjectsList.IsNullOrEmpty()) - { - yield return new EvaluationResult(null, CheckEmpty(), "There are no objects matching the criteria", - archRuleCreator, architecture); - yield break; - } - - var conditionResults = _conditionElements.Select(conditionElement => - conditionElement.Check(filteredObjectsList, architecture).ToList()).ToList(); - - for (var i = 0; i < filteredObjectsList.Count; i++) - { - yield return CreateEvaluationResult(conditionResults.Select(results => results[i]), architecture, - archRuleCreator); - } - } - - private static EvaluationResult CreateEvaluationResult( - IEnumerable conditionElementResults, - Architecture architecture, ICanBeEvaluated archRuleCreator) - { - var conditionElementResultsList = conditionElementResults.ToList(); - var analyzedObject = conditionElementResultsList.First().ConditionResult.AnalyzedObject; - var passRule = conditionElementResultsList.Aggregate(true, - (currentResult, conditionElementResult) => - conditionElementResult.LogicalConjunction.Evaluate(currentResult, - conditionElementResult.ConditionResult.Pass)); - var description = analyzedObject.FullName; - if (passRule) - { - description += " passed"; - } - else - { - var first = true; - var failDescriptionCache = - new List(); //Prevent failDescriptions like "... failed because ... is public and is public" - foreach (var conditionResult in conditionElementResultsList.Select(result => result.ConditionResult) - .Where(condResult => - !condResult.Pass && !failDescriptionCache.Contains(condResult.FailDescription))) - { - if (!first) - { - description += " and"; - } - - description += " " + conditionResult.FailDescription; - failDescriptionCache.Add(conditionResult.FailDescription); - first = false; - } - } - - return new EvaluationResult(analyzedObject, passRule, description, archRuleCreator, architecture); - } - - public override string ToString() - { - return Description; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((ConditionManager) obj); - } - - public override int GetHashCode() - { - unchecked - { - return _conditionElements.Aggregate(397, - (current, conditionElement) => - (current * 397) ^ (conditionElement != null ? conditionElement.GetHashCode() : 0)); - } - } - - private bool Equals(ConditionManager other) - { - return _conditionElements.SequenceEqual(other._conditionElements) && - _referenceTypeTemp == other._referenceTypeTemp && - _relationConditionTemp == other._relationConditionTemp; - } - -#pragma warning disable 693 - private class ConditionElement : IHasDescription where T : ICanBeAnalyzed - { - private readonly LogicalConjunction _logicalConjunction; - private ICondition _condition; - [CanBeNull] private string _customDescription; - private string _reason; - - public ConditionElement(LogicalConjunction logicalConjunction) - { - _condition = null; - _logicalConjunction = logicalConjunction; - _reason = ""; - } - - public string Description => _customDescription ?? (_condition == null - ? "" - : (_logicalConjunction.Description + " should " + - _condition.GetShortDescription() + " " + _reason).Trim()); - - public void AddReason(string reason) - { - if (_condition == null) - { - throw new InvalidOperationException( - "Can't add a reason to a ConditionElement before the condition is set."); - } - - if (_reason != "") - { - throw new InvalidOperationException( - "Can't add a reason to a ConditionElement which already has a reason."); - } - - _reason = "because " + reason; - } - - public void SetCondition(ICondition condition) - { - _condition = condition; - } - - public void SetCustomDescription(string description) - { - _customDescription = description; - } - - public IEnumerable Check(IEnumerable objects, Architecture architecture) - { - if (_condition == null) - { - throw new InvalidOperationException( - "Can't check a ConditionElement before the condition is set."); - } - - return _condition.Check(objects, architecture) - .Select(result => new ConditionElementResult(result, _logicalConjunction)); - } - - public bool CheckEmpty(bool currentResult) - { - if (_condition == null) - { - throw new InvalidOperationException( - "Can't check a ConditionElement before the condition is set."); - } - - return _logicalConjunction.Evaluate(currentResult, _condition.CheckEmpty()); - } - - public override string ToString() - { - return Description; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((ConditionElement) obj); - } - - private bool Equals(ConditionElement other) - { - return Equals(_logicalConjunction, other._logicalConjunction) && - Equals(_condition, other._condition) && - _customDescription == other._customDescription && - _reason == other._reason; - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = _logicalConjunction != null ? _logicalConjunction.GetHashCode() : 0; - hashCode = (hashCode * 397) ^ (_condition != null ? _condition.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ - (_customDescription != null ? _customDescription.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (_reason != null ? _reason.GetHashCode() : 0); - return hashCode; - } - } - } - - private class ConditionElementResult - { - public readonly ConditionResult ConditionResult; - public readonly LogicalConjunction LogicalConjunction; - - public ConditionElementResult(ConditionResult conditionResult, LogicalConjunction logicalConjunction) - { - ConditionResult = conditionResult; - LogicalConjunction = logicalConjunction; - } - } - } - } -} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/ArchRuleCreator.PredicateManager.cs b/ArchUnitNET/Fluent/ArchRuleCreator.PredicateManager.cs deleted file mode 100644 index ac1135fe1..000000000 --- a/ArchUnitNET/Fluent/ArchRuleCreator.PredicateManager.cs +++ /dev/null @@ -1,216 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System; -using System.Collections.Generic; -using System.Linq; -using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNET.Fluent.Predicates; -using JetBrains.Annotations; - -namespace ArchUnitNET.Fluent -{ - public partial class ArchRuleCreator - { - private class PredicateManager : IHasDescription where T : ICanBeAnalyzed - { - private const string NotSet = "not set"; - private readonly BasicObjectProvider _basicObjectProvider; - private readonly List> _predicateElements; - private bool _hasCustomDescription; - - public PredicateManager(BasicObjectProvider basicObjectProvider) - { - _basicObjectProvider = basicObjectProvider; - _predicateElements = new List> - { - new PredicateElement(LogicalConjunctionDefinition.ForwardSecondValue, - new SimplePredicate(t => true, NotSet)) - }; - _hasCustomDescription = false; - } - - public string Description => _hasCustomDescription - ? _predicateElements.Aggregate("", - (current, objectFilterElement) => current + " " + objectFilterElement.Description) - : _predicateElements.First().Description == NotSet - ? _basicObjectProvider.Description - : _basicObjectProvider.Description + " that" + _predicateElements.Aggregate("", - (current, objectFilterElement) => current + " " + objectFilterElement.Description); - - public IEnumerable GetObjects(Architecture architecture) - { - var objects = _basicObjectProvider.GetObjects(architecture).ToList(); - IEnumerable filteredObjects = new List(); - return _predicateElements.Aggregate(filteredObjects, - (current, predicateElement) => predicateElement.CheckPredicate(current, objects, architecture)); - } - - public void AddPredicate(IPredicate predicate) - { - _predicateElements.Last().SetPredicate(predicate); - } - - public void AddReason(string reason) - { - _predicateElements.Last().AddReason(reason); - } - - public void SetCustomDescription(string description) - { - _hasCustomDescription = true; - _predicateElements.ForEach(predicateElement => predicateElement.SetCustomDescription("")); - _predicateElements.Last().SetCustomDescription(description); - } - - public void SetNextLogicalConjunction(LogicalConjunction logicalConjunction) - { - _predicateElements.Add(new PredicateElement(logicalConjunction)); - } - - public override string ToString() - { - return Description; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((PredicateManager) obj); - } - - private bool Equals(PredicateManager other) - { - return Equals(_basicObjectProvider, other._basicObjectProvider) && - _predicateElements.SequenceEqual(other._predicateElements) && - _hasCustomDescription == other._hasCustomDescription; - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = _basicObjectProvider != null ? _basicObjectProvider.GetHashCode() : 0; - return _predicateElements.Aggregate(hashCode, - (current, predicateElement) => - (current * 397) ^ (predicateElement != null ? predicateElement.GetHashCode() : 0)); - } - } - -#pragma warning disable 693 - private class PredicateElement : IHasDescription where T : ICanBeAnalyzed - { - private readonly LogicalConjunction _logicalConjunction; - [CanBeNull] private string _customDescription; - private IPredicate _predicate; - private string _reason; - - public PredicateElement(LogicalConjunction logicalConjunction, IPredicate predicate = null) - { - _predicate = predicate; - _logicalConjunction = logicalConjunction; - _reason = ""; - } - - public string Description => _customDescription ?? (_predicate == null - ? _logicalConjunction.Description - : (_logicalConjunction.Description + " " + - _predicate.GetShortDescription() + " " + _reason).Trim()); - - public void AddReason(string reason) - { - if (_predicate == null) - { - throw new InvalidOperationException( - "Can't add a reason to a PredicateElement before the predicate is set."); - } - - if (_reason != "") - { - throw new InvalidOperationException( - "Can't add a reason to a PredicateElement which already has a reason."); - } - - _reason = "because " + reason; - } - - public void SetCustomDescription(string description) - { - _customDescription = description; - } - - public void SetPredicate(IPredicate predicate) - { - _predicate = predicate; - } - - public IEnumerable CheckPredicate(IEnumerable currentObjects, IEnumerable allObjects, - Architecture architecture) - { - if (_predicate == null) - { - throw new InvalidOperationException( - "Can't check a PredicateElement before the predicate is set."); - } - - return _logicalConjunction.Evaluate(currentObjects, - _predicate.GetMatchingObjects(allObjects, architecture)); - } - - public override string ToString() - { - return Description; - } - - private bool Equals(PredicateElement other) - { - return Equals(_logicalConjunction, other._logicalConjunction) && - _customDescription == other._customDescription && - Equals(_predicate, other._predicate) && - _reason == other._reason; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((PredicateElement) obj); - } - - public override int GetHashCode() - { - unchecked - { - var hashCode = _logicalConjunction != null ? _logicalConjunction.GetHashCode() : 0; - hashCode = (hashCode * 397) ^ - (_customDescription != null ? _customDescription.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (_predicate != null ? _predicate.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ (_reason != null ? _reason.GetHashCode() : 0); - return hashCode; - } - } - } - } - } -} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/ArchRuleCreator.cs b/ArchUnitNET/Fluent/ArchRuleCreator.cs index f481db4e3..17a73da11 100644 --- a/ArchUnitNET/Fluent/ArchRuleCreator.cs +++ b/ArchUnitNET/Fluent/ArchRuleCreator.cs @@ -12,7 +12,7 @@ namespace ArchUnitNET.Fluent { - public partial class ArchRuleCreator : IArchRuleCreator where TRuleType : ICanBeAnalyzed + public class ArchRuleCreator : IArchRuleCreator where TRuleType : ICanBeAnalyzed { private readonly ConditionManager _conditionManager; private readonly PredicateManager _predicateManager; diff --git a/ArchUnitNET/Fluent/ConditionManager.cs b/ArchUnitNET/Fluent/ConditionManager.cs new file mode 100644 index 000000000..120d34150 --- /dev/null +++ b/ArchUnitNET/Fluent/ConditionManager.cs @@ -0,0 +1,313 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Paula Ruiz +// Copyright 2019 Fritz Brandhuber +// +// SPDX-License-Identifier: Apache-2.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Fluent.Conditions; +using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Fluent.Predicates; +using JetBrains.Annotations; + +namespace ArchUnitNET.Fluent +{ + internal class ConditionManager : IHasDescription where T : ICanBeAnalyzed + { + private readonly List> _conditionElements; + private Type _referenceTypeTemp; + private object _relatedObjectsTemp; + private object _relationConditionTemp; + + public ConditionManager() + { + _conditionElements = new List> + { + new ConditionElement(LogicalConjunctionDefinition.ForwardSecondValue) + }; + } + + public string Description => _conditionElements + .Aggregate("", (current, conditionElement) => current + " " + conditionElement.Description).Trim(); + + public void BeginComplexCondition(IObjectProvider relatedObjects, + RelationCondition relationCondition) + where TRelatedType : ICanBeAnalyzed + { + _relatedObjectsTemp = relatedObjects; + _relationConditionTemp = relationCondition; + _referenceTypeTemp = typeof(TRelatedType); + } + + public void ContinueComplexCondition(IPredicate filter) + where TRelatedType : ICanBeAnalyzed + { + if (typeof(TRelatedType) == _referenceTypeTemp) + { + AddCondition( + new ComplexCondition((IObjectProvider) _relatedObjectsTemp, + (RelationCondition) _relationConditionTemp, filter)); + } + else + { + throw new InvalidCastException( + "ContinueComplexCondition() has to be called with the same generic type argument that was used for BeginComplexCondition()."); + } + } + + public void AddCondition(ICondition condition) + { + _conditionElements.Last().SetCondition(condition); + } + + public void AddReason(string reason) + { + _conditionElements.Last().AddReason(reason); + } + + public void SetCustomDescription(string description) + { + _conditionElements.ForEach(conditionElement => conditionElement.SetCustomDescription("")); + _conditionElements.Last().SetCustomDescription(description); + } + + public void SetNextLogicalConjunction(LogicalConjunction logicalConjunction) + { + _conditionElements.Add(new ConditionElement(logicalConjunction)); + } + + private bool CheckEmpty() + { + return _conditionElements.Aggregate(true, + (currentResult, conditionElement) => conditionElement.CheckEmpty(currentResult)); + } + + public IEnumerable EvaluateConditions(IEnumerable filteredObjects, + Architecture architecture, ICanBeEvaluated archRuleCreator) + { + var filteredObjectsList = filteredObjects.ToList(); + if (filteredObjectsList.IsNullOrEmpty()) + { + yield return new EvaluationResult(null, CheckEmpty(), "There are no objects matching the criteria", + archRuleCreator, architecture); + yield break; + } + + var conditionResults = _conditionElements.Select(conditionElement => + conditionElement.Check(filteredObjectsList, architecture).ToList()).ToList(); + + for (var i = 0; i < filteredObjectsList.Count; i++) + { + var index = i; + yield return CreateEvaluationResult(conditionResults.Select(results => results[index]), architecture, + archRuleCreator); + } + } + + private static EvaluationResult CreateEvaluationResult( + IEnumerable conditionElementResults, + Architecture architecture, ICanBeEvaluated archRuleCreator) + { + var conditionElementResultsList = conditionElementResults.ToList(); + var analyzedObject = conditionElementResultsList.First().ConditionResult.AnalyzedObject; + var passRule = conditionElementResultsList.Aggregate(true, + (currentResult, conditionElementResult) => + conditionElementResult.LogicalConjunction.Evaluate(currentResult, + conditionElementResult.ConditionResult.Pass)); + var description = analyzedObject.FullName; + if (passRule) + { + description += " passed"; + } + else + { + var first = true; + var failDescriptionCache = + new List(); //Prevent failDescriptions like "... failed because ... is public and is public" + foreach (var conditionResult in conditionElementResultsList.Select(result => result.ConditionResult) + .Where(condResult => + !condResult.Pass && !failDescriptionCache.Contains(condResult.FailDescription))) + { + if (!first) + { + description += " and"; + } + + description += " " + conditionResult.FailDescription; + failDescriptionCache.Add(conditionResult.FailDescription); + first = false; + } + } + + return new EvaluationResult(analyzedObject, passRule, description, archRuleCreator, architecture); + } + + public override string ToString() + { + return Description; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + return obj.GetType() == GetType() && Equals((ConditionManager) obj); + } + + public override int GetHashCode() + { + unchecked + { + return _conditionElements.Aggregate(397, + (current, conditionElement) => + (current * 397) ^ (conditionElement != null ? conditionElement.GetHashCode() : 0)); + } + } + + private bool Equals(ConditionManager other) + { + return _conditionElements.SequenceEqual(other._conditionElements) && + _referenceTypeTemp == other._referenceTypeTemp && + _relationConditionTemp == other._relationConditionTemp; + } + +#pragma warning disable 693 + private class ConditionElement : IHasDescription where T : ICanBeAnalyzed + { + private readonly LogicalConjunction _logicalConjunction; + private ICondition _condition; + + [CanBeNull] + private string _customDescription; + + private string _reason; + + public ConditionElement(LogicalConjunction logicalConjunction) + { + _condition = null; + _logicalConjunction = logicalConjunction; + _reason = ""; + } + + public string Description => _customDescription ?? (_condition == null + ? "" + : (_logicalConjunction.Description + " should " + + _condition.GetShortDescription() + " " + _reason).Trim()); + + public void AddReason(string reason) + { + if (_condition == null) + { + throw new InvalidOperationException( + "Can't add a reason to a ConditionElement before the condition is set."); + } + + if (_reason != "") + { + throw new InvalidOperationException( + "Can't add a reason to a ConditionElement which already has a reason."); + } + + _reason = "because " + reason; + } + + public void SetCondition(ICondition condition) + { + _condition = condition; + } + + public void SetCustomDescription(string description) + { + _customDescription = description; + } + + public IEnumerable Check(IEnumerable objects, Architecture architecture) + { + if (_condition == null) + { + throw new InvalidOperationException( + "Can't check a ConditionElement before the condition is set."); + } + + return _condition.Check(objects, architecture) + .Select(result => new ConditionElementResult(result, _logicalConjunction)); + } + + public bool CheckEmpty(bool currentResult) + { + if (_condition == null) + { + throw new InvalidOperationException( + "Can't check a ConditionElement before the condition is set."); + } + + return _logicalConjunction.Evaluate(currentResult, _condition.CheckEmpty()); + } + + public override string ToString() + { + return Description; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + return obj.GetType() == GetType() && Equals((ConditionElement) obj); + } + + private bool Equals(ConditionElement other) + { + return Equals(_logicalConjunction, other._logicalConjunction) && + Equals(_condition, other._condition) && + _customDescription == other._customDescription && + _reason == other._reason; + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = _logicalConjunction != null ? _logicalConjunction.GetHashCode() : 0; + hashCode = (hashCode * 397) ^ (_condition != null ? _condition.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ + (_customDescription != null ? _customDescription.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (_reason != null ? _reason.GetHashCode() : 0); + return hashCode; + } + } + } + + private class ConditionElementResult + { + public readonly ConditionResult ConditionResult; + public readonly LogicalConjunction LogicalConjunction; + + public ConditionElementResult(ConditionResult conditionResult, LogicalConjunction logicalConjunction) + { + ConditionResult = conditionResult; + LogicalConjunction = logicalConjunction; + } + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Extensions/EnumerableExtensions.cs b/ArchUnitNET/Fluent/Extensions/EnumerableExtensions.cs deleted file mode 100644 index ae9331ee7..000000000 --- a/ArchUnitNET/Fluent/Extensions/EnumerableExtensions.cs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using ArchUnitNET.ArchitectureExceptions; -using ArchUnitNET.Domain; -using JetBrains.Annotations; - -namespace ArchUnitNET.Fluent.Extensions -{ - public static class EnumerableExtensions - { - public static IEnumerable> SlicedBy(this IEnumerable source, string fullName) - { - return source.GroupBy(type => type.FullName) - .Select(sliceItems => new Slice(sliceItems.Key, sliceItems.ToList())); - } - - public static void ForEach(this IEnumerable source, Action action) - { - foreach (var element in source) - { - action(element); - } - } - - public static bool IsNullOrEmpty(this IEnumerable source) - { - return source == null || !source.Any(); - } - - [NotNull] - public static IEnumerable WhereNameIs(this IEnumerable source, string name) - where TType : IHasName - { - return source.Where(hasName => hasName.Name == name); - } - - [CanBeNull] - public static TType WhereFullNameIs(this IEnumerable source, string fullName) - where TType : IHasName - { - var withFullName = source.Where(type => type.FullName == fullName).ToList(); - - if (withFullName.Count > 1) - { - throw new MultipleOccurrencesInSequenceException( - $"Full name {fullName} found multiple times in provided types. Please use extern " - + "alias to reference assemblies that have the same fully-qualified type names."); - } - - return withFullName.FirstOrDefault(); - } - - public static IEnumerable ToStringEnumerable(this IEnumerable enumerable) - { - return enumerable.Select(obj => obj.ToString()); - } - - public static string ToErrorMessage(this IEnumerable evaluationResults) - { - var failedResults = evaluationResults.Where(result => !result.Passed).ToList(); - if (failedResults.IsNullOrEmpty()) - { - return "All Evaluations passed"; - } - - var analyzedRules = failedResults.Select(result => result.ArchRule).Distinct(); - var errorMessage = new StringBuilder(); - foreach (var rule in analyzedRules) - { - errorMessage.AppendLine("\"" + rule.Description + "\" failed:"); - foreach (var result in failedResults.Where(result => result.ArchRule.Equals(rule))) - { - errorMessage.AppendLine("\t" + result.Description); - } - - errorMessage.AppendLine(); - } - - return errorMessage.ToString(); - } - } -} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Extensions/EvaluationResultExtensions.cs b/ArchUnitNET/Fluent/Extensions/EvaluationResultExtensions.cs new file mode 100644 index 000000000..026a556b9 --- /dev/null +++ b/ArchUnitNET/Fluent/Extensions/EvaluationResultExtensions.cs @@ -0,0 +1,41 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Fritz Brandhuber +// Copyright 2020 Pavel Fischer +// +// SPDX-License-Identifier: Apache-2.0 +// + +using System.Collections.Generic; +using System.Linq; +using System.Text; +using ArchUnitNET.Domain.Extensions; + +namespace ArchUnitNET.Fluent.Extensions +{ + public static class EvaluationResultExtensions + { + public static string ToErrorMessage(this IEnumerable evaluationResults) + { + var failedResults = evaluationResults.Where(result => !result.Passed).ToList(); + if (failedResults.IsNullOrEmpty()) + { + return "All Evaluations passed"; + } + + var analyzedRules = failedResults.Select(result => result.ArchRule).Distinct(); + var errorMessage = new StringBuilder(); + foreach (var rule in analyzedRules) + { + errorMessage.AppendLine("\"" + rule.Description + "\" failed:"); + foreach (var result in failedResults.Where(result => result.ArchRule.Equals(rule))) + { + errorMessage.AppendLine("\t" + result.Description); + } + + errorMessage.AppendLine(); + } + + return errorMessage.ToString(); + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Extensions/TypeExtensions.cs b/ArchUnitNET/Fluent/Extensions/TypeExtensions.cs deleted file mode 100644 index 25eb97095..000000000 --- a/ArchUnitNET/Fluent/Extensions/TypeExtensions.cs +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using ArchUnitNET.ArchitectureExceptions; -using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Domain.Dependencies.Types; -using JetBrains.Annotations; -using Mono.Cecil; -using GenericParameter = ArchUnitNET.Domain.GenericParameter; - -namespace ArchUnitNET.Fluent.Extensions -{ - public static class TypeExtensions - { - public static bool CallsMethod(this IHasDependencies type, MethodMember method) - { - return type.GetCalledMethods().Contains(method); - } - - public static bool CallsMethod(this IHasDependencies type, string pattern, bool useRegularExpressions = false) - { - return type.GetCalledMethods().Any(member => member.FullNameMatches(pattern, useRegularExpressions)); - } - - public static bool CallsAnyMethodFromType(this IHasDependencies type, string pattern, - bool useRegularExpressions = false) - { - return type.GetMethodCallDependencies().Select(dependency => dependency.Target) - .Any(member => member.FullNameMatches(pattern, useRegularExpressions)); - } - - public static IEnumerable GetAssignableTypes(this IType type) - { - switch (type) - { - case Interface intf: - return intf.ImplementedInterfaces.Append(intf); - case Class cls: - return cls.InheritedClasses.Append(cls).Concat(cls.ImplementedInterfaces); - default: - return Enumerable.Empty(); - } - } - - public static IEnumerable GetCalledMethods(this IHasDependencies type) - { - return type.GetMethodCallDependencies().Select(dependency => (MethodMember) dependency.TargetMember); - } - - public static IEnumerable GetPropertyMembersWithName(this IType type, string name) - { - return type.GetPropertyMembers().WhereNameIs(name); - } - - public static bool HasPropertyMemberWithName(this IType type, string name) - { - return !type.GetPropertyMembersWithName(name).IsNullOrEmpty(); - } - - public static IEnumerable GetFieldMembersWithName(this IType type, string name) - { - return type.GetFieldMembers().WhereNameIs(name); - } - - public static bool HasFieldMemberWithName(this IType type, string name) - { - return !type.GetFieldMembersWithName(name).IsNullOrEmpty(); - } - - public static IEnumerable GetMethodMembersWithName(this IType type, string name) - { - return type.GetMethodMembers().WhereNameIs(name); - } - - public static bool HasMethodMemberWithName(this IType type, string name) - { - return !type.GetMethodMembersWithName(name).IsNullOrEmpty(); - } - - public static IEnumerable GetMembersWithName(this IType type, string name) - { - return type.Members.WhereNameIs(name); - } - - public static bool HasMemberWithName(this IType type, string name) - { - return !type.GetMembersWithName(name).IsNullOrEmpty(); - } - - public static PropertyMember GetPropertyMemberWithFullName(this IType type, string fullName) - { - return type.GetPropertyMembers().WhereFullNameIs(fullName); - } - - public static bool HasPropertyMemberWithFullName(this IType type, string fullname) - { - return type.GetPropertyMemberWithFullName(fullname) != null; - } - - public static MethodMember GetMethodMemberWithFullName(this IType type, string fullName) - { - return type.GetMethodMembers().WhereFullNameIs(fullName); - } - - [CanBeNull] - public static MethodMember GetMethodMemberWithMethodReference(this IType type, MethodReference methodReference) - { - var matchingMethods = type.GetMethodMembers().Where(member => member.MatchesGeneric(methodReference)) - .ToList(); - if (matchingMethods.Count > 1) - { - throw new MultipleOccurrencesInSequenceException( - $"Multiple Methods matching {methodReference.FullName} found in provided type."); - } - - return matchingMethods.FirstOrDefault(); - } - - private static bool MatchesGeneric(this MethodMember methodMember, MethodReference methodReference) - { - var referenceFullName = methodReference.GetElementMethod().GetFullName(); - var memberFullName = methodMember.FullName; - var count = methodReference.GetElementMethod().GenericParameters.Count; - if (methodMember.GenericParameters.Count != count) - { - return false; - } - - var parameters = new List(); - for (var i = 0; i < count; i++) - { - parameters.Add(new[] - { - new GenericParameter(methodReference.GetElementMethod().GenericParameters[i].Name), - methodMember.GenericParameters[i] - }); - } - - parameters = parameters.OrderByDescending(genericParameters => genericParameters[0].Name.Length).ToList(); - - foreach (var genericParameters in parameters.Where(genericParameters => genericParameters[0] != null) - ) - { - referenceFullName = referenceFullName.Replace(genericParameters[0].Name, genericParameters[1].Name); - memberFullName = memberFullName.Replace(genericParameters[0].Name, genericParameters[1].Name); - } - - return memberFullName.Equals(referenceFullName); - } - - public static bool HasMethodMemberWithFullName(this IType type, string fullname) - { - return type.GetMethodMemberWithFullName(fullname) != null; - } - - public static FieldMember GetFieldMemberWithFullName(this IType type, string fullName) - { - return type.GetFieldMembers().WhereFullNameIs(fullName); - } - - public static bool HasFieldMemberWithFullName(this IType type, string fullname) - { - return type.GetFieldMemberWithFullName(fullname) != null; - } - - public static IMember GetMemberWithFullName(this IType type, string fullName) - { - return type.Members.WhereFullNameIs(fullName); - } - - public static bool HasMemberWithFullName(this IType type, string fullname) - { - return type.GetMemberWithFullName(fullname) != null; - } - - public static Attribute GetAttributeOfType(this IType type, Class attributeClass) - { - return type.Attributes.Find(attribute => attribute.FullName.Equals(attributeClass.FullName)); - } - - public static bool NameEndsWith(this IHasName cls, string pattern) - { - return cls.Name.ToLower().EndsWith(pattern.ToLower()); - } - - public static bool NameStartsWith(this IHasName cls, string pattern) - { - return cls.Name.ToLower().StartsWith(pattern.ToLower()); - } - - public static bool NameContains(this IHasName cls, string pattern) - { - return pattern != null && cls.Name.ToLower().Contains(pattern.ToLower()); - } - - public static bool NameMatches(this IHasName cls, string pattern, bool useRegularExpressions = false) - { - if (useRegularExpressions) - { - return pattern != null && Regex.IsMatch(cls.Name, pattern); - } - - return cls.NameContains(pattern); - } - - public static bool FullNameMatches(this IHasName cls, string pattern, bool useRegularExpressions = false) - { - if (useRegularExpressions) - { - return pattern != null && Regex.IsMatch(cls.FullName, pattern); - } - - return cls.FullNameContains(pattern); - } - - public static bool FullNameContains(this IHasName cls, string pattern) - { - return pattern != null && cls.FullName.ToLower().Contains(pattern.ToLower()); - } - - public static bool ResidesInNamespace(this IType e, string pattern, bool useRegularExpressions = false) - { - return e.Namespace.FullNameMatches(pattern, useRegularExpressions); - } - - public static bool ResidesInAssembly(this IType e, string pattern, bool useRegularExpressions = false) - { - return e.Assembly.FullNameMatches(pattern, useRegularExpressions); - } - - public static bool DependsOn(this IHasDependencies c, string pattern, bool useRegularExpressions = false) - { - return c.GetTypeDependencies().Any(d => d.FullNameMatches(pattern, useRegularExpressions)); - } - - public static bool HasAttribute(this IHasAttributes a, string pattern, bool useRegularExpressions = false) - { - return a.Attributes.Any(attribute => attribute.FullNameMatches(pattern, useRegularExpressions)); - } - - public static bool OnlyHasAttributes(this IHasAttributes a, string pattern, bool useRegularExpressions = false) - { - return a.Attributes.IsNullOrEmpty() || - a.Attributes.All(attribute => attribute.FullNameMatches(pattern, useRegularExpressions)); - } - - public static bool DependsOn(this IHasDependencies c, IType type) - { - return c.GetTypeDependencies().Contains(type); - } - - public static bool IsDeclaredAsFieldIn(this IType type, string pattern, bool useRegularExpressions = false) - { - return type.GetFieldTypeDependencies(true).Any(dependency => - dependency.Target.FullNameMatches(pattern, useRegularExpressions)); - } - - public static bool OnlyDependsOn(this IHasDependencies c, string pattern, bool useRegularExpressions = false) - { - return c.GetTypeDependencies().All(d => d.FullNameMatches(pattern, useRegularExpressions)); - } - - public static IEnumerable GetClassDependencies(this IHasDependencies c) - { - return c.GetTypeDependencies().OfType(); - } - - public static IEnumerable GetClassDependencies(this IHasDependencies c, Architecture architecture) - { - return c.GetTypeDependencies(architecture).OfType(); - } - - public static IEnumerable GetInterfaceDependencies(this IHasDependencies c) - { - return c.GetTypeDependencies().OfType(); - } - - public static IEnumerable GetInterfaceDependencies(this IHasDependencies c, - Architecture architecture) - { - return c.GetTypeDependencies(architecture).OfType(); - } - - public static IEnumerable GetTypeDependencies(this IHasDependencies c) - { - return c.Dependencies.Select(dependency => dependency.Target); - } - - public static IEnumerable GetTypeDependencies(this IHasDependencies c, Architecture architecture) - { - return c.Dependencies.Select(dependency => dependency.Target).Intersect(architecture.Types); - } - - public static bool HasDependency(this IType type, ITypeDependency dependency) - { - return type.Dependencies.Contains(dependency); - } - - public static bool HasDependencies(this IType type, IEnumerable dependencies) - { - return dependencies.All(dependency => type.Dependencies.Contains(dependency)); - } - - public static IEnumerable GetPropertyMembers(this IType type) - { - return type.Members.OfType(); - } - - public static IEnumerable GetFieldMembers(this IType type) - { - return type.Members.OfType(); - } - - public static IEnumerable GetMethodMembers(this IType type) - { - return type.Members.OfType(); - } - - public static IEnumerable GetConstructors(this IType type) - { - return type.GetMethodMembers().Where(method => method.IsConstructor()); - } - - public static IEnumerable GetMethodCallDependencies(this IHasDependencies type, - bool getBackwardsDependencies = false) - { - return getBackwardsDependencies - ? type.BackwardsDependencies.OfType() - : type.Dependencies.OfType(); - } - - public static IEnumerable GetAttributeTypeDependencies(this IType type, - bool getBackwardsDependencies = false) - { - return getBackwardsDependencies - ? type.BackwardsDependencies.OfType() - : type.Dependencies.OfType(); - } - - public static IEnumerable GetImplementsInterfaceDependencies(this IType type, - bool getBackwardsDependencies = false) - { - return getBackwardsDependencies - ? type.BackwardsDependencies.OfType() - : type.Dependencies.OfType(); - } - - public static IEnumerable GetInheritsBaseClassDependencies(this IType type, - bool getBackwardsDependencies = false) - { - return getBackwardsDependencies - ? type.BackwardsDependencies.OfType() - : type.Dependencies.OfType(); - } - } -} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/PredicateManager.PredicateManager.cs b/ArchUnitNET/Fluent/PredicateManager.PredicateManager.cs new file mode 100644 index 000000000..e4607fed3 --- /dev/null +++ b/ArchUnitNET/Fluent/PredicateManager.PredicateManager.cs @@ -0,0 +1,216 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Paula Ruiz +// Copyright 2019 Fritz Brandhuber +// +// SPDX-License-Identifier: Apache-2.0 + +using System; +using System.Collections.Generic; +using System.Linq; +using ArchUnitNET.Domain; +using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Fluent.Predicates; +using JetBrains.Annotations; + +namespace ArchUnitNET.Fluent +{ + internal class PredicateManager : IHasDescription where T : ICanBeAnalyzed + { + private const string NotSet = "not set"; + private readonly BasicObjectProvider _basicObjectProvider; + private readonly List> _predicateElements; + private bool _hasCustomDescription; + + public PredicateManager(BasicObjectProvider basicObjectProvider) + { + _basicObjectProvider = basicObjectProvider; + _predicateElements = new List> + { + new PredicateElement(LogicalConjunctionDefinition.ForwardSecondValue, + new SimplePredicate(t => true, NotSet)) + }; + _hasCustomDescription = false; + } + + public string Description => _hasCustomDescription + ? _predicateElements.Aggregate("", + (current, objectFilterElement) => current + " " + objectFilterElement.Description) + : _predicateElements.First().Description == NotSet + ? _basicObjectProvider.Description + : _basicObjectProvider.Description + " that" + _predicateElements.Aggregate("", + (current, objectFilterElement) => current + " " + objectFilterElement.Description); + + public IEnumerable GetObjects(Architecture architecture) + { + var objects = _basicObjectProvider.GetObjects(architecture).ToList(); + IEnumerable filteredObjects = new List(); + return _predicateElements.Aggregate(filteredObjects, + (current, predicateElement) => predicateElement.CheckPredicate(current, objects, architecture)); + } + + public void AddPredicate(IPredicate predicate) + { + _predicateElements.Last().SetPredicate(predicate); + } + + public void AddReason(string reason) + { + _predicateElements.Last().AddReason(reason); + } + + public void SetCustomDescription(string description) + { + _hasCustomDescription = true; + _predicateElements.ForEach(predicateElement => predicateElement.SetCustomDescription("")); + _predicateElements.Last().SetCustomDescription(description); + } + + public void SetNextLogicalConjunction(LogicalConjunction logicalConjunction) + { + _predicateElements.Add(new PredicateElement(logicalConjunction)); + } + + public override string ToString() + { + return Description; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + return obj.GetType() == GetType() && Equals((PredicateManager) obj); + } + + private bool Equals(PredicateManager other) + { + return Equals(_basicObjectProvider, other._basicObjectProvider) && + _predicateElements.SequenceEqual(other._predicateElements) && + _hasCustomDescription == other._hasCustomDescription; + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = _basicObjectProvider != null ? _basicObjectProvider.GetHashCode() : 0; + return _predicateElements.Aggregate(hashCode, + (current, predicateElement) => + (current * 397) ^ (predicateElement != null ? predicateElement.GetHashCode() : 0)); + } + } + +#pragma warning disable 693 + private class PredicateElement : IHasDescription where T : ICanBeAnalyzed + { + private readonly LogicalConjunction _logicalConjunction; + + [CanBeNull] + private string _customDescription; + + private IPredicate _predicate; + private string _reason; + + public PredicateElement(LogicalConjunction logicalConjunction, IPredicate predicate = null) + { + _predicate = predicate; + _logicalConjunction = logicalConjunction; + _reason = ""; + } + + public string Description => _customDescription ?? (_predicate == null + ? _logicalConjunction.Description + : (_logicalConjunction.Description + " " + + _predicate.GetShortDescription() + " " + _reason).Trim()); + + public void AddReason(string reason) + { + if (_predicate == null) + { + throw new InvalidOperationException( + "Can't add a reason to a PredicateElement before the predicate is set."); + } + + if (_reason != "") + { + throw new InvalidOperationException( + "Can't add a reason to a PredicateElement which already has a reason."); + } + + _reason = "because " + reason; + } + + public void SetCustomDescription(string description) + { + _customDescription = description; + } + + public void SetPredicate(IPredicate predicate) + { + _predicate = predicate; + } + + public IEnumerable CheckPredicate(IEnumerable currentObjects, IEnumerable allObjects, + Architecture architecture) + { + if (_predicate == null) + { + throw new InvalidOperationException( + "Can't check a PredicateElement before the predicate is set."); + } + + return _logicalConjunction.Evaluate(currentObjects, + _predicate.GetMatchingObjects(allObjects, architecture)); + } + + public override string ToString() + { + return Description; + } + + private bool Equals(PredicateElement other) + { + return Equals(_logicalConjunction, other._logicalConjunction) && + _customDescription == other._customDescription && + Equals(_predicate, other._predicate) && + _reason == other._reason; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + return obj.GetType() == GetType() && Equals((PredicateElement) obj); + } + + public override int GetHashCode() + { + unchecked + { + var hashCode = _logicalConjunction != null ? _logicalConjunction.GetHashCode() : 0; + hashCode = (hashCode * 397) ^ + (_customDescription != null ? _customDescription.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (_predicate != null ? _predicate.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ (_reason != null ? _reason.GetHashCode() : 0); + return hashCode; + } + } + } + } +} \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Slices/Slice.cs b/ArchUnitNET/Fluent/Slices/Slice.cs index 71d35b4bb..f45af1d61 100644 --- a/ArchUnitNET/Fluent/Slices/Slice.cs +++ b/ArchUnitNET/Fluent/Slices/Slice.cs @@ -8,7 +8,7 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; namespace ArchUnitNET.Fluent.Slices { diff --git a/ArchUnitNET/Fluent/Slices/SlicesShould.cs b/ArchUnitNET/Fluent/Slices/SlicesShould.cs index 2826af92d..90c9bc8a8 100644 --- a/ArchUnitNET/Fluent/Slices/SlicesShould.cs +++ b/ArchUnitNET/Fluent/Slices/SlicesShould.cs @@ -28,7 +28,15 @@ private static IEnumerable FindDependencies(Slice slice, IEnumerable slc != null); } - private static IEnumerable Evaluate(IEnumerable slices, ICanBeEvaluated archRule, + public SliceRule BeFreeOfCycles() + { + _ruleCreator.SetEvaluationFunction(EvaluateBeFreeOfCycles); + _ruleCreator.AddToDescription("be free of cycles"); + return new SliceRule(_ruleCreator); + } + + private static IEnumerable EvaluateBeFreeOfCycles(IEnumerable slices, + ICanBeEvaluated archRule, Architecture architecture) { var slicesList = slices.ToList(); @@ -70,49 +78,43 @@ private static IEnumerable Evaluate(IEnumerable slices, } } - public SliceRule BeFreeOfCycles() + public SliceRule NotDependOnEachOther() { - _ruleCreator.SetEvaluationFunction(Evaluate); - _ruleCreator.AddToDescription("be free of cycles"); + _ruleCreator.SetEvaluationFunction(EvaluateNotDependOnEachOther); + _ruleCreator.AddToDescription("not depend on each other"); return new SliceRule(_ruleCreator); } - public SliceRule NotDependOnEachOther() + private static IEnumerable EvaluateNotDependOnEachOther(IEnumerable slices, + ICanBeEvaluated archRule, + Architecture architecture) { - IEnumerable Evaluate(IEnumerable slices, ICanBeEvaluated archRule, - Architecture architecture) - { - var slicesList = slices.ToList(); + var slicesList = slices.ToList(); - foreach (var slice in slicesList) + foreach (var slice in slicesList) + { + var sliceDependencies = FindDependencies(slice, slicesList).Except(new[] {slice}).ToList(); + var passed = !sliceDependencies.Any(); + var description = slice.Description + " does not depend on another slice."; + if (!passed) { - var sliceDependencies = FindDependencies(slice, slicesList).Except(new[] {slice}).ToList(); - var passed = !sliceDependencies.Any(); - var description = slice.Description + " does not depend on another slice."; - if (!passed) + description = slice.Description + " does depend on other slices:"; + foreach (var sliceDependency in sliceDependencies) { - description = slice.Description + " does depend on other slices:"; - foreach (var sliceDependency in sliceDependencies) - { - var depsToSlice = slice.Dependencies.Where(dependency => - sliceDependency.Types.Contains(dependency.Target)) - .Distinct(new TypeDependencyComparer()).ToList(); - description += "\n" + slice.Description + " -> " + sliceDependency.Description; - description = depsToSlice.Aggregate(description, - (current, dependency) => - current + ("\n\t" + dependency.Origin + " -> " + dependency.Target)); - } - - description += "\n"; + var depsToSlice = slice.Dependencies.Where(dependency => + sliceDependency.Types.Contains(dependency.Target)) + .Distinct(new TypeDependencyComparer()).ToList(); + description += "\n" + slice.Description + " -> " + sliceDependency.Description; + description = depsToSlice.Aggregate(description, + (current, dependency) => + current + ("\n\t" + dependency.Origin + " -> " + dependency.Target)); } - yield return new EvaluationResult(slice, passed, description, archRule, architecture); + description += "\n"; } - } - _ruleCreator.SetEvaluationFunction(Evaluate); - _ruleCreator.AddToDescription("not depend on each other"); - return new SliceRule(_ruleCreator); + yield return new EvaluationResult(slice, passed, description, archRule, architecture); + } } } } \ No newline at end of file diff --git a/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberConditionsDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberConditionsDefinition.cs index 05c1cb9bc..93b82c1a2 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberConditionsDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberConditionsDefinition.cs @@ -8,8 +8,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Conditions; -using ArchUnitNET.Fluent.Extensions; namespace ArchUnitNET.Fluent.Syntax.Elements.Members { diff --git a/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberPredicatesDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberPredicatesDefinition.cs index e4a2a5721..00249359b 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberPredicatesDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/Members/MemberPredicatesDefinition.cs @@ -8,7 +8,7 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Predicates; namespace ArchUnitNET.Fluent.Syntax.Elements.Members diff --git a/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberConditionsDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberConditionsDefinition.cs index e812c918e..4cf3732f5 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberConditionsDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberConditionsDefinition.cs @@ -8,8 +8,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Conditions; -using ArchUnitNET.Fluent.Extensions; namespace ArchUnitNET.Fluent.Syntax.Elements.Members.MethodMembers { diff --git a/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberPredicatesDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberPredicatesDefinition.cs index a4c395cc4..244542041 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberPredicatesDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/Members/MethodMembers/MethodMemberPredicatesDefinition.cs @@ -8,7 +8,7 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Predicates; namespace ArchUnitNET.Fluent.Syntax.Elements.Members.MethodMembers @@ -207,7 +207,7 @@ public static IPredicate HaveDependencyInMethodBodyTo(IEnumerable< IEnumerable Condition(IEnumerable ruleTypes) { return ruleTypes.Where(type => - type.GetBodyTypeMemberDependencies().Select(dependency => dependency.Target).Intersect(types) + type.GetBodyTypeMemberDependencies().Select(dependency => dependency.Target).Intersect(typeList) .Any()); } @@ -455,7 +455,7 @@ public static IPredicate DoNotHaveDependencyInMethodBodyTo(IEnumer IEnumerable Condition(IEnumerable ruleTypes) { return ruleTypes.Where(type => - !type.GetBodyTypeMemberDependencies().Select(dependency => dependency.Target).Intersect(types) + !type.GetBodyTypeMemberDependencies().Select(dependency => dependency.Target).Intersect(typeList) .Any()); } diff --git a/ArchUnitNET/Fluent/Syntax/Elements/ObjectConditionsDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/ObjectConditionsDefinition.cs index 0a1d70d38..f60ba30af 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/ObjectConditionsDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/ObjectConditionsDefinition.cs @@ -8,8 +8,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Conditions; -using ArchUnitNET.Fluent.Extensions; using static ArchUnitNET.Domain.Visibility; using Attribute = ArchUnitNET.Domain.Attribute; @@ -57,7 +57,7 @@ public static ICondition Be(IEnumerable patterns, bool useReg return new SimpleCondition( obj => patternList.Any(pattern => obj.FullNameMatches(pattern, useRegularExpressions)), - obj => "is " + obj.FullName, description); + description, failDescription); } @@ -818,7 +818,7 @@ public static ICondition OnlyHaveAttributes(IEnumerable patte bool Condition(TRuleType ruleType) { return ruleType.Attributes.IsNullOrEmpty() || ruleType.Attributes.All(attribute => - patternList.Any(pattern => attribute.FullNameMatches(pattern, useRegularExpressions))); + patternList.Any(pattern => attribute.FullNameMatches(pattern, useRegularExpressions))); } string description; diff --git a/ArchUnitNET/Fluent/Syntax/Elements/ObjectPredicatesDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/ObjectPredicatesDefinition.cs index 51f806b80..14285ef33 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/ObjectPredicatesDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/ObjectPredicatesDefinition.cs @@ -8,7 +8,7 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Predicates; using static ArchUnitNET.Domain.Visibility; using Attribute = ArchUnitNET.Domain.Attribute; @@ -504,7 +504,7 @@ public static IPredicate OnlyHaveAttributes(IEnumerable patterns, boo bool Filter(T type) { return type.Attributes.IsNullOrEmpty() || type.Attributes.All(attribute => - patternList.Any(pattern => attribute.FullNameMatches(pattern, useRegularExpressions))); + patternList.Any(pattern => attribute.FullNameMatches(pattern, useRegularExpressions))); } string description; diff --git a/ArchUnitNET/Fluent/Syntax/Elements/Types/TypeConditionsDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/Types/TypeConditionsDefinition.cs index ef2766b9a..8471918b2 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/Types/TypeConditionsDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/Types/TypeConditionsDefinition.cs @@ -8,9 +8,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Conditions; -using ArchUnitNET.Fluent.Extensions; -using Assembly = System.Reflection.Assembly; namespace ArchUnitNET.Fluent.Syntax.Elements.Types { @@ -296,7 +295,8 @@ public static ICondition ResideInAssembly(string pattern, bool useReg pattern + "\""); } - public static ICondition ResideInAssembly(Assembly assembly, params Assembly[] moreAssemblies) + public static ICondition ResideInAssembly(System.Reflection.Assembly assembly, + params System.Reflection.Assembly[] moreAssemblies) { bool Condition(TRuleType ruleType, Architecture architecture) { @@ -670,7 +670,8 @@ public static ICondition NotResideInAssembly(string pattern, bool use pattern + "\""); } - public static ICondition NotResideInAssembly(Assembly assembly, params Assembly[] moreAssemblies) + public static ICondition NotResideInAssembly(System.Reflection.Assembly assembly, + params System.Reflection.Assembly[] moreAssemblies) { bool Condition(TRuleType ruleType, Architecture architecture) { diff --git a/ArchUnitNET/Fluent/Syntax/Elements/Types/TypePredicatesDefinition.cs b/ArchUnitNET/Fluent/Syntax/Elements/Types/TypePredicatesDefinition.cs index 3f2937146..924f73baa 100644 --- a/ArchUnitNET/Fluent/Syntax/Elements/Types/TypePredicatesDefinition.cs +++ b/ArchUnitNET/Fluent/Syntax/Elements/Types/TypePredicatesDefinition.cs @@ -8,7 +8,7 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent.Predicates; using Assembly = System.Reflection.Assembly; diff --git a/ArchUnitNET/Core/ArchBuilder.cs b/ArchUnitNET/Loader/ArchBuilder.cs similarity index 97% rename from ArchUnitNET/Core/ArchBuilder.cs rename to ArchUnitNET/Loader/ArchBuilder.cs index e5f5c2563..dde4fe916 100644 --- a/ArchUnitNET/Core/ArchBuilder.cs +++ b/ArchUnitNET/Loader/ArchBuilder.cs @@ -6,13 +6,13 @@ using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Core.LoadTasks; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader.LoadTasks; using JetBrains.Annotations; using Mono.Cecil; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal class ArchBuilder { diff --git a/ArchUnitNET/Core/ArchLoader.cs b/ArchUnitNET/Loader/ArchLoader.cs similarity index 98% rename from ArchUnitNET/Core/ArchLoader.cs rename to ArchUnitNET/Loader/ArchLoader.cs index 7de494f39..49895a727 100644 --- a/ArchUnitNET/Core/ArchLoader.cs +++ b/ArchUnitNET/Loader/ArchLoader.cs @@ -9,12 +9,12 @@ using System.IO; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using Mono.Cecil; using static System.IO.SearchOption; using Assembly = System.Reflection.Assembly; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { public class ArchLoader { diff --git a/ArchUnitNET/Core/AssemblyRegistry.cs b/ArchUnitNET/Loader/AssemblyRegistry.cs similarity index 96% rename from ArchUnitNET/Core/AssemblyRegistry.cs rename to ArchUnitNET/Loader/AssemblyRegistry.cs index 4894a44f7..fd2b81775 100644 --- a/ArchUnitNET/Core/AssemblyRegistry.cs +++ b/ArchUnitNET/Loader/AssemblyRegistry.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using ArchUnitNET.Domain; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal class AssemblyRegistry { diff --git a/ArchUnitNET/Core/DotNetCoreAssemblyResolver.cs b/ArchUnitNET/Loader/DotNetCoreAssemblyResolver.cs similarity index 97% rename from ArchUnitNET/Core/DotNetCoreAssemblyResolver.cs rename to ArchUnitNET/Loader/DotNetCoreAssemblyResolver.cs index 918dff015..6a60f5ebd 100644 --- a/ArchUnitNET/Core/DotNetCoreAssemblyResolver.cs +++ b/ArchUnitNET/Loader/DotNetCoreAssemblyResolver.cs @@ -8,11 +8,11 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using JetBrains.Annotations; using Mono.Cecil; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal class DotNetCoreAssemblyResolver : IAssemblyResolver { diff --git a/ArchUnitNET/Fluent/Extensions/InstructionExtensions.cs b/ArchUnitNET/Loader/InstructionExtensions.cs similarity index 99% rename from ArchUnitNET/Fluent/Extensions/InstructionExtensions.cs rename to ArchUnitNET/Loader/InstructionExtensions.cs index c6b8af078..f2146b630 100644 --- a/ArchUnitNET/Fluent/Extensions/InstructionExtensions.cs +++ b/ArchUnitNET/Loader/InstructionExtensions.cs @@ -9,7 +9,7 @@ using Mono.Cecil; using Mono.Cecil.Cil; -namespace ArchUnitNET.Fluent.Extensions +namespace ArchUnitNET.Loader { public static class InstructionExtensions { diff --git a/ArchUnitNET/Core/LoadTaskRegistry.cs b/ArchUnitNET/Loader/LoadTaskRegistry.cs similarity index 96% rename from ArchUnitNET/Core/LoadTaskRegistry.cs rename to ArchUnitNET/Loader/LoadTaskRegistry.cs index d3c7663bf..66a410e06 100644 --- a/ArchUnitNET/Core/LoadTaskRegistry.cs +++ b/ArchUnitNET/Loader/LoadTaskRegistry.cs @@ -7,10 +7,10 @@ using System; using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Core.LoadTasks; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader.LoadTasks; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal class LoadTaskRegistry { diff --git a/ArchUnitNET/Core/LoadTasks/AddAttributesAndAttributeDependencies.cs b/ArchUnitNET/Loader/LoadTasks/AddAttributesAndAttributeDependencies.cs similarity index 96% rename from ArchUnitNET/Core/LoadTasks/AddAttributesAndAttributeDependencies.cs rename to ArchUnitNET/Loader/LoadTasks/AddAttributesAndAttributeDependencies.cs index a5d9cd064..d4235a793 100644 --- a/ArchUnitNET/Core/LoadTasks/AddAttributesAndAttributeDependencies.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddAttributesAndAttributeDependencies.cs @@ -7,13 +7,12 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using JetBrains.Annotations; using Mono.Cecil; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddAttributesAndAttributeDependencies : ILoadTask { diff --git a/ArchUnitNET/Core/LoadTasks/AddBackwardsDependencies.cs b/ArchUnitNET/Loader/LoadTasks/AddBackwardsDependencies.cs similarity index 88% rename from ArchUnitNET/Core/LoadTasks/AddBackwardsDependencies.cs rename to ArchUnitNET/Loader/LoadTasks/AddBackwardsDependencies.cs index 8c66f6b16..a232f968e 100644 --- a/ArchUnitNET/Core/LoadTasks/AddBackwardsDependencies.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddBackwardsDependencies.cs @@ -6,10 +6,10 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddBackwardsDependencies : ILoadTask { diff --git a/ArchUnitNET/Core/LoadTasks/AddBaseClassDependency.cs b/ArchUnitNET/Loader/LoadTasks/AddBaseClassDependency.cs similarity index 94% rename from ArchUnitNET/Core/LoadTasks/AddBaseClassDependency.cs rename to ArchUnitNET/Loader/LoadTasks/AddBaseClassDependency.cs index 356c5d38d..14b63a539 100644 --- a/ArchUnitNET/Core/LoadTasks/AddBaseClassDependency.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddBaseClassDependency.cs @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Types; +using ArchUnitNET.Domain.Dependencies; using Mono.Cecil; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddBaseClassDependency : ILoadTask { diff --git a/ArchUnitNET/Core/LoadTasks/AddClassDependencies.cs b/ArchUnitNET/Loader/LoadTasks/AddClassDependencies.cs similarity index 94% rename from ArchUnitNET/Core/LoadTasks/AddClassDependencies.cs rename to ArchUnitNET/Loader/LoadTasks/AddClassDependencies.cs index 0e367e657..d3abe71fb 100644 --- a/ArchUnitNET/Core/LoadTasks/AddClassDependencies.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddClassDependencies.cs @@ -7,11 +7,11 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Mono.Cecil; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddClassDependencies : ILoadTask { diff --git a/ArchUnitNET/Core/LoadTasks/AddFieldAndPropertyDependencies.cs b/ArchUnitNET/Loader/LoadTasks/AddFieldAndPropertyDependencies.cs similarity index 91% rename from ArchUnitNET/Core/LoadTasks/AddFieldAndPropertyDependencies.cs rename to ArchUnitNET/Loader/LoadTasks/AddFieldAndPropertyDependencies.cs index 679192d6c..afaa62352 100644 --- a/ArchUnitNET/Core/LoadTasks/AddFieldAndPropertyDependencies.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddFieldAndPropertyDependencies.cs @@ -5,10 +5,10 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddFieldAndPropertyDependencies : ILoadTask { diff --git a/ArchUnitNET/Core/LoadTasks/AddMembers.cs b/ArchUnitNET/Loader/LoadTasks/AddMembers.cs similarity index 98% rename from ArchUnitNET/Core/LoadTasks/AddMembers.cs rename to ArchUnitNET/Loader/LoadTasks/AddMembers.cs index 1492e3863..fb9e20348 100644 --- a/ArchUnitNET/Core/LoadTasks/AddMembers.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddMembers.cs @@ -8,13 +8,12 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; using JetBrains.Annotations; using Mono.Cecil; using static ArchUnitNET.Domain.Visibility; using GenericParameter = ArchUnitNET.Domain.GenericParameter; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddMembers : ILoadTask { diff --git a/ArchUnitNET/Core/LoadTasks/AddMethodDependencies.cs b/ArchUnitNET/Loader/LoadTasks/AddMethodDependencies.cs similarity index 83% rename from ArchUnitNET/Core/LoadTasks/AddMethodDependencies.cs rename to ArchUnitNET/Loader/LoadTasks/AddMethodDependencies.cs index ac39b1e65..150ab4fa9 100644 --- a/ArchUnitNET/Core/LoadTasks/AddMethodDependencies.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddMethodDependencies.cs @@ -8,13 +8,15 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Exceptions; +using ArchUnitNET.Domain.Extensions; using JetBrains.Annotations; using Mono.Cecil; using Mono.Cecil.Cil; +using GenericParameter = ArchUnitNET.Domain.GenericParameter; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddMethodDependencies : ILoadTask { @@ -175,7 +177,7 @@ private IEnumerable CreateMethodCallDependenciesFromBody(M var calledType = _typeFactory.GetOrCreateStubTypeFromTypeReference(methodReference.DeclaringType); - return calledType.GetMethodMemberWithMethodReference(methodReference); + return GetMethodMemberWithMethodReference(calledType, methodReference); }) .Where(calledMethodMember => calledMethodMember != null) .Select(calledMethodMember => new MethodCallDependency(methodMember, calledMethodMember)); @@ -222,6 +224,51 @@ private IEnumerable CreateMethodCallDependenciesForProper }); } + private MethodMember GetMethodMemberWithMethodReference(IType type, MethodReference methodReference) + { + var matchingMethods = type.GetMethodMembers().Where(member => MatchesGeneric(member, methodReference)) + .ToList(); + if (matchingMethods.Count > 1) + { + throw new MultipleOccurrencesInSequenceException( + $"Multiple Methods matching {methodReference.FullName} found in provided type."); + } + + return matchingMethods.FirstOrDefault(); + } + + private bool MatchesGeneric(MethodMember methodMember, MethodReference methodReference) + { + var referenceFullName = methodReference.GetElementMethod().GetFullName(); + var memberFullName = methodMember.FullName; + var count = methodReference.GetElementMethod().GenericParameters.Count; + if (methodMember.GenericParameters.Count != count) + { + return false; + } + + var parameters = new List(); + for (var i = 0; i < count; i++) + { + parameters.Add(new[] + { + new GenericParameter(methodReference.GetElementMethod().GenericParameters[i].Name), + methodMember.GenericParameters[i] + }); + } + + parameters = parameters.OrderByDescending(genericParameters => genericParameters[0].Name.Length).ToList(); + + foreach (var genericParameters in parameters.Where(genericParameters => genericParameters[0] != null) + ) + { + referenceFullName = referenceFullName.Replace(genericParameters[0].Name, genericParameters[1].Name); + memberFullName = memberFullName.Replace(genericParameters[0].Name, genericParameters[1].Name); + } + + return memberFullName.Equals(referenceFullName); + } + private FieldMember FindMatchingField(FieldDefinition fieldDefinition) { return _type.GetFieldMembersWithName(fieldDefinition.Name).SingleOrDefault(); diff --git a/ArchUnitNET/Core/LoadTasks/AddTypesToNamespace.cs b/ArchUnitNET/Loader/LoadTasks/AddTypesToNamespace.cs similarity index 95% rename from ArchUnitNET/Core/LoadTasks/AddTypesToNamespace.cs rename to ArchUnitNET/Loader/LoadTasks/AddTypesToNamespace.cs index fbecfccd6..1b13b8a3e 100644 --- a/ArchUnitNET/Core/LoadTasks/AddTypesToNamespace.cs +++ b/ArchUnitNET/Loader/LoadTasks/AddTypesToNamespace.cs @@ -8,7 +8,7 @@ using System.Linq; using ArchUnitNET.Domain; -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal class AddTypesToNamespace : ILoadTask { diff --git a/ArchUnitNET/Core/LoadTasks/ILoadTask.cs b/ArchUnitNET/Loader/LoadTasks/ILoadTask.cs similarity index 88% rename from ArchUnitNET/Core/LoadTasks/ILoadTask.cs rename to ArchUnitNET/Loader/LoadTasks/ILoadTask.cs index 9390282b7..c8590a25b 100644 --- a/ArchUnitNET/Core/LoadTasks/ILoadTask.cs +++ b/ArchUnitNET/Loader/LoadTasks/ILoadTask.cs @@ -4,7 +4,7 @@ // // SPDX-License-Identifier: Apache-2.0 -namespace ArchUnitNET.Core.LoadTasks +namespace ArchUnitNET.Loader.LoadTasks { internal interface ILoadTask { diff --git a/ArchUnitNET/Fluent/Extensions/MonoCecilMemberExtensions.cs b/ArchUnitNET/Loader/MonoCecilMemberExtensions.cs similarity index 98% rename from ArchUnitNET/Fluent/Extensions/MonoCecilMemberExtensions.cs rename to ArchUnitNET/Loader/MonoCecilMemberExtensions.cs index e793f546e..3b4f14bec 100644 --- a/ArchUnitNET/Fluent/Extensions/MonoCecilMemberExtensions.cs +++ b/ArchUnitNET/Loader/MonoCecilMemberExtensions.cs @@ -8,14 +8,13 @@ using System.Collections.Generic; using System.Linq; using System.Text; -using ArchUnitNET.Core; using ArchUnitNET.Domain; using JetBrains.Annotations; using Mono.Cecil; using static ArchUnitNET.Domain.Visibility; using GenericParameter = ArchUnitNET.Domain.GenericParameter; -namespace ArchUnitNET.Fluent.Extensions +namespace ArchUnitNET.Loader { public static class MonoCecilMemberExtensions { @@ -209,7 +208,7 @@ public static Visibility GetVisibility(this MethodDefinition methodDefinition) public static string GetFullName(this MethodReference methodReference) { return methodReference.FullName + methodReference.GenericParameters.Aggregate(string.Empty, - (current, newElement) => current + "<" + newElement.Name + ">"); + (current, newElement) => current + "<" + newElement.Name + ">"); } } } \ No newline at end of file diff --git a/ArchUnitNET/Core/NamespaceRegistry.cs b/ArchUnitNET/Loader/NamespaceRegistry.cs similarity index 96% rename from ArchUnitNET/Core/NamespaceRegistry.cs rename to ArchUnitNET/Loader/NamespaceRegistry.cs index a4a7ba3ce..2c696616a 100644 --- a/ArchUnitNET/Core/NamespaceRegistry.cs +++ b/ArchUnitNET/Loader/NamespaceRegistry.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using ArchUnitNET.Domain; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal class NamespaceRegistry { diff --git a/ArchUnitNET/Fluent/Extensions/RegexUtils.cs b/ArchUnitNET/Loader/RegexUtils.cs similarity index 97% rename from ArchUnitNET/Fluent/Extensions/RegexUtils.cs rename to ArchUnitNET/Loader/RegexUtils.cs index 86f9bddd8..7cafed55a 100644 --- a/ArchUnitNET/Fluent/Extensions/RegexUtils.cs +++ b/ArchUnitNET/Loader/RegexUtils.cs @@ -5,8 +5,9 @@ // SPDX-License-Identifier: Apache-2.0 using System.Text.RegularExpressions; +using ArchUnitNET.Domain; -namespace ArchUnitNET.Fluent.Extensions +namespace ArchUnitNET.Loader { public static class RegexUtils { diff --git a/ArchUnitNET/Core/RegistryUtils.cs b/ArchUnitNET/Loader/RegistryUtils.cs similarity index 95% rename from ArchUnitNET/Core/RegistryUtils.cs rename to ArchUnitNET/Loader/RegistryUtils.cs index a79e8d7f5..8e13c0643 100644 --- a/ArchUnitNET/Core/RegistryUtils.cs +++ b/ArchUnitNET/Loader/RegistryUtils.cs @@ -7,7 +7,7 @@ using System; using System.Collections.Generic; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal static class RegistryUtils { diff --git a/ArchUnitNET/Core/Type.cs b/ArchUnitNET/Loader/Type.cs similarity index 97% rename from ArchUnitNET/Core/Type.cs rename to ArchUnitNET/Loader/Type.cs index c670a6c47..5470b8f53 100644 --- a/ArchUnitNET/Core/Type.cs +++ b/ArchUnitNET/Loader/Type.cs @@ -7,10 +7,10 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { public class Type : IType { diff --git a/ArchUnitNET/Core/TypeFactory.cs b/ArchUnitNET/Loader/TypeFactory.cs similarity index 99% rename from ArchUnitNET/Core/TypeFactory.cs rename to ArchUnitNET/Loader/TypeFactory.cs index 013431137..e0470f3b7 100644 --- a/ArchUnitNET/Core/TypeFactory.cs +++ b/ArchUnitNET/Loader/TypeFactory.cs @@ -6,14 +6,14 @@ using System; using System.Linq; -using ArchUnitNET.Core.LoadTasks; using ArchUnitNET.Domain; +using ArchUnitNET.Loader.LoadTasks; using JetBrains.Annotations; using Mono.Cecil; using static ArchUnitNET.Domain.Visibility; using Attribute = ArchUnitNET.Domain.Attribute; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal class TypeFactory { diff --git a/ArchUnitNET/Core/TypeRegistry.cs b/ArchUnitNET/Loader/TypeRegistry.cs similarity index 96% rename from ArchUnitNET/Core/TypeRegistry.cs rename to ArchUnitNET/Loader/TypeRegistry.cs index aae36f982..72b237b22 100644 --- a/ArchUnitNET/Core/TypeRegistry.cs +++ b/ArchUnitNET/Loader/TypeRegistry.cs @@ -10,7 +10,7 @@ using JetBrains.Annotations; using Mono.Cecil; -namespace ArchUnitNET.Core +namespace ArchUnitNET.Loader { internal class TypeRegistry { diff --git a/ArchUnitNET/Matcher/Matcher.cs b/ArchUnitNET/Matcher/Matcher.cs deleted file mode 100644 index 031114729..000000000 --- a/ArchUnitNET/Matcher/Matcher.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System; -using System.Collections.Generic; -using System.Linq; -using ArchUnitNET.ArchitectureExceptions; - -namespace ArchUnitNET.Matcher -{ - [Obsolete] - public static class Matcher - { - public static void ShouldAll(this IEnumerable enumerable, Func matcher) - { - var first = enumerable.FirstOrDefault(arg => !matcher(arg)); - if (first != null) - { - throw new ArchitectureException(first.ToString()); - } - } - } -} \ No newline at end of file diff --git a/ArchUnitNETTests/ArchitectureTests/ArchUnitArchitectureTests.cs b/ArchUnitNETTests/ArchitectureTests/ArchUnitArchitectureTests.cs new file mode 100644 index 000000000..6a8f3b8ac --- /dev/null +++ b/ArchUnitNETTests/ArchitectureTests/ArchUnitArchitectureTests.cs @@ -0,0 +1,49 @@ +// Copyright 2019 Florian Gather +// Copyright 2019 Fritz Brandhuber +// Copyright 2020 Pavel Fischer +// +// SPDX-License-Identifier: Apache-2.0 +// + +using ArchUnitNET.Domain; +using ArchUnitNET.Fluent; +using ArchUnitNET.Loader; +using Xunit; +using static ArchUnitNET.Fluent.ArchRuleDefinition; + +namespace ArchUnitNETTests.ArchitectureTests +{ + public class ArchUnitArchitectureTests + { + private static readonly string DomainNamespace = typeof(Architecture).Namespace; + private static readonly string LoaderNamespace = typeof(ArchLoader).Namespace; + private static readonly string FluentNamespace = typeof(IArchRule).Namespace; + + private readonly Architecture _architecture = + new ArchLoader().LoadAssembly(typeof(Architecture).Assembly).Build(); + + [Fact(Skip = "Need more refactoring")] + public void DomainHasNoDependencyOnFluentAndLoader() + { + Types().That().ResideInNamespace(DomainNamespace) + .Should().NotDependOnAny(new[] {LoaderNamespace, FluentNamespace}) + .Check(_architecture); + } + + [Fact] + public void LoaderHasNoDependencyOnFluent() + { + Types().That().ResideInNamespace(LoaderNamespace) + .Should().NotDependOnAny(FluentNamespace) + .Check(_architecture); + } + + [Fact] + public void FluentHasNoDependencyOnLoader() + { + Types().That().ResideInNamespace(FluentNamespace) + .Should().NotDependOnAny(LoaderNamespace) + .Check(_architecture); + } + } +} \ No newline at end of file diff --git a/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs b/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs index 3d7722e4e..44c20720e 100644 --- a/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs +++ b/ArchUnitNETTests/Domain/ArchitectureCacheKeyTests.cs @@ -5,8 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNETTests.Dependencies.Attributes; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNETTests.Domain.Dependencies.Attributes; +using ArchUnitNETTests.Domain.Dependencies.Members; using Mono.Cecil; using Xunit; @@ -34,8 +34,6 @@ public ArchitectureCacheKeyTests() private readonly string _attributeDependencyTests; private readonly ArchitectureCacheKey _architectureCacheKey; private readonly ArchitectureCacheKey _duplicateArchitectureCacheKey; - private readonly object _objectReferenceDuplicateArchitectureCacheKey; - private readonly object _duplicateObjectArchitectureCacheKey; [Fact] public void ArchitectureCacheKeyContentEquivalentsAreEqual() diff --git a/ArchUnitNETTests/Domain/AttributeTests.cs b/ArchUnitNETTests/Domain/AttributeTests.cs index 91f42700a..2d3cbe143 100644 --- a/ArchUnitNETTests/Domain/AttributeTests.cs +++ b/ArchUnitNETTests/Domain/AttributeTests.cs @@ -5,12 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 using System.Linq; -using ArchUnitNET.Core; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Attributes; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; +using ArchUnitNETTests.Domain.Dependencies.Attributes; using JetBrains.Annotations; using Xunit; @@ -66,8 +65,11 @@ public AttributeOriginClassPair(System.Type originType) Attribute = Architecture.GetAttributeOfType(originType); } - [NotNull] public Class OriginClass { get; } - [NotNull] public Attribute Attribute { get; } + [NotNull] + public Class OriginClass { get; } + + [NotNull] + public Attribute Attribute { get; } } private class AttributeEquivalencyTestData @@ -81,10 +83,17 @@ public AttributeEquivalencyTestData([NotNull] System.Type originType) ObjectReferenceDuplicate = OriginAttribute; } - [NotNull] public Attribute OriginAttribute { get; } - [NotNull] public object DuplicateAttribute { get; } - [NotNull] public Attribute AttributeReferenceDuplicate { get; } - [NotNull] public object ObjectReferenceDuplicate { get; } + [NotNull] + public Attribute OriginAttribute { get; } + + [NotNull] + public object DuplicateAttribute { get; } + + [NotNull] + public Attribute AttributeReferenceDuplicate { get; } + + [NotNull] + public object ObjectReferenceDuplicate { get; } } [Fact] diff --git a/ArchUnitNETTests/Domain/ClassTests.cs b/ArchUnitNETTests/Domain/ClassTests.cs index 47e9d5da6..be5139d25 100644 --- a/ArchUnitNETTests/Domain/ClassTests.cs +++ b/ArchUnitNETTests/Domain/ClassTests.cs @@ -4,11 +4,10 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.Core; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Members; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; +using ArchUnitNETTests.Domain.Dependencies.Members; using JetBrains.Annotations; using Xunit; using static ArchUnitNET.Domain.Visibility; @@ -58,10 +57,17 @@ public ClassEquivalencyTestData([NotNull] System.Type originType) ObjectReferenceDuplicate = OriginClass; } - [NotNull] public Class OriginClass { get; } - [NotNull] public object DuplicateClass { get; } - [NotNull] public Class ClassReferenceDuplicate { get; } - [NotNull] public object ObjectReferenceDuplicate { get; } + [NotNull] + public Class OriginClass { get; } + + [NotNull] + public object DuplicateClass { get; } + + [NotNull] + public Class ClassReferenceDuplicate { get; } + + [NotNull] + public object ObjectReferenceDuplicate { get; } } [Fact] diff --git a/ArchUnitNETTests/Dependencies/Attributes/AttributeAssertionRepository.cs b/ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeAssertionRepository.cs similarity index 93% rename from ArchUnitNETTests/Dependencies/Attributes/AttributeAssertionRepository.cs rename to ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeAssertionRepository.cs index ec617e3d1..dd87182d2 100644 --- a/ArchUnitNETTests/Dependencies/Attributes/AttributeAssertionRepository.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeAssertionRepository.cs @@ -7,13 +7,12 @@ using System; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Xunit; using Attribute = ArchUnitNET.Domain.Attribute; -namespace ArchUnitNETTests.Dependencies.Attributes +namespace ArchUnitNETTests.Domain.Dependencies.Attributes { public static class AttributeAssertionRepository { @@ -90,7 +89,7 @@ public static void AttributeDependencyAsExpected(IMember targetMember, Class exp Assert.Equal(expectedAttributeDependency, targetMember.Dependencies.First()); - Assert.True(targetMember.HasDependency(expectedAttributeDependency)); + Assert.True(targetMember.Dependencies.Contains(expectedAttributeDependency)); } public static void AttributeDependencyAsExpected(IType targetType, Class expectedAttributeClass) diff --git a/ArchUnitNETTests/Dependencies/Attributes/AttributeDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeDependencyTests.cs similarity index 79% rename from ArchUnitNETTests/Dependencies/Attributes/AttributeDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeDependencyTests.cs index 8a93060e1..c2927ac6b 100644 --- a/ArchUnitNETTests/Dependencies/Attributes/AttributeDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeDependencyTests.cs @@ -7,15 +7,14 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNET.Matcher; -using ArchUnitNETTests.Dependencies.Members; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNETTests.Domain.Dependencies.Members; using TestAssembly; using Xunit; -using static ArchUnitNETTests.Dependencies.Attributes.AttributeAssertionRepository; +using static ArchUnitNETTests.Domain.Dependencies.Attributes.AttributeAssertionRepository; -namespace ArchUnitNETTests.Dependencies.Attributes +namespace ArchUnitNETTests.Domain.Dependencies.Attributes { public class AttributeDependencyTests { @@ -67,14 +66,13 @@ public void ClassAttributeInnerDependencyAssignedToOriginClass() var expectedClassTargets = new[] {_hello, _helloEvent}; //Assert - expectedClassTargets.ShouldAll(targetClass => - _originClass.DependsOn(targetClass.FullName)); + Assert.All(expectedClassTargets, targetClass => Assert.True(_originClass.DependsOn(targetClass.FullName))); } [Fact] public void ForbidAttributeForClass() { - _eventHandlerImplementClasses.ShouldAll(cls => !cls.DependsOn("forbidden")); + Assert.All(_eventHandlerImplementClasses, cls => Assert.False(cls.DependsOn("forbidden"))); } [Fact] @@ -84,15 +82,14 @@ public void MemberAttributeInnerDependencyAssignedToOriginClass() var expectedClassTargets = new[] {_class1, _class2, _classWithAttribute, _classWithBodyTypeA}; //Assert - expectedClassTargets.ShouldAll(targetClass => - _originClass.DependsOn(targetClass.FullName)); + Assert.All(expectedClassTargets, targetClass => Assert.True(_originClass.DependsOn(targetClass.FullName))); } [Fact] public void OriginAsExpected() { - _originClass.GetAttributeTypeDependencies().ShouldAll(dependency => - dependency.Origin.Equals(_originClass)); + Assert.All(((IHasDependencies) _originClass).Dependencies.OfType(), + dependency => Assert.True(dependency.Origin.Equals(_originClass))); } } } \ No newline at end of file diff --git a/ArchUnitNETTests/Dependencies/Attributes/AttributeTestsBuild.cs b/ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeTestsBuild.cs similarity index 98% rename from ArchUnitNETTests/Dependencies/Attributes/AttributeTestsBuild.cs rename to ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeTestsBuild.cs index 8aaa93c09..49659b3d9 100644 --- a/ArchUnitNETTests/Dependencies/Attributes/AttributeTestsBuild.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Attributes/AttributeTestsBuild.cs @@ -8,10 +8,10 @@ using System.Collections; using System.Collections.Generic; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNETTests.Fluent.Extensions; -namespace ArchUnitNETTests.Dependencies.Attributes +namespace ArchUnitNETTests.Domain.Dependencies.Attributes { public static class AttributeTestsBuild { diff --git a/ArchUnitNETTests/Dependencies/Attributes/TestAttributes.cs b/ArchUnitNETTests/Domain/Dependencies/Attributes/TestAttributes.cs similarity index 95% rename from ArchUnitNETTests/Dependencies/Attributes/TestAttributes.cs rename to ArchUnitNETTests/Domain/Dependencies/Attributes/TestAttributes.cs index c25062aa8..89640b520 100644 --- a/ArchUnitNETTests/Dependencies/Attributes/TestAttributes.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Attributes/TestAttributes.cs @@ -5,7 +5,7 @@ // SPDX-License-Identifier: Apache-2.0 using System; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNETTests.Domain.Dependencies.Members; using TestAssembly; #pragma warning disable 169 @@ -23,7 +23,7 @@ // ReSharper disable UnusedVariable // ReSharper disable UnusedTypeParameter -namespace ArchUnitNETTests.Dependencies.Attributes +namespace ArchUnitNETTests.Domain.Dependencies.Attributes { public class TestAttributes { @@ -149,13 +149,16 @@ public class ClassWithExampleAttribute private string _parameterProperty; - [ExampleField] public FieldType FieldA; + [ExampleField] + public FieldType FieldA; - [ChildOfAbstract] public string FieldWithAbstractAttributeImplemented; + [ChildOfAbstract] + public string FieldWithAbstractAttributeImplemented; public string ParameterProperty; - [ExampleProperty] public string PropertyA { get; private set; } + [ExampleProperty] + public string PropertyA { get; private set; } public string get_ParameterProperty() { diff --git a/ArchUnitNETTests/Dependencies/Members/BackingFieldDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/BackingFieldDependencyTests.cs similarity index 96% rename from ArchUnitNETTests/Dependencies/Members/BackingFieldDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/BackingFieldDependencyTests.cs index c80724fed..bf4afba93 100644 --- a/ArchUnitNETTests/Dependencies/Members/BackingFieldDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/BackingFieldDependencyTests.cs @@ -6,11 +6,10 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using Xunit; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class BackingFieldDependencyTests { diff --git a/ArchUnitNETTests/Dependencies/Members/BodyTypeMemberDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/BodyTypeMemberDependencyTests.cs similarity index 93% rename from ArchUnitNETTests/Dependencies/Members/BodyTypeMemberDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/BodyTypeMemberDependencyTests.cs index 825d0289b..8af0181e5 100644 --- a/ArchUnitNETTests/Dependencies/Members/BodyTypeMemberDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/BodyTypeMemberDependencyTests.cs @@ -6,11 +6,11 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNETTests.Fluent.Extensions; using Xunit; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class BodyTypeMemberDependencyTests { @@ -33,7 +33,6 @@ public void BodyTypeDependenciesFound() var bodyTypeDependencies = _methodWithTypeA.GetBodyTypeMemberDependencies().ToList(); - var classWithBodyTypeA = new ClassWithBodyTypeA(); Assert.Equal("AABC", ClassWithBodyTypeA.MethodWithTypeA()); Assert.True(bodyTypeDependencies.Count >= 3); Assert.Contains(_typeA, bodyTypeDependencies.Select(dependency => (Class) dependency.Target)); diff --git a/ArchUnitNETTests/Dependencies/Members/ClassDependenciesIncludeMemberDependencies.cs b/ArchUnitNETTests/Domain/Dependencies/Members/ClassDependenciesIncludeMemberDependencies.cs similarity index 94% rename from ArchUnitNETTests/Dependencies/Members/ClassDependenciesIncludeMemberDependencies.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/ClassDependenciesIncludeMemberDependencies.cs index 5fa4735dc..0987c7c55 100644 --- a/ArchUnitNETTests/Dependencies/Members/ClassDependenciesIncludeMemberDependencies.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/ClassDependenciesIncludeMemberDependencies.cs @@ -8,11 +8,10 @@ using System.Collections; using System.Collections.Generic; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using Xunit; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class ClassDependenciesIncludeMemberDependencies { diff --git a/ArchUnitNETTests/Dependencies/Members/FieldDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/FieldDependencyTests.cs similarity index 93% rename from ArchUnitNETTests/Dependencies/Members/FieldDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/FieldDependencyTests.cs index 24e18f2f0..ca37ac187 100644 --- a/ArchUnitNETTests/Dependencies/Members/FieldDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/FieldDependencyTests.cs @@ -6,13 +6,12 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Xunit; using static ArchUnitNET.Domain.Visibility; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class FieldDependencyTests { @@ -67,6 +66,7 @@ public void PrivateFieldMembersAreCreatedWithCorrectVisibility() } } +#pragma warning disable 169 public class ClassWithFieldA { private FieldType _privateFieldA; diff --git a/ArchUnitNETTests/Dependencies/Members/GetterSetterExamples.cs b/ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterExamples.cs similarity index 97% rename from ArchUnitNETTests/Dependencies/Members/GetterSetterExamples.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterExamples.cs index 1ca7e6372..90b925107 100644 --- a/ArchUnitNETTests/Dependencies/Members/GetterSetterExamples.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterExamples.cs @@ -12,7 +12,7 @@ // ReSharper disable InconsistentNaming // ReSharper disable ArrangeAccessorOwnerBody -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class GetterMethodDependencyExamples { diff --git a/ArchUnitNETTests/Dependencies/Members/GetterSetterMethodDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterMethodDependencyTests.cs similarity index 78% rename from ArchUnitNETTests/Dependencies/Members/GetterSetterMethodDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterMethodDependencyTests.cs index a847d6519..1d880185b 100644 --- a/ArchUnitNETTests/Dependencies/Members/GetterSetterMethodDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterMethodDependencyTests.cs @@ -6,32 +6,24 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Xunit; // ReSharper disable UnusedMember.Local // ReSharper disable UnusedMember.Local // ReSharper disable ParameterOnlyUsedForPreconditionCheck.Local -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class GetterSetterMethodDependencyTests { - private readonly PropertyMember _acceptedCaseProperty; private readonly Architecture _architecture = StaticTestArchitectures.ArchUnitNETTestArchitecture; - private readonly PropertyMember _firstUnacceptedCaseProperty; - private readonly PropertyMember _secondUnacceptedCaseProperty; public GetterSetterMethodDependencyTests() { var getterExampleClass = _architecture.GetClassOfType(typeof(GetterMethodDependencyExamples)); getterExampleClass.RequiredNotNull(); - _acceptedCaseProperty = getterExampleClass.GetPropertyMembersWithName("AcceptedCase").First(); - _firstUnacceptedCaseProperty = getterExampleClass.GetPropertyMembersWithName("FirstUnacceptedCase").First(); - _secondUnacceptedCaseProperty = getterExampleClass.GetPropertyMembersWithName("SecondUnacceptedCase") - .First(); } [Theory] diff --git a/ArchUnitNETTests/Dependencies/Members/GetterSetterTestsBuild.cs b/ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterTestsBuild.cs similarity index 94% rename from ArchUnitNETTests/Dependencies/Members/GetterSetterTestsBuild.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterTestsBuild.cs index 15d2ebf8c..b5e8f94ad 100644 --- a/ArchUnitNETTests/Dependencies/Members/GetterSetterTestsBuild.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/GetterSetterTestsBuild.cs @@ -9,14 +9,14 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using ArchUnitNET.Core; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.ArchitectureTestExceptions; -using static ArchUnitNETTests.Fluent.Extensions.BuildMocksExtensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; +using ArchUnitNETTests.Fluent.Extensions; using Type = System.Type; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class GetterSetterTestsBuild { @@ -111,6 +111,14 @@ private static object[] BuildAccessMethodTestData(Type classType, string propert return new object[] {accessedProperty, accessorMethod}; } + private static MethodCallDependency CreateStubMethodCallDependency(IMember originMember, + MethodMember targetMember) + { + var methodCallDependency = new MethodCallDependency(originMember, targetMember); + methodCallDependency.TargetMember.MemberBackwardsDependencies.Add(methodCallDependency); + return methodCallDependency; + } + public class SetterTestData : IEnumerable { private readonly List _setterTestData = new List diff --git a/ArchUnitNETTests/Dependencies/Members/InheritsBaseClassDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/InheritsBaseClassDependencyTests.cs similarity index 85% rename from ArchUnitNETTests/Dependencies/Members/InheritsBaseClassDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/InheritsBaseClassDependencyTests.cs index fbb646c80..57709df56 100644 --- a/ArchUnitNETTests/Dependencies/Members/InheritsBaseClassDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/InheritsBaseClassDependencyTests.cs @@ -5,13 +5,11 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNET.Matcher; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Xunit; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class BaseClassTest { @@ -52,8 +50,8 @@ public void ChildClassHasBaseClassDependency() [Fact] public void OriginAsExpected() { - _childClass.GetInheritsBaseClassDependencies().ShouldAll(dependency => - dependency.Origin.Equals(_childClass)); + Assert.All(_childClass.GetInheritsBaseClassDependencies(), + dependency => Assert.Equal(_childClass, dependency.Origin)); } } diff --git a/ArchUnitNETTests/ArchitectureTestExceptions/InvalidInputException.cs b/ArchUnitNETTests/Domain/Dependencies/Members/InvalidInputException.cs similarity index 90% rename from ArchUnitNETTests/ArchitectureTestExceptions/InvalidInputException.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/InvalidInputException.cs index 15d55efb2..2c080cc9d 100644 --- a/ArchUnitNETTests/ArchitectureTestExceptions/InvalidInputException.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/InvalidInputException.cs @@ -6,7 +6,7 @@ using System; -namespace ArchUnitNETTests.ArchitectureTestExceptions +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class InvalidInputException : Exception { diff --git a/ArchUnitNETTests/Dependencies/Members/MemberDependencyTestBuild.cs b/ArchUnitNETTests/Domain/Dependencies/Members/MemberDependencyTestBuild.cs similarity index 98% rename from ArchUnitNETTests/Dependencies/Members/MemberDependencyTestBuild.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/MemberDependencyTestBuild.cs index df404dc5e..d8e1439c9 100644 --- a/ArchUnitNETTests/Dependencies/Members/MemberDependencyTestBuild.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/MemberDependencyTestBuild.cs @@ -9,11 +9,11 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using ArchUnitNETTests.Fluent.Extensions; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public static class MemberDependencyTestBuild { diff --git a/ArchUnitNETTests/Dependencies/Members/MemberDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/MemberDependencyTests.cs similarity index 96% rename from ArchUnitNETTests/Dependencies/Members/MemberDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/MemberDependencyTests.cs index e3a675ba9..5a497054e 100644 --- a/ArchUnitNETTests/Dependencies/Members/MemberDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/MemberDependencyTests.cs @@ -4,12 +4,12 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using JetBrains.Annotations; using Xunit; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class MemberDependencyTests { diff --git a/ArchUnitNETTests/Dependencies/Members/MethodCallDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs similarity index 95% rename from ArchUnitNETTests/Dependencies/Members/MethodCallDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs index 2ca7fdfae..908007e23 100644 --- a/ArchUnitNETTests/Dependencies/Members/MethodCallDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/MethodCallDependencyTests.cs @@ -6,8 +6,8 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using ArchUnitNETTests.Fluent.Extensions; using Xunit; @@ -15,7 +15,7 @@ // ReSharper disable UnusedVariable // ReSharper disable NotAccessedField.Local -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class MethodCallDependencyTests { diff --git a/ArchUnitNETTests/Dependencies/Members/MethodDependencyTestBuild.cs b/ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs similarity index 97% rename from ArchUnitNETTests/Dependencies/Members/MethodDependencyTestBuild.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs index 88370762c..b89103096 100644 --- a/ArchUnitNETTests/Dependencies/Members/MethodDependencyTestBuild.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/MethodDependencyTestBuild.cs @@ -9,11 +9,11 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using ArchUnitNETTests.Fluent.Extensions; -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public static class MethodDependencyTestBuild { diff --git a/ArchUnitNETTests/Dependencies/Members/MethodSignatureMemberDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/MethodSignatureMemberDependencyTests.cs similarity index 92% rename from ArchUnitNETTests/Dependencies/Members/MethodSignatureMemberDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/MethodSignatureMemberDependencyTests.cs index 486005e4e..f1c14eb27 100644 --- a/ArchUnitNETTests/Dependencies/Members/MethodSignatureMemberDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/MethodSignatureMemberDependencyTests.cs @@ -5,15 +5,15 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Xunit; // ReSharper disable NotAccessedField.Local // ReSharper disable PrivateFieldCanBeConvertedToLocalVariable // ReSharper disable UnusedMember.Global -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class MethodSignatureMemberDependencyTests { diff --git a/ArchUnitNETTests/Dependencies/Members/PropertyDependencyTests.cs b/ArchUnitNETTests/Domain/Dependencies/Members/PropertyDependencyTests.cs similarity index 94% rename from ArchUnitNETTests/Dependencies/Members/PropertyDependencyTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Members/PropertyDependencyTests.cs index 7c02267a4..95e33b85d 100644 --- a/ArchUnitNETTests/Dependencies/Members/PropertyDependencyTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Members/PropertyDependencyTests.cs @@ -5,9 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Xunit; using static ArchUnitNET.Domain.Visibility; @@ -16,7 +15,7 @@ // ReSharper disable UnusedMember.Local // ReSharper disable UnusedAutoPropertyAccessor.Local -namespace ArchUnitNETTests.Dependencies.Members +namespace ArchUnitNETTests.Domain.Dependencies.Members { public class PropertyDependencyTests { diff --git a/ArchUnitNETTests/Dependencies/Types/GenericInterfaceTests.cs b/ArchUnitNETTests/Domain/Dependencies/Types/GenericInterfaceTests.cs similarity index 94% rename from ArchUnitNETTests/Dependencies/Types/GenericInterfaceTests.cs rename to ArchUnitNETTests/Domain/Dependencies/Types/GenericInterfaceTests.cs index 1932e9777..1ce9d8af5 100644 --- a/ArchUnitNETTests/Dependencies/Types/GenericInterfaceTests.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Types/GenericInterfaceTests.cs @@ -6,14 +6,13 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using Xunit; using Xunit.Sdk; // ReSharper disable UnusedTypeParameter -namespace ArchUnitNETTests.Dependencies.Types +namespace ArchUnitNETTests.Domain.Dependencies.Types { public class GenericInterfaceTests { diff --git a/ArchUnitNETTests/Dependencies/Types/ImplementingInterfacesTest.cs b/ArchUnitNETTests/Domain/Dependencies/Types/ImplementingInterfacesTest.cs similarity index 71% rename from ArchUnitNETTests/Dependencies/Types/ImplementingInterfacesTest.cs rename to ArchUnitNETTests/Domain/Dependencies/Types/ImplementingInterfacesTest.cs index a9efb716b..6e843e39f 100644 --- a/ArchUnitNETTests/Dependencies/Types/ImplementingInterfacesTest.cs +++ b/ArchUnitNETTests/Domain/Dependencies/Types/ImplementingInterfacesTest.cs @@ -5,14 +5,12 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNET.Matcher; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; using Xunit; using static ArchUnitNETTests.Domain.StaticTestTypes; -namespace ArchUnitNETTests.Dependencies.Types +namespace ArchUnitNETTests.Domain.Dependencies.Types { public class ImplementingInterfacesTest { @@ -20,11 +18,9 @@ public ImplementingInterfacesTest() { _implementingInterface = InheritingInterface; _inheritedTestInterface = InheritedTestInterface; - _inheritingType = InheritingType; + _inheritingType = StaticTestTypes.InheritingType; } - private readonly Architecture _architecture = StaticTestArchitectures.ArchUnitNETTestArchitecture; - private readonly Interface _implementingInterface; private readonly Interface _inheritedTestInterface; private readonly Class _inheritingType; @@ -42,8 +38,8 @@ public void InheritingTypeImplementsInheritedInterface() [Fact] public void OriginAsExpected() { - _inheritingType.GetImplementsInterfaceDependencies().ShouldAll(dependency => - dependency.Origin.Equals(_inheritingType)); + Assert.All(_inheritingType.GetImplementsInterfaceDependencies(), + dependency => Assert.Equal(_inheritingType, dependency.Origin)); } } } \ No newline at end of file diff --git a/ArchUnitNETTests/Fluent/Extensions/ArchitectureExtensionTests.cs b/ArchUnitNETTests/Domain/Extensions/ArchitectureExtensionTests.cs similarity index 91% rename from ArchUnitNETTests/Fluent/Extensions/ArchitectureExtensionTests.cs rename to ArchUnitNETTests/Domain/Extensions/ArchitectureExtensionTests.cs index ae05d1081..a8b29096a 100644 --- a/ArchUnitNETTests/Fluent/Extensions/ArchitectureExtensionTests.cs +++ b/ArchUnitNETTests/Domain/Extensions/ArchitectureExtensionTests.cs @@ -6,14 +6,14 @@ using System; using System.Linq; -using ArchUnitNET.ArchitectureExceptions; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Exceptions; +using ArchUnitNET.Domain.Extensions; using TestAssembly; using TestAssembly.Domain.Marker; using Xunit; -namespace ArchUnitNETTests.Fluent.Extensions +namespace ArchUnitNETTests.Domain.Extensions { public class ArchitectureExtensionTests { diff --git a/ArchUnitNETTests/Fluent/Extensions/NullableExtensionTests.cs b/ArchUnitNETTests/Domain/Extensions/NullableExtensionTests.cs similarity index 63% rename from ArchUnitNETTests/Fluent/Extensions/NullableExtensionTests.cs rename to ArchUnitNETTests/Domain/Extensions/NullableExtensionTests.cs index 0cefdf1b4..ab22e408e 100644 --- a/ArchUnitNETTests/Fluent/Extensions/NullableExtensionTests.cs +++ b/ArchUnitNETTests/Domain/Extensions/NullableExtensionTests.cs @@ -4,26 +4,25 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.ArchitectureExceptions; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Exceptions; +using ArchUnitNET.Domain.Extensions; using Xunit; -namespace ArchUnitNETTests.Fluent.Extensions +namespace ArchUnitNETTests.Domain.Extensions { public class NullableExtensionTests { [Fact] public void RequiredNotNullReturnsThisWhenNotNull() { - var nonNullObject = new NullableExtensionTests(); + var nonNullObject = new object(); Assert.Equal(nonNullObject, nonNullObject.RequiredNotNull()); } [Fact] public void RequiredNotNullThrowsExceptionWhenNull() { - NullableExtensionTests nullObject = null; - Assert.Throws(() => nullObject.RequiredNotNull()); + Assert.Throws(() => ((object) null).RequiredNotNull()); } } } \ No newline at end of file diff --git a/ArchUnitNETTests/Fluent/Extensions/TypeExtensionTests.cs b/ArchUnitNETTests/Domain/Extensions/TypeExtensionTests.cs similarity index 94% rename from ArchUnitNETTests/Fluent/Extensions/TypeExtensionTests.cs rename to ArchUnitNETTests/Domain/Extensions/TypeExtensionTests.cs index d462ffd27..5d35fd352 100644 --- a/ArchUnitNETTests/Fluent/Extensions/TypeExtensionTests.cs +++ b/ArchUnitNETTests/Domain/Extensions/TypeExtensionTests.cs @@ -7,12 +7,14 @@ using System; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Attributes; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNETTests.Domain.Dependencies.Attributes; +using ArchUnitNETTests.Domain.Dependencies.Members; +using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNETTests.Loader; using Xunit; -namespace ArchUnitNETTests.Fluent.Extensions +namespace ArchUnitNETTests.Domain.Extensions { public class TypeExtensionTests { @@ -40,12 +42,10 @@ public TypeExtensionTests() private readonly IMember _propertyMember; private readonly Class _exampleAttribute; - - private const string ExpectedAttributeNamespace = - StaticConstants.ArchUnitNETTestsDependenciesAttributesNamespace; + private const string ExpectedAttributeNamespace = "ArchUnitNETTests.Domain.Dependencies.Attributes"; private readonly Class _regexUtilsTests; - private const string ExpectedRegexUtilsTestNamespace = StaticConstants.ArchUnitNETTestsFluentNamespace; + private const string ExpectedRegexUtilsTestNamespace = "ArchUnitNETTests.Loader"; [Fact] public void FieldMemberFoundFromMembers() diff --git a/ArchUnitNETTests/Domain/GenericClassTests.cs b/ArchUnitNETTests/Domain/GenericClassTests.cs index 169aa9c16..925022995 100644 --- a/ArchUnitNETTests/Domain/GenericClassTests.cs +++ b/ArchUnitNETTests/Domain/GenericClassTests.cs @@ -7,24 +7,27 @@ using System; using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Core; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; using Xunit; using static ArchUnitNET.Domain.Visibility; -using Type = ArchUnitNET.Core.Type; +using Type = ArchUnitNET.Loader.Type; namespace ArchUnitNETTests.Domain { public class GenericClassTests { + private const string GuidClassName = "Guid"; + private const string SystemGuidFullName = StaticConstants.SystemNamespace + "." + GuidClassName; + public GenericClassTests() { _classWithGenericParameters = Architecture.GetClassOfType(typeof(ClassWithGenericParameters<>)); var invokesGenericClass = Architecture.GetClassOfType(typeof(InvokesGenericClass)); _genericallyTypedField = invokesGenericClass .GetFieldMembersWithName(nameof(InvokesGenericClass.GuidGenericArgument)).SingleOrDefault(); - var guidMock = new Type(StaticConstants.SystemGuidFullName, StaticConstants.GuidClassName, + var guidMock = new Type(SystemGuidFullName, GuidClassName, _classWithGenericParameters.Assembly, new Namespace(StaticConstants.SystemNamespace, new List()), Public, false); _expectedGenericArgument = new Class(guidMock, false, true, true, false); diff --git a/ArchUnitNETTests/Domain/InterfaceTests.cs b/ArchUnitNETTests/Domain/InterfaceTests.cs index 8afc9d4fb..1174740da 100644 --- a/ArchUnitNETTests/Domain/InterfaceTests.cs +++ b/ArchUnitNETTests/Domain/InterfaceTests.cs @@ -5,7 +5,6 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; -using ArchUnitNETTests.Fluent.Extensions; using JetBrains.Annotations; using Xunit; using static ArchUnitNET.Domain.Visibility; @@ -23,7 +22,6 @@ public InterfaceTests() _interfaceImplementingClass = StaticTestTypes.InheritedType; } - private static readonly Architecture Architecture = StaticTestArchitectures.ArchUnitNETTestArchitecture; private readonly InterfaceEquivalencyTestData _interfaceEquivalencyTestData; private readonly Interface _parentInterface; private readonly Interface _childInterface; @@ -39,10 +37,17 @@ public InterfaceEquivalencyTestData([NotNull] Interface originType) ObjectReferenceDuplicate = OriginInterface; } - [NotNull] public Interface OriginInterface { get; } - [NotNull] public object DuplicateInterface { get; } - [NotNull] public Interface InterfaceReferenceDuplicate { get; } - [NotNull] public object ObjectReferenceDuplicate { get; } + [NotNull] + public Interface OriginInterface { get; } + + [NotNull] + public object DuplicateInterface { get; } + + [NotNull] + public Interface InterfaceReferenceDuplicate { get; } + + [NotNull] + public object ObjectReferenceDuplicate { get; } } [Fact] diff --git a/ArchUnitNETTests/Domain/MemberListTests.cs b/ArchUnitNETTests/Domain/MemberListTests.cs index ac462aa6d..4d8732c34 100644 --- a/ArchUnitNETTests/Domain/MemberListTests.cs +++ b/ArchUnitNETTests/Domain/MemberListTests.cs @@ -7,8 +7,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNETTests.Domain.Dependencies.Members; using ArchUnitNETTests.Fluent.Extensions; using Xunit; diff --git a/ArchUnitNETTests/Domain/MemberTestBuild.cs b/ArchUnitNETTests/Domain/MemberTestBuild.cs index 63d4cff76..3545522de 100644 --- a/ArchUnitNETTests/Domain/MemberTestBuild.cs +++ b/ArchUnitNETTests/Domain/MemberTestBuild.cs @@ -9,8 +9,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNETTests.Domain.Dependencies.Members; using ArchUnitNETTests.Fluent.Extensions; namespace ArchUnitNETTests.Domain diff --git a/ArchUnitNETTests/Domain/MemberTests.cs b/ArchUnitNETTests/Domain/MemberTests.cs index 75d0f4a3b..1ab613c88 100644 --- a/ArchUnitNETTests/Domain/MemberTests.cs +++ b/ArchUnitNETTests/Domain/MemberTests.cs @@ -7,9 +7,9 @@ using System; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNETTests.Domain.Dependencies.Members; using ArchUnitNETTests.Fluent.Extensions; using JetBrains.Annotations; using Xunit; diff --git a/ArchUnitNETTests/Domain/StaticTestTypes.cs b/ArchUnitNETTests/Domain/StaticTestTypes.cs index c071788c9..1f390ec77 100644 --- a/ArchUnitNETTests/Domain/StaticTestTypes.cs +++ b/ArchUnitNETTests/Domain/StaticTestTypes.cs @@ -6,8 +6,7 @@ using System; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using Attribute = ArchUnitNET.Domain.Attribute; namespace ArchUnitNETTests.Domain diff --git a/ArchUnitNETTests/Domain/TypeTests.cs b/ArchUnitNETTests/Domain/TypeTests.cs index 32317da8b..dfdd146e8 100644 --- a/ArchUnitNETTests/Domain/TypeTests.cs +++ b/ArchUnitNETTests/Domain/TypeTests.cs @@ -6,7 +6,6 @@ using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Domain.Visibility; diff --git a/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs b/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs index 31a44b0d2..f195a2fc9 100644 --- a/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs +++ b/ArchUnitNETTests/Fluent/Extensions/BuildMocksExtensions.cs @@ -10,10 +10,9 @@ using System.Reflection; using System.Text; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Members; using static ArchUnitNET.Domain.Visibility; using Assembly = ArchUnitNET.Domain.Assembly; -using Type = ArchUnitNET.Core.Type; +using Type = ArchUnitNET.Loader.Type; namespace ArchUnitNETTests.Fluent.Extensions { @@ -237,13 +236,5 @@ private static MethodForm GetStubMethodForm(this TMemberInfo method return methodForm; } - - public static MethodCallDependency CreateStubMethodCallDependency(IMember originMember, - MethodMember targetMember) - { - var methodCallDependency = new MethodCallDependency(originMember, targetMember); - methodCallDependency.TargetMember.MemberBackwardsDependencies.Add(methodCallDependency); - return methodCallDependency; - } } } \ No newline at end of file diff --git a/ArchUnitNETTests/Fluent/RuleEvaluationTests.cs b/ArchUnitNETTests/Fluent/RuleEvaluationTests.cs index 276a22ea3..40a4ab34f 100644 --- a/ArchUnitNETTests/Fluent/RuleEvaluationTests.cs +++ b/ArchUnitNETTests/Fluent/RuleEvaluationTests.cs @@ -8,7 +8,6 @@ using ArchUnitNET.Fluent; using ArchUnitNET.Fluent.Extensions; using ArchUnitNETTests.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using Xunit.Sdk; using static System.Environment; diff --git a/ArchUnitNETTests/Fluent/Slices/SlicesTests.cs b/ArchUnitNETTests/Fluent/Slices/SlicesTests.cs index 449914da8..8dc40a766 100644 --- a/ArchUnitNETTests/Fluent/Slices/SlicesTests.cs +++ b/ArchUnitNETTests/Fluent/Slices/SlicesTests.cs @@ -7,7 +7,6 @@ using System.Linq; using ArchUnitNET.Fluent.Slices; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using Xunit.Sdk; diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/AttributeSyntaxElementsTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/AttributeSyntaxElementsTests.cs index 09b19669d..363426fbe 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/AttributeSyntaxElementsTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/AttributeSyntaxElementsTests.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using ArchUnitNET.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/ClassSyntaxElementsTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/ClassSyntaxElementsTests.cs index 02c034374..65998babc 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/ClassSyntaxElementsTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/ClassSyntaxElementsTests.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using ArchUnitNET.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/LogicalConjunctionTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/LogicalConjunctionTests.cs index 636a07217..05cea7286 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/LogicalConjunctionTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/LogicalConjunctionTests.cs @@ -5,9 +5,8 @@ // SPDX-License-Identifier: Apache-2.0 using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/MemberSyntaxElementsTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/MemberSyntaxElementsTests.cs index 64f2ace4d..a742851f3 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/MemberSyntaxElementsTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/MemberSyntaxElementsTests.cs @@ -8,7 +8,6 @@ using System.Collections.Generic; using ArchUnitNET.Domain; using ArchUnitNETTests.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/MethodMemberSyntaxElementsTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/MethodMemberSyntaxElementsTests.cs index b970d98a5..41ea5f208 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/MethodMemberSyntaxElementsTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/MethodMemberSyntaxElementsTests.cs @@ -7,9 +7,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNETTests.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/ObjectSyntaxElementsTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/ObjectSyntaxElementsTests.cs index ddc51a484..ec208769c 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/ObjectSyntaxElementsTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/ObjectSyntaxElementsTests.cs @@ -8,10 +8,9 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; +using ArchUnitNET.Domain.Extensions; using ArchUnitNET.Fluent; -using ArchUnitNET.Fluent.Extensions; using ArchUnitNETTests.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNETTests.Domain.StaticTestTypes; using static ArchUnitNET.Fluent.ArchRuleDefinition; @@ -20,25 +19,13 @@ namespace ArchUnitNETTests.Fluent.Syntax.Elements { public class ObjectSyntaxElementsTests { - public ObjectSyntaxElementsTests() - { - _types = Architecture.Types; - _classes = Architecture.Classes; - _interfaces = Architecture.Interfaces; - } - private static readonly Architecture Architecture = StaticTestArchitectures.ArchUnitNETTestArchitecture; - private readonly IEnumerable _types; - private readonly IEnumerable _classes; - private readonly IEnumerable _interfaces; + private readonly IEnumerable _types = Architecture.Types; private const string NoTypeName = "NotTheNameOfAnyType_58391351286"; private readonly IEnumerable _falseDependencies = new List {typeof(ClassWithNoDependencies1), typeof(ClassWithNoDependencies2)}; - private readonly IEnumerable _falseDependenciesPattern = new List - {typeof(ClassWithNoDependencies1).FullName, typeof(ClassWithNoDependencies2).FullName}; - [Fact] public void AreTest() { diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/PropertyMemberSyntaxElementsTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/PropertyMemberSyntaxElementsTests.cs index 57aceb514..1390994ab 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/PropertyMemberSyntaxElementsTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/PropertyMemberSyntaxElementsTests.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using ArchUnitNET.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; using static ArchUnitNET.Domain.Visibility; diff --git a/ArchUnitNETTests/Fluent/Syntax/Elements/TypeSyntaxElementsTests.cs b/ArchUnitNETTests/Fluent/Syntax/Elements/TypeSyntaxElementsTests.cs index 254a1af98..acc7cdcfc 100644 --- a/ArchUnitNETTests/Fluent/Syntax/Elements/TypeSyntaxElementsTests.cs +++ b/ArchUnitNETTests/Fluent/Syntax/Elements/TypeSyntaxElementsTests.cs @@ -8,9 +8,8 @@ using System.Collections.Generic; using System.Linq; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; using ArchUnitNETTests.Domain; -using ArchUnitNETTests.Fluent.Extensions; using Xunit; using static ArchUnitNET.Fluent.ArchRuleDefinition; using static ArchUnitNETTests.Domain.StaticTestTypes; diff --git a/ArchUnitNETTests/Core/ArchLoaderTests.cs b/ArchUnitNETTests/Loader/ArchLoaderTests.cs similarity index 89% rename from ArchUnitNETTests/Core/ArchLoaderTests.cs rename to ArchUnitNETTests/Loader/ArchLoaderTests.cs index 2da6fdec2..7a4b6f10e 100644 --- a/ArchUnitNETTests/Core/ArchLoaderTests.cs +++ b/ArchUnitNETTests/Loader/ArchLoaderTests.cs @@ -6,9 +6,9 @@ using System.Linq; using Xunit; -using static ArchUnitNETTests.Fluent.Extensions.StaticTestArchitectures; +using static ArchUnitNETTests.StaticTestArchitectures; -namespace ArchUnitNETTests.Core +namespace ArchUnitNETTests.Loader { public class ArchLoaderTests { diff --git a/ArchUnitNETTests/Fluent/Extensions/InstructionExtensionTests.cs b/ArchUnitNETTests/Loader/InstructionExtensionTests.cs similarity index 98% rename from ArchUnitNETTests/Fluent/Extensions/InstructionExtensionTests.cs rename to ArchUnitNETTests/Loader/InstructionExtensionTests.cs index 271ebaef7..aab59f37e 100644 --- a/ArchUnitNETTests/Fluent/Extensions/InstructionExtensionTests.cs +++ b/ArchUnitNETTests/Loader/InstructionExtensionTests.cs @@ -8,12 +8,12 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Loader; using Mono.Cecil; using Mono.Cecil.Cil; using Xunit; -namespace ArchUnitNETTests.Fluent.Extensions +namespace ArchUnitNETTests.Loader { public class InstructionExtensionTests { diff --git a/ArchUnitNETTests/Fluent/Extensions/RegexUtilsTests.cs b/ArchUnitNETTests/Loader/RegexUtilsTests.cs similarity index 97% rename from ArchUnitNETTests/Fluent/Extensions/RegexUtilsTests.cs rename to ArchUnitNETTests/Loader/RegexUtilsTests.cs index b0c777719..755cb56ea 100644 --- a/ArchUnitNETTests/Fluent/Extensions/RegexUtilsTests.cs +++ b/ArchUnitNETTests/Loader/RegexUtilsTests.cs @@ -7,11 +7,12 @@ using System.Linq; using System.Text; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; +using ArchUnitNETTests.Domain.Dependencies.Members; using Xunit; -namespace ArchUnitNETTests.Fluent.Extensions +namespace ArchUnitNETTests.Loader { public class RegexUtilsTest { diff --git a/ArchUnitNETTests/Core/TypeTestBuild.cs b/ArchUnitNETTests/Loader/TypeTestBuild.cs similarity index 83% rename from ArchUnitNETTests/Core/TypeTestBuild.cs rename to ArchUnitNETTests/Loader/TypeTestBuild.cs index ac7bfc485..60b5895e0 100644 --- a/ArchUnitNETTests/Core/TypeTestBuild.cs +++ b/ArchUnitNETTests/Loader/TypeTestBuild.cs @@ -8,12 +8,12 @@ using System.Collections; using System.Collections.Generic; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Attributes; -using ArchUnitNETTests.Dependencies.Members; -using ArchUnitNETTests.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNETTests.Domain.Dependencies.Attributes; +using ArchUnitNETTests.Domain.Dependencies.Members; +using ArchUnitType = ArchUnitNET.Loader.Type; -namespace ArchUnitNETTests.Core +namespace ArchUnitNETTests.Loader { public static class TypeTestBuild { @@ -24,7 +24,7 @@ private static object[] BuildTypeTestData(Type originType) var clazz = Architecture.GetITypeOfType(originType); clazz.RequiredNotNull(); - var type = new ArchUnitNET.Core.Type(clazz.FullName, clazz.Name, clazz.Assembly, clazz.Namespace, + var type = new ArchUnitType(clazz.FullName, clazz.Name, clazz.Assembly, clazz.Namespace, clazz.Visibility, clazz.IsNested); return new object[] {type}; @@ -34,9 +34,9 @@ private static object[] BuildTypeEquivalenceTestData(Type originType) { var clazz = Architecture.GetITypeOfType(originType); clazz.RequiredNotNull(); - var type = new ArchUnitNET.Core.Type(clazz.FullName, clazz.Name, clazz.Assembly, clazz.Namespace, + var type = new ArchUnitType(clazz.FullName, clazz.Name, clazz.Assembly, clazz.Namespace, clazz.Visibility, clazz.IsNested); - object duplicateType = new ArchUnitNET.Core.Type(clazz.FullName, clazz.Name, clazz.Assembly, + object duplicateType = new ArchUnitType(clazz.FullName, clazz.Name, clazz.Assembly, clazz.Namespace, clazz.Visibility, clazz.IsNested); var typeCopy = type; object referenceCopy = type; diff --git a/ArchUnitNETTests/Core/TypeTests.cs b/ArchUnitNETTests/Loader/TypeTests.cs similarity index 96% rename from ArchUnitNETTests/Core/TypeTests.cs rename to ArchUnitNETTests/Loader/TypeTests.cs index 2e55768f5..fdf0825e6 100644 --- a/ArchUnitNETTests/Core/TypeTests.cs +++ b/ArchUnitNETTests/Loader/TypeTests.cs @@ -4,16 +4,16 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.Core; using ArchUnitNET.Domain; -using ArchUnitNET.Domain.Dependencies.Types; -using ArchUnitNET.Fluent.Extensions; -using ArchUnitNETTests.Dependencies.Attributes; +using ArchUnitNET.Domain.Dependencies; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; +using ArchUnitNETTests.Domain.Dependencies.Attributes; using ArchUnitNETTests.Fluent.Extensions; using JetBrains.Annotations; using Xunit; -namespace ArchUnitNETTests.Core +namespace ArchUnitNETTests.Loader { public class TypeTests { diff --git a/ArchUnitNETTests/Matcher/MatcherTests.cs b/ArchUnitNETTests/Matcher/MatcherTests.cs deleted file mode 100644 index e4afa9811..000000000 --- a/ArchUnitNETTests/Matcher/MatcherTests.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2019 Florian Gather -// Copyright 2019 Paula Ruiz -// Copyright 2019 Fritz Brandhuber -// -// SPDX-License-Identifier: Apache-2.0 - -using System.Collections.Generic; -using ArchUnitNET.ArchitectureExceptions; -using ArchUnitNET.Matcher; -using Xunit; - -namespace ArchUnitNETTests.Matcher -{ - public class MatcherTests - { - private readonly List _misMatches = new List - { - "ApplePie", "AppleSauce", "AppleStrudel", - "BananaBread" - }; - - private readonly List _matches = new List {"ApplePie", "AppleSauce", "AppleStrudel"}; - - private static bool ContainsApple(string food) - { - return food.Contains("Apple"); - } - - [Fact] - public void ThrowsProperExceptionWithNoMatch() - { - _matches.ShouldAll(ContainsApple); - Assert.Throws(() => _misMatches.ShouldAll(ContainsApple)); - } - } -} \ No newline at end of file diff --git a/ArchUnitNETTests/Fluent/Extensions/StaticTestArchitectures.cs b/ArchUnitNETTests/StaticTestArchitectures.cs similarity index 92% rename from ArchUnitNETTests/Fluent/Extensions/StaticTestArchitectures.cs rename to ArchUnitNETTests/StaticTestArchitectures.cs index 456d4dc4d..104e2ad7b 100644 --- a/ArchUnitNETTests/Fluent/Extensions/StaticTestArchitectures.cs +++ b/ArchUnitNETTests/StaticTestArchitectures.cs @@ -4,16 +4,16 @@ // // SPDX-License-Identifier: Apache-2.0 -using ArchUnitNET.Core; using ArchUnitNET.Domain; -using ArchUnitNETTests.Dependencies.Attributes; -using ArchUnitNETTests.Dependencies.Members; +using ArchUnitNET.Loader; +using ArchUnitNETTests.Domain.Dependencies.Attributes; +using ArchUnitNETTests.Domain.Dependencies.Members; using TestAssembly; using Xunit.Sdk; // ReSharper disable InconsistentNaming -namespace ArchUnitNETTests.Fluent.Extensions +namespace ArchUnitNETTests { public static class StaticTestArchitectures { diff --git a/ExampleTest/ExampleArchUnitTest.cs b/ExampleTest/ExampleArchUnitTest.cs index 3fccd5a9a..d50d01dae 100644 --- a/ExampleTest/ExampleArchUnitTest.cs +++ b/ExampleTest/ExampleArchUnitTest.cs @@ -8,12 +8,10 @@ // ReSharper disable SuggestVarOrType_SimpleTypes -using ArchUnitNET.Core; using ArchUnitNET.Domain; using ArchUnitNET.Fluent; +using ArchUnitNET.Loader; using Xunit; - -//add a using directive to ArchUnitNET.Fluent.ArchRuleDefinition to easily define ArchRules using static ArchUnitNET.Fluent.ArchRuleDefinition; diff --git a/ExampleTest/ExampleArchUnitTestCooking.cs b/ExampleTest/ExampleArchUnitTestCooking.cs index 384f2ae97..936aba535 100644 --- a/ExampleTest/ExampleArchUnitTestCooking.cs +++ b/ExampleTest/ExampleArchUnitTestCooking.cs @@ -6,13 +6,13 @@ using System.Collections.Generic; using System.Linq; -using ArchUnitNET.Core; using ArchUnitNET.Domain; -using ArchUnitNET.Fluent.Extensions; +using ArchUnitNET.Domain.Extensions; +using ArchUnitNET.Loader; using Xunit; +// ReSharper disable NotAccessedField.Local // ReSharper disable UnusedMember.Global - namespace ExampleTest { public class ExampleArchUnitTestCooking diff --git a/NOTICE b/NOTICE index 9647ad0c0..857bbdc9f 100644 --- a/NOTICE +++ b/NOTICE @@ -2,6 +2,7 @@ ArchUnitNET Copyright 2019 and onwards Florian Gather Copyright 2019 Paula Ruiz Copyright 2019 Fritz Brandhuber +Copyright 2020 Pavel Fischer This product includes software developed at TNG Technology Consulting GmbH (https://www.tngtech.com/). \ No newline at end of file diff --git a/README.md b/README.md index 518919c35..7aae884fb 100644 --- a/README.md +++ b/README.md @@ -20,8 +20,8 @@ PS> Install-Package ArchUnitNET.NUnit Then you will want to create a class to start testing. We used xUnit with the ArchUnit extension here, but it works similarly with NUnit or other Unit Test Frameworks. ```cs -using ArchUnitNET.Core; using ArchUnitNET.Domain; +using ArchUnitNET.Loader; using ArchUnitNET.Fluent; using Xunit; diff --git a/TestAssembly/Domain/Repository/RepositoryWithDependencyToService.cs b/TestAssembly/Domain/Repository/RepositoryWithDependencyToService.cs index d7206771b..acef3064f 100644 --- a/TestAssembly/Domain/Repository/RepositoryWithDependencyToService.cs +++ b/TestAssembly/Domain/Repository/RepositoryWithDependencyToService.cs @@ -11,6 +11,7 @@ namespace TestAssembly.Domain.Repository { +#pragma warning disable 169 public class RepositoryWithDependencyToService : IRepository { private TestService _badDependency;