diff --git a/PowerKit.Tests/CultureInfoExtensionsTests.cs b/PowerKit.Tests/CultureInfoExtensionsTests.cs new file mode 100644 index 0000000..f377c68 --- /dev/null +++ b/PowerKit.Tests/CultureInfoExtensionsTests.cs @@ -0,0 +1,46 @@ +using System.Globalization; +using FluentAssertions; +using PowerKit.Extensions; +using Xunit; + +namespace PowerKit.Tests; + +public class CultureInfoExtensionsTests +{ + [Fact] + public void GetParents_Test() + { + // Act & assert + new CultureInfo("en-US") + .GetParents() + .Should() + .Equal(new CultureInfo("en"), CultureInfo.InvariantCulture); + + new CultureInfo("en") + .GetParents() + .Should() + .Equal(CultureInfo.InvariantCulture); + + CultureInfo.InvariantCulture.GetParents().Should().BeEmpty(); + } + + [Fact] + public void GetSelfAndParents_Test() + { + // Act & assert + new CultureInfo("en-US") + .GetSelfAndParents() + .Should() + .Equal(new CultureInfo("en-US"), new CultureInfo("en"), CultureInfo.InvariantCulture); + + new CultureInfo("en") + .GetSelfAndParents() + .Should() + .Equal(new CultureInfo("en"), CultureInfo.InvariantCulture); + + CultureInfo.InvariantCulture + .GetSelfAndParents() + .Should() + .Equal(CultureInfo.InvariantCulture); + } +} diff --git a/PowerKit/Extensions/CultureInfoExtensions.cs b/PowerKit/Extensions/CultureInfoExtensions.cs new file mode 100644 index 0000000..ad2b32b --- /dev/null +++ b/PowerKit/Extensions/CultureInfoExtensions.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.Globalization; + +namespace PowerKit.Extensions; + +internal static class CultureInfoExtensions +{ + extension(CultureInfo culture) + { + /// + /// Enumerates the parent cultures of the current culture, from the immediate parent up to + /// . + /// + public IEnumerable GetParents() + { + var current = culture; + while (!current.Equals(current.Parent)) + { + current = current.Parent; + yield return current; + } + } + + /// + /// Enumerates the current culture and its parent cultures, from the current culture up to + /// . + /// + public IEnumerable GetSelfAndParents() + { + yield return culture; + foreach (var parent in culture.GetParents()) + { + yield return parent; + } + } + } +}