public void CalculateChangesReturnsMatchResultsWhenComparingAttributesMatchingOptions()
        {
            var oldItems = Model.UsingModule <ConfigurationModule>().Create <List <TestAttributeDefinition> >()
                           .Set(x => x[3].Name = "System.Text.Json.Serialization.JsonPropertyName");
            var newItems = Model.UsingModule <ConfigurationModule>().Create <List <TestAttributeDefinition> >()
                           .Set(x => x[5].Name = "JsonIgnoreAttribute");
            var options       = ComparerOptions.Default;
            var matchingItems =
                Model.UsingModule <ConfigurationModule>().Create <List <ItemMatch <IAttributeDefinition> > >();
            var itemsRemoved = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var itemsAdded   = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var matchResults = new MatchResults <IAttributeDefinition>(matchingItems, itemsRemoved, itemsAdded);

            var comparer  = Substitute.For <IAttributeComparer>();
            var evaluator = Substitute.For <IAttributeEvaluator>();

            evaluator.FindMatches(
                Arg.Is <IEnumerable <IAttributeDefinition> >(x => x.Single() == oldItems[3]),
                Arg.Is <IEnumerable <IAttributeDefinition> >(x => x.Single() == newItems[5]))
            .Returns(matchResults);

            var sut = new AttributeMatchProcessor(evaluator, comparer, _logger);

            var actual = sut.CalculateChanges(oldItems, newItems, options).ToList();

            foreach (var result in actual)
            {
                _output.WriteLine(result.Message);
            }

            actual.Should().NotBeEmpty();
        }
        public void CalculateChangesReturnsMatchResultsWhenComparingAllAttributes()
        {
            var oldItems      = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var newItems      = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var options       = ComparerOptions.Default;
            var matchingItems =
                Model.UsingModule <ConfigurationModule>().Create <List <ItemMatch <IAttributeDefinition> > >();
            var itemsRemoved = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var itemsAdded   = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var matchResults = new MatchResults <IAttributeDefinition>(matchingItems, itemsRemoved, itemsAdded);

            options.CompareAttributes = AttributeCompareOption.All;

            var comparer  = Substitute.For <IAttributeComparer>();
            var evaluator = Substitute.For <IAttributeEvaluator>();

            evaluator.FindMatches(oldItems, newItems)
            .Returns(matchResults);

            var sut = new AttributeMatchProcessor(evaluator, comparer, _logger);

            var actual = sut.CalculateChanges(oldItems, newItems, options).ToList();

            foreach (var result in actual)
            {
                _output.WriteLine(result.Message);
            }

            actual.Should().NotBeEmpty();
        }
        public void CalculateChangesThrowsExceptionWithNullOptions()
        {
            var oldItems = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var newItems = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();

            var comparer  = Substitute.For <IAttributeComparer>();
            var evaluator = Substitute.For <IAttributeEvaluator>();

            var sut = new AttributeMatchProcessor(evaluator, comparer, _logger);

            Action action = () => sut.CalculateChanges(oldItems, newItems, null !);

            action.Should().Throw <ArgumentNullException>();
        }
        public void CalculateChangesReturnsEmptyWhenAttributeComparisonSkipped()
        {
            var oldItems = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var newItems = Model.UsingModule <ConfigurationModule>().Create <List <IAttributeDefinition> >();
            var options  = ComparerOptions.Default;

            options.CompareAttributes = AttributeCompareOption.Skip;

            var comparer  = Substitute.For <IAttributeComparer>();
            var evaluator = Substitute.For <IAttributeEvaluator>();

            var sut = new AttributeMatchProcessor(evaluator, comparer, _logger);

            var actual = sut.CalculateChanges(oldItems, newItems, options);

            actual.Should().BeEmpty();
        }