Skip to content

Commit

Permalink
Merge pull request #56 from WildernessLabs/bug/digital-storage
Browse files Browse the repository at this point in the history
fixes and tests for digital storage
  • Loading branch information
adrianstevens committed Apr 1, 2024
2 parents 8edfa10 + e35d259 commit 3858d80
Show file tree
Hide file tree
Showing 4 changed files with 191 additions and 74 deletions.
89 changes: 89 additions & 0 deletions Source/Meadow.Units.Tests/DigitalStorageTests.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
using Xunit;

namespace Meadow.Units.Tests;

public class DigitalStorageTests
{
[Fact]
public void DigitalStorageOneByteConstructor()
{
var one = new DigitalStorage(1, DigitalStorage.UnitType.Bytes);
Assert.True(one.Bytes == 1);
}

[Fact]
public void DigitalStorageOneKBConstructor()
{
var one = new DigitalStorage(1, DigitalStorage.UnitType.KiloBytes);
Assert.True(one.Bytes == 1000);
Assert.True(one.Bits == one.Bytes * 8);

var oneA = new DigitalStorage(1000, DigitalStorage.UnitType.Bytes);
Assert.True(oneA.KiloBytes == 1);
}

[Fact]
public void DigitalStorageOneKiBConstructor()
{
var one = new DigitalStorage(1, DigitalStorage.UnitType.KibiBytes);
Assert.True(one.Bytes == 1024);
Assert.True(one.Bits == one.Bytes * 8);

var oneA = new DigitalStorage(1024, DigitalStorage.UnitType.Bytes);
Assert.True(oneA.KibiBytes == 1);
Assert.True(oneA.Kibibits == 0.125);
}

[Fact]
public void DigitalStorageOneMBConstructor()
{
var one = new DigitalStorage(1, DigitalStorage.UnitType.MegaBytes);
Assert.True(one.Bytes == 1000_000);
Assert.True(one.Bits == one.Bytes * 8);

var oneA = new DigitalStorage(1000_000, DigitalStorage.UnitType.Bytes);
Assert.True(oneA.MegaBytes == 1);
}

[Fact]
public void DigitalStorageOneMiBConstructor()
{
var one = new DigitalStorage(1, DigitalStorage.UnitType.MebiBytes);
Assert.True(one.Bytes == 1024 * 1024);
Assert.True(one.Bits == one.Bytes * 8);

var oneA = new DigitalStorage(1024 * 1024, DigitalStorage.UnitType.Bytes);
Assert.True(oneA.MebiBytes == 1);
Assert.True(oneA.Mebibits == 0.125);
}

[Fact]
public void DigitalStorageOneGBConstructor()
{
var one = new DigitalStorage(1, DigitalStorage.UnitType.GigaBytes);
Assert.True(one.Bytes == 1000_000_000);
Assert.True(one.Bits == one.Bytes * 8);
}

[Fact]
public void DigitalStorageOneGiBConstructor()
{
var one = new DigitalStorage(1, DigitalStorage.UnitType.GibiBytes);
Assert.True(one.Bytes == 1024 * 1024 * 1024);
Assert.True(one.Bits == one.Bytes * 8);

var oneA = new DigitalStorage(1024 * 1024 * 1024, DigitalStorage.UnitType.Bytes);
Assert.True(oneA.GibiBytes == 1);
}

[Fact]
public void Subtraction()
{
var total = new DigitalStorage(30431968, DigitalStorage.UnitType.KibiBytes);
var available = new DigitalStorage(25975940, DigitalStorage.UnitType.KibiBytes);
var inUse = new DigitalStorage(4456028, DigitalStorage.UnitType.KibiBytes);

var testAvailable = total - inUse;
Assert.Equal(available.Bytes, testAvailable.Bytes);
}
}
105 changes: 51 additions & 54 deletions Source/Meadow.Units.Tests/MassTests.cs
Original file line number Diff line number Diff line change
@@ -1,72 +1,69 @@
using Xunit;
using System;
using Meadow.Units;
using MU = Meadow.Units.Mass.UnitType;

namespace Meadow.Units.Tests
namespace Meadow.Units.Tests;

