1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
// 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<ParameterInfo> mockPInfo = new Mock<ParameterInfo>() { 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<ParameterInfo> mockPInfo = new Mock<ParameterInfo>() { 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<bool>(true, "boolParam");
DefaultValueAttributeHelper<byte>(42, "byteParam");
DefaultValueAttributeHelper<char>('a', "charParam");
DefaultValueAttributeHelper<double>(1.0, "doubleParam");
DefaultValueAttributeHelper<MyEnum>(MyEnum.All, "enumParam");
DefaultValueAttributeHelper<float>((float)1.0, "floatParam");
DefaultValueAttributeHelper<int>(42, "intParam");
DefaultValueAttributeHelper<long>(42, "longParam");
DefaultValueAttributeHelper<object>(null, "objectParam");
DefaultValueAttributeHelper<short>(42, "shortParam");
DefaultValueAttributeHelper<string>("abc", "stringParam");
DefaultValueAttributeHelper<DateTime>(new DateTime(2010, 09, 27), "customParam");
}
[Fact]
public void TryGetDefaultValue_OptionalParameters()
{
OptionalParamHelper<bool>(true, "boolParam");
OptionalParamHelper<byte>(42, "byteParam");
OptionalParamHelper<char>('a', "charParam");
OptionalParamHelper<double>(1.0, "doubleParam");
OptionalParamHelper<MyEnum>(MyEnum.All, "enumParam");
OptionalParamHelper<float>((float)1.0, "floatParam");
OptionalParamHelper<int>(42, "intParam");
OptionalParamHelper<long>(42, "longParam");
OptionalParamHelper<object>(null, "objectParam");
OptionalParamHelper<short>(42, "shortParam");
OptionalParamHelper<string>("abc", "stringParam");
}
private static void DefaultValueAttributeHelper<TParam>(TParam expectedValue, string paramName)
{
ParameterTestHelper<TParam>(expectedValue, paramName, "AttributeDefaultValues");
}
private static void OptionalParamHelper<TParam>(TParam expectedValue, string paramName)
{
ParameterTestHelper<TParam>(expectedValue, paramName, "OptionalParamDefaultValues");
}
private static void ParameterTestHelper<TParam>(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<TParam>(returnValueObject);
}
TParam returnValue = (TParam)returnValueObject;
Assert.Equal<TParam>(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
}
}
}
|