diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsString/EnumMemberAsString.csproj b/strings-csharp/EnumMemberAsString/EnumMemberAsString/EnumMemberAsString.csproj index cfadb03dd5..9ed914b5ba 100644 --- a/strings-csharp/EnumMemberAsString/EnumMemberAsString/EnumMemberAsString.csproj +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsString/EnumMemberAsString.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsString/classes/Person.cs b/strings-csharp/EnumMemberAsString/EnumMemberAsString/classes/Person.cs index 5cf3d55e7c..95388b3879 100644 --- a/strings-csharp/EnumMemberAsString/EnumMemberAsString/classes/Person.cs +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsString/classes/Person.cs @@ -1,13 +1,7 @@ namespace EnumMemberAsString; -public class Person +public class Person(string name, Country country) { - public string Name { get; set; } - public Country Country { get; set; } - - public Person(string name, Country country) - { - Name = name; - Country = country; - } + public string Name { get; set; } = name; + public Country Country { get; set; } = country; } \ No newline at end of file diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsString/classes/Trip.cs b/strings-csharp/EnumMemberAsString/EnumMemberAsString/classes/Trip.cs new file mode 100644 index 0000000000..502dc1b334 --- /dev/null +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsString/classes/Trip.cs @@ -0,0 +1,7 @@ +namespace EnumMemberAsString; + +public class Trip +{ + public string Name { get; set; } = string.Empty; + public Region Region { get; set; } +} diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsString/enums/Region.cs b/strings-csharp/EnumMemberAsString/EnumMemberAsString/enums/Region.cs new file mode 100644 index 0000000000..3d8829c5f1 --- /dev/null +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsString/enums/Region.cs @@ -0,0 +1,16 @@ +using System.ComponentModel; +using System.Runtime.Serialization; +using System.Text.Json.Serialization; + +namespace EnumMemberAsString; + +[JsonConverter(typeof(JsonStringEnumConverter))] +public enum Region +{ + [Description("North America")] + [EnumMember(Value = "north-america")] + NorthAmerica, + + [JsonStringEnumMemberName("asia-pacific")] + AsiaPacific, +} diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/CustomStringUnitTests.cs b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/CustomStringUnitTests.cs new file mode 100644 index 0000000000..b9884d0e97 --- /dev/null +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/CustomStringUnitTests.cs @@ -0,0 +1,33 @@ +using System.ComponentModel; +using System.Reflection; +using System.Text.Json; + +public class CustomStringUnitTests +{ + [Fact] + public void WhenMemberHasEnumMemberAttribute_ThenSystemTextJsonIgnoresIt() + { + var json = JsonSerializer.Serialize(new Trip { Name = "a", Region = Region.NorthAmerica }); + + Assert.Equal("{\"Name\":\"a\",\"Region\":\"NorthAmerica\"}", json); + } + + [Fact] + public void WhenMemberHasJsonStringEnumMemberName_ThenSystemTextJsonUsesIt() + { + var json = JsonSerializer.Serialize(new Trip { Name = "b", Region = Region.AsiaPacific }); + + Assert.Equal("{\"Name\":\"b\",\"Region\":\"asia-pacific\"}", json); + } + + [Fact] + public void WhenMemberHasDescription_ThenReflectionReturnsIt() + { + var description = typeof(Region) + .GetField(nameof(Region.NorthAmerica))? + .GetCustomAttribute()? + .Description; + + Assert.Equal("North America", description); + } +} diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumMemberAsStringTests.csproj b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumMemberAsStringTests.csproj index d7c54ed2a9..ee8648a3be 100644 --- a/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumMemberAsStringTests.csproj +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumMemberAsStringTests.csproj @@ -1,7 +1,7 @@ - net7.0 + net10.0 enable enable @@ -9,13 +9,13 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumUnitTests.cs b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumUnitTests.cs index db182b78cd..eebcc3e0bc 100644 --- a/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumUnitTests.cs +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/EnumUnitTests.cs @@ -3,15 +3,25 @@ public class EnumUnitTests [Fact] public void WhenUsingGetName_ThenReturnsString() { - var usa = Enum.GetName(typeof(Country), Country.USA); - var india = Enum.GetName(typeof(Country), Country.India); - var australia = Enum.GetName(typeof(Country), Country.Australia); + var usa = Enum.GetName(Country.USA); + var india = Enum.GetName(Country.India); + var australia = Enum.GetName(Country.Australia); Assert.Equal("USA", usa); Assert.Equal("India", india); Assert.Equal("Australia", australia); } + [Fact] + public void WhenEnumTypeIsOnlyKnownAtRuntime_ThenGetNameStillReturnsString() + { + Type enumType = typeof(Country); + + var usa = Enum.GetName(enumType, 0); + + Assert.Equal("USA", usa); + } + [Fact] public void WhenUsingToString_ThenReturnsString() { @@ -35,4 +45,26 @@ public void WhenUsingNameof_ThenReturnsString() Assert.Equal("India", india); Assert.Equal("Australia", australia); } -} \ No newline at end of file + + [Fact] + public void WhenUsingFormatSpecifiers_ThenReturnsExpectedText() + { + var country = Country.Australia; + + Assert.Equal("Australia", country.ToString("G")); + Assert.Equal("2", country.ToString("D")); + Assert.Equal("00000002", country.ToString("X")); + Assert.Equal("Australia", country.ToString("F")); + Assert.Equal("0", Country.USA.ToString("D")); + Assert.Equal("00000000", Country.USA.ToString("X")); + } + + [Fact] + public void WhenValueIsNotDefined_ThenGetNameIsNullAndToStringIsTheNumber() + { + var undefined = (Country)20; + + Assert.Null(Enum.GetName(undefined)); + Assert.Equal("20", undefined.ToString()); + } +} diff --git a/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/InstanceUnitTests.cs b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/InstanceUnitTests.cs index 18ce467d52..babe17ac32 100644 --- a/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/InstanceUnitTests.cs +++ b/strings-csharp/EnumMemberAsString/EnumMemberAsStringTests/InstanceUnitTests.cs @@ -7,9 +7,9 @@ public class InstanceUnitTests [Fact] public void WhenUsingGetName_ThenReturnsString() { - var usa = Enum.GetName(typeof(Country), bob.Country); - var india = Enum.GetName(typeof(Country), alice.Country); - var australia = Enum.GetName(typeof(Country), john.Country); + var usa = Enum.GetName(bob.Country); + var india = Enum.GetName(alice.Country); + var australia = Enum.GetName(john.Country); Assert.Equal("USA", usa); Assert.Equal("India", india);