Files
JX-BPOS/packages/utils/__tests__/index.test.ts
T
JCAI Main AgentandClaude Opus 5 7cd664af3a M0: 工作区骨架 + 五道门禁 + 环境自举
- pnpm workspaces / tsconfig 双工程(node · web)/ 路径别名(§11.1)
- eslint flat(§11.3 + §12.5 可机检项)/ dependency-cruiser 基线八条 + JCAI 增补(§11.4)
- tools/module-tiers.json + gen-depcruise-tiers.ts 生成 tier-order 逐层规则
- tools/api-report.mjs 契约快照只留契约面(ADR-005)
- docker-compose(PG16)+ db/init 四 schema;种子数据五岗位五员工冻结为常量
- docs/debt.md · docs/adr/ADR-005

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KeDBx2PHLavbURXB8LJJ7m
2026-07-27 00:18:58 +08:00

32 lines
844 B
TypeScript

import { describe, expect, it } from 'vitest';
import { assertNever, groupBy, isDefined, sortedEntries } from '../src/index.ts';
describe('@utils', () => {
it('isDefined 滤掉 null 与 undefined', () => {
expect([1, null, 2, undefined].filter(isDefined)).toEqual([1, 2]);
});
it('groupBy 按键分组', () => {
const rows = [
{ pn: 'A', type: 'A' as const },
{ pn: 'B', type: 'B' as const },
{ pn: 'C', type: 'A' as const },
];
expect(groupBy(rows, (r) => r.type)).toEqual({
A: [rows[0], rows[2]],
B: [rows[1]],
});
});
it('sortedEntries 稳定排序', () => {
expect(sortedEntries({ b: 2, a: 1 })).toEqual([
['a', 1],
['b', 2],
]);
});
it('assertNever 抛错', () => {
expect(() => assertNever('x' as never)).toThrow('未覆盖的分支');
});
});