-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathrepl.test.ts
More file actions
103 lines (90 loc) · 4.3 KB
/
repl.test.ts
File metadata and controls
103 lines (90 loc) · 4.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
* Copyright (c) 2018-2025, NWO-I CWI and Swat.engineering
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
import { expect } from 'chai';
import { VSBrowser, WebDriver, Workbench } from 'vscode-extension-tester';
import { TestWorkspace, RascalREPL, Delays, IDEOperations, printRascalOutputOnFailure } from './utils';
describe('REPL', function () {
let browser: VSBrowser;
let driver: WebDriver;
let bench: Workbench;
let ide: IDEOperations;
this.timeout(2 * Delays.extremelySlow);
printRascalOutputOnFailure('Rascal MPL');
before(async () => {
browser = VSBrowser.instance;
driver = browser.driver;
bench = new Workbench();
ide = new IDEOperations(browser);
await ide.load();
await ide.cleanup();
await browser.waitForWorkbench();
});
afterEach(async function () {
if (this.test?.title) {
await ide.screenshot("REPL-"+this.test?.title);
}
await bench.executeCommand("workbench.action.terminal.killAll");
await ide.cleanup();
});
it("should open without a project", async () => {
await new RascalREPL(bench, driver).start();
}).retries(2);
it("run basic rascal commands", async () => {
const repl = new RascalREPL(bench, driver);
await repl.start();
await repl.execute("40 + 2");
expect(repl.lastOutput).matches(/int.*42/, "Result of expression should be 42");
await repl.execute("import IO;");
await repl.execute('println("Printing works: <1 + 3>");');
expect(repl.lastOutput).is.equal("Printing works: 4\nok", "println works as expected");
});
it("import module and run in terminal", async () => {
const editor = await ide.openModule(TestWorkspace.libCallFile);
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");
}).timeout(Delays.extremelySlow * 3);
it("edit call module via repl", async() => {
const repl = new RascalREPL(bench, driver);
await repl.start();
await repl.execute(":edit demo::lang::pico::LanguageServer", true, Delays.extremelySlow);
await driver.wait(async () => await (await bench.getEditorView().getActiveTab())?.getTitle() === "LanguageServer.rsc", Delays.slow, "LanguageServer should be opened");
});
it("VFS works", async() => {
const repl = new RascalREPL(bench, driver);
await repl.start();
const baseLoc = '|rascal-vscode-test:///';
await repl.execute('import IO;');
await repl.execute(`writeFile(${baseLoc}test.txt|, "Hello World")`);
expect(repl.lastOutput).contains('ok', 'Write file should succeed');
await repl.execute(`${baseLoc}|.ls`);
expect(repl.lastOutput).contains('test.txt', 'File entry should be there');
await repl.execute(`readFile(${baseLoc}test.txt|)`);
expect(repl.lastOutput).contains('Hello World', 'File contents should be there');
});
});