1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4 
5 using System.Collections.Generic;
6 using Xunit;
7 
8 namespace System.ComponentModel.DataAnnotations.Tests
9 {
10     public class EnumDataTypeAttributeTests : ValidationAttributeTestBase
11     {
ValidValues()12         protected override IEnumerable<TestCase> ValidValues()
13         {
14             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), null);
15             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "");
16             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), NonFlagsEnumType.A);
17             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), 10);
18             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), 100);
19             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), FlagsEnumType.X);
20             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), FlagsEnumType.X | FlagsEnumType.Y);
21             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), 5);
22             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), 7);
23             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "A");
24             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "B");
25             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "C");
26             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "0");
27             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "10");
28             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "100");
29             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "X");
30             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "X, Y");
31             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "X, Y, Z");
32             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "1");
33             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "5");
34             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "7");
35         }
36 
InvalidValues()37         protected override IEnumerable<TestCase> InvalidValues()
38         {
39             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), FlagsEnumType.X);
40             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), new object());
41             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), true);
42             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), 1.1f);
43             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), 123.456m);
44             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), '0');
45             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "NoSuchValue");
46             yield return new TestCase(new EnumDataTypeAttribute(typeof(NonFlagsEnumType)), "42");
47 
48             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), 0);
49             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), 8);
50             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "NoSuchValue");
51             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "0");
52             yield return new TestCase(new EnumDataTypeAttribute(typeof(FlagsEnumType)), "8");
53         }
54 
55         [Theory]
56         [InlineData(null)]
57         [InlineData(typeof(string))]
58         [InlineData(typeof(NonFlagsEnumType))]
59         [InlineData(typeof(FlagsEnumType))]
Ctor(Type enumType)60         public static void Ctor(Type enumType)
61         {
62             var attribute = new EnumDataTypeAttribute(enumType);
63             Assert.Equal(DataType.Custom, attribute.DataType);
64             Assert.Equal("Enumeration", attribute.CustomDataType);
65 
66             Assert.Equal(enumType, attribute.EnumType);
67         }
68 
69         [Theory]
70         [InlineData(null)]
71         [InlineData(typeof(string))]
72         [InlineData(typeof(NonFlagsEnumType?))]
73         [InlineData(typeof(FlagsEnumType?))]
Validate_InvalidEnumType_ThrowsInvalidOperationException(Type enumType)74         public static void Validate_InvalidEnumType_ThrowsInvalidOperationException(Type enumType)
75         {
76             var attribute = new EnumDataTypeAttribute(enumType);
77             Assert.Throws<InvalidOperationException>(() => attribute.Validate("AnyValue", new ValidationContext(new object())));
78         }
79 
80         private enum NonFlagsEnumType
81         {
82             A = 0,
83             B = 10,
84             C = 100
85         }
86 
87         [Flags]
88         private enum FlagsEnumType
89         {
90             X = 1,
91             Y = 2,
92             Z = 4
93         }
94     }
95 }
96