private void CompareIgnoreOrder(IList actual, IList expected, EntityListComparisonResult comparisonResult)
        {
            var overallSuccess = true;

            for (var i = 0; i < expected.Count; i++)
            {
                var expectedItem = expected[i];
                var found        = false;
                for (var j = 0; j < actual.Count; j++)
                {
                    var actualItem         = actual[i];
                    var entityMatcher      = new EntityMatchingStrategy(parentContext.WithIndex(i));
                    var entityMatchResults = entityMatcher.Compare(actualItem, expectedItem, expectedItem.GetType());
                    var success            = entityMatchResults.All(x => x.Success);
                    //comparisonResult.EntityMatchResults.Add(new EntityMatchResult
                    //{
                    //    Success = success,
                    //    MemberResults = entityMatchResults
                    //});
                    found |= success;
                    if (found)
                    {
                        break;
                    }
                }
                overallSuccess &= found;
            }
            comparisonResult.Equal = overallSuccess;
        }
        public EntityListComparisonResult Compare(IList actual, IList expected)
        {
            var comparisonResult = new EntityListComparisonResult
            {
                EntityMatchResults = new List <EntityMatchResult>(),
                ListMatchResults   = new List <MatchResult>()
            };

            CheckCount(actual, expected, comparisonResult);
            if (PositionComparison == OrderMatch.Strict)
            {
                CompareStrictOrder(actual, expected, comparisonResult);
            }
            if (PositionComparison == OrderMatch.IgnoreOrder)
            {
                CompareIgnoreOrder(actual, expected, comparisonResult);
            }
            return(comparisonResult);
        }
 private void CheckCount(IList actual, IList expected, EntityListComparisonResult comparisonResult)
 {
     if (ValuesComparison == ItemsMatch.Strict && expected.Count != actual.Count)
     {
         comparisonResult.ListMatchResults.Add(new MatchResult
         {
             Success  = false,
             Expected = expected.Count,
             Actual   = actual.Count,
             Parent   = parentContext.WithProprety("Count")
         });
     }
     if (ValuesComparison == ItemsMatch.Contains && expected.Count > actual.Count)
     {
         comparisonResult.ListMatchResults.Add(new MatchResult
         {
             Success  = false,
             Expected = $"Greater or equal to {expected.Count}",
             Actual   = actual.Count,
             Parent   = parentContext.WithProprety("Count")
         });
     }
 }
        private void CompareStrictOrder(IList actual, IList expected, EntityListComparisonResult comparisonResult)
        {
            var overallSuccess = true;

            for (var i = 0; i < expected.Count; i++)
            {
                var    expectedItem = expected[i];
                object actualItem   = null;
                if (i < actual.Count)
                {
                    actualItem = actual[i];
                }
                var entityMatcher      = new EntityMatchingStrategy(parentContext.WithIndex(i));
                var entityMatchResults = entityMatcher.Compare(actualItem, expectedItem, expectedItem.GetType());
                var success            = entityMatchResults.All(x => x.Success);
                comparisonResult.EntityMatchResults.Add(new EntityMatchResult
                {
                    Success       = success,
                    MemberResults = entityMatchResults
                });
                overallSuccess &= success;
            }
            comparisonResult.Equal = overallSuccess;
        }