From ddaf0d46fde6d2e788062f5bcf84a262eac25ab0 Mon Sep 17 00:00:00 2001 From: Christoph Weitkamp Date: Thu, 19 Nov 2020 19:33:10 +0100 Subject: [PATCH] Added support for MetricPrefix combined with byte and use byte as default instead of octet (#1838) Signed-off-by: Christoph Weitkamp --- .../core/library/unit/SmartHomeUnits.java | 38 ++++++++++++++++--- .../core/library/types/QuantityTypeTest.java | 15 +++++++- 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/bundles/org.openhab.core/src/main/java/org/openhab/core/library/unit/SmartHomeUnits.java b/bundles/org.openhab.core/src/main/java/org/openhab/core/library/unit/SmartHomeUnits.java index cb535a18bd..4627f5656b 100644 --- a/bundles/org.openhab.core/src/main/java/org/openhab/core/library/unit/SmartHomeUnits.java +++ b/bundles/org.openhab.core/src/main/java/org/openhab/core/library/unit/SmartHomeUnits.java @@ -180,15 +180,28 @@ public final class SmartHomeUnits extends CustomUnits { public static final Unit CUBICMETRE_PER_DAY = addUnit( new ProductUnit(Units.CUBIC_METRE.divide(Units.DAY))); public static final Unit BIT = addUnit(new AlternateUnit<>(ONE, "bit")); - public static final Unit MEGABIT = addUnit(MetricPrefix.MEGA(BIT)); public static final Unit KILOBIT = addUnit(MetricPrefix.KILO(BIT)); + public static final Unit MEGABIT = addUnit(MetricPrefix.MEGA(BIT)); public static final Unit GIGABIT = addUnit(MetricPrefix.GIGA(BIT)); public static final Unit TERABIT = addUnit(MetricPrefix.TERA(BIT)); + public static final Unit PETABIT = addUnit(MetricPrefix.PETA(BIT)); public static final Unit BYTE = addUnit(BIT.multiply(8)); - public static final Unit OCTET = BYTE; + public static final Unit OCTET = addUnit(BIT.multiply(8)); + public static final Unit KILOBYTE = addUnit(MetricPrefix.KILO(BYTE)); + public static final Unit MEGABYTE = addUnit(MetricPrefix.MEGA(BYTE)); + public static final Unit GIGABYTE = addUnit(MetricPrefix.GIGA(BYTE)); + public static final Unit TERABYTE = addUnit(MetricPrefix.TERA(BYTE)); + public static final Unit PETABYTE = addUnit(MetricPrefix.PETA(BYTE)); + public static final Unit KIBIBYTE = addUnit(BinaryPrefix.KIBI(BYTE)); + public static final Unit MEBIBYTE = addUnit(BinaryPrefix.MEBI(BYTE)); + public static final Unit GIBIBYTE = addUnit(BinaryPrefix.GIBI(BYTE)); + public static final Unit TEBIBYTE = addUnit(BinaryPrefix.TEBI(BYTE)); + public static final Unit PEBIBYTE = addUnit(BinaryPrefix.PEBI(BYTE)); public static final Unit KIBIOCTET = addUnit(BinaryPrefix.KIBI(OCTET)); public static final Unit MEBIOCTET = addUnit(BinaryPrefix.MEBI(OCTET)); public static final Unit GIBIOCTET = addUnit(BinaryPrefix.GIBI(OCTET)); + public static final Unit TEBIOCTET = addUnit(BinaryPrefix.TEBI(OCTET)); + public static final Unit PEBIOCTET = addUnit(BinaryPrefix.PEBI(OCTET)); public static final Unit BIT_PER_SECOND = addUnit( new ProductUnit(BIT.divide(Units.SECOND))); public static final Unit KILOBIT_PER_SECOND = addUnit(MetricPrefix.KILO(BIT_PER_SECOND)); @@ -207,6 +220,7 @@ public final class SmartHomeUnits extends CustomUnits { SimpleUnitFormat.getInstance().label(BIT, BIT.getSymbol()); SimpleUnitFormat.getInstance().label(BIT_PER_SECOND, "bit/s"); SimpleUnitFormat.getInstance().label(BYTE, "B"); + SimpleUnitFormat.getInstance().alias(BYTE, "o"); SimpleUnitFormat.getInstance().label(CUBICMETRE_PER_DAY, "m³/d"); SimpleUnitFormat.getInstance().label(CUBICMETRE_PER_HOUR, "m³/h"); SimpleUnitFormat.getInstance().label(CUBICMETRE_PER_MINUTE, "m³/min"); @@ -216,11 +230,15 @@ public final class SmartHomeUnits extends CustomUnits { SimpleUnitFormat.getInstance().label(DEGREE_ANGLE, "°"); SimpleUnitFormat.getInstance().label(DEUTSCHE_HAERTE, "°dH"); SimpleUnitFormat.getInstance().label(DOBSON_UNIT, "DU"); - SimpleUnitFormat.getInstance().label(GIBIOCTET, "Gio"); + SimpleUnitFormat.getInstance().label(GIGABYTE, "GB"); + SimpleUnitFormat.getInstance().label(GIBIBYTE, "GiB"); + SimpleUnitFormat.getInstance().alias(GIBIBYTE, "Gio"); SimpleUnitFormat.getInstance().label(GIGABIT, "Gbit"); SimpleUnitFormat.getInstance().label(GIGABIT_PER_SECOND, "Gbit/s"); SimpleUnitFormat.getInstance().label(IRRADIANCE, "W/m²"); - SimpleUnitFormat.getInstance().label(KIBIOCTET, "Kio"); + SimpleUnitFormat.getInstance().label(KILOBYTE, "KB"); + SimpleUnitFormat.getInstance().label(KIBIBYTE, "KiB"); + SimpleUnitFormat.getInstance().alias(KIBIBYTE, "Kio"); SimpleUnitFormat.getInstance().label(KILOBIT, "kbit"); SimpleUnitFormat.getInstance().label(KILOBIT_PER_SECOND, "kbit/s"); SimpleUnitFormat.getInstance().label(KILOVAR, "kvar"); @@ -228,7 +246,9 @@ public final class SmartHomeUnits extends CustomUnits { SimpleUnitFormat.getInstance().label(KILOWATT_HOUR, "kWh"); SimpleUnitFormat.getInstance().label(KNOT, KNOT.getSymbol()); SimpleUnitFormat.getInstance().label(LITRE_PER_MINUTE, "l/min"); - SimpleUnitFormat.getInstance().label(MEBIOCTET, "Mio"); + SimpleUnitFormat.getInstance().label(MEGABYTE, "MB"); + SimpleUnitFormat.getInstance().label(MEBIBYTE, "MiB"); + SimpleUnitFormat.getInstance().alias(MEBIBYTE, "Mio"); SimpleUnitFormat.getInstance().label(MEGABIT, "Mbit"); SimpleUnitFormat.getInstance().label(MEGABIT_PER_SECOND, "Mbit/s"); SimpleUnitFormat.getInstance().label(MEGAWATT_HOUR, "MWh"); @@ -237,11 +257,17 @@ public final class SmartHomeUnits extends CustomUnits { SimpleUnitFormat.getInstance().label(MILLIAMPERE_HOUR, "mAh"); SimpleUnitFormat.getInstance().label(MILLIBAR, "mbar"); SimpleUnitFormat.getInstance().label(MILLIMETRE_OF_MERCURY, MILLIMETRE_OF_MERCURY.getSymbol()); - SimpleUnitFormat.getInstance().label(OCTET, "o"); SimpleUnitFormat.getInstance().label(PARTS_PER_BILLION, "ppb"); SimpleUnitFormat.getInstance().label(PARTS_PER_MILLION, "ppm"); + SimpleUnitFormat.getInstance().label(PETABYTE, "PB"); + SimpleUnitFormat.getInstance().label(PEBIBYTE, "PiB"); + SimpleUnitFormat.getInstance().alias(PEBIBYTE, "Pio"); + SimpleUnitFormat.getInstance().label(PETABIT, "Pbit"); SimpleUnitFormat.getInstance().label(STANDARD_GRAVITY, "gₙ"); SimpleUnitFormat.getInstance().label(SIEMENS_PER_METRE, "S/m"); + SimpleUnitFormat.getInstance().label(TERABYTE, "TB"); + SimpleUnitFormat.getInstance().label(TEBIBYTE, "TiB"); + SimpleUnitFormat.getInstance().alias(TEBIBYTE, "Tio"); SimpleUnitFormat.getInstance().label(TERABIT, "Tbit"); SimpleUnitFormat.getInstance().label(TERABIT_PER_SECOND, "Tbit/s"); SimpleUnitFormat.getInstance().label(VAR, "var"); diff --git a/bundles/org.openhab.core/src/test/java/org/openhab/core/library/types/QuantityTypeTest.java b/bundles/org.openhab.core/src/test/java/org/openhab/core/library/types/QuantityTypeTest.java index 7eff45085b..b0cfe692fc 100644 --- a/bundles/org.openhab.core/src/test/java/org/openhab/core/library/types/QuantityTypeTest.java +++ b/bundles/org.openhab.core/src/test/java/org/openhab/core/library/types/QuantityTypeTest.java @@ -34,6 +34,7 @@ import org.openhab.core.library.dimension.DataAmount; import org.openhab.core.library.dimension.DataTransferRate; import org.openhab.core.library.dimension.Density; import org.openhab.core.library.dimension.Intensity; +import org.openhab.core.library.unit.BinaryPrefix; import org.openhab.core.library.unit.MetricPrefix; import org.openhab.core.library.unit.SIUnits; import org.openhab.core.library.unit.SmartHomeUnits; @@ -328,12 +329,24 @@ public class QuantityTypeTest { QuantityType amount = new QuantityType<>("8 bit"); QuantityType octet = amount.toUnit(SmartHomeUnits.BYTE); assertEquals(1, octet.byteValue()); + QuantityType bytes = new QuantityType<>("1 B"); + assertEquals("1 B", bytes.toString()); + QuantityType bits = bytes.toUnit(SmartHomeUnits.BIT); + assertEquals(8, bits.byteValue()); + bytes = new QuantityType<>("1 MB"); + assertEquals("1 MB", bytes.toString()); + bytes = new QuantityType(1, MetricPrefix.MEGA(SmartHomeUnits.BYTE)); + assertEquals("1 MB", bytes.toString()); + bytes = new QuantityType<>("1 GiB"); + assertEquals("1 GiB", bytes.toString()); + bytes = new QuantityType(1, BinaryPrefix.GIBI(SmartHomeUnits.BYTE)); + assertEquals("1 GiB", bytes.toString()); QuantityType bigAmount = new QuantityType<>("1 Kio"); QuantityType octets = bigAmount.toUnit(SmartHomeUnits.OCTET); assertEquals(1024, octets.intValue()); QuantityType hugeAmount = new QuantityType<>("1024Gio"); QuantityType lotOfOctets = hugeAmount.toUnit(SmartHomeUnits.OCTET); - assertEquals("1099511627776 o", lotOfOctets.toString()); + assertEquals("1099511627776 o", lotOfOctets.format("%d o")); } @Test