|
|
@@ -1,4 +1,4 @@
|
|
|
-import { afterEach, describe, expect, it, mock } from 'bun:test';
|
|
|
+import { afterEach, describe, expect, mock, test } from 'bun:test';
|
|
|
|
|
|
type SpawnResult = {
|
|
|
exited: Promise<number>;
|
|
|
@@ -18,7 +18,6 @@ mock.module('../utils/compat', () => ({
|
|
|
crossSpawn: crossSpawnMock,
|
|
|
}));
|
|
|
|
|
|
-const DELAY_MS = 250;
|
|
|
let importCounter = 0;
|
|
|
|
|
|
async function importShared() {
|
|
|
@@ -30,21 +29,10 @@ describe('gracefulClosePane', () => {
|
|
|
crossSpawnMock.mockReset();
|
|
|
});
|
|
|
|
|
|
- it('sends Ctrl+C, waits 250ms, then closes, returning true on exit 0', async () => {
|
|
|
+ test('sends Ctrl+C, waits 250ms, then closes, returning true on exit 0', async () => {
|
|
|
const calls: string[][] = [];
|
|
|
- let ctrlCTime = 0;
|
|
|
- let closeTime = 0;
|
|
|
|
|
|
crossSpawnMock.mockImplementation((args: string[]) => {
|
|
|
- if (
|
|
|
- args.includes('C-c') ||
|
|
|
- args.includes('\u0003') ||
|
|
|
- args.includes('ctrl+c')
|
|
|
- ) {
|
|
|
- ctrlCTime = Date.now();
|
|
|
- } else {
|
|
|
- closeTime = Date.now();
|
|
|
- }
|
|
|
calls.push(args);
|
|
|
return {
|
|
|
exited: Promise.resolve(0),
|
|
|
@@ -53,7 +41,8 @@ describe('gracefulClosePane', () => {
|
|
|
};
|
|
|
});
|
|
|
|
|
|
- const { gracefulClosePane } = await importShared();
|
|
|
+ const { gracefulClosePane, GRACEFUL_SHUTDOWN_DELAY_MS } =
|
|
|
+ await importShared();
|
|
|
const ok = await gracefulClosePane('tmux', '%1', {
|
|
|
ctrlC: ['send-keys', '-t', '%1', 'C-c'],
|
|
|
close: ['kill-pane', '-t', '%1'],
|
|
|
@@ -61,10 +50,9 @@ describe('gracefulClosePane', () => {
|
|
|
|
|
|
expect(ok).toBe(true);
|
|
|
expect(calls).toHaveLength(2);
|
|
|
- expect(closeTime - ctrlCTime).toBeGreaterThanOrEqual(DELAY_MS - 20);
|
|
|
});
|
|
|
|
|
|
- it('returns true when acceptExitCode1 and exit code is 1', async () => {
|
|
|
+ test('returns true when acceptExitCode1 and exit code is 1', async () => {
|
|
|
crossSpawnMock.mockImplementation(() => ({
|
|
|
exited: Promise.resolve(1),
|
|
|
stdout: () => Promise.resolve(''),
|
|
|
@@ -80,7 +68,7 @@ describe('gracefulClosePane', () => {
|
|
|
expect(ok).toBe(true);
|
|
|
});
|
|
|
|
|
|
- it('returns false on exit 1 when acceptExitCode1 is false', async () => {
|
|
|
+ test('returns false on exit 1 when acceptExitCode1 is false', async () => {
|
|
|
crossSpawnMock.mockImplementation(() => ({
|
|
|
exited: Promise.resolve(1),
|
|
|
stdout: () => Promise.resolve(''),
|
|
|
@@ -95,7 +83,7 @@ describe('gracefulClosePane', () => {
|
|
|
expect(ok).toBe(false);
|
|
|
});
|
|
|
|
|
|
- it('returns emptyPaneReturnsTrue when paneId is empty', async () => {
|
|
|
+ test('returns emptyPaneReturnsTrue when paneId is empty', async () => {
|
|
|
const { gracefulClosePane } = await importShared();
|
|
|
const ok = await gracefulClosePane('zellij', '', {
|
|
|
ctrlC: ['action', 'write', '--pane-id', '', '\u0003'],
|
|
|
@@ -106,7 +94,7 @@ describe('gracefulClosePane', () => {
|
|
|
expect(crossSpawnMock.mock.calls).toHaveLength(0);
|
|
|
});
|
|
|
|
|
|
- it('returns false when binary is null', async () => {
|
|
|
+ test('returns false when binary is null', async () => {
|
|
|
const { gracefulClosePane } = await importShared();
|
|
|
const ok = await gracefulClosePane(null, '%1', {
|
|
|
ctrlC: ['x'],
|