public void Check_CustomModelBinder_On_Parameter()
        {
            HttpConfiguration config = new HttpConfiguration();

            config.Services.ReplaceRange(
                typeof(ValueProviderFactory),
                new ValueProviderFactory[] { new CustomValueProviderFactory(), }
                );

            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(
                GetAction("Action_CustomModelBinder_On_Parameter_WithProvider", config)
                );

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);

            ModelBinderParameterBinding p = (ModelBinderParameterBinding)binding.ParameterBindings[
                0
                                            ];

            Assert.IsType <CustomModelBinder>(p.Binder);

            // Since the ModelBinderAttribute didn't specify the valueproviders, we should pull those from config.
            ValueProviderFactory valueProviderFactory = Assert.Single(p.ValueProviderFactories);

            Assert.IsType <CustomValueProviderFactory>(valueProviderFactory);
        }
        public void Check_IntArray_Is_FromBody()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_IntArray"));

            Assert.Single(binding.ParameterBindings);
            AssertIsBody(binding, 0);
        }
        public void Check_String_TypeConverter_Is_ModelBound()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_ComplexTypeWithStringConverter"));

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Check_Request_Parameter()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Request_Parameter"));

            Assert.Single(binding.ParameterBindings);
            AssertIsCustomBinder <HttpRequestParameterBinding>(binding, 0);
        }
        public void Check_CustomBindingAttribute()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_CustomBindingAttribute"));

            Assert.Equal(1, binding.ParameterBindings.Length);
            Assert.Same(CustomBindingAttribute.MockBinding, binding.ParameterBindings[0]);
        }
        public void Check_HttpContent()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_HttpContent_Parameter"));

            Assert.Equal(1, binding.ParameterBindings.Length);
            AssertIsError(binding, 0);
        }
        public void Check_Complex_Type_FromBody()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Complex_Type"));

            Assert.Equal(1, binding.ParameterBindings.Length);
            AssertIsBody(binding, 0);
        }
        public void Check_NullableInt_Is_ModelBound()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_NullableInt"));

            Assert.Equal(1, binding.ParameterBindings.Length);
            AssertIsModelBound(binding, 0);
        }
        public void Check_Empty_Action()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Empty"));

            Assert.NotNull(binding.ParameterBindings);
            Assert.Empty(binding.ParameterBindings);
        }
        public void Check_Cancellation_Token()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_CancellationToken"));

            Assert.Single(binding.ParameterBindings);
            AssertIsCancellationToken(binding, 0);
        }
        public void Check_Int_Is_ModelBound()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Int"));

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Check_String_TypeConverter_With_Body_Override()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_ComplexTypeWithStringConverter_Body_Override"));

            Assert.Equal(1, binding.ParameterBindings.Length);
            AssertIsBody(binding, 0);
        }
        public void Check_Parameter_With_ModelBinder_Attribute_On_Type()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_ComplexParameter_With_ModelBinder"));

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Check_Complex_ValueType_FromBody()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Complex_ValueType"));

            Assert.Single(binding.ParameterBindings);
            AssertIsBody(binding, 0);
        }
        public void Check_Derived_HttpContent()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Derived_HttpContent_Parameter"));

            Assert.Single(binding.ParameterBindings);
            AssertIsError(binding, 0);
        }
        public void Check_Complex_Type_FromUri()
        {
            // [FromUri] is just a specific instance of ModelBinder attribute
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Complex_Type_Uri"));

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Check_Complex_Type_FromBody_And_FromUri()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Complex_Type_UriAndBody"));

            Assert.Equal(2, binding.ParameterBindings.Length);
            AssertIsModelBound(binding, 0);
            AssertIsBody(binding, 1);
        }
        public void Check_String_String_IsModelBound()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_String_String"));

            Assert.Equal(2, binding.ParameterBindings.Length);
            AssertIsModelBound(binding, 0);
            AssertIsModelBound(binding, 1);
        }
        public void Check_Explicit_Int_Is_ModelBound()
        {
            // Even though int is implicitly model bound, still ok to specify it explicitly
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Int_FromUri"));

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Check_CustomBindingAttribute()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_CustomBindingAttribute"));

            HttpParameterBinding parameterBinding = Assert.Single(binding.ParameterBindings);

            Assert.Same(CustomBindingAttribute.MockBinding, parameterBinding);
        }
        public void Check_Closest_Attribute_Wins()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Closest_Attribute_Wins"));

            // Have 2 attributes that conflict with each other. Still get the contract, but it has an error in it.
            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Error_Conflicting_Attributes()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Conflicting_Attributes"));

            // Have 2 attributes that conflict with each other. Still get the contract, but it has an error in it.
            Assert.Single(binding.ParameterBindings);
            AssertIsError(binding, 0);
        }
        public void Check_SimpleTypes_Are_ModelBound()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_SimpleTypes"));

            for (int i = 0; i < binding.ParameterBindings.Length; i++)
            {
                AssertIsModelBound(binding, 0);
            }
        }
        public void Check_Customer_Binder()
        {
            // Mere presence of a ModelBinder attribute means the type is model bound.

            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Default_Custom_Model_Binder"));

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Check_Config_Override_Use_ModelBinding()
        {
            HttpConfiguration config = new HttpConfiguration();

            config.ParameterBindingRules.Add(param => param.BindWithModelBinding());
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Complex_Type", config));

            Assert.Single(binding.ParameterBindings);
            AssertIsModelBound(binding, 0);
        }
        public void Check_Two_Complex_Types_FromBody()
        {
            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            // It's illegal to have multiple parameters from the body.
            // But we should still be able to get a binding for it. We just can't execute it.
            var binding = binder.GetBinding(GetAction("Action_Two_Complex_Types"));

            Assert.Equal(2, binding.ParameterBindings.Length);
            AssertIsError(binding, 0);
            AssertIsError(binding, 1);
        }
        public void Check_Config_Override_Use_Formatters()
        {
            HttpConfiguration config = new HttpConfiguration();

            config.ParameterBindingRules.Add(param => param.BindWithFormatter()); // overrides

            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_Int", config));

            Assert.Single(binding.ParameterBindings);
            AssertIsBody(binding, 0);
        }
        public void Check_CustomModelBinder_On_Parameter()
        {
            HttpConfiguration config = new HttpConfiguration();

            config.ServiceResolver.SetServices(typeof(ValueProviderFactory), new ValueProviderFactory[] {
                new CustomValueProviderFactory(),
            });

            DefaultActionValueBinder binder = new DefaultActionValueBinder();

            var binding = binder.GetBinding(GetAction("Action_CustomModelBinder_On_Parameter_WithProvider", config));

            Assert.Equal(1, binding.ParameterBindings.Length);
            AssertIsModelBound(binding, 0);

            ModelBinderParameterBinding p = (ModelBinderParameterBinding)binding.ParameterBindings[0];

            Assert.IsType <CustomModelBinderProvider>(p.ModelBinderProvider);

            // Since the ModelBinderAttribute didn't specify the valueproviders, we should pull those from config.
            Assert.Equal(1, p.ValueProviderFactories.Count());
            Assert.IsType <CustomValueProviderFactory>(p.ValueProviderFactories.First());
        }