// tests/reward_core.test.mjs import { describe, it, expect, vi } from 'vitest'; import { runReward } from '../src/reward/reward_core.mjs'; describe('reward_core.mjs', () => { it('parses reward score from valid numeric output', async () => { const sample = { question: 'Q', context: [{ content: 'ctx' }], gen: { answer: 'A', raw: 'A' }, }; const provider = { generate: vi.fn(async () => '0.87\nHigh quality explanation'), }; const result = await runReward( { question: sample.question, context: sample.context, gen: sample.gen, }, provider, ); expect(result.score).toBeCloseTo(0.87, 5); expect(result.ok).toBe(true); }); it('handles invalid or missing score by falling back to 0 and ok=false', async () => { const sample = { question: 'Q', context: [{ content: 'ctx' }], gen: { answer: 'A', raw: 'A' }, }; const provider = { // no valid 0–1 number present generate: vi.fn(async () => 'no numeric score here\ntext'), }; const result = await runReward( { question: sample.question, context: sample.context, gen: sample.gen, }, provider, ); expect(result.score).toBe(0); expect(result.ok).toBe(false); }); it('treats score >= 0.5 as success and < 0.5 as failure', async () => { const sample = { question: 'Q', context: [{ content: 'ctx' }], gen: { answer: 'A', raw: 'A' }, }; const highProvider = { generate: vi.fn(async () => '0.9\nGreat answer'), }; const lowProvider = { generate: vi.fn(async () => '0.2\nWeak answer'), }; const high = await runReward( { question: sample.question, context: sample.context, gen: sample.gen, }, highProvider, ); const low = await runReward( { question: sample.question, context: sample.context, gen: sample.gen, }, lowProvider, ); expect(high.ok).toBe(true); expect(low.ok).toBe(false); }); });