Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

namespace ArchUnitNET.Fluent.Syntax.Elements.Members.FieldMembers
{
// No fluent method currently returns this class - it can't be reached, only constructed
// reflectively by a caller with a hand-built IArchRuleCreator. Kept for API symmetry with the
// other ShouldRelateTo*That classes rather than removed as a breaking change.
public sealed class ShouldRelateToFieldMembersThat<TRuleTypeShouldConjunction, TRuleType>
: AddFieldMemberPredicate<TRuleTypeShouldConjunction, TRuleType>
where TRuleType : ICanBeAnalyzed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

namespace ArchUnitNET.Fluent.Syntax.Elements.Members.PropertyMembers
{
// No fluent method currently returns this class - it can't be reached, only constructed
// reflectively by a caller with a hand-built IArchRuleCreator. Kept for API symmetry with the
// other ShouldRelateTo*That classes rather than removed as a breaking change.
public sealed class ShouldRelateToPropertyMembersThat<TNextElement, TRuleType>
: AddPropertyMemberPredicate<TNextElement, TRuleType>
where TRuleType : ICanBeAnalyzed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@

namespace ArchUnitNET.Fluent.Syntax.Elements.Members
{
// No fluent method currently returns this class - it can't be reached, only constructed
// reflectively by a caller with a hand-built IArchRuleCreator. Kept for API symmetry with the
// other ShouldRelateTo*That classes rather than removed as a breaking change.
public class ShouldRelateToMembersThat<TRuleTypeShouldConjunction, TRuleType>
: AddMemberPredicate<TRuleTypeShouldConjunction, TRuleType, IMember>
where TRuleType : ICanBeAnalyzed
Expand Down
7 changes: 7 additions & 0 deletions ArchUnitNET/Fluent/Syntax/Elements/Types/AddTypeCondition.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,13 @@ internal AddTypeCondition(IArchRuleCreator<TRuleType> ruleCreator)
public TNextElement NotBeAssignableTo(IEnumerable<IType> types) => NotBeAssignableTo(new ObjectProvider<IType>(types));
public TNextElement NotBeAssignableTo(IEnumerable<Type> types) => NotBeAssignableTo(new SystemTypeObjectProvider<IType>(types));

public TNextElement NotBeNestedIn() => NotBeNestedIn(new ObjectProvider<IType>());
public TNextElement NotBeNestedIn(params IType[] types) => NotBeNestedIn(new ObjectProvider<IType>(types));
public TNextElement NotBeNestedIn(params Type[] types) => NotBeNestedIn(new SystemTypeObjectProvider<IType>(types));
public TNextElement NotBeNestedIn(IObjectProvider<IType> types) => CreateNextElement(TypeConditionsDefinition<TRuleType>.NotBeNestedIn(types));
public TNextElement NotBeNestedIn(IEnumerable<IType> types) => NotBeNestedIn(new ObjectProvider<IType>(types));
public TNextElement NotBeNestedIn(IEnumerable<Type> types) => NotBeNestedIn(new SystemTypeObjectProvider<IType>(types));

public TNextElement NotBeValueTypes() => CreateNextElement(TypeConditionsDefinition<TRuleType>.NotBeValueTypes());
public TNextElement NotBeEnums() => CreateNextElement(TypeConditionsDefinition<TRuleType>.NotBeEnums());
public TNextElement NotBeStructs() => CreateNextElement(TypeConditionsDefinition<TRuleType>.NotBeStructs());
Expand Down
7 changes: 7 additions & 0 deletions ArchUnitNET/Fluent/Syntax/Elements/Types/AddTypePredicate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,13 @@ internal AddTypePredicate(IArchRuleCreator<TRelatedType> archRuleCreator)
public TNextElement AreNotAssignableTo(IEnumerable<IType> types) => AreNotAssignableTo(new ObjectProvider<IType>(types));
public TNextElement AreNotAssignableTo(IEnumerable<Type> types) => AreNotAssignableTo(new SystemTypeObjectProvider<IType>(types));

public TNextElement AreNotNestedIn() => AreNotNestedIn(new ObjectProvider<IType>());
public TNextElement AreNotNestedIn(params IType[] types) => AreNotNestedIn(new ObjectProvider<IType>(types));
public TNextElement AreNotNestedIn(params Type[] types) => AreNotNestedIn(new SystemTypeObjectProvider<IType>(types));
public TNextElement AreNotNestedIn(IObjectProvider<IType> types) => CreateNextElement(TypePredicatesDefinition<TRuleType>.AreNotNestedIn(types));
public TNextElement AreNotNestedIn(IEnumerable<IType> types) => AreNotNestedIn(new ObjectProvider<IType>(types));
public TNextElement AreNotNestedIn(IEnumerable<Type> types) => AreNotNestedIn(new SystemTypeObjectProvider<IType>(types));

public TNextElement AreNotValueTypes() => CreateNextElement(TypePredicatesDefinition<TRuleType>.AreNotValueTypes());
public TNextElement AreNotEnums() => CreateNextElement(TypePredicatesDefinition<TRuleType>.AreNotEnums());
public TNextElement AreNotStructs() => CreateNextElement(TypePredicatesDefinition<TRuleType>.AreNotStructs());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@

namespace ArchUnitNET.Fluent.Syntax.Elements.Types.Classes
{
// No fluent method currently returns this class - it can't be reached, only constructed
// reflectively by a caller with a hand-built IArchRuleCreator. Kept for API symmetry with the
// other ShouldRelateTo*That classes rather than removed as a breaking change.
public sealed class ShouldRelateToClassesThat<TNextElement, TRuleType>
: AddClassPredicate<TNextElement, TRuleType>
where TRuleType : ICanBeAnalyzed
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,46 @@ Architecture architecture
return new OrderedArchitectureCondition<TRuleType>(Condition, description);
}

public static IOrderedCondition<TRuleType> NotBeNestedIn(
IObjectProvider<IType> objectProvider
)
{
var sizedObjectProvider = objectProvider as ISizedObjectProvider<IType>;
IEnumerable<ConditionResult> Condition(
IEnumerable<TRuleType> ruleTypes,
Architecture architecture
)
{
var typeList = objectProvider.GetObjects(architecture).ToList();
var failDescription =
sizedObjectProvider != null && sizedObjectProvider.Count == 0
? "is nested in no types (always true)"
: "is nested in " + objectProvider.Description;
foreach (var ruleType in ruleTypes)
{
if (
typeList.Any(outerType =>
ruleType.FullName.StartsWith(outerType.FullName + "+")
)
)
{
yield return new ConditionResult(ruleType, false, failDescription);
}
else
{
yield return new ConditionResult(ruleType, true);
}
}
}

var description = objectProvider.FormatDescription(
"not be nested in no types (always true)",
"not be nested in",
"not be nested in"
);
return new OrderedArchitectureCondition<TRuleType>(Condition, description);
}

public static IOrderedCondition<TRuleType> BeValueTypes()
{
return new SimpleCondition<TRuleType>(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,24 @@ IEnumerable<T> Condition(IEnumerable<T> ruleTypes, Architecture architecture)
return new ArchitecturePredicate<T>(Condition, description);
}

public static IPredicate<T> AreNotNestedIn(IObjectProvider<IType> objectProvider)
{
IEnumerable<T> Condition(IEnumerable<T> ruleTypes, Architecture architecture)
{
var types = objectProvider.GetObjects(architecture);
return ruleTypes.Where(type =>
!types.Any(outerType => type.FullName.StartsWith(outerType.FullName + "+"))
);
}

var description = objectProvider.FormatDescription(
"are not nested in no types (always true)",
"are not nested in",
"are not nested in"
);
return new ArchitecturePredicate<T>(Condition, description);
}

public static IPredicate<T> AreValueTypes()
{
return new SimplePredicate<T>(
Expand Down
Loading
Loading