140 lines
4.1 KiB
TypeScript
140 lines
4.1 KiB
TypeScript
/**
|
|
* Tests for formatMovementPreviews
|
|
*/
|
|
|
|
import { describe, it, expect } from 'vitest';
|
|
import type { MovementPreview } from '../infra/config/loaders/pieceResolver.js';
|
|
import { formatMovementPreviews } from '../features/interactive/interactive.js';
|
|
|
|
describe('formatMovementPreviews', () => {
|
|
const basePreviews: MovementPreview[] = [
|
|
{
|
|
name: 'plan',
|
|
personaDisplayName: 'Planner',
|
|
personaContent: 'You are a planner.',
|
|
instructionContent: 'Create a plan for {task}',
|
|
allowedTools: ['Read', 'Glob', 'Grep'],
|
|
canEdit: false,
|
|
},
|
|
{
|
|
name: 'implement',
|
|
personaDisplayName: 'Coder',
|
|
personaContent: 'You are a coder.',
|
|
instructionContent: 'Implement the plan.',
|
|
allowedTools: ['Read', 'Edit', 'Bash'],
|
|
canEdit: true,
|
|
},
|
|
];
|
|
|
|
it('should format previews with English labels', () => {
|
|
const result = formatMovementPreviews(basePreviews, 'en');
|
|
|
|
expect(result).toContain('### 1. plan (Planner)');
|
|
expect(result).toContain('**Persona:**');
|
|
expect(result).toContain('You are a planner.');
|
|
expect(result).toContain('**Instruction:**');
|
|
expect(result).toContain('Create a plan for {task}');
|
|
expect(result).toContain('**Tools:** Read, Glob, Grep');
|
|
expect(result).toContain('**Edit:** No');
|
|
|
|
expect(result).toContain('### 2. implement (Coder)');
|
|
expect(result).toContain('**Tools:** Read, Edit, Bash');
|
|
expect(result).toContain('**Edit:** Yes');
|
|
});
|
|
|
|
it('should format previews with Japanese labels', () => {
|
|
const result = formatMovementPreviews(basePreviews, 'ja');
|
|
|
|
expect(result).toContain('### 1. plan (Planner)');
|
|
expect(result).toContain('**ペルソナ:**');
|
|
expect(result).toContain('**インストラクション:**');
|
|
expect(result).toContain('**ツール:** Read, Glob, Grep');
|
|
expect(result).toContain('**編集:** 不可');
|
|
expect(result).toContain('**編集:** 可');
|
|
});
|
|
|
|
it('should show "None" when no tools are allowed (English)', () => {
|
|
const previews: MovementPreview[] = [
|
|
{
|
|
name: 'step',
|
|
personaDisplayName: 'Agent',
|
|
personaContent: 'Agent persona',
|
|
instructionContent: 'Do something',
|
|
allowedTools: [],
|
|
canEdit: false,
|
|
},
|
|
];
|
|
|
|
const result = formatMovementPreviews(previews, 'en');
|
|
|
|
expect(result).toContain('**Tools:** None');
|
|
});
|
|
|
|
it('should show "なし" when no tools are allowed (Japanese)', () => {
|
|
const previews: MovementPreview[] = [
|
|
{
|
|
name: 'step',
|
|
personaDisplayName: 'Agent',
|
|
personaContent: 'Agent persona',
|
|
instructionContent: 'Do something',
|
|
allowedTools: [],
|
|
canEdit: false,
|
|
},
|
|
];
|
|
|
|
const result = formatMovementPreviews(previews, 'ja');
|
|
|
|
expect(result).toContain('**ツール:** なし');
|
|
});
|
|
|
|
it('should skip empty persona content', () => {
|
|
const previews: MovementPreview[] = [
|
|
{
|
|
name: 'step',
|
|
personaDisplayName: 'Agent',
|
|
personaContent: '',
|
|
instructionContent: 'Do something',
|
|
allowedTools: [],
|
|
canEdit: false,
|
|
},
|
|
];
|
|
|
|
const result = formatMovementPreviews(previews, 'en');
|
|
|
|
expect(result).not.toContain('**Persona:**');
|
|
expect(result).toContain('**Instruction:**');
|
|
});
|
|
|
|
it('should skip empty instruction content', () => {
|
|
const previews: MovementPreview[] = [
|
|
{
|
|
name: 'step',
|
|
personaDisplayName: 'Agent',
|
|
personaContent: 'Some persona',
|
|
instructionContent: '',
|
|
allowedTools: [],
|
|
canEdit: false,
|
|
},
|
|
];
|
|
|
|
const result = formatMovementPreviews(previews, 'en');
|
|
|
|
expect(result).toContain('**Persona:**');
|
|
expect(result).not.toContain('**Instruction:**');
|
|
});
|
|
|
|
it('should return empty string for empty array', () => {
|
|
const result = formatMovementPreviews([], 'en');
|
|
|
|
expect(result).toBe('');
|
|
});
|
|
|
|
it('should separate multiple previews with double newline', () => {
|
|
const result = formatMovementPreviews(basePreviews, 'en');
|
|
|
|
// Two movements should be separated by \n\n
|
|
const parts = result.split('\n\n### ');
|
|
expect(parts.length).toBe(2);
|
|
});
|
|
});
|