public void FindMatchesReturnsMatchWhenTypesHaveSameSignatures()
        {
            var oldItem = new TestClassDefinition();
            var newItem = new TestClassDefinition().Set(x =>
            {
                x.RawName   = oldItem.RawName;
                x.Namespace = oldItem.Namespace;
            });
            var oldItems = new List <ITypeDefinition>
            {
                oldItem
            };
            var newItems = new List <ITypeDefinition>
            {
                newItem
            };

            var sut = new TypeEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsRemoved.Should().BeEmpty();
            actual.ItemsAdded.Should().BeEmpty();
            actual.MatchingItems.Should().HaveCount(1);

            var match = actual.MatchingItems.First();

            match.OldItem.Should().Be(oldItem);
            match.NewItem.Should().Be(newItem);
        }
        public void FindMatchesDoesNotReturnMatchWhenDeclaringTypesAreDifferent()
        {
            var oldParent = new TestClassDefinition();
            var newParent = new TestClassDefinition();
            var oldItem   = new TestClassDefinition().Set(x => x.DeclaringType = oldParent);
            var newItem   = new TestClassDefinition().Set(x =>
            {
                x.RawName       = oldItem.RawName;
                x.Namespace     = oldItem.Namespace;
                x.DeclaringType = newParent;
            });
            var oldItems = new List <ITypeDefinition>
            {
                oldItem
            };
            var newItems = new List <ITypeDefinition>
            {
                newItem
            };

            var sut = new TypeEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsRemoved.Should().BeEquivalentTo(oldItems);
            actual.ItemsAdded.Should().BeEquivalentTo(newItems);
            actual.MatchingItems.Should().BeEmpty();
        }
        public void FindMatchesReturnsMatchOnMovedTypeWithDeclaringTypes()
        {
            var oldParent = new TestClassDefinition();
            var newParent = new TestClassDefinition().Set(x => { x.RawName = oldParent.RawName; });
            var oldItem   = new TestClassDefinition().Set(x => x.DeclaringType = oldParent);
            var newItem   = new TestClassDefinition().Set(x =>
            {
                x.RawName       = oldItem.RawName;
                x.DeclaringType = newParent;
            });
            var oldItems = new List <ITypeDefinition>
            {
                oldItem
            };
            var newItems = new List <ITypeDefinition>
            {
                newItem
            };

            var sut = new TypeEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsRemoved.Should().BeEmpty();
            actual.ItemsAdded.Should().BeEmpty();
            actual.MatchingItems.Should().HaveCount(1);

            var match = actual.MatchingItems.First();

            match.OldItem.Should().Be(oldItem);
            match.NewItem.Should().Be(newItem);
        }
        public void FindMatchesDoesNotReturnMatchOnMovedTypeWhenGenericTypeCountsAreDifferent()
        {
            var oldItem = new TestClassDefinition();
            var newItem = new TestClassDefinition().Set(x =>
            {
                x.RawName = oldItem.RawName;

                var updatedGenericTypeParameters = new List <string>(x.GenericTypeParameters)
                {
                    Guid.NewGuid().ToString()
                };

                x.GenericTypeParameters = updatedGenericTypeParameters.AsReadOnly();
            });
            var oldItems = new List <ITypeDefinition>
            {
                oldItem
            };
            var newItems = new List <ITypeDefinition>
            {
                newItem
            };

            var sut = new TypeEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsRemoved.Should().BeEquivalentTo(oldItems);
            actual.ItemsAdded.Should().BeEquivalentTo(newItems);
            actual.MatchingItems.Should().BeEmpty();
        }
        public void FindMatchesDoesNotReturnMatchWhenNoItemsAddedOrRemoved()
        {
            var oldItems = Array.Empty <ITypeDefinition>();
            var newItems = Array.Empty <ITypeDefinition>();

            var sut = new TypeEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsRemoved.Should().BeEmpty();
            actual.ItemsAdded.Should().BeEmpty();
            actual.MatchingItems.Should().BeEmpty();
        }
示例#6
0
        /// <summary>
        ///   Tries to find a class.
        /// </summary>
        /// <returns> <c>true</c> if something was found; otherwise, <c>false</c> . </returns>
        /// <param name='result'> Result. </param>
        /// <param name='evaluator'> A type evaluator delegate </param>
        /// <typeparam name='T'> The interface type of the plugin. </typeparam>
        public static Boolean TryFind <T>(out T result, TypeEvaluator evaluator)
        {
            foreach (var aPluginTypeOfT in GetAllTypes <T>(false).Where(_ => evaluator(_)))
            {
                var aPluginInstance = Activator.CreateInstance(aPluginTypeOfT);
                if (aPluginInstance != null)
                {
                    result = (T)aPluginInstance;
                    return(true);
                }
            }

            result = default(T);
            return(false);
        }
        public void FindMatchesDoesNotReturnMatchWhenNamespaceAndRawNameAreDifferent()
        {
            var oldItem  = new TestClassDefinition();
            var newItem  = new TestClassDefinition();
            var oldItems = new List <ITypeDefinition>
            {
                oldItem
            };
            var newItems = new List <ITypeDefinition>
            {
                newItem
            };

            var sut = new TypeEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsRemoved.Should().BeEquivalentTo(oldItems);
            actual.ItemsAdded.Should().BeEquivalentTo(newItems);
            actual.MatchingItems.Should().BeEmpty();
        }
        public void FindMatchesDoesNotReturnMatchWhenMultipleNewItemsMatchAsPossibleMovedType()
        {
            var oldItem      = new TestClassDefinition();
            var newItem      = new TestClassDefinition().Set(x => { x.RawName = oldItem.RawName; });
            var otherNewItem = new TestClassDefinition().Set(x => { x.RawName = oldItem.RawName; });
            var oldItems     = new List <ITypeDefinition>
            {
                oldItem
            };
            var newItems = new List <ITypeDefinition>
            {
                newItem,
                otherNewItem
            };

            var sut = new TypeEvaluator();

            var actual = sut.FindMatches(oldItems, newItems);

            actual.ItemsRemoved.Should().BeEquivalentTo(oldItems);
            actual.ItemsAdded.Should().BeEquivalentTo(newItems);
            actual.MatchingItems.Should().BeEmpty();
        }
