import { describe, it, expect } from 'vitest'
import { moneyFormatter, parseNumericInput } from '../format'

describe('moneyFormatter', () => {
  // Intl separates number and code with U+00A0 — normalize for comparison.
  const plain = (s: string) => s.replace(/ /g, ' ')

  it('formats de-DE currency with fallback for invalid codes', () => {
    expect(plain(moneyFormatter('EUR')(2.5))).toContain('2,50')
    // 'XYZ' is ISO-4217-shaped — Intl formats it directly.
    expect(plain(moneyFormatter('XYZ')(2.5))).toBe('2,50 XYZ')
    // syntactically invalid code → verbose fallback path
    expect(plain(moneyFormatter('N/A')(2.5))).toBe('2,5 N/A')
    expect(plain(moneyFormatter(null)(1))).toContain('1,00')
  })

  it('supports the signed variant used by delta displays', () => {
    expect(moneyFormatter('EUR', { signed: true })(2.5)).toContain('+')
    expect(moneyFormatter('EUR', { signed: true })(-1)).toContain('-')
  })
})

describe('parseNumericInput', () => {
  it('returns a finite number for valid input', () => {
    expect(parseNumericInput('2.5')).toBe(2.5)
    expect(parseNumericInput('0')).toBe(0)
    expect(parseNumericInput('-1.2')).toBe(-1.2)
  })

  it('returns null for empty or non-finite input (never NaN downstream)', () => {
    expect(parseNumericInput('')).toBeNull()
    expect(parseNumericInput('-')).toBeNull()
    expect(parseNumericInput('abc')).toBeNull()
    expect(parseNumericInput('1e999')).toBeNull()
  })

  it('tolerates in-progress decimals by parsing the committed part', () => {
    expect(parseNumericInput('0.')).toBe(0)
  })
})
