using System.Linq.Expressions; using Centron.BusinessLogic.Sales.Receipts.Internal; using Centron.Data.Entities.Sales.Receipts.DeliveryLists; using Centron.Interfaces.Sales.Receipts.DeliveryLists; namespace Centron.Tests.BL.Sales.Receipts.Internal; public class ReceiptExpressionHelperTest { [Fact] public void GetExpression_RewritesArrayContainsForReceiptFilters() { int[] receiptItemI3Ds = [1, 2]; Expression> filter = receipt => receipt.Items.Any(item => receiptItemI3Ds.Contains(item.I3D)); var result = ReceiptExpressionHelper.GetExpression(filter); Assert.NotNull(result); Assert.False(ContainsArrayContainsOrImplicitConversion(result)); } private static bool ContainsArrayContainsOrImplicitConversion(Expression expression) { var visitor = new ArrayContainsOrImplicitConversionFinder(); visitor.Visit(expression); return visitor.Found; } private sealed class ArrayContainsOrImplicitConversionFinder : ExpressionVisitor { public bool Found { get; private set; } protected override Expression VisitMethodCall(MethodCallExpression node) { if (node.Method.Name == "op_Implicit") { Found = true; return node; } if (node.Method.Name == "Contains" && node.Arguments.Count > 0) { var source = node.Object ?? node.Arguments[0]; if (source.Type.IsArray) Found = true; } return base.VisitMethodCall(node); } } }