Javascript tester

This commit is contained in:
2025-08-06 13:21:37 -05:00
parent 2ef3cae6eb
commit 9d72732cfd
2 changed files with 71 additions and 0 deletions
+29
View File
@@ -1,8 +1,37 @@
import * as vscode from 'vscode';
import os from 'os';
import path from 'path';
import testCode from './tester';
let resetTimer = () => {}
const speedCodePath = path.join(os.homedir(), ".speed-code/");
export async function openAndFocusFile(filePath: string) {
const document = await vscode.workspace.openTextDocument(filePath);
await vscode.window.showTextDocument(document, { preview: false, preserveFocus: false });
}
const userCode = `
function isPalindrome(s) {
return s === s.split('').reverse().join('');
}
`;
export function activate(context: vscode.ExtensionContext) {
const [isValid, res] = testCode(userCode, [{
input: ["racecar"],
expected: true
},{
input: ["hello"],
expected: false
},{
input: ["madam"],
expected: true
},]);
vscode.window.showInformationMessage('Speedrun info: ' + JSON.stringify(res));
const statusBarItem = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left, 100);
statusBarItem.tooltip = 'Speedrun timer';
statusBarItem.text = "No active Speedrun";
+42
View File
@@ -0,0 +1,42 @@
import vm from 'vm';
import assert from 'assert';
export interface TestCase { input: any[], expected: any };
export interface TestResult extends TestCase { result: any, valid: boolean };
export default function testCode(code: string, testCases: TestCase[]): [boolean, TestResult[]] {
const context: Record<string, any> = {};
vm.createContext(context);
const beforeKeys = new Set(Object.keys(context));
const script = new vm.Script(code);
script.runInContext(context);
const afterKeys = Object.keys(context);
const newKeys = afterKeys.filter(k => !beforeKeys.has(k));
// Find the last function defined
const funcs = newKeys
.map(k => context[k])
.filter(v => typeof v === 'function');
if (funcs.length === 0) {
throw new Error("No function was defined in the code.");
}
const targetFn = funcs[funcs.length - 1];
const tests = testCases.map((t) => {
const result = targetFn(...t.input);
try {
assert.strictEqual(result, t.expected);
return { ...t, valid: true, result };
} catch {
return { ...t, valid: false, result };
}
});
return [tests.every(t => t), tests];
}