From 6ba6ae06ce64193a009fe2dbc9d950ab9b565c7d Mon Sep 17 00:00:00 2001 From: gjsjohnmurray Date: Fri, 25 Jul 2025 15:39:05 +0100 Subject: [PATCH 1/2] Add `objectscript.unitTest.enabled` setting for better coexistence with other testing extensions --- package.json | 5 +++++ src/commands/unitTest.ts | 46 +++++++++++++++++++++++++++++++++++++--- src/extension.ts | 2 +- 3 files changed, 49 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 5a9549ba..4ac5f947 100644 --- a/package.json +++ b/package.json @@ -1526,6 +1526,11 @@ "type": "boolean", "default": true }, + "objectscript.unitTest.enabled": { + "description": "Controls whether the unit testing features are available.", + "type": "boolean", + "default": true + }, "objectscript.unitTest.relativeTestRoots": { "description": "Paths to where client-side test classes are stored. Relative to the workspace folder root.", "type": "array", diff --git a/src/commands/unitTest.ts b/src/commands/unitTest.ts index 3a0bbd32..421d4660 100644 --- a/src/commands/unitTest.ts +++ b/src/commands/unitTest.ts @@ -923,7 +923,27 @@ function configureHandler(): void { } /** Set up the `TestController` and all of its dependencies. */ -export function setUpTestController(): vscode.Disposable[] { +export function setUpTestController(context: vscode.ExtensionContext): vscode.Disposable[] { + // If currently disabled, just create a mechanism to activate when the setting changes + if (vscode.workspace.getConfiguration("objectscript.unitTest").get("enabled") === false) { + const disposablesWhenDisabled = [ + vscode.workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("objectscript.unitTest")) { + if (vscode.workspace.getConfiguration("objectscript.unitTest").get("enabled") === true) { + // Set myself up as active + const disposablesWhenEnabled = setUpTestController(context); + context.subscriptions.push(...disposablesWhenEnabled); + // Clean up after inactive state + disposablesWhenDisabled.forEach((disposable) => { + disposable.dispose(); + }); + return; + } + } + }), + ]; + return disposablesWhenDisabled; + } // Create and set up the test controller const testController = vscode.tests.createTestController(extensionId, "ObjectScript"); testController.resolveHandler = async (item?: vscode.TestItem) => { @@ -1049,8 +1069,8 @@ export function setUpTestController(): vscode.Disposable[] { return result; }; - // Register disposables - return [ + // Gather disposables + const disposables = [ testController, runProfile, debugProfile, @@ -1130,4 +1150,24 @@ export function setUpTestController(): vscode.Disposable[] { }) ), ]; + + return [ + ...disposables, + // Add a listener to disable myself if the setting changes + vscode.workspace.onDidChangeConfiguration((e) => { + if (e.affectsConfiguration("objectscript.unitTest")) { + if (vscode.workspace.getConfiguration("objectscript.unitTest").get("enabled") === false) { + // Remove my active self and clean up + testController.dispose(); + disposables.forEach((disposable) => { + disposable.dispose(); + }); + // Create a stub self that will reactivate when enabled again + const disposablesWhenEnabled = setUpTestController(context); + context.subscriptions.push(...disposablesWhenEnabled); + return; + } + } + }), + ]; } diff --git a/src/extension.ts b/src/extension.ts index 503a6898..42778935 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1856,7 +1856,7 @@ export async function activate(context: vscode.ExtensionContext): Promise { } } }), - ...setUpTestController(), + ...setUpTestController(context), vscode.commands.registerCommand("vscode-objectscript.reopenInLowCodeEditor", (uri: vscode.Uri) => { if (vscode.window.activeTextEditor?.document.uri.toString() == uri.toString()) { vscode.commands From e46b8bbabd55f33a5e609e4e3998bd9bc110d469 Mon Sep 17 00:00:00 2001 From: gjsjohnmurray Date: Fri, 1 Aug 2025 19:24:35 +0100 Subject: [PATCH 2/2] Add new setting to telemetry --- src/extension.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/extension.ts b/src/extension.ts index 42778935..9b1afc63 100644 --- a/src/extension.ts +++ b/src/extension.ts @@ -1918,6 +1918,7 @@ export async function activate(context: vscode.ExtensionContext): Promise { "config.autoPreviewXML": String(conf.get("autoPreviewXML")), "config.showGeneratedFileDecorations": String(conf.get("showGeneratedFileDecorations")), "config.showProposedApiPrompt": String(conf.get("showProposedApiPrompt")), + "config.unitTest.enabled": String(conf.get("unitTest.enabled")), }); sendWsFolderTelemetryEvent(vscode.workspace.workspaceFolders);