diff --git a/test/Microsoft.AspNet.Mvc.FunctionalTests/ValueProviderTests.cs b/test/Microsoft.AspNet.Mvc.FunctionalTests/ValueProviderTests.cs index 7f082d6714..75b317d3cf 100644 --- a/test/Microsoft.AspNet.Mvc.FunctionalTests/ValueProviderTests.cs +++ b/test/Microsoft.AspNet.Mvc.FunctionalTests/ValueProviderTests.cs @@ -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()); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/ValueProviders/ValueProviderResultTest.cs b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/ValueProviders/ValueProviderResultTest.cs index 712317a8b7..2575711d66 100644 --- a/test/Microsoft.AspNet.Mvc.ModelBinding.Test/ValueProviders/ValueProviderResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.ModelBinding.Test/ValueProviders/ValueProviderResultTest.cs @@ -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(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(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 + } } } \ No newline at end of file diff --git a/test/WebSites/ValueProvidersSite/FlagsEnum.cs b/test/WebSites/ValueProvidersSite/FlagsEnum.cs new file mode 100644 index 0000000000..766ac8f6b4 --- /dev/null +++ b/test/WebSites/ValueProvidersSite/FlagsEnum.cs @@ -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 + } +} \ No newline at end of file diff --git a/test/WebSites/ValueProvidersSite/HomeController.cs b/test/WebSites/ValueProvidersSite/HomeController.cs index a6255dfd3d..12147841f8 100644 --- a/test/WebSites/ValueProvidersSite/HomeController.cs +++ b/test/WebSites/ValueProvidersSite/HomeController.cs @@ -22,5 +22,15 @@ namespace ValueProvidersSite { return test; } + + public string GetFlagValuesAsString(FlagsEnum flags) + { + return flags.ToString(); + } + + public int GetFlagValuesAsInt(FlagsEnum flags) + { + return (int)flags; + } } } \ No newline at end of file