- fields/format.js has been renamed into fields/formatters.js - fields/parsers.js has been introduced - parsers and formatters from l10n/numbers have been moved to fields/parsers.js and fields/formatters.js - same for parseCurrency and formatCurrency, and they have been renamed into parse/formatMonetary - humanReadable option is now a boolean, no longer a function - formatPercentage implementation has been simplified thanks to that reorganization - tests have been reorganized accordingly
133 lines
5.4 KiB
JavaScript
133 lines
5.4 KiB
JavaScript
/** @odoo-module **/
|
|
|
|
import { defaultLocalization } from "../helpers/mock_services";
|
|
import {
|
|
parseFloat,
|
|
parseFloatTime,
|
|
parseInteger,
|
|
parsePercentage,
|
|
parseMonetary,
|
|
} from "@web/fields/parsers";
|
|
import { localization } from "@web/core/l10n/localization";
|
|
import { patchWithCleanup } from "../helpers/utils";
|
|
import { session } from "@web/session";
|
|
|
|
function expectInvalidNumberError(assert, func, value, options) {
|
|
let message = `${func.name} fails on value: "${value}"`;
|
|
if (options) {
|
|
message += ` with options: ${JSON.stringify(options)}`;
|
|
}
|
|
assert.throws(() => func(value, options), message);
|
|
}
|
|
|
|
QUnit.module("Fields", (hooks) => {
|
|
hooks.beforeEach(() => {
|
|
patchWithCleanup(localization, defaultLocalization);
|
|
});
|
|
|
|
QUnit.module("Parsers");
|
|
|
|
QUnit.test("parseFloat", async (assert) => {
|
|
assert.strictEqual(parseFloat(""), 0);
|
|
assert.strictEqual(parseFloat("0"), 0);
|
|
assert.strictEqual(parseFloat("100.00"), 100);
|
|
assert.strictEqual(parseFloat("-100.00"), -100);
|
|
assert.strictEqual(parseFloat("1,000.00"), 1000);
|
|
assert.strictEqual(parseFloat("1,000,000.00"), 1000000);
|
|
assert.strictEqual(parseFloat("1,234.567"), 1234.567);
|
|
expectInvalidNumberError(assert, parseFloat, "1.000.000");
|
|
|
|
patchWithCleanup(localization, { decimalPoint: ",", thousandsSep: "." });
|
|
assert.strictEqual(parseFloat("1.234,567"), 1234.567);
|
|
expectInvalidNumberError(assert, parseFloat, "1,000,000");
|
|
});
|
|
|
|
QUnit.test("parseFloatTime", function (assert) {
|
|
assert.strictEqual(parseFloatTime("0"), 0);
|
|
assert.strictEqual(parseFloatTime("100"), 100);
|
|
assert.strictEqual(parseFloatTime("100.00"), 100);
|
|
assert.strictEqual(parseFloatTime("7:15"), 7.25);
|
|
assert.strictEqual(parseFloatTime("-4:30"), -4.5);
|
|
assert.strictEqual(parseFloatTime(":"), 0);
|
|
assert.strictEqual(parseFloatTime("1:"), 1);
|
|
assert.strictEqual(parseFloatTime(":12"), 0.2);
|
|
|
|
expectInvalidNumberError(assert, parseFloatTime, "a:1");
|
|
expectInvalidNumberError(assert, parseFloatTime, "1:a");
|
|
expectInvalidNumberError(assert, parseFloatTime, "1:1:");
|
|
expectInvalidNumberError(assert, parseFloatTime, ":1:1");
|
|
});
|
|
|
|
QUnit.test("parseInteger", function (assert) {
|
|
assert.strictEqual(parseInteger(""), 0);
|
|
assert.strictEqual(parseInteger("0"), 0);
|
|
assert.strictEqual(parseInteger("100"), 100);
|
|
assert.strictEqual(parseInteger("-100"), -100);
|
|
assert.strictEqual(parseInteger("1,000"), 1000);
|
|
assert.strictEqual(parseInteger("1,000,000"), 1000000);
|
|
expectInvalidNumberError(assert, parseInteger, "1.000.000");
|
|
expectInvalidNumberError(assert, parseInteger, "1,234.567");
|
|
|
|
patchWithCleanup(localization, { decimalPoint: ",", thousandsSep: "." });
|
|
|
|
assert.strictEqual(parseInteger("1.000.000"), 1000000);
|
|
expectInvalidNumberError(assert, parseInteger, "1,000,000");
|
|
expectInvalidNumberError(assert, parseInteger, "1.234,567");
|
|
});
|
|
|
|
QUnit.test("parsePercentage", function (assert) {
|
|
assert.strictEqual(parsePercentage(""), 0);
|
|
assert.strictEqual(parsePercentage("0"), 0);
|
|
assert.strictEqual(parsePercentage("0.5"), 0.005);
|
|
assert.strictEqual(parsePercentage("1"), 0.01);
|
|
assert.strictEqual(parsePercentage("100"), 1);
|
|
assert.strictEqual(parsePercentage("50%"), 0.5);
|
|
expectInvalidNumberError(assert, parsePercentage, "50%40");
|
|
|
|
patchWithCleanup(localization, { decimalPoint: ",", thousandsSep: "." });
|
|
|
|
assert.strictEqual(parsePercentage("1.234,56"), 12.3456);
|
|
assert.strictEqual(parsePercentage("6,02"), 0.0602);
|
|
});
|
|
|
|
QUnit.test("parseMonetary", function (assert) {
|
|
assert.expect(17);
|
|
|
|
patchWithCleanup(session, {
|
|
currencies: {
|
|
1: {
|
|
digits: [69, 2],
|
|
position: "after",
|
|
symbol: "€",
|
|
},
|
|
3: {
|
|
digits: [69, 2],
|
|
position: "before",
|
|
symbol: "$",
|
|
},
|
|
},
|
|
});
|
|
|
|
assert.strictEqual(parseMonetary(""), 0);
|
|
assert.strictEqual(parseMonetary("0"), 0);
|
|
assert.strictEqual(parseMonetary("100.00 €"), 100);
|
|
assert.strictEqual(parseMonetary("-100.00"), -100);
|
|
assert.strictEqual(parseMonetary("1,000.00"), 1000);
|
|
assert.strictEqual(parseMonetary("1,000,000.00"), 1000000);
|
|
assert.strictEqual(parseMonetary("$ 125.00", { currencyId: 3 }), 125);
|
|
assert.strictEqual(parseMonetary("1,000.00 €", { currencyId: 1 }), 1000);
|
|
|
|
assert.throws(() => parseMonetary(" ", { currencyId: 3 }));
|
|
assert.throws(() => parseMonetary("1 ", { currencyId: 3 }));
|
|
assert.throws(() => parseMonetary(" 1", { currencyId: 3 }));
|
|
|
|
assert.throws(() => parseMonetary("12.00 €"));
|
|
assert.throws(() => parseMonetary("$ 12.00", { currencyId: 3 }));
|
|
assert.throws(() => parseMonetary("1 $", { currencyId: 1 }));
|
|
assert.throws(() => parseMonetary("$ 1")); // "€" is the default currency here
|
|
|
|
assert.throws(() => parseMonetary("1$ 1", { currencyId: 1 }));
|
|
assert.throws(() => parseMonetary("$ 12.00 34", { currencyId: 3 }));
|
|
});
|
|
});
|