diff --git a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.cs b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.cs index 991baf7a20..00b1b62561 100644 --- a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.cs +++ b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.cs @@ -1,85 +1,123 @@ using Microsoft.VisualStudio.TestTools.UnitTesting; using System; -namespace ConvertStringAndIntToEnumTests +namespace ConvertStringAndIntToEnumTests; + +[TestClass] +public class ConvertStringAndIntToEnumTests { - [TestClass] - public class ConvertStringAndIntToEnumTests + [TestMethod] + public void GivenValidEnumAsString_WhenConvertingToEnum_ThenCorrectlyConverted() { - [TestMethod] - public void GivenValidEnumAsString_WhenConvertingToEnum_ThenCorrectlyConverted() - { - var inputString = "Sunday"; - - DayOfWeek dayOfWeek = (DayOfWeek)Enum.Parse(typeof(DayOfWeek), inputString); - - Assert.AreEqual(DayOfWeek.Sunday, dayOfWeek); - } + var inputString = "Sunday"; + var mixedCaseInputString = "SaTurDaY"; - [TestMethod] - public void GivenInvalidEnumAsString_WhenConvertingToEnum_ThenFails() - { - var inputString = "Today"; - - var isEnumParsed = Enum.TryParse(inputString, true, out DayOfWeek dayOfWeek); - - Assert.IsFalse(isEnumParsed); - } + var weekDay = Enum.Parse(inputString); + var caseInsensitiveWeekDay = Enum.Parse(mixedCaseInputString, true); - [TestMethod] - public void GivenValidEnumAsStringInteger_WhenConvertingToEnum_ThenCorrectlyConverted() - { - var inputString = "0"; - - var isEnumParsed = Enum.TryParse(inputString, true, out DayOfWeek dayOfWeek); - - Assert.IsTrue(isEnumParsed); - Assert.AreEqual(DayOfWeek.Monday, dayOfWeek); - } + Assert.AreEqual(WeekDay.Sunday, weekDay); + Assert.AreEqual(WeekDay.Saturday, caseInsensitiveWeekDay); + } - [TestMethod] - public void GivenValidEnumAsInteger_WhenConvertingToEnum_ThenCorrectlyConverted() - { - var inputInt = 2; - - var isEnumParsed = Enum.IsDefined(typeof(DayOfWeek), inputInt); - - Assert.IsTrue(isEnumParsed); - DayOfWeek dayOfWeek = (DayOfWeek)inputInt; - Assert.AreEqual(DayOfWeek.Wednesday, dayOfWeek); - } + [TestMethod] + public void GivenInvalidEnumAsString_WhenConvertingToEnum_ThenFails() + { + var inputString = "Today"; - [TestMethod] - public void GivenInvalidEnumAsInteger_WhenConvertingToEnum_ThenFails() - { - var inputInt = 9; - - var isEnumParsed = Enum.IsDefined(typeof(DayOfWeek), inputInt); - - Assert.IsFalse(isEnumParsed); - } + var isEnumParsed = Enum.TryParse(inputString, true, out WeekDay weekDay); + + Assert.IsFalse(isEnumParsed); + } + + [TestMethod] + public void GivenValidEnumAsStringInteger_WhenConvertingToEnum_ThenCorrectlyConverted() + { + var inputString = "0"; + + var isEnumParsed = Enum.TryParse(inputString, true, out WeekDay weekDay); + + Assert.IsTrue(isEnumParsed); + Assert.AreEqual(WeekDay.Monday, weekDay); + } + + [TestMethod] + public void GivenNumericStringThatIsNotAMember_WhenConvertingToEnum_ThenParsesIntoAnUndefinedValue() + { + var inputString = "42"; + + var isEnumParsed = Enum.TryParse(inputString, out var weekDay); + + Assert.IsTrue(isEnumParsed); + Assert.IsFalse(Enum.IsDefined(weekDay)); + Assert.AreEqual("42", weekDay.ToString()); + } + + [TestMethod] + public void GivenValidEnumAsInteger_WhenConvertingToEnum_ThenCorrectlyConverted() + { + var inputInt = 2; + + var isEnumParsed = Enum.IsDefined((WeekDay)inputInt); + + Assert.IsTrue(isEnumParsed); + WeekDay weekDay = (WeekDay)inputInt; + Assert.AreEqual(WeekDay.Wednesday, weekDay); + } + + [TestMethod] + public void GivenInvalidEnumAsInteger_WhenConvertingToEnum_ThenFails() + { + var inputInt = 9; + + var isEnumParsed = Enum.IsDefined((WeekDay)inputInt); + + Assert.IsFalse(isEnumParsed); + } + + [TestMethod] + public void GivenValidFlagsEnumAsInteger_WhenConvertingToEnum_ThenCorrectlyConverted() + { + var inputInt = 3; + var parsedEnum = (UserType)inputInt; + + var isEnumParsed = Enum.IsDefined(parsedEnum) || parsedEnum.ToString().Contains(","); + + Assert.IsTrue(isEnumParsed); + Assert.AreEqual(UserType.Customer | UserType.Driver, parsedEnum); + } + + [TestMethod] + public void GivenInvalidFlagsEnumAsInteger_WhenConvertingToEnum_ThenFails() + { + var inputInt = 8; + var parsedEnum = (UserType)inputInt; + + var isEnumParsed = Enum.IsDefined(parsedEnum) || parsedEnum.ToString().Contains(","); - [TestMethod] - public void GivenValidFlagsEnumAsInteger_WhenConvertingToEnum_ThenCorrectlyConverted() + Assert.IsFalse(isEnumParsed); + } + + [TestMethod] + public void GivenFlagsEnumValues_WhenCheckingAgainstTheDeclaredFlagsMask_ThenOnlyDeclaredCombinationsAreValid() + { + var allFlags = (UserType)0; + + foreach (var flag in Enum.GetValues()) { - var inputInt = 3; - var parsedEnum = (UserType)inputInt; - - var isEnumParsed = Enum.IsDefined(typeof(UserType), inputInt) || parsedEnum.ToString().Contains(","); - - Assert.IsTrue(isEnumParsed); - Assert.AreEqual(UserType.Customer| UserType.Driver, parsedEnum); + allFlags |= flag; } - [TestMethod] - public void GivenInvalidFlagsEnumAsInteger_WhenConvertingToEnum_ThenFails() + Assert.AreEqual((UserType)7, allFlags); + + for (var inputInt = 0; inputInt <= 7; inputInt++) { - var inputInt = 8; var parsedEnum = (UserType)inputInt; - - var isEnumParsed = Enum.IsDefined(typeof(UserType), inputInt) || parsedEnum.ToString().Contains(","); - - Assert.IsFalse(isEnumParsed); + + Assert.IsTrue((parsedEnum & ~allFlags) == 0, $"{inputInt} should be a valid combination"); } + + var invalidEnum = (UserType)8; + + Assert.IsFalse((invalidEnum & ~allFlags) == 0); } -} \ No newline at end of file +} diff --git a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.csproj b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.csproj index 38a6dd3331..7af97066cb 100644 --- a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.csproj +++ b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/ConvertStringAndIntToEnumTests.csproj @@ -1,17 +1,17 @@ - net7.0 + net10.0 enable false - - - - + + + + diff --git a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/DayOfWeek.cs b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/DayOfWeek.cs deleted file mode 100644 index 84d3a694f1..0000000000 --- a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/DayOfWeek.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace ConvertStringAndIntToEnumTests -{ - public enum DayOfWeek - { - Monday, - Tuesday, - Wednesday, - Thursday, - Friday, - Saturday, - Sunday - } -} diff --git a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/UserType.cs b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/UserType.cs index aeca94ab11..7746952bc7 100644 --- a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/UserType.cs +++ b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/UserType.cs @@ -1,13 +1,12 @@ -using System; +using System; -namespace ConvertStringAndIntToEnumTests +namespace ConvertStringAndIntToEnumTests; + +[Flags] +public enum UserType { - [Flags] - public enum UserType - { - None = 0, - Customer = 1, - Driver = 2, - Admin = 4, - } + None = 0, + Customer = 1, + Driver = 2, + Admin = 4, } diff --git a/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/WeekDay.cs b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/WeekDay.cs new file mode 100644 index 0000000000..59efcec735 --- /dev/null +++ b/csharp-basic-topics/ConvertStringAndIntToEnum/ConvertStringAndIntToEnumTests/WeekDay.cs @@ -0,0 +1,12 @@ +namespace ConvertStringAndIntToEnumTests; + +public enum WeekDay +{ + Monday, + Tuesday, + Wednesday, + Thursday, + Friday, + Saturday, + Sunday +}