@abaplint/transpiler 2.7.7 → 2.7.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/src/index.js +5 -5
- package/build/src/types.d.ts +1 -1
- package/build/src/unit_test.d.ts +3 -2
- package/build/src/unit_test.js +159 -44
- package/package.json +2 -2
package/build/src/index.js
CHANGED
|
@@ -33,17 +33,17 @@ class Transpiler {
|
|
|
33
33
|
return new Transpiler().run(reg);
|
|
34
34
|
}
|
|
35
35
|
async run(reg, progress) {
|
|
36
|
-
var _a, _b, _c, _d, _e
|
|
36
|
+
var _a, _b, _c, _d, _e;
|
|
37
37
|
reg.parse();
|
|
38
38
|
new keywords_1.Keywords((_a = this.options) === null || _a === void 0 ? void 0 : _a.keywords).handle(reg);
|
|
39
39
|
this.validate(reg);
|
|
40
40
|
const dbSetup = new db_1.DatabaseSetup(reg).run(this.options);
|
|
41
41
|
const output = {
|
|
42
42
|
objects: [],
|
|
43
|
-
unitTestScript: new unit_test_1.UnitTest().unitTestScript(reg, (_b = this.options) === null || _b === void 0 ? void 0 : _b.skip
|
|
44
|
-
unitTestScriptOpen: new unit_test_1.UnitTest().unitTestScriptOpen(reg, (
|
|
45
|
-
initializationScript: new unit_test_1.UnitTest().initializationScript(reg, dbSetup, (
|
|
46
|
-
initializationScript2: new unit_test_1.UnitTest().initializationScript(reg, dbSetup, (
|
|
43
|
+
unitTestScript: new unit_test_1.UnitTest().unitTestScript(reg, (_b = this.options) === null || _b === void 0 ? void 0 : _b.skip),
|
|
44
|
+
unitTestScriptOpen: new unit_test_1.UnitTest().unitTestScriptOpen(reg, (_c = this.options) === null || _c === void 0 ? void 0 : _c.skip),
|
|
45
|
+
initializationScript: new unit_test_1.UnitTest().initializationScript(reg, dbSetup, (_d = this.options) === null || _d === void 0 ? void 0 : _d.extraSetup),
|
|
46
|
+
initializationScript2: new unit_test_1.UnitTest().initializationScript(reg, dbSetup, (_e = this.options) === null || _e === void 0 ? void 0 : _e.extraSetup, true),
|
|
47
47
|
databaseSetup: dbSetup,
|
|
48
48
|
reg: reg,
|
|
49
49
|
};
|
package/build/src/types.d.ts
CHANGED
|
@@ -47,8 +47,8 @@ export interface ITranspilerOptions {
|
|
|
47
47
|
skipConstants?: boolean;
|
|
48
48
|
/** sets behavior for unknown types, either fail at compile- or run-time */
|
|
49
49
|
unknownTypes?: "compileError" | "runtimeError";
|
|
50
|
+
/** list of unit tests to skip */
|
|
50
51
|
skip?: TestMethodList;
|
|
51
|
-
only?: TestMethodList;
|
|
52
52
|
/** extra setup script to be executed during initialization */
|
|
53
53
|
extraSetup?: string;
|
|
54
54
|
/** list of keywords to rename, if not supplied default will be used */
|
package/build/src/unit_test.d.ts
CHANGED
|
@@ -8,8 +8,9 @@ export type TestMethodList = {
|
|
|
8
8
|
export declare class UnitTest {
|
|
9
9
|
initializationScript(reg: abaplint.IRegistry, dbSetup: DatabaseSetupResult, extraSetup?: string, useImport?: boolean): string;
|
|
10
10
|
private escapeNamespace;
|
|
11
|
-
unitTestScriptOpen(reg: abaplint.IRegistry, _skip?: TestMethodList
|
|
12
|
-
|
|
11
|
+
unitTestScriptOpen(reg: abaplint.IRegistry, _skip?: TestMethodList): string;
|
|
12
|
+
private getSortedTests;
|
|
13
|
+
unitTestScript(reg: abaplint.IRegistry, skip?: TestMethodList): string;
|
|
13
14
|
private buildImports;
|
|
14
15
|
private hasClassConstructor;
|
|
15
16
|
}
|
package/build/src/unit_test.js
CHANGED
|
@@ -44,7 +44,7 @@ export async function initializeABAP() {\n`;
|
|
|
44
44
|
// ES modules are resolved and cached as URLs. This means that special characters must be percent-encoded, such as # with %23 and ? with %3F.
|
|
45
45
|
return filename.replace(/\//g, "%23");
|
|
46
46
|
}
|
|
47
|
-
unitTestScriptOpen(reg, _skip
|
|
47
|
+
unitTestScriptOpen(reg, _skip) {
|
|
48
48
|
let ret = `/* eslint-disable curly */
|
|
49
49
|
import fs from "fs";
|
|
50
50
|
import path from "path";
|
|
@@ -99,7 +99,90 @@ run().then(() => {
|
|
|
99
99
|
});`;
|
|
100
100
|
return ret;
|
|
101
101
|
}
|
|
102
|
-
|
|
102
|
+
getSortedTests(reg) {
|
|
103
|
+
const tests = [];
|
|
104
|
+
for (const obj of reg.getObjects()) {
|
|
105
|
+
if (reg.isDependency(obj) || !(obj instanceof abaplint.Objects.Class)) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
const hasTestFile = obj.getFiles().some(f => { return f.getFilename().includes(".testclasses."); });
|
|
109
|
+
if (hasTestFile === false) {
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
for (const file of obj.getABAPFiles()) {
|
|
113
|
+
for (const def of file.getInfo().listClassDefinitions()) {
|
|
114
|
+
if (def.isForTesting === false
|
|
115
|
+
|| def.isGlobal === true
|
|
116
|
+
|| def.methods.length === 0
|
|
117
|
+
|| def.isAbstract === true) {
|
|
118
|
+
// todo, fix, there might be global test methods
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
const methods = [];
|
|
122
|
+
for (const m of def.methods) {
|
|
123
|
+
if (m.isForTesting === false) {
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
methods.push(m.name);
|
|
127
|
+
}
|
|
128
|
+
tests.push({
|
|
129
|
+
obj,
|
|
130
|
+
localClass: def.name,
|
|
131
|
+
riskLevel: def.riskLevel,
|
|
132
|
+
duration: def.duration,
|
|
133
|
+
methods: methods,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
const toNumber = (riskLevel, duration) => {
|
|
139
|
+
let int = 0;
|
|
140
|
+
switch (riskLevel) {
|
|
141
|
+
case abaplint.Info.RiskLevel.harmless:
|
|
142
|
+
int = 10;
|
|
143
|
+
break;
|
|
144
|
+
case abaplint.Info.RiskLevel.critical:
|
|
145
|
+
int = 20;
|
|
146
|
+
break;
|
|
147
|
+
case abaplint.Info.RiskLevel.dangerous:
|
|
148
|
+
int = 30;
|
|
149
|
+
break;
|
|
150
|
+
default:
|
|
151
|
+
break;
|
|
152
|
+
}
|
|
153
|
+
switch (duration) {
|
|
154
|
+
case abaplint.Info.Duration.short:
|
|
155
|
+
int += 1;
|
|
156
|
+
break;
|
|
157
|
+
case abaplint.Info.Duration.medium:
|
|
158
|
+
int += 2;
|
|
159
|
+
break;
|
|
160
|
+
case abaplint.Info.Duration.long:
|
|
161
|
+
int += 3;
|
|
162
|
+
break;
|
|
163
|
+
default:
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
return int;
|
|
167
|
+
};
|
|
168
|
+
tests.sort((a, b) => {
|
|
169
|
+
const ai = toNumber(a.riskLevel, a.duration);
|
|
170
|
+
const bi = toNumber(b.riskLevel, b.duration);
|
|
171
|
+
let ret = ai - bi;
|
|
172
|
+
if (ret === 0) {
|
|
173
|
+
// if risk and duration are equal, then sort by name
|
|
174
|
+
if (a.obj.getName() < b.obj.getName()) {
|
|
175
|
+
ret = -1;
|
|
176
|
+
}
|
|
177
|
+
else if (a.obj.getName() > b.obj.getName()) {
|
|
178
|
+
ret = 1;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
return ret;
|
|
182
|
+
});
|
|
183
|
+
return tests;
|
|
184
|
+
}
|
|
185
|
+
unitTestScript(reg, skip) {
|
|
103
186
|
let ret = `/* eslint-disable curly */
|
|
104
187
|
import fs from "fs";
|
|
105
188
|
import path from "path";
|
|
@@ -116,54 +199,86 @@ async function run() {
|
|
|
116
199
|
let locl;
|
|
117
200
|
let meth;
|
|
118
201
|
try {\n`;
|
|
119
|
-
for (const
|
|
120
|
-
if (reg.isDependency(obj) || !(obj instanceof abaplint.Objects.Class)) {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
202
|
+
for (const st of this.getSortedTests(reg)) {
|
|
123
203
|
ret += `// --------------------------------------------\n`;
|
|
124
|
-
ret += ` clas = unit.addObject("${obj.getName()}");\n`;
|
|
125
|
-
|
|
204
|
+
ret += ` clas = unit.addObject("${st.obj.getName()}");\n`;
|
|
205
|
+
ret += ` {
|
|
206
|
+
const {${st.localClass}} = await import("./${this.escapeNamespace(st.obj.getName().toLowerCase())}.${st.obj.getType().toLowerCase()}.testclasses.mjs");
|
|
207
|
+
locl = clas.addTestClass("${st.localClass}");
|
|
208
|
+
if (${st.localClass}.class_setup) await ${st.localClass}.class_setup();\n`;
|
|
209
|
+
for (const m of st.methods) {
|
|
210
|
+
const skipThis = (skip || []).some(a => a.object === st.obj.getName() && a.class === st.localClass && a.method === m);
|
|
211
|
+
if (skipThis) {
|
|
212
|
+
ret += ` console.log('${st.obj.getName()}: running ${st.localClass}->${m}, skipped');\n`;
|
|
213
|
+
ret += ` meth = locl.addMethod("${m}");\n`;
|
|
214
|
+
ret += ` meth.skip();\n`;
|
|
215
|
+
continue;
|
|
216
|
+
}
|
|
217
|
+
ret += ` {\n const test = await (new ${st.localClass}()).constructor_();\n`;
|
|
218
|
+
ret += ` if (test.setup) await test.setup();\n`;
|
|
219
|
+
ret += ` console.log("${st.obj.getName()}: running ${st.localClass}->${m}");\n`;
|
|
220
|
+
ret += ` meth = locl.addMethod("${m}");\n`;
|
|
221
|
+
ret += ` await test.${m}();\n`;
|
|
222
|
+
ret += ` meth.pass();\n`;
|
|
223
|
+
ret += ` if (test.teardown) await test.teardown();\n`;
|
|
224
|
+
ret += ` }\n`;
|
|
225
|
+
}
|
|
226
|
+
ret += ` if (${st.localClass}.class_teardown) await ${st.localClass}.class_teardown();\n`;
|
|
227
|
+
ret += ` }\n`;
|
|
228
|
+
}
|
|
229
|
+
/*
|
|
230
|
+
for (const obj of reg.getObjects()) {
|
|
231
|
+
if (reg.isDependency(obj) || !(obj instanceof abaplint.Objects.Class)) {
|
|
232
|
+
continue;
|
|
233
|
+
}
|
|
234
|
+
ret += `// --------------------------------------------\n`;
|
|
235
|
+
ret += ` clas = unit.addObject("${obj.getName()}");\n`;
|
|
236
|
+
for (const file of obj.getABAPFiles()) {
|
|
126
237
|
for (const def of file.getInfo().listClassDefinitions()) {
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
238
|
+
if (def.isForTesting === false
|
|
239
|
+
|| def.isGlobal === true
|
|
240
|
+
|| def.methods.length === 0
|
|
241
|
+
|| def.isAbstract === true) {
|
|
242
|
+
// todo, fix, there might be global test methods
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
const hasTestFile = obj.getFiles().some(f => { return f.getFilename().includes(".testclasses."); });
|
|
246
|
+
if (hasTestFile === false) {
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
ret += ` {
|
|
250
|
+
const {${def.name}} = await import("./${this.escapeNamespace(obj.getName().toLowerCase())}.${obj.getType().toLowerCase()}.testclasses.mjs");
|
|
251
|
+
locl = clas.addTestClass("${def.name}");
|
|
252
|
+
if (${def.name}.class_setup) await ${def.name}.class_setup();\n`;
|
|
253
|
+
|
|
254
|
+
for (const m of def.methods) {
|
|
255
|
+
if (m.isForTesting === false) {
|
|
256
|
+
continue;
|
|
133
257
|
}
|
|
134
|
-
const
|
|
135
|
-
if (
|
|
136
|
-
|
|
258
|
+
const skipThis = (skip || []).some(a => a.object === obj.getName() && a.class === def.name && a.method === m.name);
|
|
259
|
+
if (skipThis) {
|
|
260
|
+
ret += ` console.log('${obj.getName()}: running ${def.name}->${m.name}, skipped');\n`;
|
|
261
|
+
ret += ` meth = locl.addMethod("${m.name}");\n`;
|
|
262
|
+
ret += ` meth.skip();\n`;
|
|
263
|
+
continue;
|
|
137
264
|
}
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
continue;
|
|
152
|
-
}
|
|
153
|
-
ret += ` {\n const test = await (new ${def.name}()).constructor_();\n`;
|
|
154
|
-
ret += ` if (test.setup) await test.setup();\n`;
|
|
155
|
-
ret += ` console.log("${obj.getName()}: running ${def.name}->${m.name}");\n`;
|
|
156
|
-
ret += ` meth = locl.addMethod("${m.name}");\n`;
|
|
157
|
-
ret += ` await test.${m.name}();\n`;
|
|
158
|
-
ret += ` meth.pass();\n`;
|
|
159
|
-
ret += ` if (test.teardown) await test.teardown();\n`;
|
|
160
|
-
ret += ` }\n`;
|
|
161
|
-
}
|
|
162
|
-
ret += ` if (${def.name}.class_teardown) await ${def.name}.class_teardown();\n`;
|
|
163
|
-
ret += ` }\n`;
|
|
265
|
+
|
|
266
|
+
ret += ` {\n const test = await (new ${def.name}()).constructor_();\n`;
|
|
267
|
+
ret += ` if (test.setup) await test.setup();\n`;
|
|
268
|
+
ret += ` console.log("${obj.getName()}: running ${def.name}->${m.name}");\n`;
|
|
269
|
+
ret += ` meth = locl.addMethod("${m.name}");\n`;
|
|
270
|
+
ret += ` await test.${m.name}();\n`;
|
|
271
|
+
ret += ` meth.pass();\n`;
|
|
272
|
+
ret += ` if (test.teardown) await test.teardown();\n`;
|
|
273
|
+
ret += ` }\n`;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
ret += ` if (${def.name}.class_teardown) await ${def.name}.class_teardown();\n`;
|
|
277
|
+
ret += ` }\n`;
|
|
164
278
|
}
|
|
279
|
+
}
|
|
165
280
|
}
|
|
166
|
-
|
|
281
|
+
*/
|
|
167
282
|
ret += `// -------------------END-------------------
|
|
168
283
|
fs.writeFileSync(__dirname + path.sep + "_output.xml", unit.xUnitXML());
|
|
169
284
|
} catch (e) {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abaplint/transpiler",
|
|
3
|
-
"version": "2.7.
|
|
3
|
+
"version": "2.7.9",
|
|
4
4
|
"description": "Transpiler",
|
|
5
5
|
"main": "build/src/index.js",
|
|
6
6
|
"typings": "build/src/index.d.ts",
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"author": "abaplint",
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@abaplint/core": "^2.101.
|
|
32
|
+
"@abaplint/core": "^2.101.3",
|
|
33
33
|
"source-map": "^0.7.4"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|