49 lines
1.5 KiB
TypeScript
49 lines
1.5 KiB
TypeScript
import { readFileSync } from "fs";
|
|
import { resolve } from "path";
|
|
import ExecutionController from "./execution-controller";
|
|
import { LanguageEngine } from "./types";
|
|
|
|
/**
|
|
* Read the entire contents of a test program.
|
|
* @param dirname Absolute path to directory containing program
|
|
* @param name Name of TXT file, without extension
|
|
* @returns Contents of file, as a \n-delimited string
|
|
*/
|
|
export const readTestProgram = (dirname: string, name: string): string => {
|
|
const path = resolve(dirname, name + ".txt");
|
|
return readFileSync(path, { encoding: "utf8" }).toString();
|
|
};
|
|
|
|
/**
|
|
* Run code on language engine and return final result.
|
|
* If error thrown, promise rejects with the error.
|
|
* @param engine Engine to use for execution
|
|
* @param code Source code to execute
|
|
* @param input STDIN input for execution
|
|
* @returns Final execution result object
|
|
*/
|
|
export const executeProgram = async <T>(
|
|
engine: LanguageEngine<T>,
|
|
code: string,
|
|
input: string = ""
|
|
): Promise<{ output: string; rendererState: T }> => {
|
|
const controller = new ExecutionController(engine);
|
|
controller.prepare(code, input);
|
|
return new Promise((resolve, reject) => {
|
|
try {
|
|
let output = "";
|
|
controller.executeAll({
|
|
interval: 0,
|
|
onResult: (res) => {
|
|
if (res.output) output += res.output;
|
|
if (res.nextStepLocation == null) {
|
|
resolve({ output, rendererState: res.rendererState });
|
|
}
|
|
},
|
|
});
|
|
} catch (error) {
|
|
reject(error);
|
|
}
|
|
});
|
|
};
|