File size: 1,747 Bytes
21ad36a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import { describe, expect, it } from 'vitest';
import { parseReleasePromptMatrix } from './prompt-matrix';

function fixtures() {
  return [
    { id: 'a', messages: [{ role: 'user', content: 'A' }] },
    { id: 'b', messages: [{ role: 'user', content: 'B' }] },
    { id: 'c', messages: [{ role: 'user', content: 'C' }] },
    { id: 'd', messages: [{ role: 'user', content: 'D' }] },
    {
      id: 'multiturn',
      messages: [
        { role: 'system', content: 'Track facts.' },
        { role: 'user', content: 'One.' },
        { role: 'assistant', content: 'Noted.' },
        { role: 'user', content: 'Repeat.' },
      ],
    },
    {
      id: 'tool_call',
      messages: [{ role: 'user', content: 'Use memory.' }],
      tools: [{
        type: 'function',
        function: {
          name: 'memory',
          parameters: {
            type: 'object',
            properties: { key: { type: 'string' } },
            required: ['key'],
          },
        },
      }],
    },
  ];
}

describe('parseReleasePromptMatrix', () => {
  it('accepts the locked six-case shape with multi-turn and tool coverage', () => {
    const result = parseReleasePromptMatrix(fixtures());
    expect(result).toHaveLength(6);
    expect(result.at(-1)?.tools[0]?.function.name).toBe('memory');
  });

  it('rejects a matrix that only looks complete by count', () => {
    const value = fixtures().map((fixture) => ({ ...fixture, tools: undefined }));
    expect(() => parseReleasePromptMatrix(value)).toThrow(/tool-call case/);
  });

  it('rejects duplicate case ids', () => {
    const value = fixtures();
    value[1] = { ...value[1]!, id: 'a' };
    expect(() => parseReleasePromptMatrix(value)).toThrow(/Duplicate release prompt id/);
  });
});