UNPKG

box-ui-elements-mlh

Version:
391 lines (377 loc) 17.7 kB
/** * load locale data manually that is not the current locale so that * we can use it for unit testing */ import germanLocaleData from '@box/cldr-data/locale-data/de-DE'; import russianLocaleData from '@box/cldr-data/locale-data/ru-RU'; import japaneseLocaleData from '@box/cldr-data/locale-data/ja-JP'; import { UnifiedNumberFormat } from '@formatjs/intl-unified-numberformat'; import numAbbr, { Lengths } from '../numAbbr'; const germanNumbersData = germanLocaleData.numbers; const russianNumbersData = russianLocaleData.numbers; const japaneseNumbersData = japaneseLocaleData.numbers; const { node } = process.versions; if (!node || Number(node.replace(/\..*/g, '')) < 12) { // need to polyfill the number formatter in Intl.NumberFormat, because it // doesn't work properly on versions of node before 12 /* eslint-disable global-require */ /* eslint-disable no-underscore-dangle */ /* eslint-disable @typescript-eslint/no-var-requires */ require('@formatjs/intl-unified-numberformat/polyfill'); if (typeof UnifiedNumberFormat.__addLocaleData === 'function') { UnifiedNumberFormat.__addLocaleData(require('@formatjs/intl-unified-numberformat/dist/locale-data/de.json')); UnifiedNumberFormat.__addLocaleData(require('@formatjs/intl-unified-numberformat/dist/locale-data/ru.json')); UnifiedNumberFormat.__addLocaleData(require('@formatjs/intl-unified-numberformat/dist/locale-data/ja.json')); } /* eslint-enable global-require */ /* eslint-enable no-underscore-dangle */ /* eslint-enable @typescript-eslint/no-var-requires */ } describe('util/num', () => { test('should work in English 1', () => { expect(numAbbr(1)).toBe('1'); }); test('should work in English 1000', () => { expect(numAbbr(1000)).toBe('1K'); }); test('should work in English 10000', () => { expect(numAbbr(10000)).toBe('10K'); }); test('should work in English 100000', () => { expect(numAbbr(100000)).toBe('100K'); }); test('should work in English 1000000', () => { expect(numAbbr(1000000)).toBe('1M'); }); test('should work in English 10000000', () => { expect(numAbbr(10000000)).toBe('10M'); }); test('should work in English 1000000000', () => { expect(numAbbr(1000000000)).toBe('1B'); }); test('should work in English 1000000000000', () => { expect(numAbbr(1000000000000)).toBe('1T'); }); test('should work in English larger than max', () => { expect(numAbbr(1000000000000000000)).toBe('1,000,000T'); }); test('should work in English 1 long', () => { expect(numAbbr(1, { length: Lengths.long })).toBe('1'); }); test('should work in English 1000 long', () => { expect(numAbbr(1000, { length: Lengths.long })).toBe('1 thousand'); }); test('should work in English 10000 long', () => { expect(numAbbr(10000, { length: Lengths.long })).toBe('10 thousand'); }); test('should work in English 100000 long', () => { expect(numAbbr(100000, { length: Lengths.long })).toBe('100 thousand'); }); test('should work in English 1000000 long', () => { expect(numAbbr(1000000, { length: Lengths.long })).toBe('1 million'); }); test('should work in English 10000000 long', () => { expect(numAbbr(10000000, { length: Lengths.long })).toBe('10 million'); }); test('should work in English 1000000000 long', () => { expect(numAbbr(1000000000, { length: Lengths.long })).toBe('1 billion'); }); test('should work in English 1000000000000 long', () => { expect(numAbbr(1000000000000, { length: Lengths.long })).toBe('1 trillion'); }); test('should work in English larger than max long', () => { expect(numAbbr(1000000000000000000, { length: Lengths.long })).toBe('1,000,000 trillion'); }); test('should work in English 12345678 with rounding', () => { expect(numAbbr(12345678)).toBe('12M'); }); test('should work in English 87654321 with rounding', () => { expect(numAbbr(87654321)).toBe('88M'); }); test('should work when passing in a number as a string', () => { expect(numAbbr('3230000')).toBe('3M'); }); test('should not crap out when passing in a string that does not contain a number', () => { expect(numAbbr('asdf')).toBe('0'); }); test('should not crap out when passing in an empty string', () => { expect(numAbbr('')).toBe('0'); }); test('should not crap out when passing in a boolean false', () => { expect(numAbbr(false)).toBe('0'); }); test('should not crap out when passing in a boolean true', () => { expect(numAbbr(true)).toBe('1'); }); test('should not crap out when passing in a null', () => { expect(numAbbr(null)).toBe('0'); }); test('should not crap out when passing in undefined', () => { expect(numAbbr(undefined)).toBe('0'); }); test('should not crap out when passing in an object', () => { expect(numAbbr({ foo: 2, bar: 4 })).toBe('0'); }); test('should work when passing in a floating point number', () => { expect(numAbbr(24734.45674)).toBe('25K'); }); test('should work when passing in a small negative number', () => { expect(numAbbr(-24)).toBe('-24'); }); test('should abbreviate when passing in a medium negative number', () => { expect(numAbbr(-24567)).toBe('-25K'); }); test('should abbreviate when passing in a large negative number', () => { expect(numAbbr(-24567000000)).toBe('-25B'); }); test('should work with 0', () => { expect(numAbbr(0)).toBe('0'); }); test('should work when passing an array of numbers', () => { expect(numAbbr([34534, 333000000, 34])).toStrictEqual(['35K', '333M', '34']); }); test('should work when passing an array of mixed types', () => { expect(numAbbr([34534, '333000000', 34])).toStrictEqual(['35K', '333M', '34']); }); test('should work in German 1', () => { expect(numAbbr(1, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('1'); }); test('should work in German 1000', () => { expect(numAbbr(1000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('1.000'); }); test('should work in German 10000', () => { expect(numAbbr(10000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('10.000'); }); test('should work in German 100000', () => { expect(numAbbr(100000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('100.000'); }); test('should work in German 1000000', () => { expect(numAbbr(1000000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('1 Mio.'); }); test('should work in German 10000000', () => { expect(numAbbr(10000000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('10 Mio.'); }); test('should work in German 1000000000', () => { expect(numAbbr(1000000000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('1 Mrd.'); }); test('should work in German 1000000000000', () => { expect(numAbbr(1000000000000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe('1 Bio.'); }); test('should work in German larger than max', () => { expect(numAbbr(1000000000000000000, { numbersData: germanNumbersData, locale: 'de-DE' })).toBe( '1.000.000 Bio.', ); }); test('should work in German 1 long', () => { expect(numAbbr(1, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe('1'); }); test('should work in German 1000 long', () => { expect(numAbbr(1000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe( '1 Tausend', ); }); test('should work in German 10000 long', () => { expect(numAbbr(10000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe( '10 Tausend', ); }); test('should work in German 100000 long', () => { expect(numAbbr(100000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe( '100 Tausend', ); }); test('should work in German 1000000 long', () => { expect(numAbbr(1000000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe( '1 Million', ); }); test('should work in German 10000000 long', () => { expect(numAbbr(10000000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe( '10 Millionen', ); }); test('should work in German 1000000000 long', () => { expect(numAbbr(1000000000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe( '1 Milliarde', ); }); test('should work in German 1000000000000 long', () => { expect(numAbbr(1000000000000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long })).toBe( '1 Billion', ); }); test('should work in German larger than max long', () => { expect( numAbbr(1000000000000000000, { numbersData: germanNumbersData, locale: 'de-DE', length: Lengths.long }), ).toBe('1.000.000 Billionen'); }); test('should work in Russian 1', () => { expect(numAbbr(1, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('1'); }); test('should work in Russian 1000', () => { expect(numAbbr(1000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('1 тыс.'); }); test('should work in Russian 10000', () => { expect(numAbbr(10000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('10 тыс.'); }); test('should work in Russian 100000', () => { expect(numAbbr(100000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('100 тыс.'); }); test('should work in Russian 1000000', () => { expect(numAbbr(1000000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('1 млн'); }); test('should work in Russian 10000000', () => { expect(numAbbr(10000000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('10 млн'); }); test('should work in Russian 1000000000', () => { expect(numAbbr(1000000000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('1 млрд'); }); test('should work in Russian 1000000000000', () => { expect(numAbbr(1000000000000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe('1 трлн'); }); test('should work in Russian larger than max', () => { expect(numAbbr(1000000000000000000, { numbersData: russianNumbersData, locale: 'ru-RU' })).toBe( '1 000 000 трлн', ); }); test('should work in Russian 1 long', () => { expect(numAbbr(1, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe('1'); }); test('should work in Russian 1000 long', () => { expect(numAbbr(1000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '1 тысяча', ); }); test('should work in Russian 2000', () => { expect(numAbbr(2000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '2 тысячи', ); }); test('should work in Russian 5000', () => { expect(numAbbr(5000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '5 тысяч', ); }); test('should work in Russian 10000 long', () => { expect(numAbbr(10000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '10 тысяч', ); }); test('should work in Russian 100000 long', () => { expect(numAbbr(100000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '100 тысяч', ); }); test('should work in Russian 1000000 long', () => { expect(numAbbr(1000000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '1 миллион', ); }); test('should work in Russian 2000000 long', () => { expect(numAbbr(2000000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '2 миллиона', ); }); test('should work in Russian 5000000 long', () => { expect(numAbbr(5000000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '5 миллионов', ); }); test('should work in Russian 10000000 long', () => { expect(numAbbr(10000000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '10 миллионов', ); }); test('should work in Russian 1000000000 long', () => { expect(numAbbr(1000000000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '1 миллиард', ); }); test('should work in Russian 1000000000000 long', () => { expect(numAbbr(1000000000000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long })).toBe( '1 триллион', ); }); test('should work in Russian larger than max long', () => { expect( numAbbr(1000000000000000000, { numbersData: russianNumbersData, locale: 'ru-RU', length: Lengths.long }), ).toBe('1 000 000 триллионов'); }); test('should work in Japanese 1', () => { expect(numAbbr(1, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('1'); }); test('should work in Japanese 1000', () => { expect(numAbbr(1000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('1,000'); }); test('should work in Japanese 10000', () => { expect(numAbbr(10000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('1万'); }); test('should work in Japanese 100000', () => { expect(numAbbr(100000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('10万'); }); test('should work in Japanese 1000000', () => { expect(numAbbr(1000000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('100万'); }); test('should work in Japanese 100000000', () => { expect(numAbbr(100000000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('1億'); }); test('should work in Japanese 1000000000', () => { expect(numAbbr(1000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('10億'); }); test('should work in Japanese 100000000000', () => { expect(numAbbr(100000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('1,000億'); }); test('should work in Japanese 1000000000000', () => { expect(numAbbr(1000000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('1兆'); }); test('should work in Japanese larger than max', () => { expect(numAbbr(1000000000000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP' })).toBe('1,000,000兆'); }); // short and long are the same for Japanese test('should work in Japanese 1 long', () => { expect(numAbbr(1, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe('1'); }); test('should work in Japanese 1000 long', () => { expect(numAbbr(1000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe( '1,000', ); }); test('should work in Japanese 10000 long', () => { expect(numAbbr(10000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe('1万'); }); test('should work in Japanese 100000 long', () => { expect(numAbbr(100000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe( '10万', ); }); test('should work in Japanese 1000000 long', () => { expect(numAbbr(1000000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe( '100万', ); }); test('should work in Japanese 100000000 long', () => { expect(numAbbr(100000000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe( '1億', ); }); test('should work in Japanese 1000000000 long', () => { expect(numAbbr(1000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe( '10億', ); }); test('should work in Japanese 100000000000 long', () => { expect(numAbbr(100000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long })).toBe( '1,000億', ); }); test('should work in Japanese 1000000000000 long', () => { expect( numAbbr(1000000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long }), ).toBe('1兆'); }); test('should work in Japanese larger than max long', () => { expect( numAbbr(1000000000000000000, { numbersData: japaneseNumbersData, locale: 'ja-JP', length: Lengths.long }), ).toBe('1,000,000兆'); }); });