From 3a6af0a6398a0f3d3ad16890e251b4aabc19e718 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torkel=20=C3=96degaard?= Date: Mon, 8 Feb 2021 13:02:47 +0100 Subject: [PATCH] Units: Fixes formatting of duration units (#30982) --- .../src/valueFormats/dateTimeFormatters.ts | 2 +- .../src/valueFormats/valueFormats.test.ts | 152 +++++++----------- 2 files changed, 63 insertions(+), 91 deletions(-) diff --git a/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts b/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts index cce85ac2717..93f9a815943 100644 --- a/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts +++ b/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts @@ -227,7 +227,7 @@ export function toDuration(size: number, decimals: DecimalCount, timeScale: Inte let decrementDecimals = false; let decimalsCount = 0; - if (decimals !== null || decimals !== undefined) { + if (decimals !== null && decimals !== undefined) { decimalsCount = decimals as number; } diff --git a/packages/grafana-data/src/valueFormats/valueFormats.test.ts b/packages/grafana-data/src/valueFormats/valueFormats.test.ts index b6d74a61132..3aedf0f42bc 100644 --- a/packages/grafana-data/src/valueFormats/valueFormats.test.ts +++ b/packages/grafana-data/src/valueFormats/valueFormats.test.ts @@ -12,87 +12,69 @@ interface ValueFormatTest { result: string; } -const formatTests: ValueFormatTest[] = [ - // Currency - { id: 'currencyUSD', decimals: 2, value: 1532.82, result: '$1.53K' }, - { id: 'currencyKRW', decimals: 2, value: 1532.82, result: '₩1.53K' }, - { id: 'currencyIDR', decimals: 2, value: 1532.82, result: 'Rp1.53K' }, - // no unit - { id: 'none', decimals: null, value: 3.23, result: '3.23' }, - { id: 'none', decimals: null, value: 0.0245, result: '0.0245' }, - { id: 'none', decimals: null, value: 1 / 3, result: '0.333' }, - - // Standard - { id: 'ms', decimals: 4, value: 0.0024, result: '0.0024 ms' }, - { id: 'ms', decimals: 0, value: 100, result: '100 ms' }, - { id: 'ms', decimals: 2, value: 1250, result: '1.25 s' }, - { id: 'ms', decimals: 1, value: 10000086.123, result: '2.8 hour' }, - { id: 'ms', decimals: 0, value: 1200, result: '1 s' }, - { id: 'short', decimals: null, value: 1000, result: '1 K' }, - { id: 'short', decimals: null, value: 1200, result: '1.20 K' }, - { id: 'short', decimals: null, value: 1250, result: '1.25 K' }, - { id: 'short', decimals: null, value: 1000000, result: '1 Mil' }, - { id: 'short', decimals: null, value: 1500000, result: '1.50 Mil' }, - { id: 'short', decimals: null, value: 1000120, result: '1.00 Mil' }, - { id: 'short', decimals: null, value: 98765, result: '98.8 K' }, - { id: 'short', decimals: null, value: 9876543, result: '9.88 Mil' }, - { id: 'short', decimals: null, value: 9876543, result: '9.88 Mil' }, - { id: 'kbytes', decimals: null, value: 10000000, result: '9.54 GiB' }, - { id: 'deckbytes', decimals: null, value: 10000000, result: '10 GB' }, - { id: 'megwatt', decimals: 3, value: 1000, result: '1.000 GW' }, - { id: 'kohm', decimals: 3, value: 1000, result: '1.000 MΩ' }, - { id: 'Mohm', decimals: 3, value: 1000, result: '1.000 GΩ' }, - - { id: 'farad', decimals: 3, value: 1000, result: '1.000 kF' }, - { id: 'µfarad', decimals: 3, value: 1000, result: '1.000 mF' }, - { id: 'nfarad', decimals: 3, value: 1000, result: '1.000 µF' }, - { id: 'pfarad', decimals: 3, value: 1000, result: '1.000 nF' }, - { id: 'ffarad', decimals: 3, value: 1000, result: '1.000 pF' }, - - { id: 'henry', decimals: 3, value: 1000, result: '1.000 kH' }, - { id: 'mhenry', decimals: 3, value: 1000, result: '1.000 H' }, - { id: 'µhenry', decimals: 3, value: 1000, result: '1.000 mH' }, - - // Suffix (unknown units append to the end) - { id: 'a', decimals: 0, value: 1532.82, result: '1533 a' }, - { id: 'b', decimals: 0, value: 1532.82, result: '1533 b' }, - - // Prefix (unknown units append to the end) - { id: 'prefix:b', value: 1532.82, result: 'b1533' }, - { id: 'suffix:d', value: 1532.82, result: '1533 d' }, - - // SI Units - { id: 'si:µF', value: 1234, decimals: 2, result: '1.23 mF' }, - { id: 'si:µF', value: 1234000000, decimals: 2, result: '1.23 kF' }, - { id: 'si:µF', value: 1234000000000000, decimals: 2, result: '1.23 GF' }, - - // Counts (suffix) - { id: 'count:xpm', value: 1234567, decimals: 2, result: '1.23M xpm' }, - { id: 'count:x/min', value: 1234, decimals: 2, result: '1.23K x/min' }, - - // Currency (prefix) - { id: 'currency:@', value: 1234567, decimals: 2, result: '@1.23M' }, - { id: 'currency:@', value: 1234, decimals: 2, result: '@1.23K' }, - - // Time format - { id: 'time:YYYY', decimals: 0, value: dateTime(new Date(1999, 6, 2)).valueOf(), result: '1999' }, - { id: 'time:YYYY.MM', decimals: 0, value: dateTime(new Date(2010, 6, 2)).valueOf(), result: '2010.07' }, - { id: 'dateTimeAsIso', decimals: 0, value: dateTime(new Date(2010, 6, 2)).valueOf(), result: '2010-07-02 00:00:00' }, - { - id: 'dateTimeAsUS', - decimals: 0, - value: dateTime(new Date(2010, 6, 2)).valueOf(), - result: '07/02/2010 12:00:00 am', - }, - { - id: 'dateTimeAsSystem', - decimals: 0, - value: dateTime(new Date(2010, 6, 2)).valueOf(), - result: '2010-07-02 00:00:00', - }, -]; - describe('valueFormats', () => { + it.each` + format | decimals | value | expected + ${'currencyUSD'} | ${2} | ${1532.82} | ${'$1.53K'} + ${'currencyKRW'} | ${2} | ${1532.82} | ${'₩1.53K'} + ${'currencyIDR'} | ${2} | ${1532.82} | ${'Rp1.53K'} + ${'none'} | ${undefined} | ${3.23} | ${'3.23'} + ${'none'} | ${undefined} | ${0.0245} | ${'0.0245'} + ${'none'} | ${undefined} | ${1 / 3} | ${'0.333'} + ${'ms'} | ${4} | ${0.0024} | ${'0.0024 ms'} + ${'ms'} | ${0} | ${100} | ${'100 ms'} + ${'ms'} | ${2} | ${1250} | ${'1.25 s'} + ${'ms'} | ${1} | ${10000086.123} | ${'2.8 hour'} + ${'ms'} | ${undefined} | ${1000} | ${'1 s'} + ${'ms'} | ${0} | ${1200} | ${'1 s'} + ${'short'} | ${undefined} | ${1000} | ${'1 K'} + ${'short'} | ${undefined} | ${1200} | ${'1.20 K'} + ${'short'} | ${undefined} | ${1250} | ${'1.25 K'} + ${'short'} | ${undefined} | ${1000000} | ${'1 Mil'} + ${'short'} | ${undefined} | ${1500000} | ${'1.50 Mil'} + ${'short'} | ${undefined} | ${1000120} | ${'1.00 Mil'} + ${'short'} | ${undefined} | ${98765} | ${'98.8 K'} + ${'short'} | ${undefined} | ${9876543} | ${'9.88 Mil'} + ${'short'} | ${undefined} | ${9876543} | ${'9.88 Mil'} + ${'kbytes'} | ${undefined} | ${10000000} | ${'9.54 GiB'} + ${'deckbytes'} | ${undefined} | ${10000000} | ${'10 GB'} + ${'megwatt'} | ${3} | ${1000} | ${'1.000 GW'} + ${'kohm'} | ${3} | ${1000} | ${'1.000 MΩ'} + ${'Mohm'} | ${3} | ${1000} | ${'1.000 GΩ'} + ${'farad'} | ${3} | ${1000} | ${'1.000 kF'} + ${'µfarad'} | ${3} | ${1000} | ${'1.000 mF'} + ${'nfarad'} | ${3} | ${1000} | ${'1.000 µF'} + ${'pfarad'} | ${3} | ${1000} | ${'1.000 nF'} + ${'ffarad'} | ${3} | ${1000} | ${'1.000 pF'} + ${'henry'} | ${3} | ${1000} | ${'1.000 kH'} + ${'mhenry'} | ${3} | ${1000} | ${'1.000 H'} + ${'µhenry'} | ${3} | ${1000} | ${'1.000 mH'} + ${'a'} | ${0} | ${1532.82} | ${'1533 a'} + ${'b'} | ${0} | ${1532.82} | ${'1533 b'} + ${'prefix:b'} | ${undefined} | ${1532.82} | ${'b1533'} + ${'suffix:d'} | ${undefined} | ${1532.82} | ${'1533 d'} + ${'si:µF'} | ${2} | ${1234} | ${'1.23 mF'} + ${'si:µF'} | ${2} | ${1234000000} | ${'1.23 kF'} + ${'si:µF'} | ${2} | ${1234000000000000} | ${'1.23 GF'} + ${'count:xpm'} | ${2} | ${1234567} | ${'1.23M xpm'} + ${'count:x/min'} | ${2} | ${1234} | ${'1.23K x/min'} + ${'currency:@'} | ${2} | ${1234567} | ${'@1.23M'} + ${'currency:@'} | ${2} | ${1234} | ${'@1.23K'} + ${'time:YYYY'} | ${0} | ${dateTime(new Date(1999, 6, 2)).valueOf()} | ${'1999'} + ${'time:YYYY.MM'} | ${0} | ${dateTime(new Date(2010, 6, 2)).valueOf()} | ${'2010.07'} + ${'dateTimeAsIso'} | ${0} | ${dateTime(new Date(2010, 6, 2)).valueOf()} | ${'2010-07-02 00:00:00'} + ${'dateTimeAsUS'} | ${0} | ${dateTime(new Date(2010, 6, 2)).valueOf()} | ${'07/02/2010 12:00:00 am'} + ${'dateTimeAsSystem'} | ${0} | ${dateTime(new Date(2010, 6, 2)).valueOf()} | ${'2010-07-02 00:00:00'} + ${'dtdurationms'} | ${undefined} | ${100000} | ${'1 minute'} + `( + 'With format=$format decimals=$decimals and value=$value then result shoudl be = $expected', + async ({ format, value, decimals, expected }) => { + const result = getValueFormat(format)(value, decimals, undefined, undefined); + const full = formattedValueToString(result); + expect(full).toBe(expected); + } + ); + it('Manually check a format', () => { // helpful for adding tests one at a time with the debugger const tests: ValueFormatTest[] = [ @@ -104,16 +86,6 @@ describe('valueFormats', () => { expect(full).toBe(test.result); }); - for (const test of formatTests) { - describe(`value format: ${test.id}`, () => { - it(`should translate ${test.value} as ${test.result}`, () => { - const result = getValueFormat(test.id)(test.value, test.decimals, test.scaledDecimals); - const full = formattedValueToString(result); - expect(full).toBe(test.result); - }); - }); - } - describe('normal cases', () => { it('toFixed should handle number correctly if decimal is null', () => { expect(toFixed(100)).toBe('100');