Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

401 lines
13 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
using System.Globalization;
using Xunit;
using Assert = Microsoft.TestCommon.AssertEx;
namespace System.Web.Mvc.Test
{
public class ValueProviderResultTest
{
[Fact]
public void ConstructorSetsProperties()
{
// Arrange
object rawValue = new object();
string attemptedValue = "some string";
CultureInfo culture = CultureInfo.GetCultureInfo("fr-FR");
// Act
ValueProviderResult result = new ValueProviderResult(rawValue, attemptedValue, culture);
// Assert
Assert.Same(rawValue, result.RawValue);
Assert.Same(attemptedValue, result.AttemptedValue);
Assert.Same(culture, result.Culture);
}
[Fact]
public void ConvertToCanConvertArraysToArrays()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new int[] { 1, 20, 42 }, "", CultureInfo.InvariantCulture);
// Act
string[] converted = (string[])vpr.ConvertTo(typeof(string[]));
// Assert
Assert.NotNull(converted);
Assert.Equal(3, converted.Length);
Assert.Equal("1", converted[0]);
Assert.Equal("20", converted[1]);
Assert.Equal("42", converted[2]);
}
[Fact]
public void ConvertToCanConvertArraysToSingleElements()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new int[] { 1, 20, 42 }, "", CultureInfo.InvariantCulture);
// Act
string converted = (string)vpr.ConvertTo(typeof(string));
// Assert
Assert.Equal("1", converted);
}
[Fact]
public void ConvertToCanConvertSingleElementsToArrays()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(42, "", CultureInfo.InvariantCulture);
// Act
string[] converted = (string[])vpr.ConvertTo(typeof(string[]));
// Assert
Assert.NotNull(converted);
Assert.Single(converted);
Assert.Equal("42", converted[0]);
}
[Fact]
public void ConvertToCanConvertSingleElementsToSingleElements()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(42, "", CultureInfo.InvariantCulture);
// Act
string converted = (string)vpr.ConvertTo(typeof(string));
// Assert
Assert.NotNull(converted);
Assert.Equal("42", converted);
}
[Fact]
public void ConvertToChecksTypeConverterCanConvertFrom()
{
// Arrange
object original = "someValue";
ValueProviderResult vpr = new ValueProviderResult(original, null, CultureInfo.GetCultureInfo("fr-FR"));
// Act
DefaultModelBinderTest.StringContainer returned = (DefaultModelBinderTest.StringContainer)vpr.ConvertTo(typeof(DefaultModelBinderTest.StringContainer));
// Assert
Assert.Equal(returned.Value, "someValue (fr-FR)");
}
[Fact]
public void ConvertToChecksTypeConverterCanConvertTo()
{
// Arrange
object original = new DefaultModelBinderTest.StringContainer("someValue");
ValueProviderResult vpr = new ValueProviderResult(original, "", CultureInfo.GetCultureInfo("en-US"));
// Act
string returned = (string)vpr.ConvertTo(typeof(string));
// Assert
Assert.Equal(returned, "someValue (en-US)");
}
[Fact]
public void ConvertToReturnsNullIfArrayElementValueIsNull()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new string[] { null }, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int));
// Assert
Assert.Null(outValue);
}
[Fact]
public void ConvertToReturnsNullIfTryingToConvertEmptyArrayToSingleElement()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new int[0], "", CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int));
// Assert
Assert.Null(outValue);
}
[Fact]
public void ConvertToReturnsNullIfValueIsEmptyString()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult("", null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int));
// Assert
Assert.Null(outValue);
}
[Fact]
public void ConvertToReturnsNullIfTrimmedValueIsEmptyString()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(" \t \r\n ", null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int));
// Assert
Assert.Null(outValue);
}
[Fact]
public void ConvertToReturnsNullIfValueIsNull()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(null /* rawValue */, null /* attemptedValue */, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int[]));
// Assert
Assert.Null(outValue);
}
[Fact]
public void ConvertToReturnsValueIfArrayElementIsIntegerAndDestinationTypeIsEnum()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new object[] { 1 }, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(MyEnum));
// Assert
Assert.Equal(outValue, MyEnum.Value1);
}
[Fact]
public void ConvertToReturnsValueIfArrayElementIsStringValueAndDestinationTypeIsEnum()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new object[] { "1" }, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(MyEnum));
// Assert
Assert.Equal(outValue, MyEnum.Value1);
}
[Fact]
public void ConvertToReturnsValueIfArrayElementIsStringKeyAndDestinationTypeIsEnum()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new object[] { "Value1" }, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(MyEnum));
// Assert
Assert.Equal(outValue, MyEnum.Value1);
}
[Fact]
public void ConvertToReturnsValueIfElementIsStringAndDestionationIsNullableInteger()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult("12", null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int?));
// Assert
Assert.Equal(12, outValue);
}
[Fact]
public void ConvertToReturnsValueIfElementIsStringAndDestionationIsNullableDouble()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult("12.5", null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(double?));
// Assert
Assert.Equal(12.5, outValue);
}
[Fact]
public void ConvertToReturnsValueIfElementIsDecimalAndDestionationIsNullableInteger()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(12M, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int?));
// Assert
Assert.Equal(12, outValue);
}
[Fact]
public void ConvertToReturnsValueIfElementIsDecimalAndDestionationIsNullableDouble()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(12.5M, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(double?));
// Assert
Assert.Equal(12.5, outValue);
}
[Fact]
public void ConvertToReturnsValueIfElementIsDecimalDoubleAndDestionationIsNullableInteger()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(12.5M, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(int?));
// Assert
Assert.Equal(12, outValue);
}
[Fact]
public void ConvertToReturnsValueIfElementIsDecimalDoubleAndDestionationIsNullableLong()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(12.5M, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(long?));
// Assert
Assert.Equal(12L, outValue);
}
[Fact]
public void ConvertToReturnsValueIfArrayElementInstanceOfDestinationType()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult(new object[] { "some string" }, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(string));
// Assert
Assert.Equal("some string", outValue);
}
[Fact]
public void ConvertToReturnsValueIfInstanceOfDestinationType()
{
// Arrange
string[] original = new string[] { "some string" };
ValueProviderResult vpr = new ValueProviderResult(original, null, CultureInfo.InvariantCulture);
// Act
object outValue = vpr.ConvertTo(typeof(string[]));
// Assert
Assert.Same(original, outValue);
}
[Fact]
public void ConvertToThrowsIfConverterThrows()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult("x", null, CultureInfo.InvariantCulture);
Type destinationType = typeof(DefaultModelBinderTest.StringContainer);
// Act & Assert
// Will throw since the custom converter assumes the first 5 characters to be digits
InvalidOperationException exception = Assert.Throws<InvalidOperationException>(
delegate { vpr.ConvertTo(destinationType); },
"The parameter conversion from type 'System.String' to type 'System.Web.Mvc.Test.DefaultModelBinderTest+StringContainer' failed. See the inner exception for more information.");
Exception innerException = exception.InnerException;
Assert.Equal("Value must have at least 3 characters.", innerException.Message);
}
[Fact]
public void ConvertToThrowsIfNoConverterExists()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult("x", null, CultureInfo.InvariantCulture);
Type destinationType = typeof(MyClassWithoutConverter);
// Act & Assert
Assert.Throws<InvalidOperationException>(
delegate { vpr.ConvertTo(destinationType); },
"The parameter conversion from type 'System.String' to type 'System.Web.Mvc.Test.ValueProviderResultTest+MyClassWithoutConverter' failed because no type converter can convert between these types.");
}
[Fact]
public void ConvertToThrowsIfTypeIsNull()
{
// Arrange
ValueProviderResult vpr = new ValueProviderResult("x", null, CultureInfo.InvariantCulture);
// Act & Assert
Assert.ThrowsArgumentNull(
delegate { vpr.ConvertTo(null); }, "type");
}
[Fact]
public void ConvertToUsesProvidedCulture()
{
// Arrange
object original = "someValue";
CultureInfo gbCulture = CultureInfo.GetCultureInfo("en-GB");
ValueProviderResult vpr = new ValueProviderResult(original, null, CultureInfo.GetCultureInfo("fr-FR"));
// Act
DefaultModelBinderTest.StringContainer returned = (DefaultModelBinderTest.StringContainer)vpr.ConvertTo(typeof(DefaultModelBinderTest.StringContainer), gbCulture);
// Assert
Assert.Equal(returned.Value, "someValue (en-GB)");
}
[Fact]
public void CulturePropertyDefaultsToInvariantCulture()
{
// Arrange
ValueProviderResult result = new ValueProviderResult(null, null, null);
// Act & assert
Assert.Same(CultureInfo.InvariantCulture, result.Culture);
}
private class MyClassWithoutConverter
{
}
private enum MyEnum
{
Value0 = 0,
Value1 = 1
}
}
}