import { test } from 'node:test' import assert from 'node:assert/strict' import { euro, parseEuro, grundpreisText } from '../server/services/shop/geld.js' const NB = ' ' test('euro formatiert ganze Cent deutsch mit geschuetztem Leerzeichen', () => { assert.equal(euro(123456), `1.234,56${NB}€`) assert.equal(euro(0), `0,00${NB}€`) assert.equal(euro(5), `0,05${NB}€`) assert.equal(euro(1250), `12,50${NB}€`) assert.equal(euro(100), `1,00${NB}€`) assert.equal(euro(99999999), `999.999,99${NB}€`) assert.equal(euro(100000000), `1.000.000,00${NB}€`) assert.equal(euro(-1250), `-12,50${NB}€`) assert.equal(euro(-5), `-0,05${NB}€`) }) test('euro lehnt Nicht-Ganzzahlen ab', () => { for (const v of [12.5, NaN, Infinity, '1250', null, undefined, {}]) { assert.throws(() => euro(v), TypeError) } }) test('parseEuro: gueltige Eingaben', () => { const faelle = [ [12.5, 1250], [12, 1200], [0, 0], [19.99, 1999], [0.1, 10], [1.005, null], ['12', 1200], ['12,5', 1250], ['12,50', 1250], ['12,50 €', 1250], [`12,50${NB}€`, 1250], [' 12,50 ', 1250], ['€ 12,50', 1250], ['1.234,56', 123456], ['1.234.567,00', null], ['1234,56', 123456], ['1234.56', 123456], ['12.5', 1250], ['1.23', 123], ['1.234', 123400], ['12.500', 1250000], ['0,99', 99], ['0', 0], ['007,5', 750], ['1000', 100000], ['100000', 10000000], ['100.000,00', 10000000], ['12.345,6', 1234560], ['99999,99', 9999999], ] for (const [eingabe, cent] of faelle) assert.equal(parseEuro(eingabe), cent, `parseEuro(${JSON.stringify(eingabe)})`) }) test('parseEuro: ungueltige Eingaben ergeben null', () => { const faelle = [ '', ' ', '€', 'abc', '12,5x', '-5', '-0,50', -5, NaN, Infinity, null, undefined, {}, [], '12,345', '1.2345', '1234.567', '12,', ',50', '1,2,3', '1..234,00', '1.23.456', '100000,01', 100000.01, '100001', 1e21, 0.30000000000000004, '12 50', '1 234,56', '1e3', ] for (const eingabe of faelle) assert.equal(parseEuro(eingabe), null, `parseEuro(${JSON.stringify(eingabe)})`) }) test('grundpreisText: Bezugsmengen und Format', () => { assert.equal(grundpreisText({ preisCent: 1250, menge: 750, einheit: 'g' }), `(16,67${NB}€ / 1 kg)`) assert.equal(grundpreisText({ preisCent: 1250, menge: 1, einheit: 'kg' }), `(12,50${NB}€ / 1 kg)`) assert.equal(grundpreisText({ preisCent: 299, menge: 500, einheit: 'ml' }), `(5,98${NB}€ / 1 l)`) assert.equal(grundpreisText({ preisCent: 299, menge: 0.75, einheit: 'l' }), `(3,99${NB}€ / 1 l)`) assert.equal(grundpreisText({ preisCent: 500, menge: 2, einheit: 'm' }), `(2,50${NB}€ / 1 m)`) assert.equal(grundpreisText({ preisCent: 1000, menge: 4, einheit: 'm2' }), `(2,50${NB}€ / 1 m²)`) }) test('grundpreisText: kaufmaennische Rundung ohne Gleitkommafehler', () => { // 1 / 8 = 0,125 -> 0,13 (halb auf) assert.equal(grundpreisText({ preisCent: 1, menge: 8, einheit: 'kg' }), `(0,00${NB}€ / 1 kg)`) assert.equal(grundpreisText({ preisCent: 5, menge: 8, einheit: 'kg' }), `(0,01${NB}€ / 1 kg)`) assert.equal(grundpreisText({ preisCent: 1005, menge: 2, einheit: 'kg' }), `(5,03${NB}€ / 1 kg)`) assert.equal(grundpreisText({ preisCent: 1001, menge: 2, einheit: 'l' }), `(5,01${NB}€ / 1 l)`) assert.equal(grundpreisText({ preisCent: 333, menge: 3, einheit: 'm' }), `(1,11${NB}€ / 1 m)`) assert.equal(grundpreisText({ preisCent: 1, menge: 1000, einheit: 'g' }), `(0,01${NB}€ / 1 kg)`) assert.equal(grundpreisText({ preisCent: 10, menge: 0.1, einheit: 'kg' }), `(1,00${NB}€ / 1 kg)`) assert.equal(grundpreisText({ preisCent: 3, menge: 0.3, einheit: 'l' }), `(0,10${NB}€ / 1 l)`) }) test('grundpreisText: fehlende oder ungueltige Angaben ergeben leeren Text', () => { const ok = { preisCent: 1250, menge: 750, einheit: 'g' } assert.equal(grundpreisText(), '') assert.equal(grundpreisText(null), '') assert.equal(grundpreisText({}), '') for (const aend of [ { menge: 0 }, { menge: -1 }, { menge: NaN }, { menge: Infinity }, { menge: '' }, { menge: null }, { menge: undefined }, { menge: 'abc' }, { einheit: 'stk' }, { einheit: 'KG' }, { einheit: '' }, { einheit: undefined }, { preisCent: 12.5 }, { preisCent: -1 }, { preisCent: undefined }, { preisCent: '1250' }, ]) { assert.equal(grundpreisText({ ...ok, ...aend }), '', JSON.stringify(aend)) } })