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

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');
});
});
});