harfizer
Version:
> **Convert numbers, dates, and times into words — in 7+ languages, with style.**
142 lines (141 loc) • 8.82 kB
JavaScript
"use strict";
/**
* @fileoverview
* This test suite verifies the functionality of the CoreConverter class
* in conjunction with the RussianLanguagePlugin. It checks conversion
* of numbers (including decimal and BigInt), dates (Gregorian), and times ("HH:mm").
* Various edge cases such as invalid formats, out-of-range values,
* custom separators, and custom words are also tested.
*/
Object.defineProperty(exports, "__esModule", { value: true });
const core_1 = require("../core");
const russianPlugin_1 = require("../plugins/russianPlugin");
describe("CoreConverter with RussianLanguagePlugin", () => {
let converter;
/**
* Creates a fresh instance of CoreConverter with RussianLanguagePlugin
* before each test to ensure test isolation.
*/
beforeEach(() => {
const russianPlugin = new russianPlugin_1.RussianLanguagePlugin();
converter = new core_1.CoreConverter(russianPlugin);
});
test("Convert positive number with decimal part (12345.67)", () => {
// Explanation:
// "12345" (after padding becomes "012345") splits into ["012", "345"]:
// "012" → 12 → "двенадцать" with scale[1]="тысяча" → "двенадцать тысяча"
// "345" → "триста сорок пять"
// Joined: "двенадцать тысяча триста сорок пять"
// Fractional part "67" → "шесть" and "семь", joined as "запятая шесть семь"
// Final expected result: "двенадцать тысяча триста сорок пять запятая шесть семь"
const result = converter.convertNumber(12345.67);
expect(result).toBe("двенадцать тысяча триста сорок пять запятая шесть семь");
});
test("Convert zero", () => {
// Zero should return "ноль".
const result = converter.convertNumber(0);
expect(result).toBe("ноль");
});
test("Convert negative number (-11)", () => {
// Expected: "минус одиннадцать"
const result = converter.convertNumber(-11);
expect(result).toBe("минус одиннадцать");
});
test("Use custom separator", () => {
// For 12345, expected tokens: ["двенадцать тысяча", "триста сорок пять"]
// Joined with " - " yields: "двенадцать тысяча - триста сорок пять"
const options = { customSeparator: " - " };
const result = converter.convertNumber(12345, options);
expect(result).toBe("двенадцать тысяча - триста сорок пять");
});
test("Dynamic configuration: custom negative and zero words", () => {
const customOptions = {
customNegativeWord: "минус_custom",
customZeroWord: "ноль_custom",
customSeparator: " - ",
};
const negativeResult = converter.convertNumber(-11, customOptions);
expect(negativeResult).toBe("минус_custom - одиннадцать");
const zeroResult = converter.convertNumber(0, customOptions);
expect(zeroResult).toBe("ноль_custom");
});
test("Convert triple number with convertTripleToWords (456)", () => {
// 456 → "четыреста пятьдесят шесть"
const result = converter.convertTripleToWords(456);
expect(result).toBe("четыреста пятьдесят шесть");
});
test("Convert triple number with convertTripleToWords (345)", () => {
// 345 → "триста сорок пять"
const result = converter.convertTripleToWords(345);
expect(result).toBe("триста сорок пять");
});
test('Process input with comma separators ("1,234,567.89")', () => {
// "1,234,567.89" → "1234567.89"
// Groups: ["1", "234", "567"]
// "1" → "один" with scale[2] ("миллион") → "один миллион"
// "234" → "двести тридцать четыре" with scale[1] ("тысяча") → "двести тридцать четыре тысяча"
// "567" → "пятьсот шестьдесят семь"
// Fractional part "89" → "восемь" and "девять" → "запятая восемь девять"
// Final expected: "один миллион двести тридцать четыре тысяча пятьсот шестьдесят семь запятая восемь девять"
const result = converter.convertNumber("1,234,567.89");
expect(result).toBe("один миллион двести тридцать четыре тысяча пятьсот шестьдесят семь запятая восемь девять");
});
test('Process input with space separators ("1 234 567.89")', () => {
const result = converter.convertNumber("1 234 567.89");
expect(result).toBe("один миллион двести тридцать четыре тысяча пятьсот шестьдесят семь запятая восемь девять");
});
test('Process input with dash separators ("1-2343-53123")', () => {
// "1-2343-53123" → "1234353123"
// Groups: ["1", "234", "353", "123"]
// "1" → "один" with scale[3] ("миллиард") → "один миллиард"
// "234" → "двести тридцать четыре" with scale[2] ("миллион") → "двести тридцать четыре миллион"
// "353" → "триста пятьдесят три" with scale[1] ("тысяча") → "триста пятьдесят три тысяча"
// "123" → "сто двадцать три"
// Final expected: "один миллиард двести тридцать четыре миллион триста пятьдесят три тысяча сто двадцать три"
const result = converter.convertNumber("1-2343-53123");
expect(result).toBe("один миллиард двести тридцать четыре миллион триста пятьдесят три тысяча сто двадцать три");
});
test("Convert using BigInt input", () => {
const bigIntInput = BigInt("123456789123456789");
expect(() => converter.convertNumber(bigIntInput)).not.toThrow();
const result = converter.convertNumber(bigIntInput);
expect(result.length).toBeGreaterThan(0);
});
test("Throw error for invalid input format", () => {
expect(() => converter.convertNumber("abc123")).toThrow("Error: Invalid input format.");
});
test("Throw error for out-of-range input", () => {
const outOfRangeInput = "1".repeat(67);
expect(() => converter.convertNumber(outOfRangeInput)).toThrow("Error: Out of range.");
});
describe("Date conversion", () => {
test("Convert Gregorian date to words (2023-04-05)", () => {
// For date "2023-04-05":
// Day "5" → "пять"
// Month 4 → "апреля" (genitive)
// Year 2023 → convertYear returns "две тысячи двадцать три"
// Expected: "пять апреля две тысячи двадцать три года"
const result = converter.convertDateToWords("2023-04-05", "gregorian");
expect(result).toBe("пять апреля две тысячи двадцать три года");
});
test("Convert Gregorian date to words using slash format (2023/04/05)", () => {
const result = converter.convertDateToWords("2023/04/05", "gregorian");
expect(result).toBe("пять апреля две тысячи двадцать три года");
});
});
describe("convertTimeToWords", () => {
test("should convert time '09:05' correctly", () => {
// 9 → "девять", 5 → "пять"; expected: "девять часов пять минут"
const result = converter.convertTimeToWords("09:05");
expect(result).toBe("девять часов пять минут");
});
test("should convert time '18:00' correctly", () => {
// 18 → "восемнадцать"; expected: "восемнадцать часов"
const result = converter.convertTimeToWords("18:00");
expect(result).toBe("восемнадцать часов");
});
test("should throw error for invalid time format", () => {
expect(() => converter.convertTimeToWords("9-05")).toThrow("Invalid time format. Expected format 'HH:mm'.");
});
});
});