80 lines
4.2 KiB
JavaScript
80 lines
4.2 KiB
JavaScript
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))
|
||
}
|
||
})
|