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