public class MassTests
{
public class MassTests
[Fact()]
public void MassCtors()
{
[Fact()]
public void MassCtors()
{
Mass t = new Mass(100, MU.Grams);
Assert.True(t.Grams == 100);
Mass t = new Mass(100, MU.Grams);
Assert.True(t.Grams == 100);

Mass t2 = new Mass();
Assert.True(t2.Grams == 0);
}
Mass t2 = new Mass();
Assert.True(t2.Grams == 0);
}

[Fact()]
public void MassConversions()
{
Mass t = new Mass(1000, MU.Grams);
Assert.True(t.Kilograms.Equals3DigitPrecision(1));
Assert.True(t.Ounces.Equals4DigitPrecision(35.274));
Assert.True(t.Pounds.Equals4DigitPrecision(2.20462));
Assert.True(t.TonsMetric.Equals4DigitPrecision(0.001));
Assert.True(t.TonsUSShort.Equals4DigitPrecision(0.00110231));
Assert.True(t.TonsUKLong.Equals4DigitPrecision(0.000984207));
Assert.True(t.Grains.Equals4DigitPrecision(15432.3584));
Assert.True(t.Karats.Equals4DigitPrecision(5000));
[Fact()]
public void MassConversions()
{
Mass t = new Mass(1000, MU.Grams);
Assert.True(t.Kilograms.Equals3DigitPrecision(1));
Assert.True(t.Ounces.Equals4DigitPrecision(35.274));
Assert.True(t.Pounds.Equals4DigitPrecision(2.20462));
Assert.True(t.TonsMetric.Equals4DigitPrecision(0.001));
Assert.True(t.TonsUSShort.Equals4DigitPrecision(0.00110231));
Assert.True(t.TonsUKLong.Equals4DigitPrecision(0.000984207));
Assert.True(t.Grains.Equals4DigitPrecision(15432.3584));
Assert.True(t.Karats.Equals4DigitPrecision(5000));


Mass t2 = new Mass(10, MU.Pounds);
Assert.True(t2.Kilograms.Equals4DigitPrecision(4.53592));
Mass t2 = new Mass(10, MU.Pounds);
Assert.True(t2.Kilograms.Equals4DigitPrecision(4.53592));

Mass t3 = new Mass(50, MU.Grains);
Assert.True(t3.Grams.Equals4DigitPrecision(3.23995));
}
Mass t3 = new Mass(50, MU.Grains);
Assert.True(t3.Grams.Equals4DigitPrecision(3.23995));
}

[Fact()]
public void MassMathOps()
{
Mass t1 = new Mass(1, MU.Kilograms);
Mass t2 = new Mass(10, MU.Kilograms);
Mass t3 = new Mass(-3, MU.Kilograms);
Assert.True(t1 != t2);
Assert.True((t1 + t2) == new Mass(11, MU.Kilograms));
Assert.True((t2 - t1) == new Mass(9, MU.Kilograms));
[Fact()]
public void MassMathOps()
{
Mass t1 = new Mass(1, MU.Kilograms);
Mass t2 = new Mass(10, MU.Kilograms);
Mass t3 = new Mass(-3, MU.Kilograms);
Assert.True(t1 != t2);
Assert.True((t1 + t2) == new Mass(11, MU.Kilograms));
Assert.True((t2 - t1) == new Mass(9, MU.Kilograms));

Assert.True(t3.Abs() == new Mass(3, MU.Kilograms));
}
Assert.True(t3.Abs() == new Mass(3, MU.Kilograms));
}

[Fact()]
public void MassComparisons()
{
Mass t1 = new Mass(1);
Mass t2 = new Mass(10);
Mass t3 = new Mass(10);
[Fact()]
public void MassComparisons()
{
Mass t1 = new Mass(1);
Mass t2 = new Mass(10);
Mass t3 = new Mass(10);

Assert.True(t1 < t2);
Assert.True(t2 <= t3);
Assert.True(t2 > t1);
Assert.True(t3 >= t2);
Assert.True(t1 < t2);
Assert.True(t2 <= t3);
Assert.True(t2 > t1);
Assert.True(t3 >= t2);

Assert.True(t2 == t3);
Assert.True(t2 == t3);

Assert.True(t2 == new Mass(10, MU.Grams));
Assert.True(t2 > new Mass(5, MU.Grams));
}
Assert.True(t2 == new Mass(10, MU.Grams));
Assert.True(t2 > new Mass(5, MU.Grams));
}
}
25 changes: 13 additions & 12 deletions Source/Meadow.Units/Conversions/DigitalStorageConversions.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;

