diff --git a/src/DotTiled.Tests/OptionalTests.cs b/src/DotTiled.Tests/OptionalTests.cs index 222c09a..5390a64 100644 --- a/src/DotTiled.Tests/OptionalTests.cs +++ b/src/DotTiled.Tests/OptionalTests.cs @@ -1,208 +1,5 @@ namespace DotTiled.Tests; -// public class OptionalTests -// { -// [Fact] -// public void HasValue_WhenValueIsSet_ReturnsTrue() -// { -// // Arrange -// var optional = new Optional(42); - -// // Act & Assert -// Assert.True(optional.HasValue); -// } - -// [Fact] -// public void HasValue_WhenValueIsNotSet_ReturnsFalse() -// { -// // Arrange -// var optional = new Optional(); - -// // Act & Assert -// Assert.False(optional.HasValue); -// } - -// [Fact] -// public void Value_WhenValueIsSet_ReturnsValue() -// { -// // Arrange -// var optional = new Optional(42); - -// // Act -// var value = optional.Value; - -// // Assert -// Assert.Equal(42, value); -// } - -// [Fact] -// public void Value_WhenValueIsNotSet_ThrowsInvalidOperationException() -// { -// // Arrange -// var optional = new Optional(); - -// // Act & Assert -// _ = Assert.Throws(() => optional.Value); -// } - -// [Fact] -// public void ImplicitConversionFromValue_CreatesOptionalWithValue() -// { -// // Arrange -// Optional optional = 42; - -// // Act & Assert -// Assert.True(optional.HasValue); -// Assert.Equal(42, optional.Value); -// } - -// [Fact] -// public void ImplicitConversionToValue_ReturnsValue() -// { -// // Arrange -// var optional = new Optional(42); - -// // Act -// int value = optional; - -// // Assert -// Assert.Equal(42, value); -// } - -// [Fact] -// public void ToString_WhenValueIsSet_ReturnsValueToString() -// { -// // Arrange -// var optional = new Optional(42); - -// // Act -// var result = optional.ToString(); - -// // Assert -// Assert.Equal("42", result); -// } - -// [Fact] -// public void ToString_WhenValueIsNotSet_ReturnsEmpty() -// { -// // Arrange -// var optional = new Optional(); - -// // Act -// var result = optional.ToString(); - -// // Assert -// Assert.Equal("Empty", result); -// } - -// [Fact] -// public void Equals_WithObject_ReturnsTrueWhenValueIsEqual() -// { -// // Arrange -// var optional = new Optional(42); - -// // Act -// var result = optional.Equals(42); - -// // Assert -// Assert.True(result); -// } - -// [Fact] -// public void Equals_WithObject_ReturnsFalseWhenValueIsNotEqual() -// { -// // Arrange -// var optional = new Optional(42); - -// // Act -// var result = optional.Equals(43); - -// // Assert -// Assert.False(result); -// } - -// [Fact] -// public void Equals_WithObject_ReturnsFalseWhenValueIsNotSet() -// { -// // Arrange -// var optional = new Optional(); - -// // Act -// var result = optional.Equals(42); - -// // Assert -// Assert.False(result); -// } - -// [Fact] -// public void Equals_WithOptional_ReturnsTrueWhenValueIsEqual() -// { -// // Arrange -// var optional1 = new Optional(42); -// var optional2 = new Optional(42); - -// // Act -// var result = optional1.Equals(optional2); - -// // Assert -// Assert.True(result); -// } - -// [Fact] -// public void Equals_WithOptional_ReturnsFalseWhenValueIsNotEqual() -// { -// // Arrange -// var optional1 = new Optional(42); -// var optional2 = new Optional(43); - -// // Act -// var result = optional1.Equals(optional2); - -// // Assert -// Assert.False(result); -// } - -// [Fact] -// public void Equals_WithOptional_ReturnsFalseWhenValueIsNotSet() -// { -// // Arrange -// var optional1 = new Optional(); -// var optional2 = new Optional(42); - -// // Act -// var result = optional1.Equals(optional2); - -// // Assert -// Assert.False(result); -// } - -// [Fact] -// public void GetHashCode_WhenValueIsSet_ReturnsValueHashCode() -// { -// // Arrange -// var optional = new Optional(42); - -// // Act -// var result = optional.GetHashCode(); - -// // Assert -// Assert.Equal(42.GetHashCode(), result); -// } - -// [Fact] -// public void GetHashCode_WhenValueIsNotSet_ReturnsZero() -// { -// // Arrange -// var optional = new Optional(); - -// // Act -// var result = optional.GetHashCode(); - -// // Assert -// Assert.Equal(0, result); -// } -// } - public class OptionalTests { // Constructor Tests diff --git a/src/DotTiled.Tests/Properties/CustomTypes/CustomEnumDefinitionTests.cs b/src/DotTiled.Tests/Properties/CustomTypes/CustomEnumDefinitionTests.cs index e69de29..347836a 100644 --- a/src/DotTiled.Tests/Properties/CustomTypes/CustomEnumDefinitionTests.cs +++ b/src/DotTiled.Tests/Properties/CustomTypes/CustomEnumDefinitionTests.cs @@ -0,0 +1,110 @@ +namespace DotTiled.Tests; + +public class CustomEnumDefinitionTests +{ + private static void AssertCustomEnumDefinitionEqual(CustomEnumDefinition expected, CustomEnumDefinition actual) + { + DotTiledAssert.AssertEqual(expected.ID, actual.ID, nameof(CustomEnumDefinition.ID)); + DotTiledAssert.AssertEqual(expected.Name, actual.Name, nameof(CustomEnumDefinition.Name)); + DotTiledAssert.AssertEqual(expected.StorageType, actual.StorageType, nameof(CustomEnumDefinition.StorageType)); + DotTiledAssert.AssertEqual(expected.ValueAsFlags, actual.ValueAsFlags, nameof(CustomEnumDefinition.ValueAsFlags)); + DotTiledAssert.AssertListOrdered(expected.Values, actual.Values, nameof(CustomEnumDefinition.Values)); + } + + [Fact] + public void FromEnum_Type_WhenTypeIsNotEnum_ThrowsArgumentException() + { + // Arrange + var type = typeof(string); + + // Act & Assert + Assert.Throws(() => CustomEnumDefinition.FromEnum(type)); + } + + private enum TestEnum1 { Value1, Value2, Value3 } + + [Fact] + public void FromEnum_Type_WhenTypeIsEnum_ReturnsCustomEnumDefinition() + { + // Arrange + var type = typeof(TestEnum1); + var expected = new CustomEnumDefinition + { + ID = 0, + Name = "TestEnum1", + StorageType = CustomEnumStorageType.Int, + Values = ["Value1", "Value2", "Value3"], + ValueAsFlags = false + }; + + // Act + var result = CustomEnumDefinition.FromEnum(type); + + // Assert + AssertCustomEnumDefinitionEqual(expected, result); + } + + [Flags] + private enum TestEnum2 { Value1, Value2, Value3 } + + [Fact] + public void FromEnum_Type_WhenEnumIsFlags_ReturnsCustomEnumDefinition() + { + // Arrange + var type = typeof(TestEnum2); + var expected = new CustomEnumDefinition + { + ID = 0, + Name = "TestEnum2", + StorageType = CustomEnumStorageType.Int, + Values = ["Value1", "Value2", "Value3"], + ValueAsFlags = true + }; + + // Act + var result = CustomEnumDefinition.FromEnum(type); + + // Assert + AssertCustomEnumDefinitionEqual(expected, result); + } + + [Fact] + public void FromEnum_T_WhenTypeIsEnum_ReturnsCustomEnumDefinition() + { + // Arrange + var expected = new CustomEnumDefinition + { + ID = 0, + Name = "TestEnum1", + StorageType = CustomEnumStorageType.Int, + Values = ["Value1", "Value2", "Value3"], + ValueAsFlags = false + }; + + // Act + var result = CustomEnumDefinition.FromEnum(); + + // Assert + AssertCustomEnumDefinitionEqual(expected, result); + } + + [Fact] + public void FromEnum_T_WhenEnumIsFlags_ReturnsCustomEnumDefinition() + { + // Arrange + var expected = new CustomEnumDefinition + { + ID = 0, + Name = "TestEnum2", + StorageType = CustomEnumStorageType.Int, + Values = ["Value1", "Value2", "Value3"], + ValueAsFlags = true + }; + + // Act + var result = CustomEnumDefinition.FromEnum(); + + // Assert + AssertCustomEnumDefinitionEqual(expected, result); + } +} diff --git a/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs b/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs index 719f1ef..72593d9 100644 --- a/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs +++ b/src/DotTiled/Properties/CustomTypes/CustomEnumDefinition.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; namespace DotTiled; @@ -46,8 +47,42 @@ public class CustomEnumDefinition : ICustomTypeDefinition /// public bool ValueAsFlags { get; set; } - // public CustomEnumDefinition FromEnum(Type enumType) - // { - // if (!enumType.Is) - // } + /// + /// Creates a custom enum definition from the specified enum type. + /// + /// + /// + public static CustomEnumDefinition FromEnum() where T : Enum + { + var type = typeof(T); + var isFlags = type.GetCustomAttributes(typeof(FlagsAttribute), false).Length != 0; + + return new CustomEnumDefinition + { + Name = type.Name, + StorageType = CustomEnumStorageType.Int, + Values = Enum.GetNames(type).ToList(), + ValueAsFlags = isFlags + }; + } + + /// + /// Creates a custom enum definition from the specified enum type. + /// + /// + public static CustomEnumDefinition FromEnum(Type type) + { + if (!type.IsEnum) + throw new ArgumentException("Type must be an enum.", nameof(type)); + + var isFlags = type.GetCustomAttributes(typeof(FlagsAttribute), false).Length != 0; + + return new CustomEnumDefinition + { + Name = type.Name, + StorageType = CustomEnumStorageType.Int, + Values = Enum.GetNames(type).ToList(), + ValueAsFlags = isFlags + }; + } }