Files
openchamber/packages/vscode/src/workspaceResolver.test.js
T
Maksym Mospanenko 7b33805ea0 feat(vscode): support multi-root workspaces (#1493)
Add proper VS Code multi-root workspace support. New sessions now start in the workspace folder the user chooses instead of always using the first folder.

The VS Code sidebar now shows one shared flat session list for the currently opened workspace folders, keeps that list synced when folders are added or removed, and excludes sessions from worktrees unless that worktree is opened as a workspace folder.

Also keep the OpenCode server process independent from a specific workspace folder so changing the selected folder does not restart or interrupt existing sessions.
2026-06-10 23:58:40 +03:00

69 lines
2.3 KiB
JavaScript

import { describe, expect, test } from 'bun:test';
import { resolveWorkspaceFolders } from './workspaceResolver.ts';
const ALPHA = { name: 'alpha', uri: { fsPath: '/work/alpha' } };
const BRAVO = { name: 'Bravo', uri: { fsPath: '/work/bravo' } };
const CHARLIE = { name: 'Charlie', uri: { fsPath: '/work/charlie' } };
const ALPHA_DUP = { name: 'alpha-dup', uri: { fsPath: '/work/alpha' } };
const ALPHA_WITH_TRAILING = { name: 'alpha', uri: { fsPath: '/work/alpha///' } };
const BRAVO_WITH_TRAILING = { name: 'bravo', uri: { fsPath: '/work/bravo//' } };
describe('resolveWorkspaceFolders', () => {
describe('when the input is empty', () => {
test('returns an empty list without throwing', () => {
expect(resolveWorkspaceFolders([])).toEqual([]);
});
});
describe('when a single folder is provided', () => {
test('preserves its name and path', () => {
expect(resolveWorkspaceFolders([ALPHA])).toEqual([
{ name: 'alpha', path: '/work/alpha' },
]);
});
});
describe('when multiple folders are provided', () => {
test('returns them sorted alphabetically by name, case-insensitive', () => {
const result = resolveWorkspaceFolders([CHARLIE, ALPHA, BRAVO]);
expect(result.map((entry) => entry.name)).toEqual([
'alpha',
'Bravo',
'Charlie',
]);
});
});
describe('when folders share the same path', () => {
test('keeps only the first occurrence and discards duplicates by path', () => {
const result = resolveWorkspaceFolders([ALPHA, ALPHA_DUP, BRAVO]);
expect(result).toEqual([
{ name: 'alpha', path: '/work/alpha' },
{ name: 'Bravo', path: '/work/bravo' },
]);
});
});
describe('when paths contain trailing separators', () => {
test('strips them from every returned path', () => {
const result = resolveWorkspaceFolders([
ALPHA_WITH_TRAILING,
BRAVO_WITH_TRAILING,
]);
expect(result).toEqual([
{ name: 'alpha', path: '/work/alpha' },
{ name: 'bravo', path: '/work/bravo' },
]);
});
test('treats paths that differ only by trailing separators as the same folder', () => {
const result = resolveWorkspaceFolders([ALPHA_WITH_TRAILING, ALPHA_DUP]);
expect(result).toEqual([{ name: 'alpha', path: '/work/alpha' }]);
});
});
});