namespace Meadow.Units.Conversions
namespace Meadow.Units.Conversions
{
internal static class DigitalStorageConversions
{
Expand All @@ -17,15 +15,18 @@ public static double Convert(double value, DigitalStorage.UnitType from, Digital
{
1.0 / 8.0, // Bit
1, // Byte
Math.Pow(2.0, 10.0), // Kilobyte
Math.Pow(2.0, 20.0), // Megabyte
Math.Pow(2.0, 30.0), // Gigabyte
Math.Pow(2.0, 40.0), // Terabyte
Math.Pow(2.0, 50.0), // Petabyte
Math.Pow(2.0, 60.0), // Exabyte
1.0 / 8.0 / 1024.0, // Kibit (Kibibit)
1.0 / 8.0 / 1024.0 / 1024.0, // Mibit (Mebibit)
1.0 / 8.0 / 1024.0 / 1024.0 / 1024.0, // Gibit (Gibibit)
1_000, // Kilobyte
1_000_000, // Megabyte
1_000_000_000, // Gigabyte
1_000_000_000_000, // Terabyte
1_000_000_000_000_000, // Petabyte
1_000_000_000_000_000_000,// Exabyte
1024, // KiB
1024 * 8, // Kib
1024 * 1024, // MiB
1024 * 1024 * 8, // Mib
1024 * 1024 * 1024, // GiB
// 1024 * 1024 * 1204 * 8 // Gib OVERFLOW - NOT SUPPORTED
};
}
}
46 changes: 38 additions & 8 deletions Source/Meadow.Units/DigitalStorage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,18 @@ public struct DigitalStorage :
IComparable, IFormattable, IConvertible,
IEquatable<double>, IComparable<double>
{
private static DigitalStorage _zero;

static DigitalStorage()
{
_zero = new DigitalStorage(0, UnitType.Bytes);
}

/// <summary>
/// Gets a DigitalStorage with a zero value
/// </summary>
public static DigitalStorage Zero => _zero;

/// <summary>
/// Creates a new `DigitalStorage` object.
/// </summary>
Expand Down Expand Up @@ -79,17 +91,25 @@ public enum UnitType
/// </summary>
ExaBytes,
/// <summary>
/// Represents a unit of data size in kibibits (Kibit)
/// Represents a unit of data size in kibibytes (KiB)
/// </summary>
KibiBytes,
/// <summary>
/// Represents a unit of data size in kibibits (Kib)
/// </summary>
Kibibits,
/// <summary>
/// Represents a unit of data size in mebibits (Mibit)
/// Represents a unit of data size in mebibytes (MiB)
/// </summary>
MebiBytes,
/// <summary>
/// Represents a unit of data size in mebibits (Mib)
/// </summary>
Mebibits,
/// <summary>
/// Represents a unit of data size in gibibits (Gibit)
/// Represents a unit of data size in gibibytes (GiB)
/// </summary>
Gibibits,
GibiBytes,
}

/// <summary>
Expand Down Expand Up @@ -132,20 +152,30 @@ public enum UnitType
/// </summary>
public double ExaBytes => From(UnitType.ExaBytes);

/// <summary>
/// Get DigitalStorage in kibibytes (KiB)
/// </summary>
public double KibiBytes => From(UnitType.KibiBytes);

/// <summary>
/// Get DigitalStorage in kibibits (Kibit)
/// </summary>
public double Kibibits => From(UnitType.Kibibits);

/// <summary>
/// Get DigitalStorage in mebibits (Mibit)
/// Get DigitalStorage in mebibits (MiB)
/// </summary>
public double MebiBytes => From(UnitType.MebiBytes);

/// <summary>
/// Get DigitalStorage in mebibits (Mib)
/// </summary>
public double Mebibits => From(UnitType.Mebibits);

/// <summary>
/// Get DigitalStorage in gibibits (Gibit)
/// Get DigitalStorage in gibibytes (GiB)
/// </summary>
public double Gibibits => From(UnitType.Gibibits);
public double GibiBytes => From(UnitType.GibiBytes);

/// <summary>
/// Convert to a specific unit
Expand All @@ -168,7 +198,7 @@ public override bool Equals(object obj)
{
if (obj is null) { return false; }
if (Equals(this, obj)) { return true; }
return obj.GetType() == GetType() && Equals((DigitalStorage)obj);
return obj.GetType() == GetType() && ((DigitalStorage)obj).Value == this.Value;
}

/// <summary>
Expand Down

0 comments on commit 3858d80

Please sign in to comment.