From e35d259bb01f79451c655bb1eb18e036bb47b849 Mon Sep 17 00:00:00 2001 From: Chris Tacke Date: Mon, 1 Apr 2024 10:46:23 -0500 Subject: [PATCH] fixes and tests for digital storage --- .../Meadow.Units.Tests/DigitalStorageTests.cs | 89 +++++++++++++++ Source/Meadow.Units.Tests/MassTests.cs | 105 +++++++++--------- .../Conversions/DigitalStorageConversions.cs | 25 +++-- Source/Meadow.Units/DigitalStorage.cs | 46 ++++++-- 4 files changed, 191 insertions(+), 74 deletions(-) create mode 100644 Source/Meadow.Units.Tests/DigitalStorageTests.cs diff --git a/Source/Meadow.Units.Tests/DigitalStorageTests.cs b/Source/Meadow.Units.Tests/DigitalStorageTests.cs new file mode 100644 index 0000000..50d6075 --- /dev/null +++ b/Source/Meadow.Units.Tests/DigitalStorageTests.cs @@ -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); + } +} diff --git a/Source/Meadow.Units.Tests/MassTests.cs b/Source/Meadow.Units.Tests/MassTests.cs index 5350d93..af7285e 100644 --- a/Source/Meadow.Units.Tests/MassTests.cs +++ b/Source/Meadow.Units.Tests/MassTests.cs @@ -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)); } } diff --git a/Source/Meadow.Units/Conversions/DigitalStorageConversions.cs b/Source/Meadow.Units/Conversions/DigitalStorageConversions.cs index 82f6a73..fe5b3e9 100644 --- a/Source/Meadow.Units/Conversions/DigitalStorageConversions.cs +++ b/Source/Meadow.Units/Conversions/DigitalStorageConversions.cs @@ -1,6 +1,4 @@ -using System; - -namespace Meadow.Units.Conversions +namespace Meadow.Units.Conversions { internal static class DigitalStorageConversions { @@ -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 }; } } \ No newline at end of file diff --git a/Source/Meadow.Units/DigitalStorage.cs b/Source/Meadow.Units/DigitalStorage.cs index 9bab94b..3a451ed 100644 --- a/Source/Meadow.Units/DigitalStorage.cs +++ b/Source/Meadow.Units/DigitalStorage.cs @@ -17,6 +17,18 @@ public struct DigitalStorage : IComparable, IFormattable, IConvertible, IEquatable, IComparable { + private static DigitalStorage _zero; + + static DigitalStorage() + { + _zero = new DigitalStorage(0, UnitType.Bytes); + } + + /// + /// Gets a DigitalStorage with a zero value + /// + public static DigitalStorage Zero => _zero; + /// /// Creates a new `DigitalStorage` object. /// @@ -79,17 +91,25 @@ public enum UnitType /// ExaBytes, /// - /// Represents a unit of data size in kibibits (Kibit) + /// Represents a unit of data size in kibibytes (KiB) + /// + KibiBytes, + /// + /// Represents a unit of data size in kibibits (Kib) /// Kibibits, /// - /// Represents a unit of data size in mebibits (Mibit) + /// Represents a unit of data size in mebibytes (MiB) + /// + MebiBytes, + /// + /// Represents a unit of data size in mebibits (Mib) /// Mebibits, /// - /// Represents a unit of data size in gibibits (Gibit) + /// Represents a unit of data size in gibibytes (GiB) /// - Gibibits, + GibiBytes, } /// @@ -132,20 +152,30 @@ public enum UnitType /// public double ExaBytes => From(UnitType.ExaBytes); + /// + /// Get DigitalStorage in kibibytes (KiB) + /// + public double KibiBytes => From(UnitType.KibiBytes); + /// /// Get DigitalStorage in kibibits (Kibit) /// public double Kibibits => From(UnitType.Kibibits); /// - /// Get DigitalStorage in mebibits (Mibit) + /// Get DigitalStorage in mebibits (MiB) + /// + public double MebiBytes => From(UnitType.MebiBytes); + + /// + /// Get DigitalStorage in mebibits (Mib) /// public double Mebibits => From(UnitType.Mebibits); /// - /// Get DigitalStorage in gibibits (Gibit) + /// Get DigitalStorage in gibibytes (GiB) /// - public double Gibibits => From(UnitType.Gibibits); + public double GibiBytes => From(UnitType.GibiBytes); /// /// Convert to a specific unit @@ -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; } ///