diff --git a/src/Humanizer.Tests.Shared/Bytes/ByteRateTests.cs b/src/Humanizer.Tests.Shared/Bytes/ByteRateTests.cs index e596211a2..00e1d0bf7 100644 --- a/src/Humanizer.Tests.Shared/Bytes/ByteRateTests.cs +++ b/src/Humanizer.Tests.Shared/Bytes/ByteRateTests.cs @@ -28,13 +28,13 @@ public void HumanizesRates(long inputBytes, double perSeconds, string expectedVa [Theory] [InlineData(1, 1, TimeUnit.Second, "1 MB/s")] [InlineData(1, 60, TimeUnit.Minute, "1 MB/min")] - [InlineData(1, 60 * 60, TimeUnit.Hour, "1 MB/hour")] + [InlineData(1, 60 * 60, TimeUnit.Hour, "1 MB/h")] [InlineData(10, 1, TimeUnit.Second, "10 MB/s")] [InlineData(10, 60, TimeUnit.Minute, "10 MB/min")] - [InlineData(10, 60 * 60, TimeUnit.Hour, "10 MB/hour")] + [InlineData(10, 60 * 60, TimeUnit.Hour, "10 MB/h")] [InlineData(1, 10 * 1, TimeUnit.Second, "102.4 KB/s")] [InlineData(1, 10 * 60, TimeUnit.Minute, "102.4 KB/min")] - [InlineData(1, 10 * 60 * 60, TimeUnit.Hour, "102.4 KB/hour")] + [InlineData(1, 10 * 60 * 60, TimeUnit.Hour, "102.4 KB/h")] public void TimeUnitTests(long megabytes, double measurementIntervalSeconds, TimeUnit displayInterval, string expectedValue) { var size = ByteSize.FromMegabytes(megabytes); diff --git a/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems b/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems index b640770c5..d2a2bcb77 100644 --- a/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems +++ b/src/Humanizer.Tests.Shared/Humanizer.Tests.Shared.projitems @@ -72,6 +72,7 @@ + diff --git a/src/Humanizer.Tests.Shared/Localisation/de/Bytes/ByteRateTests.cs b/src/Humanizer.Tests.Shared/Localisation/de/Bytes/ByteRateTests.cs new file mode 100644 index 000000000..5437ab7d0 --- /dev/null +++ b/src/Humanizer.Tests.Shared/Localisation/de/Bytes/ByteRateTests.cs @@ -0,0 +1,80 @@ +using System; + +using Humanizer.Bytes; +using Humanizer.Localisation; + +using Xunit; + +namespace Humanizer.Tests.Localisation.de.Bytes +{ + [UseCulture("de-DE")] + public class ByteRateTests + { + [Theory] + [InlineData(400, 1, "400 B/s")] + [InlineData(4 * 1024, 1, "4 kB/s")] + [InlineData(4 * 1024 * 1024, 1, "4 MB/s")] + [InlineData(4 * 2 * 1024 * 1024, 2, "4 MB/s")] + [InlineData(4 * 1024, 0.1, "40 kB/s")] + [InlineData(15 * 60 * 1024 * 1024, 60, "15 MB/s")] + public void HumanizesRates(long inputBytes, double perSeconds, string expectedValue) + { + var size = new ByteSize(inputBytes); + var interval = TimeSpan.FromSeconds(perSeconds); + + var rate = size.Per(interval).Humanize(); + + Assert.Equal(expectedValue, rate); + } + + [Theory] + [InlineData(1, 1, TimeUnit.Second, "1 MB/s")] + [InlineData(1, 60, TimeUnit.Minute, "1 MB/min")] + [InlineData(1, 60 * 60, TimeUnit.Hour, "1 MB/h")] + [InlineData(10, 1, TimeUnit.Second, "10 MB/s")] + [InlineData(10, 60, TimeUnit.Minute, "10 MB/min")] + [InlineData(10, 60 * 60, TimeUnit.Hour, "10 MB/h")] + [InlineData(1, 10 * 1, TimeUnit.Second, "102,4 kB/s")] + [InlineData(1, 10 * 60, TimeUnit.Minute, "102,4 kB/min")] + [InlineData(1, 10 * 60 * 60, TimeUnit.Hour, "102,4 kB/h")] + public void TimeUnitTests(long megabytes, double measurementIntervalSeconds, TimeUnit displayInterval, string expectedValue) + { + var size = ByteSize.FromMegabytes(megabytes); + var measurementInterval = TimeSpan.FromSeconds(measurementIntervalSeconds); + + var rate = size.Per(measurementInterval); + var text = rate.Humanize(displayInterval); + + Assert.Equal(expectedValue, text); + } + + [Theory] + [InlineData(19854651984, 1, TimeUnit.Second, null, "18,4910856038332 GB/s")] + [InlineData(19854651984, 1, TimeUnit.Second, "#.##", "18,49 GB/s")] + public void FormattedTimeUnitTests(long bytes, int measurementIntervalSeconds, TimeUnit displayInterval, string format, string expectedValue) + { + var size = ByteSize.FromBytes(bytes); + var measurementInterval = TimeSpan.FromSeconds(measurementIntervalSeconds); + var rate = size.Per(measurementInterval); + var text = rate.Humanize(format, displayInterval); + + Assert.Equal(expectedValue, text); + } + + [Theory] + [InlineData(TimeUnit.Millisecond)] + [InlineData(TimeUnit.Day)] + [InlineData(TimeUnit.Month)] + [InlineData(TimeUnit.Week)] + [InlineData(TimeUnit.Year)] + public void ThowsOnUnsupportedData(TimeUnit units) + { + var dummyRate = ByteSize.FromBits(1).Per(TimeSpan.FromSeconds(1)); + + Assert.Throws(() => + { + dummyRate.Humanize(units); + }); + } + } +} 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 bdff90769..cfc0bca08 100644 --- a/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt +++ b/src/Humanizer.Tests/ApiApprover/PublicApiApprovalTest.approve_public_api.approved.txt @@ -1639,7 +1639,7 @@ namespace Humanizer.Bytes public System.TimeSpan Interval { get; } public Humanizer.Bytes.ByteSize Size { get; } public string Humanize(Humanizer.Localisation.TimeUnit timeUnit = 1) { } - public string Humanize(string format, Humanizer.Localisation.TimeUnit timeUnit = 1) { } + public string Humanize(string format, Humanizer.Localisation.TimeUnit timeUnit = 1, System.Globalization.CultureInfo culture = null) { } } public struct ByteSize : System.IComparable, System.IComparable, System.IEquatable, System.IFormattable { diff --git a/src/Humanizer/Bytes/ByteRate.cs b/src/Humanizer/Bytes/ByteRate.cs index 67534eeca..350a53bff 100644 --- a/src/Humanizer/Bytes/ByteRate.cs +++ b/src/Humanizer/Bytes/ByteRate.cs @@ -1,4 +1,6 @@ using System; +using System.Globalization; + using Humanizer.Localisation; namespace Humanizer.Bytes @@ -47,34 +49,19 @@ public string Humanize(TimeUnit timeUnit = TimeUnit.Second) /// /// Unit of time to calculate rate for (defaults is per second) /// The string format to use for the number of bytes + /// Culture to use. If null, current thread's UI culture is used. /// - public string Humanize(string format, TimeUnit timeUnit = TimeUnit.Second) + public string Humanize(string format, TimeUnit timeUnit = TimeUnit.Second, CultureInfo culture = null) { - TimeSpan displayInterval; - string displayUnit; - - if (timeUnit == TimeUnit.Second) - { - displayInterval = TimeSpan.FromSeconds(1); - displayUnit = "s"; - } - else if (timeUnit == TimeUnit.Minute) + var displayInterval = timeUnit switch { - displayInterval = TimeSpan.FromMinutes(1); - displayUnit = "min"; - } - else if (timeUnit == TimeUnit.Hour) - { - displayInterval = TimeSpan.FromHours(1); - displayUnit = "hour"; - } - else - { - throw new NotSupportedException("timeUnit must be Second, Minute, or Hour"); - } - + TimeUnit.Second => TimeSpan.FromSeconds(1), + TimeUnit.Minute => TimeSpan.FromMinutes(1), + TimeUnit.Hour => TimeSpan.FromHours(1), + _ => throw new NotSupportedException("timeUnit must be Second, Minute, or Hour"), + }; return new ByteSize(Size.Bytes / Interval.TotalSeconds * displayInterval.TotalSeconds) - .Humanize(format) + '/' + displayUnit; + .Humanize(format, culture) + '/' + timeUnit.ToSymbol(culture); } } }