public void MatchOnIdentifiesMatchesByMultipleConditions()
        {
            var oldItems = new List <IClassDefinition>
            {
                new TestClassDefinition(),
                new TestClassDefinition(),
                new TestClassDefinition(),
                new TestClassDefinition()
            };
            var newItems = new List <IClassDefinition>
            {
                new TestClassDefinition(),
                new TestClassDefinition(),
                new TestClassDefinition()
            };

            var sut = new MatchAgent <IClassDefinition>(oldItems, newItems);

            sut.MatchOn((oldItem, newItem) => oldItem == oldItems[2] && newItem == newItems[1]);
            sut.MatchOn((oldItem, newItem) => oldItem == oldItems[1] && newItem == newItems[0]);

            var actual = sut.Results;

            actual.MatchingItems.Should().HaveCount(2);
            actual.MatchingItems.First().OldItem.Should().Be(oldItems[2]);
            actual.MatchingItems.First().NewItem.Should().Be(newItems[1]);
            actual.MatchingItems.Skip(1).First().OldItem.Should().Be(oldItems[1]);
            actual.MatchingItems.Skip(1).First().NewItem.Should().Be(newItems[0]);
            actual.ItemsRemoved.Should().BeEquivalentTo(oldItems.Where(x => x != oldItems[2] && x != oldItems[1]));
            actual.ItemsAdded.Should().BeEquivalentTo(newItems.Where(x => x != newItems[1] && x != newItems[0]));
        }
        public void MatchOnSkipsProcessingWhenNoMoreOldItemsFound()
        {
            var oldItems = new List <IClassDefinition>
            {
                new TestClassDefinition()
            };
            var newItems = new List <IClassDefinition>
            {
                new TestClassDefinition(),
                new TestClassDefinition()
            };

            var sut = new MatchAgent <IClassDefinition>(oldItems, newItems);

            sut.MatchOn((oldItem, newItem) => oldItem == oldItems[0] && newItem == newItems[1]);
            sut.MatchOn((_, _) => true);

            var actual = sut.Results;

            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().Be(oldItems[0]);
            actual.MatchingItems.First().NewItem.Should().Be(newItems[1]);
            actual.ItemsRemoved.Should().BeEmpty();
            actual.ItemsAdded.Should().BeEquivalentTo(newItems.Where(x => x == newItems[0]));

            sut.OldItems.Should().BeEmpty();
            sut.NewItems.Should().HaveCount(1);
            sut.NewItems.Single().Should().Be(newItems[0]);
        }
        public void MatchOnIdentifiesMatchesWhenConditionReturnsTrue()
        {
            var oldItems = new List <IClassDefinition>
            {
                new TestClassDefinition()
            };
            var newItems = new List <IClassDefinition>
            {
                new TestClassDefinition()
            };

            var sut = new MatchAgent <IClassDefinition>(oldItems, newItems);

            sut.MatchOn((_, _) => true);

            var actual = sut.Results;

            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().Be(oldItems[0]);
            actual.MatchingItems.First().NewItem.Should().Be(newItems[0]);
            actual.ItemsRemoved.Should().BeEmpty();
            actual.ItemsAdded.Should().BeEmpty();

            sut.NewItems.Should().BeEmpty();
            sut.OldItems.Should().BeEmpty();
        }
        public void MatchOnDoesNotIdentifyMatchWhenConditionReturnsFalse()
        {
            var oldItems = new List <IClassDefinition>
            {
                new TestClassDefinition()
            };
            var newItems = new List <IClassDefinition>
            {
                new TestClassDefinition()
            };

            var sut = new MatchAgent <IClassDefinition>(oldItems, newItems);

            sut.MatchOn((_, _) => false);

            var actual = sut.Results;

            actual.MatchingItems.Should().BeEmpty();
            actual.ItemsRemoved.Should().BeEquivalentTo(oldItems);
            actual.ItemsAdded.Should().BeEquivalentTo(newItems);
        }