diff --git a/src/Humanizer.Tests.Shared/HeadingTests.cs b/src/Humanizer.Tests.Shared/HeadingTests.cs index aeb7153f1..3ba6b0ad5 100644 --- a/src/Humanizer.Tests.Shared/HeadingTests.cs +++ b/src/Humanizer.Tests.Shared/HeadingTests.cs @@ -158,5 +158,36 @@ public void ToHeadingArrow(double heading, char expected) { Assert.Equal(expected, heading.ToHeadingArrow()); } + + [InlineData('↑', 0)] + [InlineData('↗', 45)] + [InlineData('→', 90)] + [InlineData('↘', 135)] + [InlineData('↓', 180)] + [InlineData('↙', 225)] + [InlineData('←', 270)] + [InlineData('↖', 315)] + [InlineData('\n', -1)] + [Theory] + public void FromHeadingArrow(char heading, double expected) + { + Assert.Equal(expected, heading.FromHeadingArrow()); + } + + [InlineData("↑", 0)] + [InlineData("↗", 45)] + [InlineData("→", 90)] + [InlineData("↘", 135)] + [InlineData("↓", 180)] + [InlineData("↙", 225)] + [InlineData("←", 270)] + [InlineData("↖", 315)] + [InlineData("", -1)] + [InlineData("xyz", -1)] + [Theory] + public void FromHeadingArrow_Also_Works_With_Strings(string heading, double expected) + { + Assert.Equal(expected, heading.FromHeadingArrow()); + } } } diff --git a/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt b/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt index 2cd4303cb..91e266757 100644 --- a/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt +++ b/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt @@ -127,6 +127,8 @@ namespace Humanizer public class static HeadingExtensions { public static double FromAbbreviatedHeading(this string heading, System.Globalization.CultureInfo culture = null) { } + public static double FromHeadingArrow(this char heading) { } + public static double FromHeadingArrow(this string heading) { } public static string ToHeading(this double heading, Humanizer.HeadingStyle style = 0, System.Globalization.CultureInfo culture = null) { } public static char ToHeadingArrow(this double heading) { } } diff --git a/src/Humanizer/HeadingExtensions.cs b/src/Humanizer/HeadingExtensions.cs index 9f99d1a0d..760a4bb52 100644 --- a/src/Humanizer/HeadingExtensions.cs +++ b/src/Humanizer/HeadingExtensions.cs @@ -1,5 +1,6 @@ using System; using System.Globalization; + using Humanizer.Localisation; namespace Humanizer @@ -93,5 +94,38 @@ public static double FromAbbreviatedHeading(this string heading, CultureInfo cul return -1; } + + /// + /// Returns a heading based on the heading arrow. + /// + public static double FromHeadingArrow(this char heading) + { + var index = Array.IndexOf(headingArrows, heading); + + if (index == -1) + { + return -1; + } + + return (index * 45.0); + } + + /// + /// Returns a heading based on the heading arrow. + /// + public static double FromHeadingArrow(this string heading) + { + if (heading == null) + { + throw new ArgumentNullException(nameof(heading)); + } + + if (heading.Length != 1) + { + return -1; + } + + return heading[0].FromHeadingArrow(); + } } }