public void CompareMatchReturnsBreakingWhenNameChangedWithGenericTypeParameters()
        {
            var genericTypeParameters = new List <string>
            {
                "T"
            }.AsReadOnly();
            var oldItem = new TestMethodDefinition().Set(x =>
            {
                x.Name    = "Original<T>";
                x.RawName = "Original";
                x.GenericTypeParameters = genericTypeParameters;
            });
            var newItem = oldItem.JsonClone().Set(x =>
            {
                x.Name    = "Renamed<T>";
                x.RawName = "Renamed";
            });
            var match   = new ItemMatch <IMethodDefinition>(oldItem, newItem);
            var options = ComparerOptions.Default;

            var actual = SUT.CompareMatch(match, options).ToList();

            _output.WriteResults(actual);
            actual.First().Message.Should().Contain("renamed");

            actual.Should().HaveCount(1);
            actual[0].ChangeType.Should().BeEquivalentTo(SemVerChangeType.Breaking);
        }
        FindMatchesReturnsMatchOnMethodWithoutGenericTypeConstraintsOrParameters()
        {
            var method = new TestMethodDefinition
            {
                GenericTypeParameters = Array.Empty <string>(),
                Parameters            = Array.Empty <IParameterDefinition>()
            };

            var oldItems = new List <IMethodDefinition>
            {
                method
            };
            var newItems = new List <IMethodDefinition>
            {
                method
            };

            var sut = new MethodEvaluator();

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

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().BeEmpty();
            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().BeEquivalentTo(method);
            actual.MatchingItems.First().NewItem.Should().BeEquivalentTo(method);
        }
        FindMatchesDoesNotReturnsMatchOnRenamedMethodWhenMultipleTargetOptionsAvailable()
        {
            var oldMethod = new TestMethodDefinition
            {
                GenericTypeParameters = new List <string>
                {
                    "TKey",
                    "TValue"
                },
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "List<string>"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };
            var newMethod = new TestMethodDefinition().Set(x =>
            {
                x.GenericTypeParameters = oldMethod.GenericTypeParameters;
                x.Parameters            = oldMethod.Parameters;
            });
            var otherNewMethod = new TestMethodDefinition().Set(x =>
            {
                x.GenericTypeParameters = oldMethod.GenericTypeParameters;
                x.Parameters            = oldMethod.Parameters;
            });

            var oldItems = new List <IMethodDefinition>
            {
                oldMethod
            };
            var newItems = new List <IMethodDefinition>
            {
                newMethod,
                otherNewMethod
            };

            var sut = new MethodEvaluator();

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

            actual.ItemsAdded.Should().HaveCount(2);
            actual.ItemsAdded.First().Should().BeEquivalentTo(newMethod);
            actual.ItemsAdded.Skip(1).First().Should().BeEquivalentTo(otherNewMethod);
            actual.ItemsRemoved.Should().HaveCount(1);
            actual.ItemsRemoved.First().Should().BeEquivalentTo(oldMethod);
            actual.MatchingItems.Should().BeEmpty();
        }
        FindMatchesReturnsMatchOnMethodWithGenericTypeCountChanged()
        {
            var oldMethod = new TestMethodDefinition
            {
                GenericTypeParameters = new List <string>
                {
                    "TKey"
                },
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "string"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };

            var newMethod = new TestMethodDefinition
            {
                RawName               = oldMethod.RawName,
                ReturnType            = oldMethod.ReturnType,
                GenericTypeParameters = new List <string>
                {
                    "TKey",
                    "TValue"
                },
                Parameters = oldMethod.Parameters
            };

            var oldItems = new List <IMethodDefinition>
            {
                oldMethod
            };
            var newItems = new List <IMethodDefinition>
            {
                newMethod
            };

            var sut = new MethodEvaluator();

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

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().BeEmpty();
            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().BeEquivalentTo(oldMethod);
            actual.MatchingItems.First().NewItem.Should().BeEquivalentTo(newMethod);
        }
        FindMatchesReturnsOverloadMethodAsMatchesWhenParametersMatchWithOtherOverloadRemoved()
        {
            var matchingOverload = new TestMethodDefinition
            {
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "List<string>"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };
            var otherOverload = new TestMethodDefinition
            {
                RawName    = matchingOverload.RawName,
                Parameters = new List <IParameterDefinition>
                {
                    new TestParameterDefinition
                    {
                        Type = "string"
                    },
                    new TestParameterDefinition
                    {
                        Type = "Guid"
                    },
                    new TestParameterDefinition
                    {
                        Type = "CancellationToken"
                    }
                }
            };

            var oldItems = new List <IMethodDefinition>
            {
                otherOverload,
                matchingOverload
            };
            var newItems = new List <IMethodDefinition>
            {
                matchingOverload
            };

            var sut = new MethodEvaluator();

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

            actual.ItemsAdded.Should().BeEmpty();
            actual.ItemsRemoved.Should().HaveCount(1);
            actual.ItemsRemoved.First().Should().BeEquivalentTo(otherOverload);
            actual.MatchingItems.Should().HaveCount(1);
            actual.MatchingItems.First().OldItem.Should().BeEquivalentTo(matchingOverload);
            actual.MatchingItems.First().NewItem.Should().BeEquivalentTo(matchingOverload);
        }