Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Testing: basic coverage support #2369

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
2 changes: 1 addition & 1 deletion .vscode/launch.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@
"preLaunchTask": "${defaultBuildTask}",
"env": {
"base_testing": "true",
"specific": "encoding"
"specific": "tools"
}
},
{
Expand Down
143 changes: 143 additions & 0 deletions src/testing/coverage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,143 @@
import { TestSuite } from ".";

const IGNORE_METHODS = [`constructor`];

export class CoverageCollection {
private staticCollectors: CoverageCollector<any>[] = [];
private instanceCollectors: CoverageCollector<any>[] = [];

constructor() {}

addStaticCollector<T>(collector: CoverageCollector<T>) {
this.staticCollectors.push(collector);
}

addInstanceCollector<T>(collector: CoverageCollector<T>) {
this.instanceCollectors.push(collector);
}

clearInstances() {
this.instanceCollectors = [];
}

reset() {
for (const collector of this.staticCollectors) {
collector.reset();
}

for (const collector of this.instanceCollectors) {
collector.reset();
}
}

get() {
return [...this.staticCollectors, ...this.instanceCollectors];
}

addSuiteReferences(suites: TestSuite[]) {
this.reset();

for (const suite of suites) {
for (const testcase of suite.tests) {
for (const collector of [...this.staticCollectors, ...this.instanceCollectors]) {
const functionBody = testcase.test.toString();

const possibleReferences = collector.getMethods().filter(method => functionBody.includes(method));
for (const method of possibleReferences) {
collector.addSuiteReference(suite.name, testcase.name, method);
}
}
}
}
}
}

export interface CaptureDetail {count: number, usedInTests: {[suiteName: string]: string[]}};
export interface CapturedMethods { [key: string]: CaptureDetail };

export class CoverageCollector<T> {
private name: string = `Unknown`;
private methodNames: string[] = [];
private captured: CapturedMethods = {};
constructor(private instanceClass: T, options: { fixedName?: string, ignoredMethods?: string[] } = {}) {
if ('constructor' in (instanceClass as object)) {
this.name = (instanceClass as object).constructor.name;
}

const isObject = this.name === `Object`;
let methods = [];

if (isObject) {
// T is an object, so get a list of methods

if (!options.fixedName) {
throw new Error(`CoverageCollector: Object must have a fixed name`);
}

this.name = options.fixedName;
methods = Object.keys(instanceClass as object);
this.methodNames = methods.filter(prop => IGNORE_METHODS.includes(prop) === false && typeof instanceClass[prop as keyof T] === 'function');

} else {
// T is a class, so get a list of methods
methods = Object.getOwnPropertyNames(Object.getPrototypeOf(instanceClass));

this.methodNames = methods.filter(prop => IGNORE_METHODS.includes(prop) === false && typeof instanceClass[prop as keyof T] === 'function');
}

// Remove any ignored method names
if (options.ignoredMethods) {
this.methodNames = this.methodNames.filter(method => options.ignoredMethods!.includes(method) === false);
}

for (const func of this.methodNames) {
this.captured[func] = {count: 0, usedInTests: {}};
}

this.wrap();
}

getMethods() {
return this.methodNames;
}

addSuiteReference(suiteName: string, testName: string, method: string) {
if (this.captured[method]) {
if (!this.captured[method].usedInTests[suiteName]) {
this.captured[method].usedInTests[suiteName] = [];
}

this.captured[method].usedInTests[suiteName].push(testName);
}
}

private wrap() {
for (const method of this.methodNames) {
const original = (this.instanceClass as any)[method];
(this.instanceClass as any)[method] = (...args: any[]) => {
this.captured[method].count++;
return original.apply(this.instanceClass, args);
}
}
}

getName() {
return this.name;
}

reset() {
for (const method of this.methodNames) {
this.captured[method] = {count: 0, usedInTests: {}};
}
}

getPercentCoverage() {
const totalMethods = this.methodNames.length;
const capturedMethods = Object.keys(this.captured).filter(method => this.captured[method].count > 0).length;
return Math.round((capturedMethods / totalMethods) * 100);
}

getCoverage() {
return this.captured;
}
}
67 changes: 49 additions & 18 deletions src/testing/index.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,23 @@
import { env } from "process";
import vscode from "vscode";
import { instance } from "../instantiate";
import { ActionSuite } from "./action";
import { ComponentSuite } from "./components";
import { ConnectionSuite } from "./connection";
import { ContentSuite } from "./content";
import { DebugSuite } from "./debug";
import { ActionSuite } from "./suites/action";
import { ComponentSuite } from "./suites/components";
import { ConnectionSuite } from "./suites/connection";
import { ContentSuite } from "./suites/content";
import { DebugSuite } from "./suites/debug";
import { DeployToolsSuite } from "./deployTools";
import { EncodingSuite } from "./encoding";
import { FilterSuite } from "./filter";
import { ILEErrorSuite } from "./ileErrors";
import { SearchSuite } from "./search";
import { StorageSuite } from "./storage";
import { EncodingSuite } from "./suites/encoding";
import { FilterSuite } from "./suites/filter";
import { ILEErrorSuite } from "./suites/ileErrors";
import { SearchSuite } from "./suites/search";
import { StorageSuite } from "./suites/storage";
import { TestSuitesTreeProvider } from "./testCasesTree";
import { ToolsSuite } from "./tools";
import { ToolsSuite } from "./suites/tools";
import { Server } from "../typings";
import { CoverageCollection, CoverageCollector } from "./coverage";
import { Tools } from "../api/Tools";
import { Search } from "../api/Search";

const suites: TestSuite[] = [
ActionSuite,
Expand Down Expand Up @@ -68,17 +71,41 @@ const testSuitesSimultaneously = env.simultaneous === `true`;
const testIndividually = env.individual === `true`;
const testSpecific = env.specific;

let coverage = new CoverageCollection();

coverage.addStaticCollector(new CoverageCollector(Tools, {fixedName: `Tools`}));
coverage.addStaticCollector(new CoverageCollector(Search, {fixedName: `Search`}));

let testSuitesTreeProvider: TestSuitesTreeProvider;
export function initialise(context: vscode.ExtensionContext) {
if (testingEnabled) {
vscode.commands.executeCommand(`setContext`, `code-for-ibmi:testing`, true);
instance.subscribe(context, 'connected', 'Run tests', () => {
const connection = instance.getConnection();
if (connection) {
coverage.addInstanceCollector(new CoverageCollector(connection, {ignoredMethods: [`connect`, `disconnect`, `end`]}));
coverage.addInstanceCollector(new CoverageCollector(connection.content));
}

if (!testIndividually) {
instance.subscribe(context, 'connected', 'Run tests', () => configuringFixture ? console.log(`Not running tests as configuring fixture`) : runTests(testSuitesSimultaneously));
}
coverage.addSuiteReferences(suites);

testSuitesTreeProvider.refresh();

instance.subscribe(context, 'disconnected', 'Reset tests', resetTests);
testSuitesTreeProvider = new TestSuitesTreeProvider(suites);
if (!testIndividually) {
if (configuringFixture) {
console.log(`Not running tests as configuring fixture`);
} else {
runTests(testSuitesSimultaneously)
}
}
});

instance.subscribe(context, 'disconnected', 'Reset tests', () => {
coverage.clearInstances();
resetTests();
});

testSuitesTreeProvider = new TestSuitesTreeProvider(suites, coverage);
context.subscriptions.push(
vscode.window.createTreeView("testingView", { treeDataProvider: testSuitesTreeProvider, showCollapseAll: true }),
vscode.commands.registerCommand(`code-for-ibmi.testing.specific`, (suiteName: string, testName: string) => {
Expand Down Expand Up @@ -159,6 +186,9 @@ async function setupUserFixture(connectionName: string, fixture: ConnectionFixtu
}

async function runTests(simultaneously?: boolean) {
coverage.reset();
resetTests();

let nonConcurrentSuites: Function[] = [];
let concurrentSuites: Function[] = [];

Expand Down Expand Up @@ -244,7 +274,7 @@ async function runTest(test: TestCase) {
if (connection) {
console.log(`Running ${test.name}`);
test.status = "running";
testSuitesTreeProvider.refresh(test);
testSuitesTreeProvider.refresh();
const start = +(new Date());
try {
await test.test();
Expand All @@ -258,7 +288,7 @@ async function runTest(test: TestCase) {
}
finally {
test.duration = +(new Date()) - start;
testSuitesTreeProvider.refresh(test);
testSuitesTreeProvider.refresh();
}
} else {
test.status = undefined;
Expand All @@ -268,6 +298,7 @@ async function runTest(test: TestCase) {
}

function resetTests() {
coverage.reset();
suites.flatMap(ts => ts.tests).forEach(tc => {
tc.status = undefined;
tc.failure = undefined;
Expand Down
20 changes: 10 additions & 10 deletions src/testing/action.ts → src/testing/suites/action.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import assert from "assert";
import { existsSync } from "fs";
import vscode from "vscode";
import { TestSuite } from ".";
import { CompileTools } from "../api/CompileTools";
import { Tools } from "../api/Tools";
import { LocalLanguageActions } from "../api/local/LocalLanguageActions";
import { DeployTools } from "../api/local/deployTools";
import { getEnvConfig } from "../api/local/env";
import { getMemberUri, getUriFromPath } from "../filesystems/qsys/QSysFs";
import { instance } from "../instantiate";
import { Action, IBMiObject } from "../typings";
import { File, Folder, createFolder } from "./deployTools";
import { TestSuite } from "../.";
import { CompileTools } from "../../api/CompileTools";
import { Tools } from "../../api/Tools";
import { LocalLanguageActions } from "../../api/local/LocalLanguageActions";
import { DeployTools } from "../../api/local/deployTools";
import { getEnvConfig } from "../../api/local/env";
import { getMemberUri, getUriFromPath } from "../../filesystems/qsys/QSysFs";
import { instance } from "../../instantiate";
import { Action, IBMiObject } from "../../typings";
import { File, Folder, createFolder } from ".././deployTools";

export const helloWorldProject: Folder = {
name: `DeleteMe_${Tools.makeid()}`,
Expand Down
10 changes: 5 additions & 5 deletions src/testing/components.ts → src/testing/suites/components.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import assert from "assert";
import { TestSuite } from ".";
import { Tools } from "../api/Tools";
import { GetMemberInfo } from "../components/getMemberInfo";
import { GetNewLibl } from "../components/getNewLibl";
import { instance } from "../instantiate";
import { TestSuite } from "../.";
import { Tools } from "../../api/Tools";
import { GetMemberInfo } from "../../components/getMemberInfo";
import { GetNewLibl } from "../../components/getNewLibl";
import { instance } from "../../instantiate";

export const ComponentSuite: TestSuite = {
name: `Component tests`,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import assert from "assert";
import { TestSuite } from ".";
import { instance } from "../instantiate";
import { Tools } from "../api/Tools";
import { TestSuite } from "../.";
import { instance } from "../../instantiate";
import { Tools } from "../../api/Tools";

export const ConnectionSuite: TestSuite = {
name: `Connection tests`,
Expand Down
10 changes: 5 additions & 5 deletions src/testing/content.ts → src/testing/suites/content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import { posix } from "path";
import tmp from 'tmp';
import util, { TextDecoder } from 'util';
import { Uri, workspace } from "vscode";
import { TestSuite } from ".";
import { Tools } from "../api/Tools";
import { getMemberUri } from "../filesystems/qsys/QSysFs";
import { instance } from "../instantiate";
import { CommandResult, IBMiObject } from "../typings";
import { TestSuite } from "../.";
import { Tools } from "../../api/Tools";
import { getMemberUri } from "../../filesystems/qsys/QSysFs";
import { instance } from "../../instantiate";
import { CommandResult, IBMiObject } from "../../typings";

export const ContentSuite: TestSuite = {
name: `Content API tests`,
Expand Down
6 changes: 3 additions & 3 deletions src/testing/debug.ts → src/testing/suites/debug.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import assert from "assert";
import { TestSuite } from ".";
import { getJavaHome } from "../api/debug/config";
import { instance } from "../instantiate";
import { TestSuite } from "../.";
import { getJavaHome } from "../../api/debug/config";
import { instance } from "../../instantiate";

export const DebugSuite: TestSuite = {
name: `Debug engine tests`,
Expand Down
12 changes: 6 additions & 6 deletions src/testing/encoding.ts → src/testing/suites/encoding.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import assert from "assert";
import os from "os";
import { Uri, workspace } from "vscode";
import { TestSuite } from ".";
import IBMi from "../api/IBMi";
import { Tools } from "../api/Tools";
import { getMemberUri } from "../filesystems/qsys/QSysFs";
import { instance } from "../instantiate";
import { IBMiObject } from "../typings";
import { TestSuite } from "../.";
import IBMi from "../../api/IBMi";
import { Tools } from "../../api/Tools";
import { getMemberUri } from "../../filesystems/qsys/QSysFs";
import { instance } from "../../instantiate";
import { IBMiObject } from "../../typings";
import path from "path";

const contents = {
Expand Down
4 changes: 2 additions & 2 deletions src/testing/filter.ts → src/testing/suites/filter.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from "assert";
import { TestSuite } from ".";
import { parseFilter, singleGenericName } from "../api/Filter";
import { TestSuite } from "..";
import { parseFilter, singleGenericName } from "../../api/Filter";

const QSYSINCS = ["CMRPG", "DSQCOMMR", "ECACHCMD", "ECARTCMD", "ECHGPRF1", "ECHGRCV1", "ECHKPWD1", "ECLRMST", "ECRTPRF1", "EDBOPNDB", "EDCVARY", "EDLTKR", "EDLTPRF1", "EDLTPRF2", "EDLTRCV1", "EIM", "EIMGEPH", "EJOBNTFY", "EKICONR", "EMHDFTPG", "EMOOPTEP", "ENPSEP", "EOGDOCH", "EOK", "EOKDRSH1", "EOKDRSP", "EOKDRVF", "EPADSEL", "EPDTRCJB", "EPQMAPXT", "EPQXFORM", "EPWFSEP", "EQQQRYGV", "EQQQRYSV", "ERRNO", "ERSTPRF1", "ERWSCI", "ESCWCHT", "ESETMST", "ESOEXTPT", "ESPBLSEP", "ESPDQRCD", "ESPDRVXT", "ESPTRNXT", "ESPXPTS", "ESYDRAPP", "ESYRGAPP", "ESYUPDCA", "ESYUPDCU", "ETASTGEX", "ETATAPMG", "ETEPGMST", "ETEPSEPH", "ETGDEVEX", "ETNCMTRB", "ETOCSVRE", "ETRNKSF", "EUIAFEX", "EUIALCL", "EUIALEX", "EUICSEX", "EUICTEX", "EUIFKCL", "EUIGPEX", "EUIILEX", "EUIMICL", "EUITAEX", "EVLDPWD1", "EWCPRSEP", "EWCPWRD", "EZDAEP", "EZHQEP", "EZRCEP", "EZSCEP", "EZSOEP", "FCNTL", "ICONV", "IFS", "JNI", "PTHREAD", "QALRTVA", "QANE", "QBNCHGPD", "QBNLMODI", "QBNLPGMI", "QBNLSPGM", "QBNRMODI", "QBNRPII", "QBNRSPGM", "QC3CCI", "QCAPCMD", "QCAVFY", "QCDRCMDD", "QCDRCMDI", "QCLRPGMI", "QCST", "QCSTCFG", "QCSTCFG1", "QCSTCHT", "QCSTCRG1", "QCSTCRG3", "QCSTCRG4", "QCSTCTL", "QCSTCTL1", "QCSTCTL2", "QCSTDD", "QDBJRNL", "QDBLDBR", "QDBRJBRL", "QDBRPLAY", "QDBRRCDL", "QDBRTVFD", "QDBRTVSN", "QDBST", "QDCCCFGD", "QDCLCFGD", "QDCRCFGS", "QDCRCTLD", "QDCRDEVD", "QDCRLIND", "QDCRNWSD", "QDFRPRTA", "QDFRTVFD", "QDMLOPNF", "QDMRTVFO", "QEDCHGIN", "QEDRTVCI", "QESCPTFO", "QESRSRVA", "QEZCHBKL", "QEZCHBKS", "QEZLSGNU", "QEZOLBKL", "QEZRTBKD", "QEZRTBKH", "QEZRTBKO", "QEZRTBKS", "QFPADAP1", "QFPADOLD", "QFPADOLS", "QFPADOLU", "QFPADRNI", "QFPADRUA", "QFPRLNWS", "QFPRRNWS", "QFPZAAPI", "QFVLSTA", "QFVLSTNL", "QFVRTVCD", "QGLDPAPI", "QGLDUAPI", "QGY", "QGYFNDF", "QGYGTLE", "QGYOLAFP", "QGYOLJBL", "QGYOLJOB", "QGYOLMSG", "QGYOLOBJ", "QGYOLSPL", "QGYRATLO", "QGYRHRCM", "QGYRPRTA", "QGYRPRTL", "QGYRTVSJ", "QHF", "QHFLSTFS", "QHFRDDR", "QIMGAPII", "QITDRSTS", "QJOJRNENT", "QJORJIDI", "QJOSJRNE", "QJOURNAL", "QKRBSPNEGO", "QLEAWI", "QLG", "QLGLCL", "QLGRLNGI", "QLGRTVCD", "QLGRTVCI", "QLGRTVCT", "QLGRTVLI", "QLGRTVSS", "QLGSORT", "QLGSRTIO", "QLIJRNL", "QLIRLIBD", "QLP", "QLPINSLP", "QLPLPRDS", "QLPRAGR", "QLYWRTBI", "QLZA", "QLZAADDK", "QLZADDLI", "QLZAGENK", "QLZARTV", "QLZARTVK", "QMHCTLJL", "QMHLJOBL", "QMHLSTM", "QMHOLHST", "QMHQCDQ", "QMHQJRNL", "QMHQRDQD", "QMHRCVM", "QMHRCVPM", "QMHRDQM", "QMHRMFAT", "QMHRMQAT", "QMHRSNEM", "QMHRTVM", "QMHRTVRQ", "QMR", "QMRAP1", "QNMRCVDT", "QNMRGFN", "QNMRGTI", "QNMRRGF", "QOGRTVOE", "QOKDSPDP", "QOKSCHD", "QOLQLIND", "QOLRECV", "QOLSEND", "QOLSETF", "QP0LFLOP", "QP0LROR", "QP0LRRO", "QP0LSCAN", "QP0LSTDI", "QP0MSRTVSO", "QPASTRPT", "QPDETCPP", "QPDETCVT", "QPDETPOL", "QPDETRPD", "QPDETRTV", "QPDETSND", "QPDETWCH", "QPDSRVPG", "QPMAAPI", "QPMDCPRM", "QPMLPFRD", "QPMLPMGT", "QPQ", "QPQAPME", "QPQMAP", "QPQOLPM", "QPQRAFPI", "QPQRPME", "QPTRTVPO", "QPZCPYSV", "QPZCRTFX", "QPZGENNM", "QPZGROUP", "QPZLOGFX", "QPZLSTFX", "QPZRTVFX", "QQQQRY", "QRCVDTAQ", "QRZRRSI", "QRZSCHE", "QSCCHGCT", "QSCJOINT", "QSCRWCHI", "QSCRWCHL", "QSCRXMLI", "QSCSWCH", "QSNAPI", "QSOTLSA", "QSPBOPNC", "QSPBSEPP", "QSPEXTWI", "QSPGETSP", "QSPMOVJB", "QSPMOVSP", "QSPOLJBQ", "QSPOLOTQ", "QSPRILSP", "QSPRJOBQ", "QSPROUTQ", "QSPRWTRI", "QSPSETWI", "QSPSNDWM", "QSPSPLI", "QSQCHKS", "QSQGNDDL", "QSQPRCED", "QSR", "QSRLIB01", "QSRLSAVF", "QSRRSTO", "QSRSAVO", "QSXFTRPB", "QSXSRVPL", "QSY", "QSYDIGID", "QSYEIMAPI", "QSYJRNL", "QSYLATLO", "QSYLAUTU", "QSYLOBJA", "QSYLOBJP", "QSYLUSRA", "QSYOLUC", "QSYOLVLE", "QSYRAUTU", "QSYREG", "QSYRTVAI", "QSYRTVSA", "QSYRTVSE", "QSYRTVUA", "QSYRUPWD", "QSYRUSRA", "QSYRUSRI", "QSYSUPWD", "QSYUSRIN", "QSYVLDL", "QSZCRTPD", "QSZCRTPL", "QSZPKGPO", "QSZRTVPR", "QSZSLTPR", "QSZSPTPR", "QTACJMA", "QTACTLDV", "QTAFROBJ", "QTARCGYL", "QTARCTGF", "QTARCTGI", "QTARDCAP", "QTARDINF", "QTARDSTS", "QTARJMA", "QTARTLBL", "QTASCTGF", "QTECRTVS", "QTEDBGS", "QTEDBGSI", "QTEDMPV", "QTERTVPV", "QTES", "QTHMCTLT", "QTMMSNDM", "QTMSCRTSNM", "QTNADDCR", "QTNCHGCO", "QTNRCMTI", "QTNXADTP", "QTOBUPDT", "QTOCC4IF", "QTOCCVTI", "QTOCLPPJ", "QTOCNETSTS", "QTOCPPPAPI", "QTOOSPF1", "QTOQMONAPI", "QTQICONV", "QTRXRLRL", "QTRXRLSA", "QTRXRLSL", "QTVOPNVT", "QTWAIDSP", "QTWCHKSP", "QUHRHLPT", "QUS", "QUSADDUI", "QUSCUSAT", "QUSEC", "QUSGEN", "QUSLFLD", "QUSLJOB", "QUSLMBR", "QUSLOBJ", "QUSLRCD", "QUSLSPL", "QUSREG", "QUSRJOBI", "QUSRMBRD", "QUSROBJD", "QUSRSPLA", "QUSRUIAT", "QUSRUSAT", "QVOIRCLD", "QVOIRCLG", "QVTRMSTG", "QWCADJTM", "QWCATTR", "QWCCHGJP", "QWCCHGPL", "QWCCHGTN", "QWCCVTDT", "QWCJBITP", "QWCJRNL", "QWCLASBS", "QWCLOBJL", "QWCLSCDE", "QWCOLTHD", "QWCRCLSI", "QWCRDTAA", "QWCRIPLA", "QWCRJBLK", "QWCRLCKI", "QWCRLRQI", "QWCRNETA", "QWCRSSTS", "QWCRSVAL", "QWCRTVCA", "QWCRTVTM", "QWCRTVTZ", "QWDCSBSE", "QWDLSBSE", "QWDLSJBQ", "QWDRJOBD", "QWDRSBSD", "QWPZ", "QWPZTAFP", "QWSRTVOI", "QWTCHGJB", "QWTRMVJL", "QWTRTVPX", "QWTRTVTA", "QWTSETPX", "QWVOLACT", "QWVOLAGP", "QWVRCSTK", "QXDADBBK", "QXDAEDRS", "QYASPOL", "QYASRDI", "QYASRDMS", "QYASRTVDDD", "QYASSDMO", "QYCDCUSG", "QYCDRCUI", "QYCUCERTI", "QYDOCOMMON", "QYDORTVR", "QYPERPEX", "QYPSCOLL", "QYPSSRVS", "QZCACLT", "QZD", "QZDMMDTA", "QZIPUTIL", "QZLS", "QZLSCHSI", "QZLSLSTI", "QZLSOLST", "QZMF", "QZMFASRV", "QZNFNFSO", "QZNFRTVE", "SCHED", "SIGNAL", "SQL", "SQLCLI", "SQLENV", "SQLFP", "SQLSCDS", "SQLUDF", "SYSIPC", "SYSSEM", "SYSSTAT", "SYSTYPES", "TIME", "TRGBUF", "UNISTD"];

Expand Down
4 changes: 2 additions & 2 deletions src/testing/ileErrors.ts → src/testing/suites/ileErrors.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from "assert";
import { TestSuite } from ".";
import { parseErrors } from "../api/errors/parser";
import { TestSuite } from "../.";
import { parseErrors } from "../../api/errors/parser";

export const ILEErrorSuite: TestSuite = {
name: `ILE Error API tests`,
Expand Down
Loading
Loading