import { describe, it, expect } from 'vitest'
import { computeCycleHistogram, type CycleDatum } from '@/lib/lsc-workshop/cycle-histogram'

describe('computeCycleHistogram', () => {
  it('returns empty array when no data', () => {
    expect(computeCycleHistogram([], 5)).toEqual([])
  })

  it('buckets observed cycle times into bins of given width', () => {
    const data: CycleDatum[] = [
      { observed_ct_sec: 5 },
      { observed_ct_sec: 7 },
      { observed_ct_sec: 12 },
      { observed_ct_sec: 14 },
      { observed_ct_sec: 22 },
    ]
    const result = computeCycleHistogram(data, 5)
    expect(result.find((r) => r.bin_start === 5)?.count).toBe(2)
    expect(result.find((r) => r.bin_start === 10)?.count).toBe(2)
    expect(result.find((r) => r.bin_start === 20)?.count).toBe(1)
  })

  it('filters out null observed_ct_sec', () => {
    const data: CycleDatum[] = [
      { observed_ct_sec: null },
      { observed_ct_sec: 5 },
    ]
    const result = computeCycleHistogram(data, 5)
    expect(result.reduce((a, r) => a + r.count, 0)).toBe(1)
  })

  it('produces bin_label as "[start-end)"', () => {
    const data: CycleDatum[] = [{ observed_ct_sec: 3 }]
    const result = computeCycleHistogram(data, 5)
    expect(result[0].bin_label).toBe('0-5')
  })

  it('handles single value at exact bin boundary', () => {
    const data: CycleDatum[] = [{ observed_ct_sec: 10 }]
    const result = computeCycleHistogram(data, 5)
    expect(result.find((r) => r.bin_start === 10)?.count).toBe(1)
  })
})
