public void ChoosesActionWith2MatchingParametersOverActionWith1MatchingParameter()
        {
            // Arrange

            var incomingValues = new RouteValueDictionary(new{ a = 1, b = 2 });
            var actions        = new[]
            {
                new ControllerActionDescriptor
                {
                    ControllerName     = "Controller",
                    ControllerTypeInfo = typeof(AController).GetTypeInfo(),
                    MethodInfo         = typeof(AController).GetMethod("A1", new[] { typeof(int) }),
                    DisplayName        = "A1",
                    Parameters         = new []
                    {
                        new ParameterDescriptor {
                            Name = "a", ParameterType = typeof(int)
                        }
                    }
                },
                new ControllerActionDescriptor
                {
                    ControllerName     = "Controller",
                    ControllerTypeInfo = typeof(AController).GetTypeInfo(),
                    MethodInfo         = typeof(AController).GetMethod("A2", new[] { typeof(int), typeof(float) }),
                    DisplayName        = "A2",
                    Parameters         = new []
                    {
                        new ParameterDescriptor {
                            Name = "a", ParameterType = typeof(int)
                        },
                        new ParameterDescriptor {
                            Name = "b", ParameterType = typeof(float)
                        },
                    }
                },
                new ControllerActionDescriptor
                {
                    ControllerName     = "Controller",
                    ControllerTypeInfo = typeof(AController).GetTypeInfo(),
                    MethodInfo         = typeof(AController).GetMethod("A3", new[] { typeof(int), typeof(int) }),
                    DisplayName        = "A3",
                    Parameters         = new []
                    {
                        new ParameterDescriptor {
                            Name = "a", ParameterType = typeof(int)
                        },
                        new ParameterDescriptor {
                            Name = "b", ParameterType = typeof(int)
                        },
                    }
                }
            };

            // Act
            actions
            .OrderByDescending(a => ScoreByParameterNameAndConvertibility.Score(incomingValues, a))
            .Select(a => a.DisplayName)
            .ShouldEqualByValue(new[] { "A3", "A2", "A1" });
        }
        public void ScoreGivenRouteValuesA1BBCC_IsAsPerAlgorithm(Type type, int expectedScore)
        {
            var incomingValues = new RouteValueDictionary(new { a = 1, b = "b", c = "c" });
            var action         = new ActionDescriptor
            {
                Parameters = new[] { new ParameterDescriptor {
                                         Name = "a", ParameterType = type
                                     } }
            };

            ScoreByParameterNameAndConvertibility.Score(incomingValues, action).ShouldBe(expectedScore);
        }