Issue #220 - Flags enum does not bind

Fix - After TypeConverter support this works. Adding tests for the same.
This commit is contained in:
sornaks 2014-10-20 14:09:13 -07:00
parent 78bda87730
commit 1dd1652dcf
4 changed files with 100 additions and 4 deletions

View File

@ -56,5 +56,25 @@ namespace Microsoft.AspNet.Mvc.FunctionalTests
// Assert
Assert.Equal("route-value", body.Trim());
}
[Theory]
[InlineData("http://localhost/Home/GetFlagValuesAsString?flags=1", "Value1")]
[InlineData("http://localhost/Home/GetFlagValuesAsString?flags=5", "Value1, Value4")]
[InlineData("http://localhost/Home/GetFlagValuesAsString?flags=7", "Value1, Value2, Value4")]
[InlineData("http://localhost/Home/GetFlagValuesAsString?flags=0", "0")]
[InlineData("http://localhost/Home/GetFlagValuesAsInt?flags=Value1", "1")]
[InlineData("http://localhost/Home/GetFlagValuesAsInt?flags=Value1,Value2", "3")]
public async Task ValueProvider_DeserializesEnumsWithFlags(string url, string expected)
{
// Arrange
var server = TestServer.Create(_services, _app);
var client = server.CreateClient();
// Act
var body = await client.GetStringAsync(url);
// Assert
Assert.Equal(expected, body.Trim());
}
}
}

View File

@ -296,12 +296,32 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
var vpr = new ValueProviderResult(value, null, CultureInfo.InvariantCulture);
// Act
var outValue = (MyEnum[])vpr.ConvertTo(typeof(MyEnum[]));
var outValue = vpr.ConvertTo(typeof(MyEnum[]));
// Assert
Assert.Equal(2, outValue.Length);
Assert.Equal(MyEnum.Value1, outValue[0]);
Assert.Equal(MyEnum.Value0, outValue[1]);
var result = Assert.IsType<MyEnum[]>(outValue);
Assert.Equal(2, result.Length);
Assert.Equal(MyEnum.Value1, result[0]);
Assert.Equal(MyEnum.Value0, result[1]);
}
[Theory]
[InlineData(new object[] { new[] { 1, 2 }, new[] { FlagsEnum.Value1, FlagsEnum.Value2 } })]
[InlineData(new object[] { new[] { "Value1", "Value2" }, new[] { FlagsEnum.Value1, FlagsEnum.Value2 } })]
[InlineData(new object[] { new[] { 5, 2 }, new[] { FlagsEnum.Value1 | FlagsEnum.Value4, FlagsEnum.Value2 } })]
public void ConvertTo_ConvertsFlagsEnumArrays(object value, FlagsEnum[] expected)
{
// Arrange
var vpr = new ValueProviderResult(value, null, CultureInfo.InvariantCulture);
// Act
var outValue = vpr.ConvertTo(typeof(FlagsEnum[]));
// Assert
var result = Assert.IsType<FlagsEnum[]>(outValue);
Assert.Equal(2, result.Length);
Assert.Equal(expected[0], result[0]);
Assert.Equal(expected[1], result[1]);
}
[Fact]
@ -448,6 +468,27 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Assert.Equal(expectedMessage, ex.Message);
}
[Theory]
[InlineData(new object[] { 2, FlagsEnum.Value2 })]
[InlineData(new object[] { 5, FlagsEnum.Value1 | FlagsEnum.Value4 })]
[InlineData(new object[] { 15, FlagsEnum.Value1 | FlagsEnum.Value2 | FlagsEnum.Value4 | FlagsEnum.Value8 })]
[InlineData(new object[] { 16, (FlagsEnum)16 })]
[InlineData(new object[] { 0, (FlagsEnum)0 })]
[InlineData(new object[] { null, (FlagsEnum)0 })]
[InlineData(new object[] { "Value1,Value2", (FlagsEnum)3 })]
[InlineData(new object[] { "Value1,Value2,value4, value8", (FlagsEnum)15 })]
public void ConvertTo_ConvertsEnumFlags(object value, object expected)
{
// Arrange
var vpr = new ValueProviderResult(value, null, CultureInfo.InvariantCulture);
// Act
var outValue = (FlagsEnum)vpr.ConvertTo(typeof(FlagsEnum));
// Assert
Assert.Equal(expected, outValue);
}
private class MyClassWithoutConverter
{
}
@ -457,5 +498,14 @@ namespace Microsoft.AspNet.Mvc.ModelBinding
Value0 = 0,
Value1 = 1
}
[Flags]
public enum FlagsEnum
{
Value1 = 1,
Value2 = 2,
Value4 = 4,
Value8 = 8
}
}
}

View File

@ -0,0 +1,16 @@
// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
namespace ValueProvidersSite
{
[Flags]
public enum FlagsEnum
{
Value1 = 1,
Value2 = 2,
Value4 = 4,
Value8 = 8
}
}

View File

@ -22,5 +22,15 @@ namespace ValueProvidersSite
{
return test;
}
public string GetFlagValuesAsString(FlagsEnum flags)
{
return flags.ToString();
}
public int GetFlagValuesAsInt(FlagsEnum flags)
{
return (int)flags;
}
}
}