forked from Humanizr/Humanizer
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added byte rate calculation functons, closes Humanizr#296
closes Humanizr#314
- Loading branch information
1 parent
6670ce3
commit 174b3b4
Showing
8 changed files
with
177 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
using System; | ||
using Humanizer.Bytes; | ||
using Humanizer.Localisation; | ||
using Xunit; | ||
using Xunit.Extensions; | ||
|
||
namespace Humanizer.Tests.Bytes | ||
{ | ||
public class ByteRateTests : AmbientCulture | ||
{ | ||
public ByteRateTests() : base("en") { } | ||
|
||
[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/hour")] | ||
[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(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")] | ||
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(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<NotSupportedException>(() => | ||
{ | ||
dummyRate.Humanize(units); | ||
}); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,66 @@ | ||
using System; | ||
using Humanizer.Localisation; | ||
|
||
namespace Humanizer.Bytes | ||
{ | ||
|
||
/// <summary> | ||
/// Class to hold a ByteSize and a measurement interval, for the purpose of calculating the rate of transfer | ||
/// </summary> | ||
public class ByteRate | ||
{ | ||
/// <summary> | ||
/// Quantity of bytes | ||
/// </summary> | ||
/// <returns></returns> | ||
public ByteSize Size { get; private set;} | ||
|
||
/// <summary> | ||
/// Interval that bytes were transferred in | ||
/// </summary> | ||
/// <returns></returns> | ||
public TimeSpan Interval { get; private set; } | ||
|
||
/// <summary> | ||
/// Create a ByteRate with given quantity of bytes across an interval | ||
/// </summary> | ||
/// <param name="size"></param> | ||
/// <param name="interval"></param> | ||
public ByteRate(ByteSize size, TimeSpan interval) | ||
{ | ||
this.Size = size; | ||
this.Interval = interval; | ||
} | ||
|
||
/// <summary> | ||
/// Calculate rate for the quantity of bytes and interval defined by this instance | ||
/// </summary> | ||
/// <param name="timeUnit">Unit of time to calculate rate for (defaults is per second)</param> | ||
/// <returns></returns> | ||
public string Humanize(TimeUnit timeUnit = TimeUnit.Second) | ||
{ | ||
TimeSpan displayInterval; | ||
string displayUnit; | ||
|
||
if (timeUnit == TimeUnit.Second) | ||
{ | ||
displayInterval = TimeSpan.FromSeconds(1); | ||
displayUnit = "s"; | ||
} | ||
else if (timeUnit == TimeUnit.Minute) | ||
{ | ||
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"); | ||
|
||
return (new ByteSize(Size.Bytes / Interval.TotalSeconds * displayInterval.TotalSeconds)).Humanize() + '/' + displayUnit; | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters