import { describe, it, expect } from 'vitest'
import { parseHex, relativeLuminance, contrastRatio } from './color'

describe('parseHex', () => {
  it('parses #rgb and #rrggbb (case-insensitive), trims', () => {
    expect(parseHex('#fff')).toEqual([255, 255, 255])
    expect(parseHex('#000')).toEqual([0, 0, 0])
    expect(parseHex('  #1A2b3C ')).toEqual([0x1a, 0x2b, 0x3c])
  })
  it('FAIL-CLOSED: returns null for anything not hex (oklch/hsl/named/garbage)', () => {
    expect(parseHex('oklch(0.5 0.1 250)')).toBeNull()
    expect(parseHex('rgb(0,0,0)')).toBeNull()
    expect(parseHex('red')).toBeNull()
    expect(parseHex('#12')).toBeNull()
    expect(parseHex('#xyzxyz')).toBeNull()
    expect(parseHex('')).toBeNull()
  })
})

describe('WCAG-2.x contrast — pinned reference vectors', () => {
  it('black vs white == 21:1 exactly', () => {
    expect(contrastRatio([0, 0, 0], [255, 255, 255])).toBeCloseTo(21, 5)
  })
  it('identical colors == 1:1', () => {
    expect(contrastRatio([255, 255, 255], [255, 255, 255])).toBeCloseTo(1, 5)
  })
  it('order-independent (lighter/darker auto-detected)', () => {
    expect(contrastRatio([255, 255, 255], [0, 0, 0])).toBeCloseTo(21, 5)
  })
  it('#767676 on #ffffff is ~4.54 (PASSES the 4.5 boundary)', () => {
    const r = contrastRatio([0x76, 0x76, 0x76], [255, 255, 255])
    expect(r).toBeGreaterThanOrEqual(4.5)
    expect(r).toBeCloseTo(4.54, 1)
  })
  it('#777777 on #ffffff is ~4.48 (FAILS the 4.5 boundary)', () => {
    const r = contrastRatio([0x77, 0x77, 0x77], [255, 255, 255])
    expect(r).toBeLessThan(4.5)
  })
  it('relativeLuminance: white=1, black=0', () => {
    expect(relativeLuminance([255, 255, 255])).toBeCloseTo(1, 5)
    expect(relativeLuminance([0, 0, 0])).toBeCloseTo(0, 5)
  })
})
