takt/src/__tests__/task-decomposer.test.ts
nrs a82d6d9d8a
github-issue-244 (#250)
* dist-tag 検証をリトライ付きに変更(npm レジストリの結果整合性対策)

* takt run 実行時に蓋閉じスリープを抑制

* takt: github-issue-244

* takt: #244/implement-parallel-subtasks
2026-02-12 11:51:34 +09:00

77 lines
2.3 KiB
TypeScript

import { describe, it, expect } from 'vitest';
import { parseParts } from '../core/piece/engine/task-decomposer.js';
describe('parseParts', () => {
it('最後のjsonコードブロックをパースする', () => {
const content = [
'説明',
'```json',
'[{"id":"old","title":"old","instruction":"old"}]',
'```',
'最終案',
'```json',
'[{"id":"a","title":"A","instruction":"Do A"},{"id":"b","title":"B","instruction":"Do B","timeout_ms":1200}]',
'```',
].join('\n');
const result = parseParts(content, 3);
expect(result).toHaveLength(2);
expect(result[0]).toEqual({
id: 'a',
title: 'A',
instruction: 'Do A',
timeoutMs: undefined,
});
expect(result[1]!.timeoutMs).toBe(1200);
});
it('jsonコードブロックがない場合はエラー', () => {
expect(() => parseParts('no json', 3)).toThrow(
'Team leader output must include a ```json ... ``` block',
);
});
it('max_partsを超えたらエラー', () => {
const content = '```json\n[{"id":"a","title":"A","instruction":"Do A"},{"id":"b","title":"B","instruction":"Do B"}]\n```';
expect(() => parseParts(content, 1)).toThrow(
'Team leader produced too many parts: 2 > 1',
);
});
it('必須フィールドが不足したらエラー', () => {
const content = '```json\n[{"id":"a","title":"A"}]\n```';
expect(() => parseParts(content, 3)).toThrow(
'Part[0] "instruction" must be a non-empty string',
);
});
it('jsonコードブロックが配列でない場合はエラー', () => {
const content = '```json\n{"not":"array"}\n```';
expect(() => parseParts(content, 3)).toThrow(
'Team leader JSON must be an array',
);
});
it('空配列の場合はエラー', () => {
const content = '```json\n[]\n```';
expect(() => parseParts(content, 3)).toThrow(
'Team leader JSON must contain at least one part',
);
});
it('重複したpart idがある場合はエラー', () => {
const content = [
'```json',
'[{"id":"dup","title":"A","instruction":"Do A"},{"id":"dup","title":"B","instruction":"Do B"}]',
'```',
].join('\n');
expect(() => parseParts(content, 3)).toThrow('Duplicate part id: dup');
});
});