1. 1/*jslint beta, node*/
2. 1import jslint from "./jslint.mjs";
3. 1import jslintCjs from "./jslint_wrapper_cjs.cjs";
4. 1import moduleFs from "fs";
5. 1import modulePath from "path";
6. 1
7. 1let {
8. 1 assertErrorThrownAsync,
9. 1 assertJsonEqual,
10. 1 assertOrThrow,
11. 1 debugInline,
12. 1 fsWriteFileWithParents,
13. 1 globExclude,
14. 1 jstestDescribe,
15. 1 jstestIt,
16. 1 jstestOnExit,
17. 1 moduleFsInit,
18. 1 noop,
19. 1 v8CoverageListMerge,
20. 1 v8CoverageReportCreate
21. 1} = jslint;
22. 1let sourceJslintMjs;
23. 1let testCoverageMergeData;
24. 1
25. 1await (async function init() {
26. 1
27. 1// Coverage-hack - Ugly-hack to get test-coverage for all initialization-states.
28. 1
29. 1 moduleFsInit();
30. 1 moduleFsInit();
31. 1
32. 1// Cleanup directory .tmp
33. 1
34. 1 await moduleFs.promises.rm(".tmp", {
35. 1 recursive: true
36. 1 }).catch(noop);
37. 1
38. 1// init sourceJslintMjs
39. 1
40. 1 sourceJslintMjs = await moduleFs.promises.readFile("jslint.mjs", "utf8");
41. 1
42. 1// init testCoverageMergeData
43. 1
44. 1 testCoverageMergeData = JSON.parse(
45. 1 await moduleFs.promises.readFile(
46. 1 "test_coverage_merge_data.json",
47. 1 "utf8"
48. 1 )
49. 1 );
50. 1}());
51. 1
52. 1jstestDescribe((
53. 1 "test fsXxx handling-behavior"
54. 1), function testBehaviorFsXxx() {
55. 1 jstestIt((
56. 1 "test fsWriteFileWithParents handling-behavior"
57. 1 ), async function () {
58. 1 await Promise.all([
59. 1 1, 2, 3, 4
60. 4 ].map(async function () {
61. 4 await fsWriteFileWithParents(
62. 4 ".tmp/fsWriteFileWithParents/aa/bb/cc",
63. 4 "aa"
64. 4 );
65. 4 }));
66. 1 assertJsonEqual(
67. 1 await moduleFs.promises.readFile(
68. 1 ".tmp/fsWriteFileWithParents/aa/bb/cc",
69. 1 "utf8"
70. 1 ),
71. 1 "aa"
72. 1 );
73. 1 });
74. 1});
75. 1
76. 1jstestDescribe((
77. 1 "test globXxx handling-behavior"
78. 1), function testBehaviorGlobXxx() {
79. 1 jstestIt((
80. 1 "test globAssertNotWeird-error handling-behavior"
81. 1 ), async function () {
82. 1 await Promise.all([
83. 1 "\n",
84. 1 "\r",
85. 1 "\u0000"
86. 3 ].map(async function (char) {
87. 3 await assertErrorThrownAsync(function () {
88. 3 return globExclude({
89. 3 pathnameList: [
90. 3 "aa",
91. 3 `cc/${char}/dd`,
92. 3 "bb"
93. 3 ]
94. 3 });
95. 3 }, (
96. 3 "Weird character "
97. 3 + JSON.stringify(char).replace("\\", "\\\\")
98. 3 + " found in "
99. 3 ));
100. 3 }));
101. 1 });
102. 1 jstestIt((
103. 1 "test globExclude handling-behavior"
104. 1 ), function () {
105. 1 let pathnameList = [
106. 1 ".dockerignore",
107. 1 ".eslintrc.js",
108. 1 ".gitignore",
109. 1 ".npmignore",
110. 1 ".travis.yml",
111. 1 "/node_modules/aa/bb/cc.js",
112. 1 "/node_modules/aa/bb/dd.js",
113. 1 "CHANGELOG.md",
114. 1 "CONTRIBUTING.md",
115. 1 "Dockerfile",
116. 1 "LICENSE",
117. 1 "Makefile",
118. 1 "README.md",
119. 1 "appveyor.yml",
120. 1 "benchmark/insert-transaction.sql",
121. 1 "benchmark/insert.js",
122. 1 "binding.gyp",
123. 1 "cloudformation/ci.template.js",
124. 1 "deps/common-sqlite.gypi",
125. 1 "deps/extract.py",
126. 1 "deps/sqlite-autoconf-3340000.tar.gz",
127. 1 "deps/sqlite3.gyp",
128. 1 "examples/simple-chaining.js",
129. 1 "lib/index.js",
130. 1 "lib/sqlite3-binding.js",
131. 1 "lib/sqlite3.js",
132. 1 "lib/trace.js",
133. 1 "node_modules/aa/bb/cc.js",
134. 1 "node_modules/aa/bb/dd.js",
135. 1 "package.json",
136. 1 "scripts/build-appveyor.bat",
137. 1 "scripts/build-local.bat",
138. 1 "scripts/build_against_electron.sh",
139. 1 "scripts/build_against_node.sh",
140. 1 "scripts/build_against_node_webkit.sh",
141. 1 "scripts/build_for_node_webkit.cmd",
142. 1 "scripts/install_node.sh",
143. 1 "scripts/validate_tag.sh",
144. 1 "sqlite3.js",
145. 1 "src/async.h",
146. 1 "src/backup.cc",
147. 1 "src/backup.h",
148. 1 "src/database.cc",
149. 1 "src/database.h",
150. 1 "src/gcc-preinclude.h",
151. 1 "src/macros.h",
152. 1 "src/node_sqlite3.cc",
153. 1 "src/statement.cc",
154. 1 "src/statement.h",
155. 1 "src/threading.h",
156. 1 "test/affected.test.js",
157. 1 "test/backup.test.js",
158. 1 "test/blob.test.js",
159. 1 "test/cache.test.js",
160. 1 "test/constants.test.js",
161. 1 "test/database_fail.test.js",
162. 1 "test/each.test.js",
163. 1 "test/exec.test.js",
164. 1 "test/extension.test.js",
165. 1 "test/fts-content.test.js",
166. 1 "test/interrupt.test.js",
167. 1 "test/issue-108.test.js",
168. 1 "test/json.test.js",
169. 1 "test/map.test.js",
170. 1 "test/named_columns.test.js",
171. 1 "test/named_params.test.js",
172. 1 "test/null_error.test.js",
173. 1 "test/nw/.gitignore",
174. 1 "test/nw/Makefile",
175. 1 "test/nw/index.html",
176. 1 "test/nw/package.json",
177. 1 "test/open_close.test.js",
178. 1 "test/other_objects.test.js",
179. 1 "test/parallel_insert.test.js",
180. 1 "test/prepare.test.js",
181. 1 "test/profile.test.js",
182. 1 "test/rerun.test.js",
183. 1 "test/scheduling.test.js",
184. 1 "test/serialization.test.js",
185. 1 "test/support/createdb-electron.js",
186. 1 "test/support/createdb.js",
187. 1 "test/support/elmo.png",
188. 1 "test/support/helper.js",
189. 1 "test/support/prepare.db",
190. 1 "test/support/script.sql",
191. 1 "test/trace.test.js",
192. 1 "test/unicode.test.js",
193. 1 "test/upsert.test.js",
194. 1 "test/verbose.test.js",
195. 1 "tools/docker/architecture/linux-arm/Dockerfile",
196. 1 "tools/docker/architecture/linux-arm/run.sh",
197. 1 "tools/docker/architecture/linux-arm64/Dockerfile",
198. 1 "tools/docker/architecture/linux-arm64/run.sh"
199. 1 ];
200. 1 [
201. 1 "tes?/",
202. 1 "tes[-t-]/",
203. 1 "tes[-t]/",
204. 1 "tes[0-9A-Z_a-z-]/",
205. 1 "tes[t-]/",
206. 1 "test/**/*.js"
207. 6 ].forEach(function (aa) {
208. 6 [
209. 6 "li*/*.js",
210. 6 "li?/*.js",
211. 6 "lib/",
212. 6 "lib/*",
213. 6 "lib/**/*.js",
214. 6 "lib/*.js"
215. 36 ].forEach(function (bb) {
216. 36 [
217. 36 "",
218. 36 "**/node_modules/",
219. 36 "node_modules/"
220. 108 ].forEach(function (cc) {
221. 108 assertJsonEqual(
222. 108 globExclude({
223. 108 excludeList: [
224. 108 "tes[!0-9A-Z_a-z-]/",
225. 108 "tes[^0-9A-Z_a-z-]/",
226. 108 "test/suppor*/*elper.js",
227. 108 "test/suppor?/?elper.js",
228. 108 "test/support/helper.js"
229. 108 ].concat(aa, cc),
230. 108 includeList: [
231. 108 "**/*.cjs",
232. 108 "**/*.js",
233. 108 "**/*.mjs",
234. 108 "lib/sqlite3.js"
235. 108 ].concat(bb),
236. 108 pathnameList
237. 108 }).pathnameList,
238. 108 [
239. 108 ".eslintrc.js",
240. 108 "benchmark/insert.js",
241. 108 "cloudformation/ci.template.js",
242. 108 "examples/simple-chaining.js",
243. 108 "lib/index.js",
244. 108 "lib/sqlite3-binding.js",
245. 108 "lib/sqlite3.js",
246. 108 "lib/trace.js",
247. 108 "sqlite3.js"
248. 108 ].concat(
249. 108 cc === "**/node_modules/"
250. 36 ? [
251. 36 "node_modules/aa/bb/cc.js",
252. 36 "node_modules/aa/bb/dd.js"
253. 36 ]
254. 72 : cc === "node_modules/"
255. 72 ? [
256. 72 "/node_modules/aa/bb/cc.js",
257. 72 "/node_modules/aa/bb/dd.js"
258. 72 ]
259. 72 : [
260. 72 "/node_modules/aa/bb/cc.js",
261. 72 "/node_modules/aa/bb/dd.js",
262. 72 "node_modules/aa/bb/cc.js",
263. 72 "node_modules/aa/bb/dd.js"
264. 72 ]
265. 108 ).sort()
266. 108 );
267. 108 });
268. 36 });
269. 6 });
270. 1 });
271. 1 jstestIt((
272. 1 "test globToRegexp handling-behavior"
273. 1 ), function () {
274. 1 Object.entries({
275. 1 "*": (
276. 1 /^[^\/]*?$/gm
277. 1 ),
278. 1 "**": (
279. 1 /^.*?$/gm
280. 1 ),
281. 1 "***": (
282. 1 /^.*?$/gm
283. 1 ),
284. 1 "****": (
285. 1 /^.*?$/gm
286. 1 ),
287. 1 "****////****": (
288. 1 /^.*?$/gm
289. 1 ),
290. 1 "***///***": (
291. 1 /^.*?$/gm
292. 1 ),
293. 1 "**/*": (
294. 1 /^.*?$/gm
295. 1 ),
296. 1 "**/node_modules/": (
297. 1 /^.*?\/node_modules\/.*?$/gm
298. 1 ),
299. 1 "**/node_modules/**/*": (
300. 1 /^.*?\/node_modules\/.*?$/gm
301. 1 ),
302. 1 "?": (
303. 1 /^[^\/]$/gm
304. 1 ),
305. 1 "[!0-9A-Za-z-]": (
306. 1 /^[^0-9A-Za-z\-]$/gm
307. 1 ),
308. 1 "[0-9A-Za-z-]": (
309. 1 /^[0-9A-Za-z\-]$/gm
310. 1 ),
311. 1 "[[]] ]][[": (
312. 1 /^[\[]\] \]\][\[]$/gm
313. 1 ),
314. 1 "[]": (
315. 1 /^$/gm
316. 1 ),
317. 1 "[^0-9A-Za-z-]": (
318. 1 /^[^0-9A-Za-z\-]$/gm
319. 1 ),
320. 1 "aa/bb/cc": (
321. 1 /^aa\/bb\/cc$/gm
322. 1 ),
323. 1 "aa/bb/cc/": (
324. 1 /^aa\/bb\/cc\/.*?$/gm
325. 1 ),
326. 1 "li*/*": (
327. 1 /^li[^\/]*?\/[^\/]*?$/gm
328. 1 ),
329. 1 "li?/*": (
330. 1 /^li[^\/]\/[^\/]*?$/gm
331. 1 ),
332. 1 "lib/": (
333. 1 /^lib\/.*?$/gm
334. 1 ),
335. 1 "lib/*": (
336. 1 /^lib\/[^\/]*?$/gm
337. 1 ),
338. 1 "lib/**/*.js": (
339. 1 /^lib\/.*?\.js$/gm
340. 1 ),
341. 1 "lib/*.js": (
342. 1 /^lib\/[^\/]*?\.js$/gm
343. 1 ),
344. 1 "node_modules/": (
345. 1 /^node_modules\/.*?$/gm
346. 1 ),
347. 1 "node_modules/**/*": (
348. 1 /^node_modules\/.*?$/gm
349. 1 ),
350. 1 "tes[!0-9A-Z_a-z-]/**/*": (
351. 1 /^tes[^0-9A-Z_a-z\-]\/.*?$/gm
352. 1 ),
353. 1 "tes[0-9A-Z_a-z-]/**/*": (
354. 1 /^tes[0-9A-Z_a-z\-]\/.*?$/gm
355. 1 ),
356. 1 "tes[^0-9A-Z_a-z-]/**/*": (
357. 1 /^tes[^0-9A-Z_a-z\-]\/.*?$/gm
358. 1 ),
359. 1 "test/**/*": (
360. 1 /^test\/.*?$/gm
361. 1 ),
362. 1 "test/**/*.js": (
363. 1 /^test\/.*?\.js$/gm
364. 1 ),
365. 1 "test/suppor*/*elper.js": (
366. 1 /^test\/suppor[^\/]*?\/[^\/]*?elper\.js$/gm
367. 1 ),
368. 1 "test/suppor?/?elper.js": (
369. 1 /^test\/suppor[^\/]\/[^\/]elper\.js$/gm
370. 1 ),
371. 1 "test/support/helper.js": (
372. 1 /^test\/support\/helper\.js$/gm
373. 1 )
374. 33 }).forEach(function ([
375. 33 pattern, rgx
376. 33 ]) {
377. 33 assertJsonEqual(
378. 33 globExclude({
379. 33 excludeList: [
380. 33 pattern
381. 33 ]
382. 33 }).excludeList[0].source,
383. 33 rgx.source
384. 33 );
385. 33 assertJsonEqual(
386. 33 globExclude({
387. 33 includeList: [
388. 33 pattern
389. 33 ]
390. 33 }).includeList[0].source,
391. 33 rgx.source
392. 33 );
393. 33 });
394. 1 });
395. 1});
396. 1
397. 1jstestDescribe((
398. 1 "test jslint's cli handling-behavior"
399. 1), function testBehaviorJslintCli() {
400. 5 function processExit0(exitCode) {
401. 5 assertOrThrow(exitCode === 0, exitCode);
402. 5 }
403. 6 function processExit1(exitCode) {
404. 6 assertOrThrow(exitCode === 1, exitCode);
405. 6 }
406. 1 jstestIt((
407. 1 "test cli-null-case handling-behavior"
408. 1 ), function () {
409. 1 jslint.jslint_cli({
410. 1 mode_noop: true,
411. 1 process_exit: processExit0
412. 1 });
413. 1 });
414. 1 jstestIt((
415. 1 "test cli-window-jslint handling-behavior"
416. 1 ), function () {
417. 1 [
418. 1 "&window_jslint=",
419. 1 "&window_jslint=12",
420. 1 "&window_jslint=1?",
421. 1 "&window_jslint=?",
422. 1 "?window_jslint=",
423. 1 "?window_jslint=12",
424. 1 "?window_jslint=1?",
425. 1 "?window_jslint=?",
426. 1 "window_jslint=1",
427. 1 "window_jslint=1&",
428. 1 "window_jslint=12",
429. 1 "window_jslint=1?"
430. 12 ].forEach(function (import_meta_url) {
431. 12 jslint.jslint_cli({
432. 12 import_meta_url
433. 12 });
434. 12 assertOrThrow(globalThis.jslint === undefined);
435. 12 });
436. 1 [
437. 1 "&window_jslint=1",
438. 1 "&window_jslint=1&",
439. 1 "?window_jslint=1",
440. 1 "?window_jslint=1&"
441. 4 ].forEach(function (import_meta_url) {
442. 4 jslint.jslint_cli({
443. 4 import_meta_url
444. 4 });
445. 4 assertOrThrow(globalThis.jslint === jslint);
446. 4 delete globalThis.jslint;
447. 4 });
448. 1 });
449. 1 jstestIt((
450. 1 "test cli-cjs-and-invalid-file handling-behavior"
451. 1 ), async function () {
452. 1 await fsWriteFileWithParents(".test_dir.cjs/touch.txt", "");
453. 1 [
454. 1 ".", // test dir handling-behavior
455. 1 "jslint.mjs", // test file handling-behavior
456. 1 undefined // test file-undefined handling-behavior
457. 3 ].forEach(function (file) {
458. 3 jslint.jslint_cli({
459. 3 file,
460. 3 mode_cli: true,
461. 3 process_env: {
462. 3 JSLINT_BETA: "1"
463. 3 },
464. 3 process_exit: processExit0
465. 3 });
466. 3 });
467. 1 });
468. 1 jstestIt((
469. 1 "test cli-apidoc handling-behavior"
470. 1 ), function () {
471. 1 jslint.jslint_cli({
472. 1 mode_cli: true,
473. 1 process_argv: [
474. 1 "node",
475. 1 "jslint.mjs",
476. 1 "jslint_apidoc=.artifact/apidoc.html",
477. 1 JSON.stringify({
478. 1 example_list: [
479. 1 "README.md",
480. 1 "test.mjs",
481. 1 "jslint.mjs"
482. 1 ],
483. 1 github_repo: "https://github.com/jslint-org/jslint",
484. 1 module_list: [
485. 1 {
486. 1 pathname: "./jslint.mjs"
487. 1 }
488. 1 ],
489. 1 package_name: "JSLint",
490. 1 version: jslint.jslint_edition
491. 1 })
492. 1 ],
493. 1 process_exit: processExit0
494. 1 });
495. 1 });
496. 1 jstestIt((
497. 1 "test cli-file-error handling-behavior"
498. 1 ), function () {
499. 1 jslint.jslint_cli({
500. 1 // suppress error
501. 1 console_error: noop,
502. 1 file: "undefined",
503. 1 mode_cli: true,
504. 1 process_exit: processExit1
505. 1 });
506. 1 });
507. 1 jstestIt((
508. 1 "test cli-syntax-error handling-behavior"
509. 1 ), function () {
510. 1 jslint.jslint_cli({
511. 1 // suppress error
512. 1 console_error: noop,
513. 1 file: "syntax-error.js",
514. 1 mode_cli: true,
515. 1 option: {
516. 1 trace: true
517. 1 },
518. 1 process_exit: processExit1,
519. 1 source: "syntax error"
520. 1 });
521. 1 });
522. 1 jstestIt((
523. 1 "test cli-report handling-behavior"
524. 1 ), function () {
525. 1 jslint.jslint_cli({
526. 1 // suppress error
527. 1 console_error: noop,
528. 1 mode_cli: true,
529. 1 process_argv: [
530. 1 "node",
531. 1 "jslint.mjs",
532. 1 "jslint_report=.tmp/jslint_report.html",
533. 1 "jslint.mjs"
534. 1 ],
535. 1 process_exit: processExit0
536. 1 });
537. 1 });
538. 1 jstestIt((
539. 1 "test cli-report-error handling-behavior"
540. 1 ), function () {
541. 1 jslint.jslint_cli({
542. 1 // suppress error
543. 1 console_error: noop,
544. 1 mode_cli: true,
545. 1 process_argv: [
546. 1 "node",
547. 1 "jslint.mjs",
548. 1 "jslint_report=.tmp/jslint_report.html",
549. 1 "syntax-error.js"
550. 1 ],
551. 1 process_exit: processExit1,
552. 1 source: "syntax error"
553. 1 });
554. 1 });
555. 1 jstestIt((
556. 1 "test cli-report-json handling-behavior"
557. 1 ), function () {
558. 1 jslint.jslint_cli({
559. 1 // suppress error
560. 1 console_error: noop,
561. 1 mode_cli: true,
562. 1 process_argv: [
563. 1 "node",
564. 1 "jslint.mjs",
565. 1 "jslint_report=.tmp/jslint_report.html",
566. 1 "aa.json"
567. 1 ],
568. 1 process_exit: processExit0,
569. 1 source: "[]"
570. 1 });
571. 1 });
572. 1 jstestIt((
573. 1 "test cli-report-json-error handling-behavior"
574. 1 ), function () {
575. 1 jslint.jslint_cli({
576. 1 // suppress error
577. 1 console_error: noop,
578. 1 mode_cli: true,
579. 1 process_argv: [
580. 1 "node",
581. 1 "jslint.mjs",
582. 1 "jslint_report=.tmp/jslint_report.html",
583. 1 "aa.json"
584. 1 ],
585. 1 process_exit: processExit1,
586. 1 source: "["
587. 1 });
588. 1 });
589. 1 jstestIt((
590. 1 "test cli-report-misc handling-behavior"
591. 1 ), function () {
592. 1 jslint.jslint_cli({
593. 1 // suppress error
594. 1 console_error: noop,
595. 1 mode_cli: true,
596. 1 process_argv: [
597. 1 "node",
598. 1 "jslint.mjs",
599. 1 "jslint_report=.tmp/jslint_report.html",
600. 1 "aa.js"
601. 1 ],
602. 1 process_exit: processExit0,
603. 1 source: "let aa = 0;"
604. 1 });
605. 1 jslint.jslint_cli({
606. 1 // suppress error
607. 1 console_error: noop,
608. 1 mode_cli: true,
609. 1 process_argv: [
610. 1 "node",
611. 1 "jslint.mjs",
612. 1 "jslint_report=.tmp/jslint_report.html",
613. 1 "aa.js"
614. 1 ],
615. 1 process_exit: processExit1,
616. 1 source: "(aa)=>aa; function aa([aa]){}"
617. 1 });
618. 1 });
619. 1 jstestIt((
620. 1 "test cli-jslint-wrapper-vim handling-behavior"
621. 1 ), function () {
622. 1 jslint.jslint_cli({
623. 1 // suppress error
624. 1 console_error: noop,
625. 1 mode_cli: true,
626. 1 process_argv: [
627. 1 "node",
628. 1 "jslint.mjs",
629. 1 "jslint_wrapper_vim",
630. 1 "syntax-error.js"
631. 1 ],
632. 1 process_exit: processExit1,
633. 1 source: "syntax error"
634. 1 });
635. 1 });
636. 1});
637. 1
638. 1jstestDescribe((
639. 1 "test jslint's no-warnings handling-behavior"
640. 1), function testBehaviorJslintNoWarnings() {
641. 1 jstestIt((
642. 1 "test jslint's no-warnings handling-behavior"
643. 1 ), function () {
644. 1 Object.values({
645. 1 array: [
646. 1 "new Array(0);"
647. 1 ],
648. 1 async_await: [
649. 1 "async function aa() {\n await aa();\n}",
650. 1
651. 1// PR-405 - Bugfix - fix expression after "await" mis-identified as statement.
652. 1
653. 1 "async function aa() {\n await aa;\n}",
654. 1 (
655. 1 "async function aa() {\n"
656. 1 + " try {\n"
657. 1 + " aa();\n"
658. 1 + " } catch (err) {\n"
659. 1 + " await err();\n"
660. 1 + " }\n"
661. 1 + "}\n"
662. 1 ),
663. 1 (
664. 1 "async function aa() {\n"
665. 1 + " try {\n"
666. 1 + " await aa();\n"
667. 1 + " } catch (err) {\n"
668. 1 + " await err();\n"
669. 1 + " }\n"
670. 1 + "}\n"
671. 1 ),
672. 1
673. 1// PR-370 - Add top-level-await support.
674. 1
675. 1 "await String();\n"
676. 1 ],
677. 1
678. 1// PR-351 - Add BigInt support.
679. 1
680. 1 bigint: [
681. 1 "let aa = 0b0n;\n",
682. 1 "let aa = 0o0n;\n",
683. 1 "let aa = 0x0n;\n",
684. 1 "let aa = BigInt(0n);\n",
685. 1 "let aa = typeof aa === \"bigint\";\n"
686. 1 ],
687. 1 date: [
688. 1 "Date.getTime();",
689. 1 "let aa = aa().getTime();",
690. 1 "let aa = aa.aa().getTime();"
691. 1 ],
692. 1 directive: [
693. 1 "#!\n/*jslint browser:false, node*/\n\"use strict\";",
694. 1 "/*property aa bb*/"
695. 1 ],
696. 1 for: [
697. 1 (
698. 1 "/*jslint for*/\n"
699. 1 + "function aa(bb) {\n"
700. 1 + " for (bb = 0; bb < 0; bb += 1) {\n"
701. 1 + " bb();\n"
702. 1 + " }\n"
703. 1 + "}\n"
704. 1 )
705. 1 ],
706. 1 jslint_disable: [
707. 1 "/*jslint-disable*/\n0\n/*jslint-enable*/"
708. 1 ],
709. 1 jslint_ignore_line: [
710. 1 "0 //jslint-ignore-line"
711. 1 ],
712. 1 json: [
713. 1 "{\"aa\":[[],-0,null]}"
714. 1 ],
715. 1 label: [
716. 1 (
717. 1 "function aa() {\n"
718. 1 + "bb:\n"
719. 1 + " while (true) {\n"
720. 1 + " if (true) {\n"
721. 1 + " break bb;\n"
722. 1 + " }\n"
723. 1 + " }\n"
724. 1 + "}\n"
725. 1 )
726. 1 ],
727. 1 loop: [
728. 1 (
729. 1 "function aa() {\n"
730. 1 + " do {\n"
731. 1 + " aa();\n"
732. 1 + " } while (aa());\n"
733. 1 + "}\n"
734. 1 ),
735. 1
736. 1// PR-378 - Relax warning "function_in_loop".
737. 1
738. 1 (
739. 1 "function aa() {\n"
740. 1 + " while (true) {\n"
741. 1 + " (function () {\n"
742. 1 + " return;\n"
743. 1 + " }());\n"
744. 1 + " }\n"
745. 1 + "}\n"
746. 1 )
747. 1 ],
748. 1 module: [
749. 1 "export default Object.freeze();",
750. 1
751. 1// PR-439 - Add grammar for "export async function ...".
752. 1
753. 1 (
754. 1 "export default Object.freeze(async function () {\n"
755. 1 + " return await 0;\n"
756. 1 + "});\n"
757. 1 ),
758. 1 "import {aa, bb} from \"aa\";\naa(bb);",
759. 1 "import {} from \"aa\";",
760. 1 "import(\"aa\").then(function () {\n return;\n});",
761. 1 (
762. 1 "let aa = 0;\n"
763. 1 + "import(aa).then(aa).then(aa)"
764. 1 + ".catch(aa).finally(aa);\n"
765. 1 )
766. 1 ],
767. 1 number: [
768. 1 "let aa = 0.0e0;",
769. 1 "let aa = 0b0;",
770. 1 "let aa = 0o0;",
771. 1 "let aa = 0x0;"
772. 1 ],
773. 1
774. 1// PR-390 - Add numeric-separator support.
775. 1
776. 1 numeric_separator: [
777. 1 "let aa = 0.0_0_0;",
778. 1 "let aa = 0b0_1111_1111n;\n",
779. 1 "let aa = 0o0_1234_1234n;\n",
780. 1 "let aa = 0x0_1234_1234n;\n",
781. 1 "let aa = 1_234_234.1_234_234E1_234_234;"
782. 1 ],
783. 1 optional_chaining: [
784. 1 "let aa = aa?.bb?.cc;"
785. 1 ],
786. 1 param: [
787. 1 "function aa({aa, bb}) {\n return {aa, bb};\n}\n",
788. 1 (
789. 1 "function aa({constructor}) {\n"
790. 1 + " return {constructor};\n"
791. 1 + "}\n"
792. 1 )
793. 1 ],
794. 1 property: [
795. 1 "let aa = aa[`!`];"
796. 1 ],
797. 1 regexp: [
798. 1 "function aa() {\n return /./;\n}",
799. 1 "let aa = /(?!.)(?:.)(?=.)/;",
800. 1 "let aa = /./gimuy;",
801. 1 "let aa = /[\\--\\-]/;"
802. 1 ],
803. 1 ternary: [
804. 1 (
805. 1 "let aa = (\n"
806. 1 + " aa()\n"
807. 1 + " ? 0\n"
808. 1 + " : 1\n"
809. 1 + ") "
810. 1 + "&& (\n"
811. 1 + " aa()\n"
812. 1 + " ? 0\n"
813. 1 + " : 1\n"
814. 1 + ");"
815. 1 ),
816. 1 (
817. 1 "let aa = (\n"
818. 1 + " aa()\n"
819. 1 + " ? `${0}`\n"
820. 1 + " : `${1}`\n"
821. 1 + ");"
822. 1 ),
823. 1
824. 1// PR-394 - Bugfix
825. 1// Fix jslint falsely believing megastring literals `0` and `1` are similar.
826. 1
827. 1 (
828. 1 "let aa = (\n"
829. 1 + " aa()\n"
830. 1 + " ? `0`\n"
831. 1 + " : `1`\n"
832. 1 + ");"
833. 1 )
834. 1 ],
835. 1 try_catch: [
836. 1 (
837. 1 "let aa = 0;\n"
838. 1 + "try {\n"
839. 1 + " aa();\n"
840. 1 + "} catch (err) {\n"
841. 1 + " aa = err;\n"
842. 1 + "}\n"
843. 1 + "try {\n"
844. 1 + " aa();\n"
845. 1 + "} catch (err) {\n"
846. 1 + " aa = err;\n"
847. 1 + "}\n"
848. 1 + "aa();\n"
849. 1 )
850. 1 ],
851. 1 try_finally: [
852. 1 (
853. 1 "let aa = 0;\n"
854. 1 + "try {\n"
855. 1 + " aa();\n"
856. 1 + "} finally {\n"
857. 1 + " aa();\n"
858. 1 + "}\n"
859. 1 )
860. 1 ],
861. 1 use_strict: [
862. 1 (
863. 1 "\"use strict\";\n"
864. 1 + "let aa = 0;\n"
865. 1 + "function bb() {\n"
866. 1 + " \"use strict\";\n"
867. 1 + " return aa;\n"
868. 1 + "}\n"
869. 1 )
870. 1 ],
871. 1 var: [
872. 1
873. 1// PR-363 - Bugfix
874. 1// Add test against false-warning <uninitialized 'bb'> in code
875. 1// '/*jslint node*/\nlet {aa:bb} = {}; bb();'.
876. 1
877. 1 "/*jslint node*/\n",
878. 1 ""
879. 2 ].map(function (directive) {
880. 2 return [
881. 2 "let [\n aa, bb = 0\n] = 0;\naa();\nbb();",
882. 2 "let aa = 0;\nlet [...bb] = [...aa];\nbb();",
883. 2
884. 2// PR-459 - Allow destructuring-assignment after function-definition.
885. 2
886. 2 (
887. 2 "let aa;\n"
888. 2 + "let bb;\n"
889. 2 + "function cc() {\n"
890. 2 + " return;\n"
891. 2 + "}\n"
892. 2 + "[aa, bb] = cc();\n"
893. 2 ),
894. 2 "let constructor = 0;\nconstructor();",
895. 2 "let {\n aa: bb\n} = 0;\nbb();",
896. 2 "let {\n aa: bb,\n bb: cc\n} = 0;\nbb();\ncc();",
897. 2 "let {aa, bb} = 0;\naa();\nbb();",
898. 2 "let {constructor} = 0;\nconstructor();"
899. 16 ].map(function (code) {
900. 16 return directive + code;
901. 16 });
902. 2 }).flat()
903. 23 }).forEach(function (codeList) {
904. 23 let elemPrv = "";
905. 68 codeList.forEach(function (code) {
906. 68 let warnings;
907. 68 // Assert codeList is sorted.
908. 68 assertOrThrow(elemPrv < code, JSON.stringify([
909. 68 elemPrv, code
910. 68 ], undefined, 4));
911. 68 elemPrv = code;
912. 68 [
913. 68 jslint.jslint,
914. 68 jslintCjs.jslint
915. 136 ].forEach(function (jslint) {
916. 136 warnings = jslint(code, {
917. 136 beta: true
918. 136 }).warnings;
919. 136 assertOrThrow(
920. 136 warnings.length === 0,
921. 136 JSON.stringify([code, warnings])
922. 136 );
923. 136 });
924. 68 });
925. 23 });
926. 1 });
927. 1});
928. 1
929. 1jstestDescribe((
930. 1 "test jslint's option handling-behavior"
931. 1), function testBehaviorJslintOption() {
932. 1 let elemPrv = "";
933. 1 [
934. 1 [
935. 1 "let aa = aa | 0;", {bitwise: true}, []
936. 1 ], [
937. 1 ";\naa(new XMLHttpRequest());", {browser: true}, ["aa"]
938. 1 ], [
939. 1 "let aa = \"aa\" + 0;", {convert: true}, []
940. 1 ], [
941. 1 "registerType();", {couch: true}, []
942. 1 ], [
943. 1 "debugger;", {devel: true}, []
944. 1 ], [
945. 1
946. 1// PR-404 - Alias "evil" to jslint-directive "eval" for backwards-compat.
947. 1
948. 1 "new Function();\neval();", {eval: true, evil: true}, []
949. 1 ], [
950. 1 "let aa = () => 0;", {fart: true}, []
951. 1 ], [
952. 1 (
953. 1 "let aa = async (bb, {cc, dd}, [ee, ff], ...gg) => {\n"
954. 1 + " bb += 1;\n"
955. 1 + " return await (bb + cc + dd + ee + ff + gg);\n"
956. 1 + "};\n"
957. 1 ), {fart: true}, []
958. 1 ], [
959. 1 (
960. 1 "function aa(aa) {\n"
961. 1 + " for (aa = 0; aa < 0; aa += 1) {\n"
962. 1 + " aa();\n"
963. 1 + " }\n"
964. 1 + "}\n"
965. 1 ), {for: true}, []
966. 1 ], [
967. 1 "let aa = {get aa() {\n return;\n}};", {getset: true}, []
968. 1 ], [
969. 1 "let aa = {set aa(aa) {\n return aa;\n}};", {getset: true}, []
970. 1 ], [
971. 1 sourceJslintMjs.replace((
972. 1 / /g
973. 1 ), " "), {indent2: true}, []
974. 1 ], [
975. 1 "function aa() {\n return;\n}", {indent2: true}, []
976. 1 ], [
977. 1 "/".repeat(100), {long: true}, []
978. 1 ], [
979. 1
980. 1// PR-404 - Alias "nomen" to jslint-directive "name" for backwards-compat.
981. 1
982. 1 "let aa = aa._;", {name: true, nomen: true}, []
983. 1 ], [
984. 1 "require();", {node: true}, []
985. 1 ], [
986. 1 "let aa = 'aa';", {single: true}, []
987. 1 ], [
988. 1
989. 1// PR-404 - Add new directive "subscript" to play nice with Google Closure.
990. 1
991. 1 "aa[\"aa\"] = 1;", {subscript: true}, ["aa"]
992. 1 ], [
993. 1 "", {test_internal_error: true}, []
994. 1 ], [
995. 1 "let aa = this;", {this: true}, []
996. 1 ], [
997. 1 "", {trace: true}, []
998. 1 ], [
999. 1 (
1000. 1 "function aa({bb, aa}) {\n"
1001. 1 + " switch (aa) {\n"
1002. 1 + " case 1:\n"
1003. 1 + " break;\n"
1004. 1 + " case 0:\n"
1005. 1 + " break;\n"
1006. 1 + " default:\n"
1007. 1 + " return {bb, aa};\n"
1008. 1 + " }\n"
1009. 1 + "}\n"
1010. 1 ), {unordered: true}, []
1011. 1 ], [
1012. 1 "let {bb, aa} = 0;", {unordered: true}, []
1013. 1 ], [
1014. 1 (
1015. 1 "function aa() {\n"
1016. 1 + " if (aa) {\n"
1017. 1 + " let bb = 0;\n"
1018. 1 + " return bb;\n"
1019. 1 + " }\n"
1020. 1 + "}\n"
1021. 1 ), {variable: true}, []
1022. 1 ], [
1023. 1 "let bb = 0;\nlet aa = 0;", {variable: true}, []
1024. 1 ], [
1025. 1 "\t", {white: true}, []
1026. 1 ]
1027. 26 ].forEach(function ([
1028. 26 source, option_dict, global_list
1029. 26 ]) {
1030. 26 jstestIt((
1031. 26 `test option=${JSON.stringify(option_dict)} handling-behavior`
1032. 26 ), function () {
1033. 26 let elemNow = JSON.stringify([
1034. 26 option_dict, source, global_list
1035. 26 ]);
1036. 26 let warningsLength = (
1037. 26 option_dict.test_internal_error
1038. 1 ? 1
1039. 25 : 0
1040. 26 );
1041. 26 // Assert list is sorted.
1042. 26 assertOrThrow(elemPrv < elemNow, JSON.stringify([
1043. 26 elemPrv, elemNow
1044. 26 ], undefined, 4));
1045. 26 elemPrv = elemNow;
1046. 26 option_dict.beta = true;
1047. 26 [
1048. 26 jslint.jslint,
1049. 26 jslintCjs.jslint
1050. 52 ].forEach(function (jslint) {
1051. 52 // test jslint's option handling-behavior
1052. 52 assertOrThrow(
1053. 52 jslint(
1054. 52 source,
1055. 52 option_dict,
1056. 52 global_list
1057. 52 ).warnings.length === warningsLength,
1058. 52 "jslint.jslint(" + JSON.stringify([
1059. 52 source, option_dict, global_list
1060. 52 ]) + ")"
1061. 52 );
1062. 52 // test jslint's directive handling-behavior
1063. 52 source = (
1064. 52 "/*jslint " + JSON.stringify(
1065. 52 option_dict
1066. 52 ).slice(1, -1).replace((
1067. 52 /"/g
1068. 52 ), "") + "*/\n"
1069. 52 + (
1070. 52 global_list.length === 0
1071. 48 ? ""
1072. 4 : "/*global " + global_list.join(",") + "*/\n"
1073. 52 )
1074. 52 + source.replace((
1075. 52 /^#!/
1076. 52 ), "//")
1077. 52 );
1078. 52 assertOrThrow(
1079. 52 jslint(source).warnings.length === warningsLength,
1080. 52 source
1081. 52 );
1082. 52 });
1083. 26 });
1084. 26 });
1085. 1});
1086. 1
1087. 1jstestDescribe((
1088. 1 "test jslint's warnings handling-behavior"
1089. 1), function testBehaviorJslintWarnings() {
1090. 1 jstestIt((
1091. 1 "test jslint's warning handling-behavior"
1092. 1 ), function () {
1093. 1
1094. 1// this function will validate each jslint <warning> is raised with given
1095. 1// malformed <code>
1096. 1
1097. 1 sourceJslintMjs.replace((
1098. 1 /(\n\s*?\/\/\s*?test_cause:\s*?)(\S[\S\s]*?\S)(\n\n\s*?) *?\S/g
1099. 327 ), function (match0, header, causeList, footer) {
1100. 327 let tmp;
1101. 327 // console.error(match0);
1102. 327 // Validate header.
1103. 327 assertOrThrow(header === "\n\n// test_cause:\n", match0);
1104. 327 // Validate footer.
1105. 327 assertOrThrow(footer === "\n\n", match0);
1106. 327 // Validate causeList.
1107. 327 causeList = causeList.replace((
1108. 327 /^\/\/ /gm
1109. 327 ), "").replace((
1110. 327 /^\["\n([\S\s]*?)\n"(,.*?)$/gm
1111. 43 ), function (ignore, source, param) {
1112. 43 source = "[" + JSON.stringify(source) + param;
1113. 43 assertOrThrow(source.length > (80 - 3), source);
1114. 43 return source;
1115. 43 }).replace((
1116. 327 / \/\/jslint-ignore-line$/gm
1117. 327 ), "");
1118. 503 tmp = causeList.split("\n").map(function (cause) {
1119. 503 return (
1120. 503 "["
1121. 2515 + JSON.parse(cause).map(function (elem) {
1122. 2515 return JSON.stringify(elem);
1123. 2515 }).join(", ")
1124. 503 + "]"
1125. 503 );
1126. 503 }).sort().join("\n");
1127. 327 assertOrThrow(
1128. 327 causeList === tmp,
1129. 327 "\n" + causeList + "\n\n" + tmp
1130. 327 );
1131. 503 causeList.split("\n").forEach(function (cause) {
1132. 503 cause = JSON.parse(cause);
1133. 503 tmp = jslint.jslint(cause[0], {
1134. 503 beta: true,
1135. 503 test_cause: true
1136. 503 }).causes;
1137. 503 // Validate cause.
1138. 503 assertOrThrow(
1139. 503 tmp[JSON.stringify(cause.slice(1))],
1140. 503 (
1141. 503 "\n" + JSON.stringify(cause) + "\n\n"
1142. 503 + Object.keys(tmp).sort().join("\n")
1143. 503 )
1144. 503 );
1145. 503 });
1146. 327 return "";
1147. 327 });
1148. 1 });
1149. 1});
1150. 1
1151. 1jstestDescribe((
1152. 1 "test jstestXxx handling-behavior"
1153. 1), function testBehaviorJstestXxx() {
1154. 1 jstestIt((
1155. 1 "test jstestDescribe error handling-behavior"
1156. 1 ), function () {
1157. 1 throw new Error();
1158. 1 }, "pass");
1159. 1 jstestIt((
1160. 1 "test jstestOnExit tests-failed handling-behavior"
1161. 1 ), function () {
1162. 1 jstestOnExit(undefined, "testsFailed");
1163. 1 });
1164. 1});
1165. 1
1166. 1jstestDescribe((
1167. 1 "test misc handling-behavior"
1168. 1), function testBehaviorMisc() {
1169. 1 jstestIt((
1170. 1 "test misc handling-behavior"
1171. 1 ), async function () {
1172. 1 // test debugInline handling-behavior
1173. 1 noop(debugInline);
1174. 1 // test assertErrorThrownAsync error handling-behavior
1175. 1 await assertErrorThrownAsync(function () {
1176. 1 return assertErrorThrownAsync(noop);
1177. 1 });
1178. 1 // test assertJsonEqual error handling-behavior
1179. 1 await assertErrorThrownAsync(function () {
1180. 1 assertJsonEqual(1, 2);
1181. 1 });
1182. 1 await assertErrorThrownAsync(function () {
1183. 1 assertJsonEqual(1, 2, "undefined");
1184. 1 });
1185. 1 await assertErrorThrownAsync(function () {
1186. 1 assertJsonEqual(1, 2, {});
1187. 1 });
1188. 1 // test assertOrThrow error handling-behavior
1189. 1 await assertErrorThrownAsync(function () {
1190. 1 assertOrThrow(undefined, "undefined");
1191. 1 });
1192. 1 await assertErrorThrownAsync(function () {
1193. 1 assertOrThrow(undefined, new Error());
1194. 1 });
1195. 1 });
1196. 1});
1197. 1
1198. 1jstestDescribe((
1199. 1 "test v8CoverageListMerge handling-behavior"
1200. 1), function testBehaviorV8CoverageListMerge() {
1201. 1 let functionsInput = JSON.stringify([
1202. 1 {
1203. 1 functionName: "test",
1204. 1 isBlockCoverage: true,
1205. 1 ranges: [
1206. 1 {
1207. 1 count: 2,
1208. 1 endOffset: 4,
1209. 1 startOffset: 0
1210. 1 },
1211. 1 {
1212. 1 count: 1,
1213. 1 endOffset: 2,
1214. 1 startOffset: 1
1215. 1 },
1216. 1 {
1217. 1 count: 1,
1218. 1 endOffset: 3,
1219. 1 startOffset: 2
1220. 1 }
1221. 1 ]
1222. 1 }
1223. 1 ]);
1224. 1 jstestIt((
1225. 1 "accepts empty arrays for `v8CoverageListMerge`"
1226. 1 ), function () {
1227. 1 assertJsonEqual(v8CoverageListMerge([]), {
1228. 1 result: []
1229. 1 });
1230. 1 });
1231. 1 jstestIt((
1232. 1 "funcCovs.length === 1"
1233. 1 ), function () {
1234. 1 assertJsonEqual(v8CoverageListMerge([
1235. 1 {
1236. 1 result: [
1237. 1 {
1238. 1 functions: [
1239. 1 {
1240. 1 functionName: "test",
1241. 1 isBlockCoverage: true,
1242. 1 ranges: [
1243. 1 {
1244. 1 count: 2,
1245. 1 endOffset: 4,
1246. 1 startOffset: 0
1247. 1 }
1248. 1 ]
1249. 1 }
1250. 1 ],
1251. 1 moduleUrl: "/lib.js",
1252. 1 scriptId: "1"
1253. 1 }
1254. 1 ]
1255. 1 },
1256. 1 {
1257. 1 result: [
1258. 1 {
1259. 1 functions: [],
1260. 1 moduleUrl: "/lib.js",
1261. 1 scriptId: "2"
1262. 1 }
1263. 1 ]
1264. 1 }
1265. 1 ]), {
1266. 1 result: [
1267. 1 {
1268. 1 functions: [
1269. 1 {
1270. 1 functionName: "test",
1271. 1 isBlockCoverage: true,
1272. 1 ranges: [
1273. 1 {
1274. 1 count: 2,
1275. 1 endOffset: 4,
1276. 1 startOffset: 0
1277. 1 }
1278. 1 ]
1279. 1 }
1280. 1 ],
1281. 1 scriptId: "0"
1282. 1 }
1283. 1 ]
1284. 1 });
1285. 1 });
1286. 1 jstestIt((
1287. 1 "accepts arrays with a single item for `v8CoverageListMerge`"
1288. 1 ), function () {
1289. 1 assertJsonEqual(v8CoverageListMerge([
1290. 1 {
1291. 1 result: [
1292. 1 {
1293. 1 functions: JSON.parse(functionsInput),
1294. 1 moduleUrl: "/lib.js",
1295. 1 scriptId: "123"
1296. 1 }
1297. 1 ]
1298. 1 }
1299. 1 ]), {
1300. 1 result: [
1301. 1 {
1302. 1 functions: [
1303. 1 {
1304. 1 functionName: "test",
1305. 1 isBlockCoverage: true,
1306. 1 ranges: [
1307. 1 {
1308. 1 count: 2,
1309. 1 endOffset: 4,
1310. 1 startOffset: 0
1311. 1 },
1312. 1 {
1313. 1 count: 1,
1314. 1 endOffset: 3,
1315. 1 startOffset: 1
1316. 1 }
1317. 1 ]
1318. 1 }
1319. 1 ],
1320. 1 moduleUrl: "/lib.js",
1321. 1 scriptId: "0"
1322. 1 }
1323. 1 ]
1324. 1 });
1325. 1 });
1326. 1 jstestIt((
1327. 1 "accepts arrays with two identical items for"
1328. 1 + " `v8CoverageListMerge`"
1329. 1 ), function () {
1330. 1 assertJsonEqual(v8CoverageListMerge([
1331. 1 {
1332. 1 result: [
1333. 1 {
1334. 1 functions: JSON.parse(functionsInput),
1335. 1 scriptId: "123",
1336. 1 url: "/lib.js"
1337. 1 }, {
1338. 1 functions: JSON.parse(functionsInput),
1339. 1 scriptId: "123",
1340. 1 url: "/lib.js"
1341. 1 }
1342. 1 ]
1343. 1 }
1344. 1 ]), {
1345. 1 result: [
1346. 1 {
1347. 1 functions: [
1348. 1 {
1349. 1 functionName: "test",
1350. 1 isBlockCoverage: true,
1351. 1 ranges: [
1352. 1 {
1353. 1 count: 4,
1354. 1 endOffset: 4,
1355. 1 startOffset: 0
1356. 1 },
1357. 1 {
1358. 1 count: 2,
1359. 1 endOffset: 3,
1360. 1 startOffset: 1
1361. 1 }
1362. 1 ]
1363. 1 }
1364. 1 ],
1365. 1 scriptId: "0",
1366. 1 url: "/lib.js"
1367. 1 }
1368. 1 ]
1369. 1 });
1370. 1 });
1371. 1 [
1372. 1 "test_coverage_merge_is_block_coverage_test.json",
1373. 1 "test_coverage_merge_issue_2_mixed_is_block_coverage_test.json",
1374. 1 "test_coverage_merge_node_10_internal_errors_one_of_test.json",
1375. 1 "test_coverage_merge_reduced_test.json",
1376. 1 "test_coverage_merge_simple_test.json",
1377. 1 "test_coverage_merge_various_test.json"
1378. 6 ].forEach(function (file) {
1379. 6 jstestIt(file, function () {
1380. 6 file = testCoverageMergeData[file];
1381. 84 file.forEach(function ({
1382. 84 expected,
1383. 84 inputs
1384. 84 }) {
1385. 84 assertJsonEqual(v8CoverageListMerge(inputs), expected);
1386. 84 });
1387. 6 });
1388. 6 });
1389. 1 jstestIt((
1390. 1 "merge multiple node-sqlite coverage files"
1391. 1 ), function () {
1392. 1 let data1 = [
1393. 1 "test_v8_coverage_node_sqlite_9884_1633662346346_0.json",
1394. 1 "test_v8_coverage_node_sqlite_13216_1633662333140_0.json"
1395. 2 ].map(function (file) {
1396. 2 return testCoverageMergeData[file];
1397. 2 });
1398. 1 let data2 = testCoverageMergeData[
1399. 1 "test_v8_coverage_node_sqlite_merged.json"
1400. 1 ];
1401. 1 data1 = v8CoverageListMerge(data1);
1402. 1 data1 = v8CoverageListMerge([data1]);
1403. 1
1404. 1// Debug data1.
1405. 1// await moduleFs.promises.writeFile(
1406. 1// ".test_v8_coverage_node_sqlite_merged.json",
1407. 1// JSON.stringify(objectDeepCopyWithKeysSorted(data1), undefined, 4) + "\n"
1408. 1// );
1409. 1
1410. 1 assertJsonEqual(data1, data2);
1411. 1 });
1412. 1});
1413. 1
1414. 1jstestDescribe((
1415. 1 "test v8CoverageReportCreate handling-behavior"
1416. 1), function testBehaviorV8CoverageReportCreate() {
1417. 1 jstestIt((
1418. 1 "test null-case handling-behavior"
1419. 1 ), async function () {
1420. 1 await assertErrorThrownAsync(function () {
1421. 1 return v8CoverageReportCreate({});
1422. 1 }, "invalid coverageDir");
1423. 1 });
1424. 1 jstestIt((
1425. 1 "test coverage-report jslint.mjs handling-behavior"
1426. 1 ), async function () {
1427. 1 // test remove-old-coverage handling-behavior
1428. 1 await fsWriteFileWithParents(
1429. 1 ".tmp/coverage_jslint/coverage-0-0-0.json",
1430. 1 ""
1431. 1 );
1432. 1 await jslint.jslint_cli({
1433. 1 console_error: noop, // comment to debug
1434. 1 mode_cli: true,
1435. 1 process_argv: [
1436. 1 "node", "jslint.mjs",
1437. 1 "v8_coverage_report=.tmp/coverage_jslint",
1438. 1 "--exclude=aa.js",
1439. 1 "--include-node-modules=1",
1440. 1 "--include=jslint.mjs",
1441. 1 "node", "jslint.mjs"
1442. 1 ]
1443. 1 });
1444. 1 });
1445. 1 [
1446. 1 [
1447. 1 "v8CoverageReportCreate_high.js", (
1448. 1 "switch(0){\n"
1449. 1 + "case 0:break;\n"
1450. 1 + "}\n"
1451. 1 )
1452. 1 ], [
1453. 1 "v8CoverageReportCreate_ignore.js", (
1454. 1 "/*coverage-ignore-file*/\n"
1455. 1 + "switch(0){\n"
1456. 1 + "case 0:break;\n"
1457. 1 + "}\n"
1458. 1 )
1459. 1 ], [
1460. 1 "v8CoverageReportCreate_low.js", (
1461. 1 "switch(0){\n"
1462. 1 + "case 1:break;\n"
1463. 1 + "case 2:break;\n"
1464. 1 + "case 3:break;\n"
1465. 1 + "case 4:break;\n"
1466. 1 + "}\n"
1467. 1 )
1468. 1 ], [
1469. 1 "v8CoverageReportCreate_medium.js", (
1470. 1 "switch(0){\n"
1471. 1 + "case 0:break;\n"
1472. 1 + "case 1:break;\n"
1473. 1 + "case 2:break;\n"
1474. 1 + "}\n"
1475. 1 )
1476. 1 ]
1477. 4 ].forEach(function ([
1478. 4 file, data
1479. 4 ], ii) {
1480. 4 jstestIt(file, async function () {
1481. 4 let dir = ".tmp/coverage_" + ii + "/";
1482. 4 file = dir + file;
1483. 4 await fsWriteFileWithParents(file, data);
1484. 4 await jslint.jslint_cli({
1485. 4 console_error: noop, // comment to debug
1486. 4 mode_cli: true,
1487. 4 process_argv: [
1488. 4 "node", "jslint.mjs",
1489. 4 "v8_coverage_report=" + dir,
1490. 4 "node",
1491. 4 file
1492. 4 ]
1493. 4 });
1494. 4 });
1495. 4 });
1496. 1 jstestIt((
1497. 1 "test npm handling-behavior"
1498. 1 ), async function () {
1499. 1 await jslint.jslint_cli({
1500. 1 console_error: noop, // comment to debug
1501. 1 mode_cli: true,
1502. 1 process_argv: [
1503. 1 "node", "jslint.mjs",
1504. 1 "v8_coverage_report=.tmp/coverage_npm",
1505. 1 "npm", "--version"
1506. 1 ]
1507. 1 });
1508. 1 });
1509. 1 jstestIt((
1510. 1 "test misc handling-behavior"
1511. 1 ), async function () {
1512. 1 await Promise.all([
1513. 1 [
1514. 1 ".tmp/coverage_misc/aa.js", "\n".repeat(0x100)
1515. 1 ], [
1516. 1 ".tmp/coverage_misc/coverage-0-0-0.json", JSON.stringify({
1517. 1 "result": [
1518. 1 {
1519. 1 "functions": [
1520. 1 {
1521. 1 "functionName": "",
1522. 1 "isBlockCoverage": true,
1523. 1 "ranges": [
1524. 1 {
1525. 1 "count": 1,
1526. 1 "endOffset": 0xf0,
1527. 1 "startOffset": 0x10
1528. 1 },
1529. 1 {
1530. 1 "count": 1,
1531. 1 "endOffset": 0x40,
1532. 1 "startOffset": 0x20
1533. 1 },
1534. 1 {
1535. 1 "count": 1,
1536. 1 "endOffset": 0x80,
1537. 1 "startOffset": 0x60
1538. 1 },
1539. 1 {
1540. 1 "count": 0,
1541. 1 "endOffset": 0x45,
1542. 1 "startOffset": 0x25
1543. 1 },
1544. 1 {
1545. 1 "count": 0,
1546. 1 "endOffset": 0x85,
1547. 1 "startOffset": 0x65
1548. 1 }
1549. 1 ]
1550. 1 }
1551. 1 ],
1552. 1 "scriptId": "0",
1553. 1 "url": "file:///" + modulePath.resolve(
1554. 1 ".tmp/coverage_misc/aa.js"
1555. 1 )
1556. 1 }
1557. 1 ]
1558. 1 }, undefined, 4)
1559. 1 ]
1560. 2 ].map(async function ([
1561. 2 file, data
1562. 2 ]) {
1563. 2 await fsWriteFileWithParents(file, data);
1564. 2 }));
1565. 1 await jslint.jslint_cli({
1566. 1 console_error: noop, // comment to debug
1567. 1 mode_cli: true,
1568. 1 process_argv: [
1569. 1 "node", "jslint.mjs",
1570. 1 "v8_coverage_report=.tmp/coverage_misc"
1571. 1 // "node", ".tmp/coverage_misc/aa.js"
1572. 1 ]
1573. 1 });
1574. 1 });
1575. 1});
1576. 1