You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

138 lines
4.3 KiB

import { describe, it, expect } from 'vitest';
import { createNumr } from '../numr_engine';
// =============================================================================
// NUMR — Formato de números
// =============================================================================
describe('createNumr', () => {
describe('defaultLocale', () => {
it('acepta una función como defaultLocale', () => {
let locale = 'es';
const numr = createNumr({}, () => locale);
expect(numr.f(1234.5)).toBe('1234,5');
locale = 'en';
expect(numr.f(1234.5)).toBe('1,234.5');
});
it('acepta un string como defaultLocale', () => {
const numr = createNumr({}, 'en');
expect(numr.f(1234.5)).toBe('1,234.5');
});
});
describe('f() — formato básico', () => {
it('formatea enteros en es', () => {
const numr = createNumr({}, 'es');
expect(numr.f(1000000)).toBe('1.000.000');
});
it('formatea enteros en en', () => {
const numr = createNumr({}, 'en');
expect(numr.f(1000000)).toBe('1,000,000');
});
it('formatea decimales en es', () => {
const numr = createNumr({}, 'es');
expect(numr.f(1234.56)).toBe('1234,56');
});
it('formatea decimales en en', () => {
const numr = createNumr({}, 'en');
expect(numr.f(1234.56)).toBe('1,234.56');
});
it('formatea en de (alemán)', () => {
const numr = createNumr({}, 'de');
expect(numr.f(1234.56)).toBe('1.234,56');
});
it('formatea cero', () => {
const numr = createNumr({}, 'es');
expect(numr.f(0)).toBe('0');
});
it('formatea números negativos', () => {
const numr = createNumr({}, 'es');
expect(numr.f(-1234.5)).toBe('-1234,5');
});
});
describe('f() — opciones de decimales', () => {
it('respeta minDecimals del constructor', () => {
const numr = createNumr({ minDecimals: 2 }, 'en');
expect(numr.f(1)).toBe('1.00');
expect(numr.f(1.5)).toBe('1.50');
});
it('respeta maxDecimals del constructor', () => {
const numr = createNumr({ maxDecimals: 0 }, 'en');
expect(numr.f(1234.56)).toBe('1,235');
});
it('admite opciones por llamada que sobreescriben el constructor', () => {
const numr = createNumr({ maxDecimals: 2 }, 'en');
expect(numr.f(1.5, { minDecimals: 2 })).toBe('1.50');
expect(numr.f(1234.5, { maxDecimals: 0 })).toBe('1,235');
});
it('admite locale por llamada que sobreescribe el defaultLocale', () => {
const numr = createNumr({}, 'es');
expect(numr.f(1234.5, {}, 'en')).toBe('1,234.5');
});
it('minDecimals 0 y maxDecimals 0 — sin decimales', () => {
const numr = createNumr({ minDecimals: 0, maxDecimals: 0 }, 'en');
expect(numr.f(1234.9)).toBe('1,235');
});
it('minDecimals 4 — fuerza 4 decimales', () => {
const numr = createNumr({ minDecimals: 4, maxDecimals: 4 }, 'en');
expect(numr.f(1.5)).toBe('1.5000');
});
});
describe('locale reactivo via función', () => {
it('responde a cambios de locale sin recrear el módulo', () => {
let locale = 'es';
const numr = createNumr({}, () => locale);
expect(numr.f(1234.56)).toContain(',56');
locale = 'en';
expect(numr.f(1234.56)).toContain('.56');
});
it('locale por llamada tiene prioridad sobre defaultLocale', () => {
let locale = 'es';
const numr = createNumr({}, () => locale);
expect(numr.f(1234.5, {}, 'de')).toBe('1.234,5');
});
});
describe('locales extendidos', () => {
it('acepta locales extendidos como es-MX', () => {
const numr = createNumr({}, 'es-MX');
expect(() => numr.f(1234.5)).not.toThrow();
});
it('formatea en ja (japonés)', () => {
const numr = createNumr({}, 'ja');
expect(numr.f(1234)).toBe('1,234');
});
});
});

Powered by TurnKey Linux.