|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299 |
- import { describe, it, expect } from 'vitest';
- import { parse, stringify, systems } from '../../src';
- import { numberToExponential } from '../../src/exponent';
-
- const options = {
- system: systems.enUS.shortCount,
- };
-
- const stringifyOptions = {
- ...options,
- stringifyGroupsOptions: {
- addTensDashes: false,
- },
- };
-
- describe('numerica', () => {
- describe('group names', () => {
- describe('0-9', () => {
- it.each`
- ones | expected
- ${0} | ${'zero'}
- ${1} | ${'one'}
- ${2} | ${'two'}
- ${3} | ${'three'}
- ${4} | ${'four'}
- ${5} | ${'five'}
- ${6} | ${'six'}
- ${7} | ${'seven'}
- ${8} | ${'eight'}
- ${9} | ${'nine'}
- `('converts $ones to $expected', ({ ones, expected }: { ones: number, expected: string }) => {
- expect(stringify(ones, stringifyOptions)).toBe(expected);
- expect(parse(expected, { ...options, type: 'number' })).toBe(ones);
- });
- });
-
- describe('10-19', () => {
- it.each`
- tenPlusOnes | expected
- ${10} | ${'ten'}
- ${11} | ${'eleven'}
- ${12} | ${'twelve'}
- ${13} | ${'thirteen'}
- ${14} | ${'fourteen'}
- ${15} | ${'fifteen'}
- ${16} | ${'sixteen'}
- ${17} | ${'seventeen'}
- ${18} | ${'eighteen'}
- ${19} | ${'nineteen'}
- `('converts $tenPlusOnes to $expected', ({ tenPlusOnes, expected }: { tenPlusOnes: number, expected: string }) => {
- expect(stringify(tenPlusOnes, stringifyOptions)).toBe(expected);
- expect(parse(expected, { ...options, type: 'number' })).toBe(tenPlusOnes);
- });
- });
-
- describe.each`
- tensStart | tensEnd | tensBase
- ${20} | ${29} | ${'twenty'}
- ${30} | ${39} | ${'thirty'}
- ${40} | ${49} | ${'forty'}
- ${50} | ${59} | ${'fifty'}
- ${60} | ${69} | ${'sixty'}
- ${70} | ${79} | ${'seventy'}
- ${80} | ${89} | ${'eighty'}
- ${90} | ${99} | ${'ninety'}
- `('$tensStart-$tensEnd', ({
- tensStart, tensBase,
- }: { tensStart: number, tensBase: string }) => {
- it.each`
- value | expected
- ${tensStart} | ${tensBase}
- ${tensStart + 1} | ${`${tensBase} one`}
- ${tensStart + 2} | ${`${tensBase} two`}
- ${tensStart + 3} | ${`${tensBase} three`}
- ${tensStart + 4} | ${`${tensBase} four`}
- ${tensStart + 5} | ${`${tensBase} five`}
- ${tensStart + 6} | ${`${tensBase} six`}
- ${tensStart + 7} | ${`${tensBase} seven`}
- ${tensStart + 8} | ${`${tensBase} eight`}
- ${tensStart + 9} | ${`${tensBase} nine`}
- `('converts $value to $expected', ({ value, expected }: { value: number, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, { ...options, type: 'number' })).toBe(value);
- });
- });
-
- describe.each`
- hundredsStart | hundredsEnd | hundredsBase
- ${100} | ${199} | ${'one hundred'}
- ${200} | ${299} | ${'two hundred'}
- ${300} | ${399} | ${'three hundred'}
- ${400} | ${499} | ${'four hundred'}
- ${500} | ${599} | ${'five hundred'}
- ${600} | ${699} | ${'six hundred'}
- ${700} | ${799} | ${'seven hundred'}
- ${800} | ${899} | ${'eight hundred'}
- ${900} | ${999} | ${'nine hundred'}
- `('$hundredsStart-$hundredsEnd', ({
- hundredsStart, hundredsBase,
- }: { hundredsStart: number, hundredsBase: string }) => {
- describe(`${hundredsStart}-${hundredsStart + 9}`, () => {
- it.each`
- value | expected
- ${hundredsStart} | ${hundredsBase}
- ${hundredsStart + 1} | ${`${hundredsBase} one`}
- ${hundredsStart + 2} | ${`${hundredsBase} two`}
- ${hundredsStart + 3} | ${`${hundredsBase} three`}
- ${hundredsStart + 4} | ${`${hundredsBase} four`}
- ${hundredsStart + 5} | ${`${hundredsBase} five`}
- ${hundredsStart + 6} | ${`${hundredsBase} six`}
- ${hundredsStart + 7} | ${`${hundredsBase} seven`}
- ${hundredsStart + 8} | ${`${hundredsBase} eight`}
- ${hundredsStart + 9} | ${`${hundredsBase} nine`}
- `('converts $value to $expected', ({ value, expected }: { value: number, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, { ...options, type: 'number' })).toBe(value);
- });
- });
-
- describe(`${hundredsStart + 10}-${hundredsStart + 19}`, () => {
- it.each`
- value | expected
- ${hundredsStart + 10} | ${`${hundredsBase} ten`}
- ${hundredsStart + 11} | ${`${hundredsBase} eleven`}
- ${hundredsStart + 12} | ${`${hundredsBase} twelve`}
- ${hundredsStart + 13} | ${`${hundredsBase} thirteen`}
- ${hundredsStart + 14} | ${`${hundredsBase} fourteen`}
- ${hundredsStart + 15} | ${`${hundredsBase} fifteen`}
- ${hundredsStart + 16} | ${`${hundredsBase} sixteen`}
- ${hundredsStart + 17} | ${`${hundredsBase} seventeen`}
- ${hundredsStart + 18} | ${`${hundredsBase} eighteen`}
- ${hundredsStart + 19} | ${`${hundredsBase} nineteen`}
- `('converts $value to $expected', ({ value, expected }: { value: number, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, { ...options, type: 'number' })).toBe(value);
- });
- });
-
- describe.each`
- start | end | base
- ${20} | ${29} | ${'twenty'}
- ${30} | ${39} | ${'thirty'}
- ${40} | ${49} | ${'forty'}
- ${50} | ${59} | ${'fifty'}
- ${60} | ${69} | ${'sixty'}
- ${70} | ${79} | ${'seventy'}
- ${80} | ${89} | ${'eighty'}
- ${90} | ${99} | ${'ninety'}
- `('$start-$end', ({
- start, base,
- }: { start: number, base: string }) => {
- it.each`
- value | expected
- ${hundredsStart + start} | ${`${hundredsBase} ${base}`}
- ${hundredsStart + start + 1} | ${`${hundredsBase} ${base} one`}
- ${hundredsStart + start + 2} | ${`${hundredsBase} ${base} two`}
- ${hundredsStart + start + 3} | ${`${hundredsBase} ${base} three`}
- ${hundredsStart + start + 4} | ${`${hundredsBase} ${base} four`}
- ${hundredsStart + start + 5} | ${`${hundredsBase} ${base} five`}
- ${hundredsStart + start + 6} | ${`${hundredsBase} ${base} six`}
- ${hundredsStart + start + 7} | ${`${hundredsBase} ${base} seven`}
- ${hundredsStart + start + 8} | ${`${hundredsBase} ${base} eight`}
- ${hundredsStart + start + 9} | ${`${hundredsBase} ${base} nine`}
- `('converts $value to $expected', ({ value, expected }: { value: number, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, { ...options, type: 'number' })).toBe(value);
- });
- });
- });
- });
-
- it('converts 1000 to one thousand', () => {
- expect(stringify(1000, stringifyOptions)).toBe('one thousand');
- expect(parse('one thousand', { ...options, type: 'number' })).toBe(1000);
- });
-
- it('converts 10000 to ten thousand', () => {
- expect(stringify(10000, stringifyOptions)).toBe('ten thousand');
- expect(parse('ten thousand', { ...options, type: 'number' })).toBe(10000);
- });
-
- it('converts 100000 to one hundred thousand', () => {
- expect(stringify(100000, stringifyOptions)).toBe('one hundred thousand');
- expect(parse('one hundred thousand', { ...options, type: 'number' })).toBe(100000);
- });
-
- it('converts 123456 to one hundred twenty three thousand four hundred fifty six', () => {
- expect(stringify(123456, stringifyOptions)).toBe('one hundred twenty three thousand four hundred fifty six');
- expect(parse('one hundred twenty three thousand four hundred fifty six', { ...options, type: 'number' })).toBe(123456);
- });
-
- it.each`
- value | expected
- ${1e+6} | ${'one million'}
- ${1e+9} | ${'one billion'}
- ${1e+12} | ${'one trillion'}
- ${1e+15} | ${'one quadrillion'}
- ${1e+18} | ${'one quintillion'}
- ${1e+21} | ${'one sextillion'}
- ${1e+24} | ${'one septillion'}
- ${1e+27} | ${'one octillion'}
- ${1e+30} | ${'one nonillion'}
- `('converts $value to $expected', ({ value, expected }: { value: number, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, { ...options, type: 'number' })).toBe(value);
- });
-
- it.each`
- value | expected
- ${'1e+33'} | ${'one decillion'}
- ${'1e+36'} | ${'one undecillion'}
- ${'1e+39'} | ${'one duodecillion'}
- ${'1e+42'} | ${'one tredecillion'}
- ${'1e+45'} | ${'one quattuordecillion'}
- ${'1e+48'} | ${'one quindecillion'}
- ${'1e+51'} | ${'one sexdecillion'}
- ${'1e+54'} | ${'one septendecillion'}
- ${'1e+57'} | ${'one octodecillion'}
- ${'1e+60'} | ${'one novemdecillion'}
- `('converts $value to $expected', ({ value, expected }: { value: string, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, options)).toBe(value);
- });
-
- it.each`
- value | expected
- ${'1e+63'} | ${'one vigintillion'}
- ${'1e+66'} | ${'one unvigintillion'}
- ${'1e+69'} | ${'one duovigintillion'}
- ${'1e+72'} | ${'one trevigintillion'}
- ${'1e+75'} | ${'one quattuorvigintillion'}
- ${'1e+78'} | ${'one quinvigintillion'}
- ${'1e+81'} | ${'one sexvigintillion'}
- ${'1e+84'} | ${'one septenvigintillion'}
- ${'1e+87'} | ${'one octovigintillion'}
- ${'1e+90'} | ${'one novemvigintillion'}
- `('converts $value to $expected', ({ value, expected }: { value: string, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, options)).toBe(value);
- });
-
- it.each`
- value | expected
- ${'1e+93'} | ${'one trigintillion'}
- ${'1e+123'} | ${'one quadragintillion'}
- ${'1e+153'} | ${'one quinquagintillion'}
- ${'1e+183'} | ${'one sexagintillion'}
- ${'1e+213'} | ${'one septuagintillion'}
- ${'1e+243'} | ${'one octogintillion'}
- ${'1e+273'} | ${'one nonagintillion'}
- `('converts $value to $expected', ({ value, expected }: { value: string, expected: string }) => {
- expect(stringify(value, stringifyOptions)).toBe(expected);
- expect(parse(expected, options)).toBe(value);
- });
-
- it('converts values', () => {
- const exp1 = numberToExponential('123,456,789,012,345,678,901,234,567,890');
- //
- // one hundred twenty three octillion
- // four hundred fifty six septillion
- // seven hundred eighty nine sextillion
- // twelve quintillion
- // three hundred forty five quadrillion
- // six hundred seventy eight trillion
- // nine hundred one billion
- // two hundred thirty four million
- // five hundred sixty seven thousand
- // eight hundred ninety
- expect(parse(stringify('123456789012345678901234567890'))).toBe(exp1);
-
- const value2 = '1000005000000';
- const exp2 = numberToExponential(value2);
- expect(stringify(value2)).toBe('one trillion five million');
- expect(parse(stringify(value2))).toBe(exp2);
-
- const value3 = '12012';
- const exp3 = numberToExponential(value3);
- expect(stringify(value3)).toBe('twelve thousand twelve');
- expect(parse(stringify(value3))).toBe(exp3);
-
- const value4 = '12020';
- const exp4 = numberToExponential(value4);
- expect(stringify(value4)).toBe('twelve thousand twenty');
- expect(parse(stringify(value4))).toBe(exp4);
-
- const value5 = '1e3006';
- expect(stringify(value5)).toBe('one milliauntillion');
- });
-
- it('converts short millia', () => {
- const shortMillia1 = 'one millia^1-tillion';
- expect(parse(shortMillia1)).toBe('1e+3003');
-
- const shortMillia2 = 'one millia^2-tillion';
- expect(parse(shortMillia2)).toBe('1e+3000003');
- expect(stringify(parse(shortMillia2), { stringifyGroupsOptions: { shortenMillia: true } }))
- .toBe(shortMillia2);
- });
- });
|