import { describe, it, expect } from 'vitest';
import {
  formatNumber,
  formatCurrency,
  formatPercentage,
  formatCompactNumber,
} from '@/lib/utils/format';

describe('formatNumber', () => {
  it('formats integers with thousand separators', () => {
    expect(formatNumber(1234567)).toBe('1,234,567');
  });

  it('formats zero', () => {
    expect(formatNumber(0)).toBe('0');
  });

  it('formats negative numbers', () => {
    expect(formatNumber(-42000)).toBe('-42,000');
  });
});

describe('formatCurrency', () => {
  it('formats as USD with two decimals', () => {
    expect(formatCurrency(1234.5)).toBe('$1,234.50');
  });

  it('formats zero', () => {
    expect(formatCurrency(0)).toBe('$0.00');
  });

  it('rounds to two decimal places', () => {
    expect(formatCurrency(9.999)).toBe('$10.00');
  });
});

describe('formatPercentage', () => {
  it('converts a decimal ratio to a percentage string', () => {
    expect(formatPercentage(0.456)).toBe('45.6%');
  });

  it('formats zero', () => {
    expect(formatPercentage(0)).toBe('0.0%');
  });

  it('formats 100%', () => {
    expect(formatPercentage(1)).toBe('100.0%');
  });
});

describe('formatCompactNumber', () => {
  it('formats millions', () => {
    expect(formatCompactNumber(1234567)).toBe('1.2M');
  });

  it('formats thousands', () => {
    expect(formatCompactNumber(45600)).toBe('45.6K');
  });

  it('formats billions', () => {
    expect(formatCompactNumber(2_500_000_000)).toBe('2.5B');
  });

  it('returns plain number below 1000', () => {
    expect(formatCompactNumber(999)).toBe('999');
  });

  it('handles negative values', () => {
    expect(formatCompactNumber(-1500000)).toBe('-1.5M');
  });
});
