You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
76 lines
2.8 KiB
TypeScript
76 lines
2.8 KiB
TypeScript
import { describe, it, expect } from 'vitest';
|
|
import { CmuxClient } from '../../src/bridge/cmux-client.js';
|
|
|
|
describe('CmuxClient', () => {
|
|
describe('parseTree', () => {
|
|
it('parses real cmux tree output with tree-drawing chars', () => {
|
|
const client = new CmuxClient();
|
|
const output = `window window:1 [current]
|
|
├── workspace workspace:1 "My Project" [selected]
|
|
│ ├── pane pane:2
|
|
│ │ ├── surface surface:2 [terminal] "zsh"
|
|
│ │ └── surface surface:13 [terminal] "node"
|
|
│ └── pane pane:3 [focused]
|
|
│ └── surface surface:4 [browser] "localhost"
|
|
└── workspace workspace:2 "Notes"
|
|
└── pane pane:6 [focused]
|
|
└── surface surface:6 [terminal] "vim" [selected]`;
|
|
|
|
const result = client.parseTree(output);
|
|
|
|
expect(result).toHaveLength(2);
|
|
expect(result[0].ref).toBe('workspace:1');
|
|
expect(result[0].name).toBe('My Project');
|
|
expect(result[0].panes).toHaveLength(2);
|
|
expect(result[0].panes[0].surfaces).toHaveLength(2);
|
|
expect(result[0].panes[0].surfaces[0].type).toBe('terminal');
|
|
expect(result[0].panes[0].surfaces[0].title).toBe('zsh');
|
|
expect(result[0].panes[1].surfaces[0].type).toBe('browser');
|
|
expect(result[0].panes[1].surfaces[0].title).toBe('localhost');
|
|
expect(result[1].panes[0].surfaces[0].title).toBe('vim');
|
|
});
|
|
|
|
it('handles empty output', () => {
|
|
const client = new CmuxClient();
|
|
expect(client.parseTree('')).toEqual([]);
|
|
});
|
|
|
|
it('handles workspace without quoted name', () => {
|
|
const client = new CmuxClient();
|
|
const output = `window window:1
|
|
├── workspace workspace:1 [selected]
|
|
│ └── pane pane:1
|
|
│ └── surface surface:1 [terminal] [selected]`;
|
|
|
|
const result = client.parseTree(output);
|
|
expect(result[0].name).toBeUndefined();
|
|
});
|
|
|
|
it('extracts titles with special characters', () => {
|
|
const client = new CmuxClient();
|
|
const output = `window window:1
|
|
└── workspace workspace:5 "✳ cmux-remote-plugin"
|
|
└── pane pane:9 [focused]
|
|
└── surface surface:14 [terminal] "⠂ cmux-remote-plugin" [selected]`;
|
|
|
|
const result = client.parseTree(output);
|
|
expect(result[0].name).toBe('✳ cmux-remote-plugin');
|
|
expect(result[0].panes[0].surfaces[0].title).toBe('⠂ cmux-remote-plugin');
|
|
});
|
|
});
|
|
|
|
describe('parseSurfaces', () => {
|
|
it('parses surface list', () => {
|
|
const client = new CmuxClient();
|
|
const output = `surface:1 [terminal] zsh
|
|
surface:2 [browser] localhost`;
|
|
|
|
const result = client.parseSurfaces(output);
|
|
expect(result).toHaveLength(2);
|
|
expect(result[0].ref).toBe('surface:1');
|
|
expect(result[0].type).toBe('terminal');
|
|
expect(result[1].type).toBe('browser');
|
|
});
|
|
});
|
|
});
|