⚡ Zero-dependency plcbundle library exclusively for Bun
1import { describe, test, expect, beforeEach } from 'bun:test';
2import { parseProcessArgs, parseBundleSelection } from '../src/cmds/common';
3import { PLCBundle } from '../src/plcbundle';
4import { TEMP_DIR, createMockIndex } from './setup';
5
6describe('Common CLI Logic', () => {
7 describe('parseProcessArgs', () => {
8 test('parses positional arguments', () => {
9 const { values, positionals } = parseProcessArgs(['./detect.ts', '--threads', '4']);
10
11 expect(positionals[0]).toBe('./detect.ts');
12 expect(values.threads).toBe('4');
13 });
14
15 test('parses boolean flags', () => {
16 const { values } = parseProcessArgs(['./detect.ts', '--silent', '--flush']);
17
18 expect(values.silent).toBe(true);
19 expect(values.flush).toBe(true);
20 });
21
22 test('handles short flags', () => {
23 const { values } = parseProcessArgs(['./detect.ts', '-s']);
24
25 expect(values.s).toBe(true);
26 });
27 });
28
29 describe('parseBundleSelection', () => {
30 let bundle: PLCBundle;
31
32 beforeEach(async () => {
33 bundle = new PLCBundle(TEMP_DIR);
34 const mockIndex = createMockIndex();
35 await bundle.saveIndex(mockIndex);
36 });
37
38 test('defaults to all bundles', async () => {
39 const { start, end } = await parseBundleSelection({}, bundle);
40
41 expect(start).toBe(1);
42 expect(end).toBe(3); // From mock index
43 });
44
45 test('parses single bundle', async () => {
46 const { start, end } = await parseBundleSelection({ bundles: '2' }, bundle);
47
48 expect(start).toBe(2);
49 expect(end).toBe(2);
50 });
51
52 test('parses bundle range', async () => {
53 const { start, end } = await parseBundleSelection({ bundles: '1-3' }, bundle);
54
55 expect(start).toBe(1);
56 expect(end).toBe(3);
57 });
58
59 test('throws error for invalid range', async () => {
60 try {
61 await parseBundleSelection({ bundles: '1-999' }, bundle);
62 expect(true).toBe(false); // Should throw
63 } catch (error) {
64 expect(error).toBeDefined();
65 expect((error as Error).message).toContain('Invalid bundle range');
66 }
67 });
68
69 test('throws error for invalid format', async () => {
70 try {
71 await parseBundleSelection({ bundles: 'invalid' }, bundle);
72 expect(true).toBe(false); // Should throw
73 } catch (error) {
74 expect(error).toBeDefined();
75 }
76 });
77 });
78});