// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.ComponentModel; using System.Linq; using System.Reflection; using Moq; using Xunit; namespace System.Web.Mvc.Test { public class ParameterInfoUtilTest { [Fact] public void TryGetDefaultValue_FirstChecksDefaultValue() { // Arrange Mock mockPInfo = new Mock() { DefaultValue = DefaultValue.Mock }; mockPInfo.Setup(p => p.DefaultValue).Returns(42); mockPInfo.Setup(p => p.Name).Returns("someParameter"); // Act object defaultValue; bool retVal = ParameterInfoUtil.TryGetDefaultValue(mockPInfo.Object, out defaultValue); // Assert Assert.True(retVal); Assert.Equal(42, defaultValue); } [Fact] public void TryGetDefaultValue_SecondChecksDefaultValueAttribute() { // Arrange ParameterInfo pInfo = typeof(MyController).GetMethod("DefaultValues").GetParameters()[1]; // hasDefaultValue // Act object defaultValue; bool retVal = ParameterInfoUtil.TryGetDefaultValue(pInfo, out defaultValue); // Assert Assert.True(retVal); Assert.Equal("someValue", defaultValue); } [Fact] public void TryGetDefaultValue_RespectsNullDefaultValue() { // Arrange Mock mockPInfo = new Mock() { DefaultValue = DefaultValue.Mock }; mockPInfo.Setup(p => p.DefaultValue).Returns(null); mockPInfo.Setup(p => p.Name).Returns("someParameter"); mockPInfo .Setup(p => p.GetCustomAttributes(typeof(DefaultValueAttribute[]), false)) .Returns(new DefaultValueAttribute[] { new DefaultValueAttribute(42) }); // Act object defaultValue; bool retVal = ParameterInfoUtil.TryGetDefaultValue(mockPInfo.Object, out defaultValue); // Assert Assert.True(retVal); Assert.Null(defaultValue); } [Fact] public void TryGetDefaultValue_ReturnsFalseIfNoDefaultValue() { // Arrange ParameterInfo pInfo = typeof(MyController).GetMethod("DefaultValues").GetParameters()[0]; // noDefaultValue // Act object defaultValue; bool retVal = ParameterInfoUtil.TryGetDefaultValue(pInfo, out defaultValue); // Assert Assert.False(retVal); Assert.Equal(default(object), defaultValue); } [Fact] public void TryGetDefaultValue_DefaultValueAttributeParameters() { DefaultValueAttributeHelper(true, "boolParam"); DefaultValueAttributeHelper(42, "byteParam"); DefaultValueAttributeHelper('a', "charParam"); DefaultValueAttributeHelper(1.0, "doubleParam"); DefaultValueAttributeHelper(MyEnum.All, "enumParam"); DefaultValueAttributeHelper((float)1.0, "floatParam"); DefaultValueAttributeHelper(42, "intParam"); DefaultValueAttributeHelper(42, "longParam"); DefaultValueAttributeHelper(null, "objectParam"); DefaultValueAttributeHelper(42, "shortParam"); DefaultValueAttributeHelper("abc", "stringParam"); DefaultValueAttributeHelper(new DateTime(2010, 09, 27), "customParam"); } [Fact] public void TryGetDefaultValue_OptionalParameters() { OptionalParamHelper(true, "boolParam"); OptionalParamHelper(42, "byteParam"); OptionalParamHelper('a', "charParam"); OptionalParamHelper(1.0, "doubleParam"); OptionalParamHelper(MyEnum.All, "enumParam"); OptionalParamHelper((float)1.0, "floatParam"); OptionalParamHelper(42, "intParam"); OptionalParamHelper(42, "longParam"); OptionalParamHelper(null, "objectParam"); OptionalParamHelper(42, "shortParam"); OptionalParamHelper("abc", "stringParam"); } private static void DefaultValueAttributeHelper(TParam expectedValue, string paramName) { ParameterTestHelper(expectedValue, paramName, "AttributeDefaultValues"); } private static void OptionalParamHelper(TParam expectedValue, string paramName) { ParameterTestHelper(expectedValue, paramName, "OptionalParamDefaultValues"); } private static void ParameterTestHelper(TParam expectedValue, string paramName, string actionMethodName) { ParameterInfo pInfo = typeof(MyController).GetMethod(actionMethodName).GetParameters().Single(p => p.Name == paramName); object returnValueObject; bool result = ParameterInfoUtil.TryGetDefaultValue(pInfo, out returnValueObject); Assert.True(result); if (expectedValue != null) { Assert.IsType(returnValueObject); } TParam returnValue = (TParam)returnValueObject; Assert.Equal(expectedValue, returnValue); } private class MyController : Controller { public void DefaultValues(string noDefaultValue, [DefaultValue("someValue")] string hasDefaultValue) { } public void AttributeDefaultValues( [DefaultValue(true)] bool boolParam, [DefaultValue((byte)42)] byte byteParam, [DefaultValue('a')] char charParam, [DefaultValue(typeof(DateTime), "2010-09-27")] object customParam, [DefaultValue((double)1.0)] double doubleParam, [DefaultValue(MyEnum.All)] MyEnum enumParam, [DefaultValue((float)1.0)] float floatParam, [DefaultValue(42)] int intParam, [DefaultValue((long)42)] long longParam, [DefaultValue(null)] object objectParam, [DefaultValue((short)42)] short shortParam, [DefaultValue("abc")] string stringParam ) { } public void OptionalParamDefaultValues( bool boolParam = true, byte byteParam = 42, char charParam = 'a', double doubleParam = 1.0, MyEnum enumParam = MyEnum.All, float floatParam = (float)1.0, int intParam = 42, long longParam = 42, object objectParam = null, short shortParam = 42, string stringParam = "abc" ) { } } private enum MyEnum { None = 0, All = 1 } } }