lion/packages/ui/components/localize/test/number/parseNumber.test.js
gerjanvangeest 35e66052b6
fix(input-amount): parse amount always on locale once the amount is formatted (#2439)
* fix(input-amount): parse amount always  on locale once the amount is formatted

* chore: add unit test

* chore: add some description

* chore: update playwright script to install dependencies

* Update .github/workflows/verify-pr.yml

* chore: set formatOptions temp and cleanup for programmatic api

* feat(form-core): add "user-edit" mode to formatOptions while editing existing value of a form control

* chore: enhance code readability and robustness

---------

Co-authored-by: Thijs Louisse <thijs.louisse@ing.com>
2025-01-15 09:59:02 +01:00

193 lines
8.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { expect } from '@open-wc/testing';
import { getLocalizeManager, parseNumber } from '@lion/ui/localize-no-side-effects.js';
describe('parseNumber()', () => {
const localizeManager = getLocalizeManager();
it('parses integers', () => {
expect(parseNumber('1')).to.equal(1);
expect(parseNumber('12')).to.equal(12);
expect(parseNumber('123')).to.equal(123);
expect(parseNumber('1234')).to.equal(1234);
expect(parseNumber('12345')).to.equal(12345);
expect(parseNumber('123456')).to.equal(123456);
expect(parseNumber('1234567')).to.equal(1234567);
expect(parseNumber('12345678')).to.equal(12345678);
expect(parseNumber('123456789')).to.equal(123456789);
});
it('detects separators heuristically when there are 2 different ones e.g. 1,234.5', () => {
expect(parseNumber('1,234.5')).to.equal(1234.5);
expect(parseNumber('1.234,5')).to.equal(1234.5);
expect(parseNumber('1 234.5')).to.equal(1234.5);
expect(parseNumber('1 234,5')).to.equal(1234.5);
expect(parseNumber('1,234.56')).to.equal(1234.56);
expect(parseNumber('1.234,56')).to.equal(1234.56);
expect(parseNumber('1 234.56')).to.equal(1234.56);
expect(parseNumber('1 234,56')).to.equal(1234.56);
expect(parseNumber('1,234.567')).to.equal(1234.567);
expect(parseNumber('1.234,567')).to.equal(1234.567);
expect(parseNumber('1 234.567')).to.equal(1234.567);
expect(parseNumber('1 234,567')).to.equal(1234.567);
expect(parseNumber('1,234.5678')).to.equal(1234.5678);
expect(parseNumber('1.234,5678')).to.equal(1234.5678);
expect(parseNumber('1 234.5678')).to.equal(1234.5678);
expect(parseNumber('1 234,5678')).to.equal(1234.5678);
expect(parseNumber('1,234.56789')).to.equal(1234.56789);
expect(parseNumber('1.234,56789')).to.equal(1234.56789);
expect(parseNumber('1 234.56789')).to.equal(1234.56789);
expect(parseNumber('1 234,56789')).to.equal(1234.56789);
});
it('detects separators heuristically when there is only one and "pasted" mode used e.g. 123456,78', () => {
expect(parseNumber('1.', { mode: 'pasted' })).to.equal(1);
expect(parseNumber('1,', { mode: 'pasted' })).to.equal(1);
expect(parseNumber('1 ', { mode: 'pasted' })).to.equal(1);
expect(parseNumber('1.2', { mode: 'pasted' })).to.equal(1.2);
expect(parseNumber('1,2', { mode: 'pasted' })).to.equal(1.2);
expect(parseNumber('1 2', { mode: 'pasted' })).to.equal(12);
expect(parseNumber('1.23', { mode: 'pasted' })).to.equal(1.23);
expect(parseNumber('1,23', { mode: 'pasted' })).to.equal(1.23);
expect(parseNumber('1 23', { mode: 'pasted' })).to.equal(123);
expect(parseNumber('1 234', { mode: 'pasted' })).to.equal(1234);
expect(parseNumber('1.2345', { mode: 'pasted' })).to.equal(1.2345);
expect(parseNumber('1,2345', { mode: 'pasted' })).to.equal(1.2345);
expect(parseNumber('1 2345', { mode: 'pasted' })).to.equal(12345);
expect(parseNumber('1.23456', { mode: 'pasted' })).to.equal(1.23456);
expect(parseNumber('1,23456', { mode: 'pasted' })).to.equal(1.23456);
expect(parseNumber('1 23456', { mode: 'pasted' })).to.equal(123456);
expect(parseNumber('1.234567', { mode: 'pasted' })).to.equal(1.234567);
expect(parseNumber('1,234567', { mode: 'pasted' })).to.equal(1.234567);
expect(parseNumber('1 234567', { mode: 'pasted' })).to.equal(1234567);
expect(parseNumber('123456,78', { mode: 'pasted' })).to.equal(123456.78);
expect(parseNumber('123456.78', { mode: 'pasted' })).to.equal(123456.78);
});
it('detects separators withLocale when "user-edit" mode used e.g. 123.456,78', async () => {
expect(parseNumber('123,456.78', { mode: 'auto' })).to.equal(123456.78);
expect(parseNumber('123,456.78', { mode: 'user-edit' })).to.equal(123456.78);
expect(parseNumber('123.456,78', { mode: 'auto' })).to.equal(123456.78);
expect(parseNumber('123.456,78', { mode: 'user-edit' })).to.equal(123.45678);
});
it('detects separators unparseable when there are 2 same ones e.g. 1.234.56', () => {
expect(parseNumber('1.234.56')).to.equal(123456);
expect(parseNumber('1,234,56')).to.equal(123456);
expect(parseNumber('1 234 56')).to.equal(123456);
});
it('uses heuristic to parse amount if there is only one separator e.g. 12.34 and amount of decimals is 2 or smaller', () => {
localizeManager.locale = 'en-GB';
expect(parseNumber('12.3')).to.equal(12.3);
expect(parseNumber('12,3')).to.equal(12.3);
expect(parseNumber('12.34')).to.equal(12.34);
expect(parseNumber('12,34')).to.equal(12.34);
localizeManager.locale = 'nl-NL';
expect(parseNumber('12.3')).to.equal(12.3);
expect(parseNumber('12,3')).to.equal(12.3);
expect(parseNumber('12.34')).to.equal(12.34);
expect(parseNumber('12,34')).to.equal(12.34);
});
it('uses locale to parse amount if there is only one separator e.g. 1.234 and amount of decimals is bigger then 2', () => {
localizeManager.locale = 'en-GB';
expect(parseNumber('1.234')).to.equal(1.234);
expect(parseNumber('1,234')).to.equal(1234);
expect(parseNumber('1.2345')).to.equal(1.2345);
expect(parseNumber('1,2345')).to.equal(12345);
localizeManager.locale = 'nl-NL';
expect(parseNumber('1.234')).to.equal(1234);
expect(parseNumber('1,234')).to.equal(1.234);
expect(parseNumber('1.2345')).to.equal(12345);
expect(parseNumber('1,2345')).to.equal(1.2345);
});
it('returns numbers only if it can not be interpreted e.g. 1.234.567', () => {
// impossible to interpret unambiguously even with locale knowledge
expect(parseNumber('1.234.567')).to.equal(1234567);
expect(parseNumber('1,234,567')).to.equal(1234567);
});
it('keeps only last separator for "broken" numbers like 1.23,4', () => {
expect(parseNumber('1.23,4')).to.equal(123.4);
expect(parseNumber('1,23.4')).to.equal(123.4);
expect(parseNumber('1 23,4')).to.equal(123.4);
expect(parseNumber('1 23.4')).to.equal(123.4);
});
it('ignores all non-number symbols (including currency)', () => {
expect(parseNumber('€ 1,234.56')).to.equal(1234.56);
expect(parseNumber('1,234.56 €')).to.equal(1234.56);
expect(parseNumber('EUR 1,234.56')).to.equal(1234.56);
expect(parseNumber('1,234.56 EUR')).to.equal(1234.56);
expect(parseNumber('Number is 1,234.56')).to.equal(1234.56);
});
describe('negative numbers', () => {
it('can get parsed', () => {
expect(parseNumber('-0')).to.equal(0);
expect(parseNumber('-1')).to.equal(-1);
expect(parseNumber('-1234')).to.equal(-1234);
expect(parseNumber('-1.234,5')).to.equal(-1234.5);
expect(parseNumber('-1,234.5')).to.equal(-1234.5);
expect(parseNumber('-1.234,5678')).to.equal(-1234.5678);
expect(parseNumber('-1,234.5678')).to.equal(-1234.5678);
});
it('parses different type of hypens', () => {
expect(parseNumber('-1')).to.equal(-1, 'Hypen');
expect(parseNumber('1')).to.equal(-1, 'Minus-Sign');
});
it('ignores all non-number symbols (including currency)', () => {
expect(parseNumber('€ -1,234.56')).to.equal(-1234.56);
expect(parseNumber('-€ 1,234.56')).to.equal(-1234.56);
expect(parseNumber('-1,234.56 €')).to.equal(-1234.56);
expect(parseNumber('EUR -1,234.56')).to.equal(-1234.56);
expect(parseNumber('-EUR 1,234.56')).to.equal(-1234.56);
expect(parseNumber('-1,234.56 EUR')).to.equal(-1234.56);
});
it('detects separators unparseable when there are 2 same ones e.g. -1.234.56', () => {
expect(parseNumber('-1.234.56')).to.equal(-123456);
expect(parseNumber('-1,234,56')).to.equal(-123456);
expect(parseNumber('-1 234 56')).to.equal(-123456);
});
});
it('ignores non-number characters and returns undefined', () => {
expect(parseNumber('A')).to.equal(undefined);
expect(parseNumber('EUR')).to.equal(undefined);
expect(parseNumber('EU R')).to.equal(undefined);
});
it('returns undefined when value is empty string', () => {
expect(parseNumber('')).to.equal(undefined);
});
it('with locale set and length is more than four', () => {
expect(
parseNumber('6,000', {
locale: 'en-GB',
}),
).to.equal(6000);
expect(
parseNumber('6.000', {
locale: 'es-ES',
}),
).to.equal(6000);
});
});