1. 1/*jslint beta, node*/
2. 1import moduleFs from "fs";
3. 1import jslint from "./jslint.mjs";
4. 1
5. 1let {
6. 1 assertErrorThrownAsync,
7. 1 assertJsonEqual,
8. 1 assertOrThrow,
9. 1 debugInline,
10. 1 fsRmRecursive,
11. 1 fsWriteFileWithParents,
12. 1 jstestDescribe,
13. 1 jstestIt,
14. 1 jstestOnExit,
15. 1 noop,
16. 1 v8CoverageListMerge,
17. 1 v8CoverageReportCreate
18. 1} = jslint;
19. 1
20. 4function processExit0(exitCode) {
21. 4 assertOrThrow(exitCode === 0, exitCode);
22. 4}
23. 6function processExit1(exitCode) {
24. 6 assertOrThrow(exitCode === 1, exitCode);
25. 6}
26. 1
27. 1(function testCaseFsXxx() {
28. 1/*
29. 1 * this function will test fsXxx's handling-behavior
30. 1 */
31. 1 // test fsRmRecursive handling-behavior
32. 1 fsRmRecursive(".artifact/fsRmRecursive");
33. 1 fsRmRecursive(".artifact/fsRmRecursive", {
34. 1 process_version: "v12"
35. 1 });
36. 1 // test fsWriteFileWithParents handling-behavior
37. 1 (async function () {
38. 1 await fsRmRecursive(".tmp/fsWriteFileWithParents");
39. 1 await fsWriteFileWithParents(
40. 1 ".tmp/fsWriteFileWithParents/aa/bb/cc",
41. 1 "aa"
42. 1 );
43. 1 }());
44. 1}());
45. 1
46. 1(async function testCaseJslintCli() {
47. 1/*
48. 1 * this function will test jslint's cli handling-behavior
49. 1 */
50. 1 let packageJson = JSON.parse(
51. 1 await moduleFs.promises.readFile("package.json")
52. 1 );
53. 1 // test null-case handling-behavior
54. 1 jslint.jslint_cli({
55. 1 mode_noop: true,
56. 1 process_exit: processExit0
57. 1 });
58. 1 [
59. 1 ".", // test dir handling-behavior
60. 1 "jslint.mjs", // test file handling-behavior
61. 1 undefined // test file-undefined handling-behavior
62. 3 ].forEach(function (file) {
63. 3 jslint.jslint_cli({
64. 3 console_error: noop, // suppress error
65. 3 file,
66. 3 mode_cli: true,
67. 3 processEnv: {
68. 3 JSLINT_BETA: "1"
69. 3 },
70. 3 process_exit: processExit0
71. 3 });
72. 3 });
73. 1 // test apidoc handling-behavior
74. 1 jslint.jslint_cli({
75. 1 mode_cli: true,
76. 1 processArgv: [
77. 1 "node",
78. 1 "jslint.mjs",
79. 1 "jslint_apidoc=.artifact/apidoc.html",
80. 1 JSON.stringify({
81. 1 example_list: [
82. 1 "README.md",
83. 1 "test.mjs",
84. 1 "jslint.mjs"
85. 1 ],
86. 1 github_repo: "https://github.com/kaizhu256/v8-coverage-repo",
87. 1 module_list: [
88. 1 {
89. 1 pathname: "./v8_coverage_report.mjs"
90. 1 }
91. 1 ],
92. 1 package_name: "v8-coverage-report",
93. 1 version: "v" + packageJson.version
94. 1 })
95. 1 ],
96. 1 process_exit: processExit0
97. 1 });
98. 1 // test cjs handling-behavior
99. 1 jslint.jslint_cli({
100. 1 cjs_module: {
101. 1 exports: {}
102. 1 },
103. 1 cjs_require: {},
104. 1 process_exit: processExit0
105. 1 });
106. 1 // test file-error handling-behavior
107. 1 jslint.jslint_cli({
108. 1 // suppress error
109. 1 console_error: noop,
110. 1 file: "undefined",
111. 1 mode_cli: true,
112. 1 process_exit: processExit1
113. 1 });
114. 1 // test syntax-error handling-behavior
115. 1 jslint.jslint_cli({
116. 1 // suppress error
117. 1 console_error: noop,
118. 1 file: "syntax-error.js",
119. 1 mode_cli: true,
120. 1 option: {
121. 1 trace: true
122. 1 },
123. 1 process_exit: processExit1,
124. 1 source: "syntax error"
125. 1 });
126. 1 // test report handling-behavior
127. 1 jslint.jslint_cli({
128. 1 // suppress error
129. 1 console_error: noop,
130. 1 mode_cli: true,
131. 1 processArgv: [
132. 1 "node",
133. 1 "jslint.mjs",
134. 1 "jslint_report=.tmp/jslint_report.html",
135. 1 "jslint.mjs"
136. 1 ],
137. 1 process_exit: processExit0
138. 1 });
139. 1 // test report-error handling-behavior
140. 1 jslint.jslint_cli({
141. 1 // suppress error
142. 1 console_error: noop,
143. 1 mode_cli: true,
144. 1 processArgv: [
145. 1 "node",
146. 1 "jslint.mjs",
147. 1 "jslint_report=.tmp/jslint_report.html",
148. 1 "syntax-error.js"
149. 1 ],
150. 1 process_exit: processExit1,
151. 1 source: "syntax error"
152. 1 });
153. 1 // test report-json handling-behavior
154. 1 jslint.jslint_cli({
155. 1 // suppress error
156. 1 console_error: noop,
157. 1 mode_cli: true,
158. 1 processArgv: [
159. 1 "node",
160. 1 "jslint.mjs",
161. 1 "jslint_report=.tmp/jslint_report.html",
162. 1 "aa.json"
163. 1 ],
164. 1 process_exit: processExit0,
165. 1 source: "[]"
166. 1 });
167. 1 // test report-misc handling-behavior
168. 1 jslint.jslint_cli({
169. 1 // suppress error
170. 1 console_error: noop,
171. 1 mode_cli: true,
172. 1 processArgv: [
173. 1 "node",
174. 1 "jslint.mjs",
175. 1 "jslint_report=.tmp/jslint_report.html",
176. 1 "aa.js"
177. 1 ],
178. 1 process_exit: processExit1,
179. 1 source: "(aa)=>aa; function aa([aa]){}"
180. 1 });
181. 1 // test report-json-error handling-behavior
182. 1 jslint.jslint_cli({
183. 1 // suppress error
184. 1 console_error: noop,
185. 1 mode_cli: true,
186. 1 processArgv: [
187. 1 "node",
188. 1 "jslint.mjs",
189. 1 "jslint_report=.tmp/jslint_report.html",
190. 1 "aa.json"
191. 1 ],
192. 1 process_exit: processExit1,
193. 1 source: "["
194. 1 });
195. 1 // test plugin-vim handling-behavior
196. 1 jslint.jslint_cli({
197. 1 // suppress error
198. 1 console_error: noop,
199. 1 mode_cli: true,
200. 1 processArgv: [
201. 1 "node",
202. 1 "jslint.mjs",
203. 1 "jslint_plugin_vim",
204. 1 "syntax-error.js"
205. 1 ],
206. 1 process_exit: processExit1,
207. 1 source: "syntax error"
208. 1 });
209. 1}());
210. 1
211. 1(function testCaseJslintCodeValidate() {
212. 1/*
213. 1 * this function will validate each code is valid in jslint
214. 1 */
215. 1 Object.values({
216. 1 array: [
217. 1 "new Array(0);"
218. 1 ],
219. 1 async_await: [
220. 1 "async function aa() {\n await aa();\n}",
221. 1 (
222. 1 "async function aa() {\n"
223. 1 + " try {\n"
224. 1 + " aa();\n"
225. 1 + " } catch (err) {\n"
226. 1 + " await err();\n"
227. 1 + " }\n"
228. 1 + "}\n"
229. 1 ), (
230. 1 "async function aa() {\n"
231. 1 + " try {\n"
232. 1 + " await aa();\n"
233. 1 + " } catch (err) {\n"
234. 1 + " await err();\n"
235. 1 + " }\n"
236. 1 + "}\n"
237. 1 )
238. 1 ],
239. 1
240. 1// PR-351 - Add BigInt support.
241. 1
242. 1 bigint: [
243. 1 "let aa = 0b0n;\n",
244. 1 "let aa = 0o0n;\n",
245. 1 "let aa = 0x0n;\n",
246. 1 "let aa = BigInt(0n);\n",
247. 1 "let aa = typeof aa === \"bigint\";\n"
248. 1 ],
249. 1 date: [
250. 1 "Date.getTime();",
251. 1 "let aa = aa().getTime();",
252. 1 "let aa = aa.aa().getTime();"
253. 1 ],
254. 1 directive: [
255. 1 "#!\n/*jslint browser:false, node*/\n\"use strict\";",
256. 1 "/*property aa bb*/"
257. 1 ],
258. 1 fart: [
259. 1 "function aa() {\n return () => 0;\n}"
260. 1 ],
261. 1 for: [
262. 1 (
263. 1 "/*jslint for*/\n"
264. 1 + "function aa(bb) {\n"
265. 1 + " for (bb = 0; bb < 0; bb += 1) {\n"
266. 1 + " bb();\n"
267. 1 + " }\n"
268. 1 + "}\n"
269. 1 )
270. 1 ],
271. 1 jslint_disable: [
272. 1 "/*jslint-disable*/\n0\n/*jslint-enable*/"
273. 1 ],
274. 1 jslint_quiet: [
275. 1 "0 //jslint-quiet"
276. 1 ],
277. 1 json: [
278. 1 "{\"aa\":[[],-0,null]}"
279. 1 ],
280. 1 label: [
281. 1 (
282. 1 "function aa() {\n"
283. 1 + "bb:\n"
284. 1 + " while (true) {\n"
285. 1 + " if (true) {\n"
286. 1 + " break bb;\n"
287. 1 + " }\n"
288. 1 + " }\n"
289. 1 + "}\n"
290. 1 )
291. 1 ],
292. 1 loop: [
293. 1 "function aa() {\n do {\n aa();\n } while (aa());\n}"
294. 1 ],
295. 1 module: [
296. 1 "export default Object.freeze();",
297. 1 "import {aa, bb} from \"aa\";\naa(bb);",
298. 1 "import {} from \"aa\";",
299. 1 "import(\"aa\").then(function () {\n return;\n});",
300. 1 "let aa = 0;\nimport(aa).then(aa).then(aa).catch(aa).finally(aa);"
301. 1 ],
302. 1 number: [
303. 1 "let aa = 0.0e0;",
304. 1 "let aa = 0b0;",
305. 1 "let aa = 0o0;",
306. 1 "let aa = 0x0;"
307. 1 ],
308. 1 optional_chaining: [
309. 1 "let aa = aa?.bb?.cc;"
310. 1 ],
311. 1 param: [
312. 1 (
313. 1 "function aa({aa, bb}) {\n"
314. 1 + " return {aa, bb};\n"
315. 1 + "}\n"
316. 1 ), (
317. 1 "function aa({constructor}) {\n"
318. 1 + " return {constructor};\n"
319. 1 + "}\n"
320. 1 )
321. 1 ],
322. 1 property: [
323. 1 "let aa = aa[`!`];"
324. 1 ],
325. 1 regexp: [
326. 1 "function aa() {\n return /./;\n}",
327. 1 "let aa = /(?!.)(?:.)(?=.)/;",
328. 1 "let aa = /./gimuy;",
329. 1 "let aa = /[\\--\\-]/;"
330. 1 ],
331. 1 ternary: [
332. 1 (
333. 1 "let aa = (\n aa()\n ? 0\n : 1\n) "
334. 1 + "&& (\n aa()\n ? 0\n : 1\n);"
335. 1 ),
336. 1 "let aa = (\n aa()\n ? `${0}`\n : `${1}`\n);"
337. 1 ],
338. 1 try_catch: [
339. 1 (
340. 1 "let aa = 0;\n"
341. 1 + "try {\n"
342. 1 + " aa();\n"
343. 1 + "} catch (err) {\n"
344. 1 + " aa = err;\n"
345. 1 + "}\n"
346. 1 + "try {\n"
347. 1 + " aa();\n"
348. 1 + "} catch (err) {\n"
349. 1 + " aa = err;\n"
350. 1 + "}\n"
351. 1 + "aa();\n"
352. 1 )
353. 1 ],
354. 1 use_strict: [
355. 1 (
356. 1 "\"use strict\";\n"
357. 1 + "let aa = 0;\n"
358. 1 + "function bb() {\n"
359. 1 + " \"use strict\";\n"
360. 1 + " return aa;\n"
361. 1 + "}\n"
362. 1 )
363. 1 ],
364. 1 var: [
365. 1
366. 1// PR-363 - Bugfix - add test against false-warning
367. 1// <uninitialized 'bb'> in code '/*jslint node*/\nlet {aa:bb} = {}; bb();'
368. 1
369. 1 "/*jslint node*/\n",
370. 1 ""
371. 2 ].map(function (directive) {
372. 2 return [
373. 2 "let [\n aa, bb = 0\n] = 0;\naa();\nbb();",
374. 2 "let [...aa] = [...aa];\naa();",
375. 2 "let constructor = 0;\nconstructor();",
376. 2 "let {\n aa: bb\n} = 0;\nbb();",
377. 2 "let {\n aa: bb,\n bb: cc\n} = 0;\nbb();\ncc();",
378. 2 "let {aa, bb} = 0;\naa();\nbb();",
379. 2 "let {constructor} = 0;\nconstructor();"
380. 14 ].map(function (code) {
381. 14 return directive + code;
382. 14 });
383. 2 }).flat()
384. 22 }).forEach(function (codeList) {
385. 22 let elemPrv = "";
386. 56 codeList.forEach(function (code) {
387. 56 let warnings;
388. 56 // Assert codeList is sorted.
389. 56 assertOrThrow(elemPrv < code, JSON.stringify([
390. 56 elemPrv, code
391. 56 ], undefined, 4));
392. 56 elemPrv = code;
393. 56 warnings = jslint.jslint(code, {
394. 56 beta: true
395. 56 }).warnings;
396. 56 assertOrThrow(
397. 56 warnings.length === 0,
398. 56 JSON.stringify([code, warnings])
399. 56 );
400. 56 });
401. 22 });
402. 1}());
403. 1
404. 1(async function testCaseJslintOption() {
405. 1/*
406. 1 * this function will test jslint's option handling-behavior
407. 1 */
408. 1 let elemPrv = "";
409. 1 [
410. 1 [
411. 1 "let aa = aa | 0;", {bitwise: true}, []
412. 1 ], [
413. 1 ";\naa(new XMLHttpRequest());", {browser: true}, ["aa"]
414. 1 ], [
415. 1 "let aa = \"aa\" + 0;", {convert: true}, []
416. 1 ], [
417. 1 "registerType();", {couch: true}, []
418. 1 ], [
419. 1 "debugger;", {devel: true}, []
420. 1 ], [
421. 1 "new Function();\neval();", {eval: true}, []
422. 1 ], [
423. 1 (
424. 1 "function aa(aa) {\n"
425. 1 + " for (aa = 0; aa < 0; aa += 1) {\n"
426. 1 + " aa();\n"
427. 1 + " }\n"
428. 1 + "}\n"
429. 1 ), {for: true}, []
430. 1 ], [
431. 1 "let aa = {get aa() {\n return;\n}};", {getset: true}, []
432. 1 ], [
433. 1 "let aa = {set aa(aa) {\n return aa;\n}};", {getset: true}, []
434. 1 ], [
435. 1 String(
436. 1 await moduleFs.promises.readFile("jslint.mjs", "utf8")
437. 1 ).replace((
438. 1 / /g
439. 1 ), " "),
440. 1 {indent2: true},
441. 1 []
442. 1 ], [
443. 1 "function aa() {\n return;\n}", {indent2: true}, []
444. 1 ], [
445. 1 "/".repeat(100), {long: true}, []
446. 1 ], [
447. 1 "let aa = aa._;", {name: true}, []
448. 1 ], [
449. 1 "require();", {node: true}, []
450. 1 ], [
451. 1 "let aa = 'aa';", {single: true}, []
452. 1 ], [
453. 1 "let aa = this;", {this: true}, []
454. 1 ], [
455. 1 "", {trace: true}, []
456. 1 ], [
457. 1 (
458. 1 "function aa({bb, aa}) {\n"
459. 1 + " switch (aa) {\n"
460. 1 + " case 1:\n"
461. 1 + " break;\n"
462. 1 + " case 0:\n"
463. 1 + " break;\n"
464. 1 + " default:\n"
465. 1 + " return {bb, aa};\n"
466. 1 + " }\n"
467. 1 + "}\n"
468. 1 ), {unordered: true}, []
469. 1 ], [
470. 1 "let {bb, aa} = 0;", {unordered: true}, []
471. 1 ], [
472. 1 (
473. 1 "function aa() {\n"
474. 1 + " if (aa) {\n"
475. 1 + " let bb = 0;\n"
476. 1 + " return bb;\n"
477. 1 + " }\n"
478. 1 + "}\n"
479. 1 ), {variable: true}, []
480. 1 ], [
481. 1 "let bb = 0;\nlet aa = 0;", {variable: true}, []
482. 1 ], [
483. 1 "\t", {white: true}, []
484. 1 ]
485. 22 ].forEach(function ([
486. 22 source, option_dict, global_list
487. 22 ]) {
488. 22 let elemNow = JSON.stringify([
489. 22 option_dict, source, global_list
490. 22 ]);
491. 22 // Assert list is sorted.
492. 22 assertOrThrow(elemPrv < elemNow, JSON.stringify([
493. 22 elemPrv, elemNow
494. 22 ], undefined, 4));
495. 22 elemPrv = elemNow;
496. 22 option_dict.beta = true;
497. 22 // test jslint's option handling-behavior
498. 22 assertOrThrow(
499. 22 jslint.jslint(
500. 22 source,
501. 22 option_dict,
502. 22 global_list
503. 22 ).warnings.length === 0,
504. 22 "jslint.jslint(" + JSON.stringify([
505. 22 source, option_dict, global_list
506. 22 ]) + ")"
507. 22 );
508. 22 // test jslint's directive handling-behavior
509. 22 source = (
510. 22 "/*jslint " + JSON.stringify(option_dict).slice(1, -1).replace((
511. 22 /"/g
512. 22 ), "") + "*/\n"
513. 22 + (
514. 22 global_list.length === 0
515. 21 ? ""
516. 1 : "/*global " + global_list.join(",") + "*/\n"
517. 22 )
518. 22 + source.replace((
519. 22 /^#!/
520. 22 ), "//")
521. 22 );
522. 22 assertOrThrow(jslint.jslint(source).warnings.length === 0, source);
523. 22 });
524. 1 assertOrThrow(jslint.jslint("", {
525. 1 test_internal_error: true
526. 1 }).warnings.length === 1);
527. 1}());
528. 1
529. 1(async function testCaseJslintWarningsValidate() {
530. 1/*
531. 1 * this function will validate each jslint <warning> is raised with given
532. 1 * malformed <code>
533. 1 */
534. 1 String(
535. 1 await moduleFs.promises.readFile("jslint.mjs", "utf8")
536. 1 ).replace((
537. 1 /(\n\s*?\/\/\s*?test_cause:\s*?)(\S[\S\s]*?\S)(\n\n\s*?) *?\S/g
538. 327 ), function (match0, header, causeList, footer) {
539. 327 let tmp;
540. 327 // console.error(match0);
541. 327 // Validate header.
542. 327 assertOrThrow(header === "\n\n// test_cause:\n", match0);
543. 327 // Validate footer.
544. 327 assertOrThrow(footer === "\n\n", match0);
545. 327 // Validate causeList.
546. 327 causeList = causeList.replace((
547. 327 /^\/\/ /gm
548. 327 ), "").replace((
549. 327 /^\["\n([\S\s]*?)\n"(,.*?)$/gm
550. 45 ), function (ignore, source, param) {
551. 45 source = "[" + JSON.stringify(source) + param;
552. 45 assertOrThrow(source.length > (80 - 3), source);
553. 45 return source;
554. 45 }).replace((
555. 327 / \/\/jslint-quiet$/gm
556. 327 ), "");
557. 497 tmp = causeList.split("\n").map(function (cause) {
558. 497 return (
559. 497 "["
560. 2485 + JSON.parse(cause).map(function (elem) {
561. 2485 return JSON.stringify(elem);
562. 2485 }).join(", ")
563. 497 + "]"
564. 497 );
565. 497 }).sort().join("\n");
566. 327 assertOrThrow(causeList === tmp, "\n" + causeList + "\n\n" + tmp);
567. 497 causeList.split("\n").forEach(function (cause) {
568. 497 cause = JSON.parse(cause);
569. 497 tmp = jslint.jslint(cause[0], {
570. 497 beta: true,
571. 497 test_cause: true
572. 497 }).causes;
573. 497 // Validate cause.
574. 497 assertOrThrow(
575. 497 tmp[JSON.stringify(cause.slice(1))],
576. 497 (
577. 497 "\n" + JSON.stringify(cause) + "\n\n"
578. 497 + Object.keys(tmp).sort().join("\n")
579. 497 )
580. 497 );
581. 497 });
582. 327 return "";
583. 327 });
584. 1}());
585. 1
586. 1(async function testCaseMisc() {
587. 1/*
588. 1 * this function will test misc handling-behavior
589. 1 */
590. 1 // test debugInline's handling-behavior
591. 1 noop(debugInline);
592. 1 // test assertErrorThrownAsync's error handling-behavior
593. 1 await assertErrorThrownAsync(function () {
594. 1 return assertErrorThrownAsync(noop);
595. 1 });
596. 1 // test assertJsonEqual's error handling-behavior
597. 1 await assertErrorThrownAsync(function () {
598. 1 assertJsonEqual(1, 2);
599. 1 });
600. 1 // test assertOrThrow's error handling-behavior
601. 1 await assertErrorThrownAsync(function () {
602. 1 assertOrThrow(undefined, "undefined");
603. 1 });
604. 1 await assertErrorThrownAsync(function () {
605. 1 assertOrThrow(undefined, new Error());
606. 1 });
607. 1}());
608. 1
609. 1(async function () {
610. 1 let testCoverageMergeData = JSON.parse(
611. 1 await moduleFs.promises.readFile(
612. 1 "test_coverage_merge_data.json",
613. 1 "utf8"
614. 1 )
615. 1 );
616. 1
617. 1 jstestDescribe((
618. 1 "test jstestXxx's handling-behavior"
619. 1 ), function () {
620. 1 jstestIt((
621. 1 "test jstestDescribe's error handling-behavior"
622. 1 ), function () {
623. 1 throw new Error();
624. 1 }, "pass");
625. 1 jstestIt((
626. 1 "test jstestOnExit's error handling-behavior"
627. 1 ), function () {
628. 1 jstestOnExit(undefined, noop, 1);
629. 1 });
630. 1 });
631. 1
632. 1 jstestDescribe((
633. 1 "test v8CoverageListMerge's handling-behavior"
634. 1 ), function () {
635. 1 let functionsExpected = JSON.stringify([
636. 1 {
637. 1 functionName: "test",
638. 1 isBlockCoverage: true,
639. 1 ranges: [
640. 1 {
641. 1 count: 2,
642. 1 endOffset: 4,
643. 1 startOffset: 0
644. 1 },
645. 1 {
646. 1 count: 1,
647. 1 endOffset: 3,
648. 1 startOffset: 1
649. 1 }
650. 1 ]
651. 1 }
652. 1 ]);
653. 1 let functionsInput = JSON.stringify([
654. 1 {
655. 1 functionName: "test",
656. 1 isBlockCoverage: true,
657. 1 ranges: [
658. 1 {
659. 1 count: 2,
660. 1 endOffset: 4,
661. 1 startOffset: 0
662. 1 },
663. 1 {
664. 1 count: 1,
665. 1 endOffset: 2,
666. 1 startOffset: 1
667. 1 },
668. 1 {
669. 1 count: 1,
670. 1 endOffset: 3,
671. 1 startOffset: 2
672. 1 }
673. 1 ]
674. 1 }
675. 1 ]);
676. 1 jstestIt((
677. 1 "accepts empty arrays for `v8CoverageListMerge`"
678. 1 ), function () {
679. 1 assertJsonEqual(v8CoverageListMerge([]), {
680. 1 result: []
681. 1 });
682. 1 });
683. 1 jstestIt((
684. 1 "funcCovs.length === 1"
685. 1 ), function () {
686. 1 assertJsonEqual(v8CoverageListMerge([
687. 1 {
688. 1 result: [
689. 1 {
690. 1 functions: [
691. 1 {
692. 1 functionName: "test",
693. 1 isBlockCoverage: true,
694. 1 ranges: [
695. 1 {
696. 1 count: 2,
697. 1 endOffset: 4,
698. 1 startOffset: 0
699. 1 }
700. 1 ]
701. 1 }
702. 1 ],
703. 1 moduleUrl: "/lib.js",
704. 1 scriptId: "1"
705. 1 }
706. 1 ]
707. 1 },
708. 1 {
709. 1 result: [
710. 1 {
711. 1 functions: [],
712. 1 moduleUrl: "/lib.js",
713. 1 scriptId: "2"
714. 1 }
715. 1 ]
716. 1 }
717. 1 ]), {
718. 1 result: [
719. 1 {
720. 1 functions: [
721. 1 {
722. 1 functionName: "test",
723. 1 isBlockCoverage: true,
724. 1 ranges: [
725. 1 {
726. 1 count: 2,
727. 1 endOffset: 4,
728. 1 startOffset: 0
729. 1 }
730. 1 ]
731. 1 }
732. 1 ],
733. 1 scriptId: "0"
734. 1 }
735. 1 ]
736. 1 });
737. 1 });
738. 1 jstestIt((
739. 1 "accepts arrays with a single item for `v8CoverageListMerge`"
740. 1 ), function () {
741. 1 assertJsonEqual(v8CoverageListMerge([
742. 1 {
743. 1 result: [
744. 1 {
745. 1 functions: JSON.parse(functionsInput),
746. 1 moduleUrl: "/lib.js",
747. 1 scriptId: "123"
748. 1 }
749. 1 ]
750. 1 }
751. 1 ]), {
752. 1 result: [
753. 1 {
754. 1 functions: JSON.parse(functionsExpected),
755. 1 moduleUrl: "/lib.js",
756. 1 scriptId: "0"
757. 1 }
758. 1 ]
759. 1 });
760. 1 });
761. 1 jstestIt((
762. 1 "accepts arrays with two identical items for"
763. 1 + " `v8CoverageListMerge`"
764. 1 ), function () {
765. 1 assertJsonEqual(v8CoverageListMerge([
766. 1 {
767. 1 result: [
768. 1 {
769. 1 functions: JSON.parse(functionsInput),
770. 1 scriptId: "123",
771. 1 url: "/lib.js"
772. 1 }, {
773. 1 functions: JSON.parse(functionsInput),
774. 1 scriptId: "123",
775. 1 url: "/lib.js"
776. 1 }
777. 1 ]
778. 1 }
779. 1 ]), {
780. 1 result: [
781. 1 {
782. 1 functions: JSON.parse(functionsExpected),
783. 1 scriptId: "0",
784. 1 url: "/lib.js"
785. 1 },
786. 1 {
787. 1 functions: JSON.parse(functionsExpected),
788. 1 scriptId: "1",
789. 1 url: "/lib.js"
790. 1 }
791. 1 ]
792. 1 });
793. 1 });
794. 1 [
795. 1 "test_coverage_merge_is_block_coverage_test.json",
796. 1 "test_coverage_merge_issue_2_mixed_is_block_coverage_test.json",
797. 1 "test_coverage_merge_node_10_internal_errors_one_of_test.json",
798. 1 "test_coverage_merge_reduced_test.json",
799. 1 "test_coverage_merge_simple_test.json",
800. 1 "test_coverage_merge_various_test.json"
801. 6 ].forEach(function (file) {
802. 6 jstestIt(file, function () {
803. 6 file = testCoverageMergeData[file];
804. 84 file.forEach(function ({
805. 84 expected,
806. 84 inputs
807. 84 }) {
808. 84 assertJsonEqual(v8CoverageListMerge(inputs), expected);
809. 84 });
810. 6 });
811. 6 });
812. 1 jstestIt((
813. 1 "merge multiple node-sqlite coverage files"
814. 1 ), function () {
815. 1 let data1 = [
816. 1 "test_v8_coverage_node_sqlite_9884_1633662346346_0.json",
817. 1 "test_v8_coverage_node_sqlite_13216_1633662333140_0.json"
818. 2 ].map(function (file) {
819. 2 return testCoverageMergeData[file];
820. 2 });
821. 1 let data2 = testCoverageMergeData[
822. 1 "test_v8_coverage_node_sqlite_merged.json"
823. 1 ];
824. 1 data1 = v8CoverageListMerge(data1);
825. 1 data1 = v8CoverageListMerge([data1]);
826. 1
827. 1// Debug data1.
828. 1// await moduleFs.promises.writeFile(
829. 1// ".test_v8_coverage_node_sqlite_merged.json",
830. 1// JSON.stringify(objectDeepCopyWithKeysSorted(data1), undefined, 4) + "\n"
831. 1// );
832. 1
833. 1 assertJsonEqual(data1, data2);
834. 1 });
835. 1 });
836. 1
837. 1 jstestDescribe((
838. 1 "test v8CoverageReportCreate's handling-behavior"
839. 1 ), function () {
840. 1 jstestIt((
841. 1 "test null-case handling-behavior"
842. 1 ), async function () {
843. 1 await assertErrorThrownAsync(function () {
844. 1 return v8CoverageReportCreate({});
845. 1 }, "invalid coverageDir");
846. 1 });
847. 1
848. 1// CL-xxx - coverage - Relax requirement for coverageDir to be in cwd.
849. 1// jstestIt((
850. 1// "test invalid-coverageDir handling-behavior"
851. 1// ), async function () {
852. 1// await assertErrorThrownAsync(function () {
853. 1// return jslint.jslint_cli({
854. 1// // suppress error
855. 1// console_error: noop,
856. 1// mode_cli: true,
857. 1// processArgv: [
858. 1// "node", "jslint.mjs",
859. 1// "v8_coverage_report=..",
860. 1// "node", "jslint.mjs"
861. 1// ]
862. 1// });
863. 1// }, "is not subdirectory of cwd");
864. 1// });
865. 1
866. 1 jstestIt((
867. 1 "test coverage-report jslint.mjs handling-behavior"
868. 1 ), async function () {
869. 1 await jslint.jslint_cli({
870. 1 mode_cli: true,
871. 1 processArgv: [
872. 1 "node", "jslint.mjs",
873. 1 "v8_coverage_report=.tmp/coverage_jslint",
874. 1 "node", "jslint.mjs"
875. 1 ]
876. 1 });
877. 1 });
878. 1 [
879. 1 [
880. 1 "v8CoverageReportCreate_high.js", (
881. 1 "switch(0){\n"
882. 1 + "case 0:break;\n"
883. 1 + "}\n"
884. 1 )
885. 1 ], [
886. 1 "v8CoverageReportCreate_ignore.js", (
887. 1 "/*mode-coverage-ignore-file*/\n"
888. 1 + "switch(0){\n"
889. 1 + "case 0:break;\n"
890. 1 + "}\n"
891. 1 )
892. 1 ], [
893. 1 "v8CoverageReportCreate_low.js", (
894. 1 "switch(0){\n"
895. 1 + "case 1:break;\n"
896. 1 + "case 2:break;\n"
897. 1 + "case 3:break;\n"
898. 1 + "case 4:break;\n"
899. 1 + "}\n"
900. 1 )
901. 1 ], [
902. 1 "v8CoverageReportCreate_medium.js", (
903. 1 "switch(0){\n"
904. 1 + "case 0:break;\n"
905. 1 + "case 1:break;\n"
906. 1 + "case 2:break;\n"
907. 1 + "}\n"
908. 1 )
909. 1 ]
910. 4 ].forEach(function ([
911. 4 file, data
912. 4 ], ii) {
913. 4 jstestIt(file, async function () {
914. 4 let dir = ".tmp/coverage" + ii + "/";
915. 4 file = dir + file;
916. 4 await fsWriteFileWithParents(file, data);
917. 4 await jslint.jslint_cli({
918. 4 mode_cli: true,
919. 4 processArgv: [
920. 4 "node", "jslint.mjs",
921. 4 "v8_coverage_report=" + dir,
922. 4 "node",
923. 4 file
924. 4 ]
925. 4 });
926. 4 // test npm handling-behavior
927. 1 if (ii === 0) {
928. 1 await jslint.jslint_cli({
929. 1 mode_cli: true,
930. 1 processArgv: [
931. 1 "node", "jslint.mjs",
932. 1 "v8_coverage_report=" + dir,
933. 1 "npm", "--version"
934. 1 ]
935. 1 });
936. 1 }
937. 4 });
938. 4 });
939. 1 });
940. 1}());
941. 1