117 lines
4.8 KiB
JavaScript
117 lines
4.8 KiB
JavaScript
import { describe, it } from 'node:test';
|
|
import assert from 'node:assert';
|
|
import { resolveEffortLevel } from '../dist/effort.js';
|
|
|
|
describe('resolveEffortLevel', () => {
|
|
describe('stdin effort (future Claude Code support)', () => {
|
|
it('returns effort info when stdin provides effort level', () => {
|
|
const result = resolveEffortLevel('max');
|
|
assert.deepStrictEqual(result, { level: 'max', symbol: '●' });
|
|
});
|
|
|
|
it('normalizes effort level to lowercase', () => {
|
|
const result = resolveEffortLevel('HIGH');
|
|
assert.deepStrictEqual(result, { level: 'high', symbol: '◑' });
|
|
});
|
|
|
|
it('handles all known effort levels', () => {
|
|
assert.deepStrictEqual(resolveEffortLevel('low'), { level: 'low', symbol: '○' });
|
|
assert.deepStrictEqual(resolveEffortLevel('medium'), { level: 'medium', symbol: '◔' });
|
|
assert.deepStrictEqual(resolveEffortLevel('high'), { level: 'high', symbol: '◑' });
|
|
assert.deepStrictEqual(resolveEffortLevel('xhigh'), { level: 'xhigh', symbol: '◕' });
|
|
assert.deepStrictEqual(resolveEffortLevel('max'), { level: 'max', symbol: '●' });
|
|
});
|
|
|
|
it('wraps the reported level (not a hardcoded xhigh) when the marker is active', () => {
|
|
const result = resolveEffortLevel('max', { ultracodeActive: true });
|
|
assert.deepStrictEqual(result, { level: 'ultracode(max)', symbol: '●' });
|
|
});
|
|
|
|
it('annotates xhigh as ultracode(xhigh) when the transcript marker is active', () => {
|
|
const result = resolveEffortLevel('xhigh', { ultracodeActive: true });
|
|
assert.deepStrictEqual(result, { level: 'ultracode(xhigh)', symbol: '◕' });
|
|
});
|
|
|
|
it('keeps plain xhigh when the ultracode marker is inactive', () => {
|
|
const result = resolveEffortLevel('xhigh', { ultracodeActive: false });
|
|
assert.deepStrictEqual(result, { level: 'xhigh', symbol: '◕' });
|
|
});
|
|
|
|
it('keeps plain xhigh when no ultracode marker is present', () => {
|
|
const result = resolveEffortLevel('xhigh');
|
|
assert.deepStrictEqual(result, { level: 'xhigh', symbol: '◕' });
|
|
});
|
|
|
|
it('handles unknown future effort levels with empty symbol', () => {
|
|
const result = resolveEffortLevel('turbo');
|
|
assert.deepStrictEqual(result, { level: 'turbo', symbol: '' });
|
|
});
|
|
|
|
it('returns null when stdin effort is null', () => {
|
|
assert.strictEqual(resolveEffortLevel(null), null);
|
|
});
|
|
|
|
it('returns null when stdin effort is undefined', () => {
|
|
assert.strictEqual(resolveEffortLevel(undefined), null);
|
|
});
|
|
|
|
it('returns null for empty string', () => {
|
|
assert.strictEqual(resolveEffortLevel(''), null);
|
|
});
|
|
});
|
|
|
|
describe('stdin effort as object (Claude Code 2.1.115+ schema)', () => {
|
|
it('extracts level from object { level: "max" }', () => {
|
|
const result = resolveEffortLevel({ level: 'max' });
|
|
assert.deepStrictEqual(result, { level: 'max', symbol: '●' });
|
|
});
|
|
|
|
it('extracts and normalizes uppercase level from object', () => {
|
|
const result = resolveEffortLevel({ level: 'HIGH' });
|
|
assert.deepStrictEqual(result, { level: 'high', symbol: '◑' });
|
|
});
|
|
|
|
it('handles all known levels when wrapped in object', () => {
|
|
assert.deepStrictEqual(resolveEffortLevel({ level: 'low' }), { level: 'low', symbol: '○' });
|
|
assert.deepStrictEqual(resolveEffortLevel({ level: 'medium' }), { level: 'medium', symbol: '◔' });
|
|
assert.deepStrictEqual(resolveEffortLevel({ level: 'xhigh' }), { level: 'xhigh', symbol: '◕' });
|
|
});
|
|
|
|
it('annotates object xhigh as ultracode(xhigh) when the transcript marker is active', () => {
|
|
const result = resolveEffortLevel({ level: 'xhigh' }, { ultracodeActive: true });
|
|
assert.deepStrictEqual(result, { level: 'ultracode(xhigh)', symbol: '◕' });
|
|
});
|
|
|
|
it('tolerates extra fields in effort object (forward-compat)', () => {
|
|
const result = resolveEffortLevel({ level: 'max', budget: 32000, extra: 'ignored' });
|
|
assert.deepStrictEqual(result, { level: 'max', symbol: '●' });
|
|
});
|
|
|
|
it('returns null when object has no level field', () => {
|
|
assert.strictEqual(resolveEffortLevel({}), null);
|
|
});
|
|
|
|
it('returns null when object.level is null', () => {
|
|
assert.strictEqual(resolveEffortLevel({ level: null }), null);
|
|
});
|
|
|
|
it('returns null when object.level is not a string', () => {
|
|
assert.strictEqual(resolveEffortLevel({ level: 42 }), null);
|
|
});
|
|
});
|
|
|
|
describe('defensive handling of unexpected types (no crash)', () => {
|
|
it('returns null on numeric effort value', () => {
|
|
assert.strictEqual(resolveEffortLevel(42), null);
|
|
});
|
|
|
|
it('returns null on boolean effort value', () => {
|
|
assert.strictEqual(resolveEffortLevel(true), null);
|
|
});
|
|
|
|
it('returns null on array effort value', () => {
|
|
assert.strictEqual(resolveEffortLevel(['max']), null);
|
|
});
|
|
});
|
|
});
|