diff --git a/src/Humanizer.Tests/TimeSpanHumanizeTests.cs b/src/Humanizer.Tests/TimeSpanHumanizeTests.cs index ef686dad8..a49ae4633 100644 --- a/src/Humanizer.Tests/TimeSpanHumanizeTests.cs +++ b/src/Humanizer.Tests/TimeSpanHumanizeTests.cs @@ -13,6 +13,8 @@ public TimeSpanHumanizeTests() : base("en-US") { } [Theory] [InlineData(14, "2 weeks")] [InlineData(7, "1 week")] + [InlineData(-14, "2 weeks")] + [InlineData(-7, "1 week")] public void Weeks(int days, string expected) { var actual = TimeSpan.FromDays(days).Humanize(); @@ -23,6 +25,9 @@ public void Weeks(int days, string expected) [InlineData(6, "6 days")] [InlineData(2, "2 days")] [InlineData(1, "1 day")] + [InlineData(-6, "6 days")] + [InlineData(-2, "2 days")] + [InlineData(-1, "1 day")] public void Days(int days, string expected) { var actual = TimeSpan.FromDays(days).Humanize(); @@ -32,6 +37,8 @@ public void Days(int days, string expected) [Theory] [InlineData(2, "2 hours")] [InlineData(1, "1 hour")] + [InlineData(-2, "2 hours")] + [InlineData(-1, "1 hour")] public void Hours(int hours, string expected) { var actual = TimeSpan.FromHours(hours).Humanize(); @@ -41,6 +48,8 @@ public void Hours(int hours, string expected) [Theory] [InlineData(2, "2 minutes")] [InlineData(1, "1 minute")] + [InlineData(-2, "2 minutes")] + [InlineData(-1, "1 minute")] public void Minutes(int minutes, string expected) { var actual = TimeSpan.FromMinutes(minutes).Humanize(); @@ -52,6 +61,10 @@ public void Minutes(int minutes, string expected) [InlineData(60, "1 minute")] [InlineData(2, "2 seconds")] [InlineData(1, "1 second")] + [InlineData(-135, "2 minutes")] + [InlineData(-60, "1 minute")] + [InlineData(-2, "2 seconds")] + [InlineData(-1, "1 second")] public void Seconds(int seconds, string expected) { var actual = TimeSpan.FromSeconds(seconds).Humanize(); @@ -63,6 +76,10 @@ public void Seconds(int seconds, string expected) [InlineData(1400, "1 second")] [InlineData(2, "2 milliseconds")] [InlineData(1, "1 millisecond")] + [InlineData(-2500, "2 seconds")] + [InlineData(-1400, "1 second")] + [InlineData(-2, "2 milliseconds")] + [InlineData(-1, "1 millisecond")] public void Milliseconds(int ms, string expected) { var actual = TimeSpan.FromMilliseconds(ms).Humanize(); diff --git a/src/Humanizer/TimeSpanHumanizeExtensions.cs b/src/Humanizer/TimeSpanHumanizeExtensions.cs index b9757fe54..c686fc377 100644 --- a/src/Humanizer/TimeSpanHumanizeExtensions.cs +++ b/src/Humanizer/TimeSpanHumanizeExtensions.cs @@ -155,8 +155,9 @@ private static int GetNormalCaseTimeAsInteger(int timeNumberOfUnits, double tota private static string BuildFormatTimePart(IFormatter cultureFormatter, TimeUnit timeUnitType, int amountOfTimeUnits) { + // Always use positive units to account for negative timespans return amountOfTimeUnits != 0 - ? cultureFormatter.TimeSpanHumanize(timeUnitType, amountOfTimeUnits) + ? cultureFormatter.TimeSpanHumanize(timeUnitType, Math.Abs(amountOfTimeUnits)) : null; }