| import { describe, expect, test } from 'bun:test' |
| import { |
| drainFinalizeStateEvents, |
| selectSourceToolPool, |
| } from './sourceClaudeSessionAgent.js' |
| import type { FinalizeSubmissionState } from './finalizeSubmissionTool.js' |
|
|
| function tool(name: string) { |
| return { name } as never |
| } |
|
|
| describe('selectSourceToolPool', () => { |
| test('keeps the standard eval tools and removes TodoWrite noise', () => { |
| const selected = selectSourceToolPool( |
| [ |
| tool('Read'), |
| tool('Write'), |
| tool('Edit'), |
| tool('MultiEdit'), |
| tool('Glob'), |
| tool('Grep'), |
| tool('Bash'), |
| tool('TodoWrite'), |
| tool('Agent'), |
| ], |
| tool('finalize_submission'), |
| ) |
|
|
| expect(selected.map(item => item.name)).toEqual([ |
| 'Read', |
| 'Write', |
| 'Edit', |
| 'MultiEdit', |
| 'Glob', |
| 'Grep', |
| 'Bash', |
| 'finalize_submission', |
| ]) |
| }) |
| }) |
|
|
| describe('drainFinalizeStateEvents', () => { |
| test('emits a terminal finalize event as soon as validation has passed', () => { |
| const state: FinalizeSubmissionState = { |
| readyForJudge: true, |
| summary: 'ready', |
| files: ['outputs/case_000.npz'], |
| pendingEvents: [ |
| { |
| type: 'submission_validation_passed', |
| result: { |
| ok: true, |
| normalizedFiles: ['outputs/case_000.npz'], |
| issues: [], |
| }, |
| }, |
| ], |
| } |
|
|
| const drained = drainFinalizeStateEvents(state) |
|
|
| expect(drained.readyForJudge).toBe(true) |
| expect(drained.events.map(event => event.type)).toEqual([ |
| 'submission_validation_passed', |
| 'finalize', |
| ]) |
| expect(drained.events.at(-1)).toEqual({ |
| type: 'finalize', |
| summary: 'ready', |
| files: ['outputs/case_000.npz'], |
| }) |
| expect(state.pendingEvents).toEqual([]) |
| }) |
|
|
| test('does not emit finalize for recoverable validation feedback', () => { |
| const state: FinalizeSubmissionState = { |
| readyForJudge: false, |
| summary: '', |
| files: [], |
| pendingEvents: [ |
| { |
| type: 'submission_validation_failed', |
| result: { |
| ok: false, |
| normalizedFiles: [], |
| issues: [ |
| { |
| code: 'missing_output_file', |
| path: 'outputs/case_000.npz', |
| message: 'outputs/case_000.npz is missing', |
| }, |
| ], |
| }, |
| }, |
| ], |
| } |
|
|
| const drained = drainFinalizeStateEvents(state) |
|
|
| expect(drained.readyForJudge).toBe(false) |
| expect(drained.events.map(event => event.type)).toEqual([ |
| 'submission_validation_failed', |
| ]) |
| expect(state.pendingEvents).toEqual([]) |
| }) |
| }) |
|
|