/// <summary> /// /// Performs a check for all members in the collection. /// /// <para> Here you can send properties that need to be checked. See <paramref name="expressions"/> </para> /// /// <para> Here you can send the rule to be made during the check. See <paramref name="customAssertEnum"/> </para> /// /// </summary> /// <typeparam name="T"></typeparam> /// <param name="collection"></param> /// <param name="customAssertEnum"></param> /// <param name="expressions"></param> public static void CheckAllItems <T>(IEnumerable <T> collection, CheckPropertyEnum customAssertEnum, List <Expression <Func <T, object> > > expressions = null) { List <string> checkedProps = new(); if (expressions != null) { foreach (var expression in expressions) { checkedProps.Add(expression.GetPropertyName()); } } else { foreach (var item in typeof(T).GetProperties()) { checkedProps.Add(item.Name); } } foreach (var item in collection) { foreach (var propertyName in checkedProps) { var predicate = GetPredicate <T>(propertyName, customAssertEnum); var result = predicate.Compile().Invoke(item); if (!result) { throw new MilvaTestException($"Not all items match to predicate. Mismatched property : {propertyName}, Predicate : {customAssertEnum}"); } } } }
/// <summary> /// creates a predicate according to <paramref name="customAssertEnum"/> and <paramref name="propName"/>. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="propName"></param> /// <param name="customAssertEnum"></param> /// <returns></returns> private static Expression <Func <T, bool> > GetPredicate <T>(string propName, CheckPropertyEnum customAssertEnum) { ParameterExpression argParam = Expression.Parameter(typeof(T), "p"); Expression nameProperty = Expression.Property(argParam, propName); var defaultExpression = Expression.Default(typeof(T).GetProperty(propName).PropertyType); BinaryExpression notEqualOrEqual; if (customAssertEnum == CheckPropertyEnum.NotDefault) { notEqualOrEqual = Expression.NotEqual(nameProperty, defaultExpression); } else { notEqualOrEqual = Expression.Equal(nameProperty, defaultExpression); } return(Expression.Lambda <Func <T, bool> >(notEqualOrEqual, argParam)); }