From b3b28c2d2b529e06871a76ba3b2d70bfc80cc57c Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 15 Apr 2026 11:09:15 +0200 Subject: [PATCH 1/2] Fix flaky code lens test. --- .../src/test/vscode-suite/dsl.test.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 83c66c498..51bed5a4e 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -222,8 +222,15 @@ end it("code lens works", async function() { if (errorRecovery) { this.skip(); } const editor = await ide.openModule(TestWorkspace.picoFile); - const lens = await driver.wait(() => editor.getCodeLens("Rename variables a to b."), Delays.verySlow, "Rename lens should be available"); - await lens!.click(); + await driver.wait(async () => { + try { + const lens = await editor.getCodeLens("Rename variables a to b."); + await lens!.click(); + return true; + } catch (e) { + return false; + } + }, Delays.verySlow, "Rename lens should be available"); await ide.assertLineBecomes(editor, 9, "b := 2;", "a variable should be changed to b"); }); From 66aa5ba1f2674eb80bb50a163a5d59a8bff1013b Mon Sep 17 00:00:00 2001 From: Toine Hartman Date: Wed, 15 Apr 2026 13:26:02 +0200 Subject: [PATCH 2/2] Extract code lens clicking as utility. --- .../src/test/vscode-suite/dsl.test.ts | 10 +--------- .../src/test/vscode-suite/repl.test.ts | 11 +---------- .../src/test/vscode-suite/utils.ts | 16 +++++++++++----- 3 files changed, 13 insertions(+), 24 deletions(-) diff --git a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts index 51bed5a4e..61cfa60ed 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/dsl.test.ts @@ -222,15 +222,7 @@ end it("code lens works", async function() { if (errorRecovery) { this.skip(); } const editor = await ide.openModule(TestWorkspace.picoFile); - await driver.wait(async () => { - try { - const lens = await editor.getCodeLens("Rename variables a to b."); - await lens!.click(); - return true; - } catch (e) { - return false; - } - }, Delays.verySlow, "Rename lens should be available"); + await ide.clickCodeLens(editor, "Rename variables a to b.", Delays.verySlow, "Rename lens should be available"); await ide.assertLineBecomes(editor, 9, "b := 2;", "a variable should be changed to b"); }); diff --git a/rascal-vscode-extension/src/test/vscode-suite/repl.test.ts b/rascal-vscode-extension/src/test/vscode-suite/repl.test.ts index 011c95487..461b0f201 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/repl.test.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/repl.test.ts @@ -74,16 +74,7 @@ describe('REPL', function () { it("import module and run in terminal", async () => { const editor = await ide.openModule(TestWorkspace.libCallFile); - driver.wait(async () => { - try { - const lens = await ide.findCodeLens(editor, "Run in new Rascal terminal"); - await lens!.click(); - return true; - } catch (e) { - console.log("codelens clicking failed"); - return false; - } - }, Delays.slow, "Codelens for 'Run in new Rascal terminal'"); + await ide.clickCodeLens(editor, "Run in new Rascal terminal"); const repl = new RascalREPL(bench, driver); await repl.connect(); expect(repl.lastOutput).is.equal("5\nint: 0"); diff --git a/rascal-vscode-extension/src/test/vscode-suite/utils.ts b/rascal-vscode-extension/src/test/vscode-suite/utils.ts index a46aa8c4d..179a80f4d 100644 --- a/rascal-vscode-extension/src/test/vscode-suite/utils.ts +++ b/rascal-vscode-extension/src/test/vscode-suite/utils.ts @@ -29,7 +29,7 @@ import { assert, expect } from "chai"; import { stat, unlink } from "fs/promises"; import * as os from 'os'; import { env } from "process"; -import { BottomBarPanel, By, CodeLens, ContentAssist, EditorView, Key, Locator, TerminalView, TextEditor, VSBrowser, WebDriver, WebElement, WebElementCondition, Workbench, until } from "vscode-extension-tester"; +import { BottomBarPanel, By, ContentAssist, EditorView, Key, Locator, TerminalView, TextEditor, VSBrowser, WebDriver, WebElement, WebElementCondition, Workbench, until } from "vscode-extension-tester"; import path = require("path"); export async function sleep(ms: number) { @@ -428,10 +428,16 @@ export class IDEOperations { } } - - findCodeLens(editor: TextEditor, name: string, timeout = Delays.slow, message = `Cannot find code lens: ${name}`): Promise { - return this.driver.wait(() => ignoreFails(editor.getCodeLens(name)), timeout, message); - + async clickCodeLens(editor: TextEditor, name: string, timeout = Delays.slow, message = `Cannot click code lens: ${name}`): Promise { + await this.driver.wait(async () => { + try { + const lens = await editor.getCodeLens(name); + await lens!.click(); + return true; + } catch (_e) { + return false; + } + }, timeout, message); } statusContains(needle: string): () => Promise {