@mixxtor/currencyx-js
Version:
Modern TypeScript currency converter with type inference and multiple providers (Google Finance, Fixer.io). Framework agnostic with clean architecture.
111 lines (97 loc) • 5.62 kB
text/typescript
import { describe, expect, it } from 'vitest'
import { GoogleFinanceExchange } from '../exchanges/index.js'
describe('Real-world Currency Rounding Corrections', () => {
const exchange = new GoogleFinanceExchange()
describe('VND - Vietnamese Dong (500 rounding)', () => {
it('should round to nearest 500 VND (cash transactions)', () => {
// VND: smallest coin is 100, but cash transactions round to 500
expect(exchange.roundMoney(79015.16, 'VND')).toBe(79000) // 79,015 → 79,000
expect(exchange.roundMoney(79250, 'VND')).toBe(79500) // 79,250 → 79,500
expect(exchange.roundMoney(79749, 'VND')).toBe(79500) // 79,749 → 79,500
expect(exchange.roundMoney(79750, 'VND')).toBe(80000) // 79,750 → 80,000
expect(exchange.roundMoney(24500, 'VND')).toBe(24500) // Exact 500
expect(exchange.roundMoney(24250, 'VND')).toBe(24500) // Rounds up
expect(exchange.roundMoney(24249, 'VND')).toBe(24000) // Rounds down
})
})
describe('KRW - South Korean Won (10 rounding)', () => {
it('should round to nearest 10 KRW (cash transactions)', () => {
// KRW is NOT a weak currency, just different denomination
// Cash transactions typically round to 10 won
expect(exchange.roundMoney(1234, 'KRW')).toBe(1230) // 1,234 → 1,230
expect(exchange.roundMoney(1235, 'KRW')).toBe(1240) // 1,235 → 1,240 (rounds up)
expect(exchange.roundMoney(1000, 'KRW')).toBe(1000) // Exact 10
expect(exchange.roundMoney(1005, 'KRW')).toBe(1010) // 1,005 → 1,010
expect(exchange.roundMoney(1004, 'KRW')).toBe(1000) // 1,004 → 1,000
expect(exchange.roundMoney(50000, 'KRW')).toBe(50000) // Large amounts
})
})
describe('IDR - Indonesian Rupiah (100 rounding)', () => {
it('should round to nearest 100 IDR (practical usage)', () => {
// IDR: smallest practical coin is 50-100, round to 100
expect(exchange.roundMoney(15350, 'IDR')).toBe(15400) // 15,350 → 15,400 (rounds up)
expect(exchange.roundMoney(15349, 'IDR')).toBe(15300) // 15,349 → 15,300 (rounds down)
expect(exchange.roundMoney(15450, 'IDR')).toBe(15500) // 15,450 → 15,500 (rounds up)
expect(exchange.roundMoney(15050, 'IDR')).toBe(15100) // 15,050 → 15,100
expect(exchange.roundMoney(15049, 'IDR')).toBe(15000) // 15,049 → 15,000
expect(exchange.roundMoney(100000, 'IDR')).toBe(100000) // Large notes
})
})
describe('KHR - Cambodian Riel (100 rounding)', () => {
it('should round to nearest 100 KHR (more reasonable than 1000)', () => {
// KHR: USD is commonly used, but when using KHR, 100 is more practical
expect(exchange.roundMoney(2350, 'KHR')).toBe(2400) // 2,350 → 2,400
expect(exchange.roundMoney(2349, 'KHR')).toBe(2300) // 2,349 → 2,300
expect(exchange.roundMoney(4050, 'KHR')).toBe(4100) // 4,050 → 4,100
expect(exchange.roundMoney(4000, 'KHR')).toBe(4000) // Exact 100
})
})
describe('LAK - Lao Kip (100 rounding)', () => {
it('should round to nearest 100 LAK (more reasonable than 1000)', () => {
// LAK: Very weak currency but 100 rounding is more practical
expect(exchange.roundMoney(8650, 'LAK')).toBe(8700) // 8,650 → 8,700
expect(exchange.roundMoney(8649, 'LAK')).toBe(8600) // 8,649 → 8,600
expect(exchange.roundMoney(12050, 'LAK')).toBe(12100) // 12,050 → 12,100
expect(exchange.roundMoney(10000, 'LAK')).toBe(10000) // Exact 100
})
})
describe('MMK - Myanmar Kyat (5 rounding)', () => {
it('should round to nearest 5 MMK (small denominations available)', () => {
// MMK: Small denominations exist, 5 kyat is reasonable
expect(exchange.roundMoney(1503, 'MMK')).toBe(1505) // 1,503 → 1,505
expect(exchange.roundMoney(1502, 'MMK')).toBe(1500) // 1,502 → 1,500
expect(exchange.roundMoney(2007, 'MMK')).toBe(2005) // 2,007 → 2,005
expect(exchange.roundMoney(2008, 'MMK')).toBe(2010) // 2,008 → 2,010
expect(exchange.roundMoney(1000, 'MMK')).toBe(1000) // Exact 5
})
})
describe('Real-world Examples', () => {
it('should demonstrate practical usage scenarios', () => {
// VND: Restaurant bill
expect(exchange.roundMoney(79015.16, 'VND')).toBe(79000) // Your original example
// KRW: Coffee shop (KRW is strong, not weak!)
expect(exchange.roundMoney(4500, 'KRW')).toBe(4500) // Exact 10 won
expect(exchange.roundMoney(4507, 'KRW')).toBe(4510) // Rounds to 10
// IDR: Market purchase
expect(exchange.roundMoney(25750, 'IDR')).toBe(25800) // Rounds to 100
// Currency strength context
// KRW ~1,300 per USD = not weak, just different scale
// VND ~24,000 per USD = genuinely weak
// JPY ~150 per USD = strong but no decimals used
})
})
describe('Economic Context Validation', () => {
it('should reflect real economic conditions', () => {
// Strong currencies with appropriate rounding
expect(exchange.roundMoney(1.234, 'USD')).toBe(1.23) // 0.01 standard
expect(exchange.roundMoney(1.234, 'EUR')).toBe(1.23) // 0.01 standard
expect(exchange.roundMoney(1.234, 'CHF')).toBe(1.25) // 0.05 Swiss style
// Weak currencies with larger rounding
expect(exchange.roundMoney(79015, 'VND')).toBe(79000) // 500 rounding
expect(exchange.roundMoney(25750, 'IDR')).toBe(25800) // 100 rounding
// Stable but different scale
expect(exchange.roundMoney(1507, 'KRW')).toBe(1510) // 10 rounding (NOT weak!)
expect(exchange.roundMoney(150.7, 'JPY')).toBe(151) // 1 rounding (strong)
})
})
})