diff --git a/Nuclex.Support (Xbox 360).csproj b/Nuclex.Support (Xbox 360).csproj index 185726f..987b411 100644 --- a/Nuclex.Support (Xbox 360).csproj +++ b/Nuclex.Support (Xbox 360).csproj @@ -134,6 +134,10 @@ ReverseComparer.cs + + + EnumHelper.cs + PrototypeFactory.cs diff --git a/Nuclex.Support.csproj b/Nuclex.Support.csproj index d5a896c..a2affe1 100644 --- a/Nuclex.Support.csproj +++ b/Nuclex.Support.csproj @@ -120,6 +120,10 @@ ReverseComparer.cs + + + EnumHelper.cs + PrototypeFactory.cs diff --git a/Source/EnumHelper.Test.cs b/Source/EnumHelper.Test.cs new file mode 100644 index 0000000..5b45212 --- /dev/null +++ b/Source/EnumHelper.Test.cs @@ -0,0 +1,149 @@ +#region CPL License +/* +Nuclex Framework +Copyright (C) 2002-2009 Nuclex Development Labs + +This library is free software; you can redistribute it and/or +modify it under the terms of the IBM Common Public License as +published by the IBM Corporation; either version 1.0 of the +License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +IBM Common Public License for more details. + +You should have received a copy of the IBM Common Public +License along with this library +*/ +#endregion + +#if UNITTEST + +using System; +using System.IO; + +using NUnit.Framework; + +namespace Nuclex.Support { + + /// Unit Test for the enumeration helper class + [TestFixture] + public class EnumHelperTest { + + #region enum TestEnumeration + + /// An enumeration used for unit testing + internal enum TestEnumeration { + /// First arbitrary enumeration value + One = -2, + /// Third arbitrary enumeration value + Three = 33, + /// Second arbitrary enumeration value + Two = 23 + } + + #endregion // enum TestEnumeration + + #region enum EmptyEnumeration + + internal enum EmptyEnumeration { } + + #endregion // enum EmptyEnumeration + + /// + /// Verifies that the enum helper can list the members of an enumeration + /// manually (as it needs to be done on the XBox 360) + /// + [Test] + public void TestGetValuesXbox360() { + CollectionAssert.AreEquivalent( + new TestEnumeration[] { + TestEnumeration.One, TestEnumeration.Two, TestEnumeration.Three + }, + EnumHelper.GetValuesXbox360() + ); + } + + /// + /// Verifies that the enum helper can list the members of an enumeration + /// + [Test] + public void TestGetValues() { + CollectionAssert.AreEquivalent( + new TestEnumeration[] { + TestEnumeration.One, TestEnumeration.Two, TestEnumeration.Three + }, + EnumHelper.GetValues() + ); + } + + /// + /// Verifies that the enum helper can locate the highest value in an enumeration + /// + [Test] + public void TestGetHighestValue() { + Assert.AreEqual( + TestEnumeration.Three, EnumHelper.GetHighestValue() + ); + } + + /// + /// Verifies that the enum helper can locate the lowest value in an enumeration + /// + [Test] + public void TestGetLowestValue() { + Assert.AreEqual( + TestEnumeration.One, EnumHelper.GetLowestValue() + ); + } + + /// + /// Tests whether an exception is thrown if the GetValuesXbox360() method is + /// used on a non-enumeration type + /// + [Test] + public void TestThrowOnNonEnumTypeXbox360() { + Assert.Throws( + delegate() { EnumHelper.GetValuesXbox360(); } + ); + } + + /// + /// Tests whether an exception is thrown if the GetValues() method is used on + /// a non-enumeration type + /// + [Test] + public void TestThrowOnNonEnumType() { + Assert.Throws( + delegate() { EnumHelper.GetValues(); } + ); + } + + /// + /// Verifies that the default value for an enumeration is returned if + /// the GetLowestValue() method is used on an empty enumeration + /// + [Test] + public void TestLowestValueInEmptyEnumeration() { + Assert.AreEqual( + default(EmptyEnumeration), EnumHelper.GetLowestValue() + ); + } + + /// + /// Verifies that the default value for an enumeration is returned if + /// the GetHighestValue() method is used on an empty enumeration + /// + [Test] + public void TestHighestValueInEmptyEnumeration() { + Assert.AreEqual( + default(EmptyEnumeration), EnumHelper.GetHighestValue() + ); + } + + } + +} // namespace Nuclex.Support + +#endif // UNITTEST diff --git a/Source/EnumHelper.cs b/Source/EnumHelper.cs new file mode 100644 index 0000000..98e56dc --- /dev/null +++ b/Source/EnumHelper.cs @@ -0,0 +1,126 @@ +#region CPL License +/* +Nuclex Framework +Copyright (C) 2002-2009 Nuclex Development Labs + +This library is free software; you can redistribute it and/or +modify it under the terms of the IBM Common Public License as +published by the IBM Corporation; either version 1.0 of the +License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +IBM Common Public License for more details. + +You should have received a copy of the IBM Common Public +License along with this library +*/ +#endregion + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; + +namespace Nuclex.Support { + + /// Helper methods for enumerations + public static class EnumHelper { + + /// Returns the highest value encountered in an enumeration + /// + /// Enumeration of which the highest value will be returned + /// + /// The highest value in the enumeration + public static EnumType GetHighestValue() where EnumType : IComparable { + EnumType[] values = GetValues(); + + // If the enumeration is empty, return nothing + if(values.Length == 0) { + return default(EnumType); + } + + // Look for the highest value in the enumeration. We initialize the highest value + // to the first enumeration value so we don't have to use some arbitrary starting + // value which might actually appear in the enumeration. + EnumType highestValue = values[0]; + for(int index = 1; index < values.Length; ++index) { + if(values[index].CompareTo(highestValue) > 0) { + highestValue = values[index]; + } + } + + return highestValue; + } + + /// Returns the lowest value encountered in an enumeration + /// + /// Enumeration of which the lowest value will be returned + /// + /// The lowest value in the enumeration + public static EnumType GetLowestValue() where EnumType : IComparable { + EnumType[] values = GetValues(); + + // If the enumeration is empty, return nothing + if(values.Length == 0) { + return default(EnumType); + } + + // Look for the lowest value in the enumeration. We initialize the lowest value + // to the first enumeration value so we don't have to use some arbitrary starting + // value which might actually appear in the enumeration. + EnumType lowest = values[0]; + for(int index = 1; index < values.Length; ++index) { + if(values[index].CompareTo(lowest) < 0) { + lowest = values[index]; + } + } + + return lowest; + } + + /// Retrieves a list of all values contained in an enumeration + /// + /// Type of the enumeration whose values will be returned + /// + /// All values contained in the specified enumeration + public static EnumType[] GetValues() { +#if XBOX360 + return GetValuesXbox360(); +#else + return (EnumType[])Enum.GetValues(typeof(EnumType)); +#endif + } + + /// Retrieves a list of all values contained in an enumeration + /// + /// Type of the enumeration whose values will be returned + /// + /// All values contained in the specified enumeration + internal static EnumType[] GetValuesXbox360() { + Type enumType = typeof(EnumType); + if(!enumType.IsEnum) { + throw new ArgumentException( + "The provided type needs to be an enumeration", "EnumType" + ); + } + + // Use reflection to get all fields in the enumeration + FieldInfo[] fieldInfos = enumType.GetFields( + BindingFlags.Public | BindingFlags.Static + ); + + // Create an array to hold the enumeration value and copy them over from + // the fields we just retrieved + EnumType[] values = new EnumType[fieldInfos.Length]; + for(int index = 0; index < fieldInfos.Length; ++index) { + values[index] = (EnumType)fieldInfos[index].GetValue(null); + } + + return values; + } + + } + +} // namespace Nuclex.Support \ No newline at end of file