示例#9
0
        public static IChangeCalculator BuildCalculator(ILogger?logger)
        {
            var attributeComparer  = new AttributeComparer();
            var attributeMatcher   = new AttributeEvaluator();
            var attributeProcessor = new AttributeMatchProcessor(attributeMatcher, attributeComparer, logger);

            var accessModifierChangeTable  = new AccessModifiersChangeTable();
            var accessModifiersComparer    = new AccessModifiersComparer(accessModifierChangeTable);
            var memberModifiersChangeTable = new PropertyModifiersChangeTable();
            var memberModifiersComparer    = new PropertyModifiersComparer(memberModifiersChangeTable);

            var genericTypeElementComparer = new GenericTypeElementComparer();

            var fieldModifiersChangeTable = new FieldModifiersChangeTable();
            var fieldModifiersComparer    = new FieldModifiersComparer(fieldModifiersChangeTable);
            var fieldComparer             = new FieldComparer(accessModifiersComparer, fieldModifiersComparer, attributeProcessor);
            var fieldMatcher   = new FieldEvaluator();
            var fieldProcessor = new FieldMatchProcessor(fieldMatcher, fieldComparer, logger);

            var propertyAccessorAccessModifiersChangeTable = new PropertyAccessorAccessModifiersChangeTable();
            var propertyAccessorAccessModifiersComparer    = new PropertyAccessorAccessModifiersComparer(propertyAccessorAccessModifiersChangeTable);
            var propertyAccessorComparer  = new PropertyAccessorComparer(propertyAccessorAccessModifiersComparer, attributeProcessor);
            var propertyAccessorEvaluator = new PropertyAccessorEvaluator();
            var propertyAccessorProcessor =
                new PropertyAccessorMatchProcessor(propertyAccessorEvaluator, propertyAccessorComparer, logger);
            var propertyComparer  = new PropertyComparer(accessModifiersComparer, memberModifiersComparer, propertyAccessorProcessor, attributeProcessor);
            var propertyMatcher   = new PropertyEvaluator();
            var propertyProcessor = new PropertyMatchProcessor(propertyMatcher, propertyComparer, logger);

            var methodEvaluator               = new MethodEvaluator();
            var methodModifiersChangeTable    = new MethodModifiersChangeTable();
            var methodModifiersComparer       = new MethodModifiersComparer(methodModifiersChangeTable);
            var parameterModifiersChangeTable = new ParameterModifiersChangeTable();
            var parameterModifiersComparer    = new ParameterModifiersComparer(parameterModifiersChangeTable);
            var parameterComparer             = new ParameterComparer(parameterModifiersComparer, attributeProcessor);
            var methodComparer  = new MethodComparer(accessModifiersComparer, methodModifiersComparer, genericTypeElementComparer, parameterComparer, attributeProcessor);
            var methodProcessor = new MethodMatchProcessor(methodEvaluator, methodComparer, logger);

            var classModifiersChangeTable = new ClassModifiersChangeTable();
            var classModifiersComparer    = new ClassModifiersComparer(classModifiersChangeTable);
            var classComparer             = new ClassComparer(
                accessModifiersComparer,
                classModifiersComparer,
                genericTypeElementComparer,
                fieldProcessor,
                propertyProcessor,
                methodProcessor, attributeProcessor);

            var interfaceComparer = new InterfaceComparer(
                accessModifiersComparer,
                genericTypeElementComparer,
                propertyProcessor,
                methodProcessor,
                attributeProcessor);

            var structModifiersChangeTable = new StructModifiersChangeTable();
            var structModifiersComparer    = new StructModifiersComparer(structModifiersChangeTable);
            var structComparer             = new StructComparer(
                accessModifiersComparer,
                structModifiersComparer,
                genericTypeElementComparer,
                fieldProcessor,
                propertyProcessor,
                methodProcessor,
                attributeProcessor);

            var aggregateTypeComparer = new AggregateTypeComparer(classComparer, interfaceComparer, structComparer);

            var typeEvaluator = new TypeEvaluator();
            var typeProcessor = new TypeMatchProcessor(typeEvaluator, aggregateTypeComparer, logger);

            return(new ChangeCalculator(typeProcessor, logger));
        }