From 42061cfd805fbb3e79275f11167c149e22d437ba Mon Sep 17 00:00:00 2001 From: Mate Pek Date: Sun, 14 Oct 2018 14:20:45 +0200 Subject: [PATCH] Testing of the testing framework begins --- .vscode/launch.json | 27 ++- .vscode/tasks.json | 30 ++- README.md | 1 - package-lock.json | 332 ++++++++++++++++++++++++++------- package.json | 12 +- src/C2TestSuiteInfo.ts | 12 +- src/test/C2TestAdapter.test.ts | 176 +++++++++++++++++ src/test/index.ts | 25 +++ tsconfig.json | 10 +- 9 files changed, 518 insertions(+), 107 deletions(-) create mode 100644 src/test/C2TestAdapter.test.ts create mode 100644 src/test/index.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index 78b0b143..8a238868 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -6,14 +6,27 @@ "request": "launch", "name": "Catch2 adapter", "runtimeExecutable": "${execPath}", - "args": ["--extensionDevelopmentPath=${workspaceFolder}"], - "outFiles": ["${workspaceFolder}/out"] + "args": [ + "--extensionDevelopmentPath=${workspaceFolder}" + ], + "outFiles": [ + "${workspaceFolder}/out" + ] }, { - "type": "node", - "request": "attach", - "name": "Catch2 worker", - "processId": "${command:PickProcess}" + "name": "Extension Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--disable-extensions", + "--extensionDevelopmentPath=${workspaceFolder}", + "--extensionTestsPath=${workspaceFolder}/out/test" + ], + "outFiles": [ + "${workspaceFolder}/out/test/**/*.js" + ], + "preLaunchTask": "npm: watch" } ] -} +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json index df28e3e9..73816c91 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -5,24 +5,16 @@ "tasks": [ { "type": "npm", - "script": "build", - "problemMatcher": [ - { - "owner": "ts", - "source": "typescript", - "fileLocation": "relative", - "pattern": [ - { - "regexp": "^([^:]+):([0-9]+):([0-9]+) - (error) (.*)$", - "file": 1, - "line": 2, - "column": 3, - "severity": 4, - "message": 5 - } - ] - } - ] + "script": "watch", + "problemMatcher": "$tsc-watch", + "isBackground": true, + "presentation": { + "reveal": "never" + }, + "group": { + "kind": "build", + "isDefault": true + } } ] -} +} \ No newline at end of file diff --git a/README.md b/README.md index 5024402f..125d744b 100644 --- a/README.md +++ b/README.md @@ -116,7 +116,6 @@ Example: - `--nothrow` -- Grouping by tags. - Tests ## Contribution diff --git a/package-lock.json b/package-lock.json index 68656774..ac6c1e66 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4,6 +4,47 @@ "lockfileVersion": 1, "requires": true, "dependencies": { + "@sinonjs/commons": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.0.2.tgz", + "integrity": "sha512-WR3dlgqJP4QNrLC4iXN/5/2WaLQQ0VijOOkmflqFGVJ6wLEpbSjo7c0ZeGIdtY8Crk7xBBp87sM6+Mkerz7alw==", + "dev": true, + "requires": { + "type-detect": "4.0.8" + } + }, + "@sinonjs/formatio": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.0.0.tgz", + "integrity": "sha512-vdjoYLDptCgvtJs57ULshak3iJe4NW3sJ3g36xVDGff5AE8P30S6A093EIEPjdi2noGhfuNOEkbxt3J3awFW1w==", + "dev": true, + "requires": { + "@sinonjs/samsam": "2.1.0" + }, + "dependencies": { + "@sinonjs/samsam": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.0.tgz", + "integrity": "sha512-5x2kFgJYupaF1ns/RmharQ90lQkd2ELS8A9X0ymkAAdemYHGtI2KiUHG8nX2WU0T1qgnOU5YMqnBM2V7NUanNw==", + "dev": true, + "requires": { + "array-from": "^2.1.1" + } + } + } + }, + "@sinonjs/samsam": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-2.1.2.tgz", + "integrity": "sha512-ZwTHAlC9akprWDinwEPD4kOuwaYZlyMwVJIANsKNC3QVp0AHB04m7RnB4eqeWfgmxw8MGTzS9uMaw93Z3QcZbw==", + "dev": true + }, + "@types/chai": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.6.tgz", + "integrity": "sha512-CBk7KTZt3FhPsEkYioG6kuCIpWISw+YI8o+3op4+NXwTpvAPxE1ES8+PY8zfaK2L98b1z5oq03UHa4VYpeUxnw==", + "dev": true + }, "@types/entities": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@types/entities/-/entities-1.1.0.tgz", @@ -16,6 +57,21 @@ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==", "dev": true }, + "@types/fs-extra": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.4.tgz", + "integrity": "sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/mocha": { + "version": "5.2.5", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", + "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", + "dev": true + }, "@types/node": { "version": "10.9.4", "resolved": "https://registry.npmjs.org/@types/node/-/node-10.9.4.tgz", @@ -111,6 +167,12 @@ "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", "dev": true }, + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true + }, "array-slice": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", @@ -229,12 +291,6 @@ "repeat-element": "^1.1.2" } }, - "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", - "dev": true - }, "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", @@ -393,9 +449,9 @@ "dev": true }, "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "dom-serializer": { @@ -645,6 +701,17 @@ "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", "dev": true }, + "fs-extra": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.0.tgz", + "integrity": "sha512-EglNDLRpmaTWiD/qraZn6HREAEAHJcJOmxNEYwq6xeMKnVMAy3GUcFB+wXt2C6k4CNvB/mP1y/U3dzvKKj5OtQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -803,12 +870,6 @@ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true }, - "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", - "dev": true - }, "gulp-chmod": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", @@ -1075,9 +1136,9 @@ } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "he": { @@ -1292,6 +1353,15 @@ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", "dev": true }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, "jsonify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", @@ -1310,6 +1380,12 @@ "verror": "1.10.0" } }, + "just-extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-3.0.0.tgz", + "integrity": "sha512-Fu3T6pKBuxjWT/p4DkqGHFRsysc8OauWr4ZRTY9dIx07Y9O0RkoR5jcv28aeD1vuAwhm3nLkDurwLXoALp4DpQ==", + "dev": true + }, "kind-of": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", @@ -1340,12 +1416,24 @@ "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", "dev": true }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, "lodash.isequal": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", "dev": true }, + "lolex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-3.0.0.tgz", + "integrity": "sha512-hcnW80h3j2lbUfFdMArd5UPA/vxZJ+G8vobd+wg3nVEQA0EigStbYcrG030FJxL6xiDDPEkoMatV9xIh5OecQQ==", + "dev": true + }, "map-stream": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", @@ -1487,46 +1575,6 @@ "minimist": "0.0.8" } }, - "mocha": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", - "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", - "dev": true, - "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", - "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" - }, - "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", - "dev": true - }, - "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - } - } - }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -1551,6 +1599,27 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "nise": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.4.6.tgz", + "integrity": "sha512-1GedetLKzmqmgwabuMSqPsT7oumdR77SBpDfNNJhADRIeA3LN/2RVqR4fFqwvzhAqcTef6PPCzQwITE/YQ8S8A==", + "dev": true, + "requires": { + "@sinonjs/formatio": "3.0.0", + "just-extend": "^3.0.0", + "lolex": "^2.3.2", + "path-to-regexp": "^1.7.0", + "text-encoding": "^0.6.4" + }, + "dependencies": { + "lolex": { + "version": "2.7.5", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.7.5.tgz", + "integrity": "sha512-l9x0+1offnKKIzYVjyXU2SiwhXDLekRzKyhnbyldPHvC7BvLPVpdNUNR2KeMAiCN2D/kLNttZgQD5WjSxuBx3Q==", + "dev": true + } + } + }, "node.extend": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", @@ -1700,6 +1769,23 @@ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + } + } + }, "pause-stream": { "version": "0.0.11", "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", @@ -1933,6 +2019,34 @@ "integrity": "sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==", "dev": true }, + "sinon": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.0.0.tgz", + "integrity": "sha512-8OrSYFPZ9xaECfi1ayVMd0ihYCW2OZYgX3rBczrB990gHZMM+aftvhNTJazGz/luS0Us9NWgD5P3KGQ7kYZvGg==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.0.2", + "@sinonjs/formatio": "^3.0.0", + "@sinonjs/samsam": "^2.1.2", + "diff": "^3.5.0", + "lodash.get": "^4.4.2", + "lolex": "^3.0.0", + "nise": "^1.4.5", + "supports-color": "^5.5.0", + "type-detect": "^4.0.8" + }, + "dependencies": { + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -2045,15 +2159,6 @@ "strip-bom": "^2.0.0" } }, - "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", - "dev": true, - "requires": { - "has-flag": "^2.0.0" - } - }, "tar": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", @@ -2065,6 +2170,12 @@ "inherits": "2" } }, + "text-encoding": { + "version": "0.6.4", + "resolved": "http://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -2157,6 +2268,12 @@ "dev": true, "optional": true }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + }, "typed-rest-client": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-0.9.0.tgz", @@ -2203,6 +2320,12 @@ "through2-filter": "^2.0.0" } }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, "url-join": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/url-join/-/url-join-1.1.0.tgz", @@ -2363,6 +2486,81 @@ "source-map-support": "^0.5.0", "url-parse": "^1.4.3", "vinyl-source-stream": "^1.1.0" + }, + "dependencies": { + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "^2.0.0" + } + } } }, "vscode-test-adapter-api": { diff --git a/package.json b/package.json index eac6bb37..bf376e2b 100644 --- a/package.json +++ b/package.json @@ -30,11 +30,12 @@ "postinstall": "node ./node_modules/vscode/bin/install", "reinstall": "rimraf node_modules package-lock.json && npm install", "clean": "rimraf out vscode-google-test-adapter-*.vsix", - "build": "tsc", - "watch": "tsc -w", + "compile": "tsc -p ./", + "watch": "tsc -watch -p ./", "rebuild": "npm run clean && npm run build", "package": "vsce package", - "publish": "vsce publish" + "publish": "vsce publish", + "test": "node ./node_modules/vscode/bin/test" }, "extensionDependencies": [ "hbenl.vscode-test-explorer" @@ -50,6 +51,11 @@ "@types/entities": "^1.1.0", "@types/xml-parser": "^1.2.29", "@types/xml2js": "^0.4.3", + "@types/mocha": "^5.2.5", + "@types/chai": "^4.1.2", + "@types/fs-extra": "^5.0.4", + "fs-extra": "^7.0.0", + "sinon": "^7.0.0", "typescript": "^2.9.2", "vsce": "^1.51.1", "vscode": "^1.1.21" diff --git a/src/C2TestSuiteInfo.ts b/src/C2TestSuiteInfo.ts index e3a9416a..3b348013 100644 --- a/src/C2TestSuiteInfo.ts +++ b/src/C2TestSuiteInfo.ts @@ -136,13 +136,10 @@ export class C2TestSuiteInfo implements TestSuiteInfo { } } - this.adapter.testStatesEmitter.fire( - {type: 'suite', suite: this, state: 'running'}); - this.proc = spawn(this.execPath, execParams, this.execOptions); - let resolver: Function|undefined = undefined; + let pResolver: Function|undefined = undefined; const p = new Promise((resolve, reject) => { - resolver = resolve; + pResolver = resolve; }); const data = new class { @@ -229,9 +226,12 @@ export class C2TestSuiteInfo implements TestSuiteInfo { }); this.proc.on('close', (code: number) => { - if (resolver != undefined) resolver(); + if (pResolver != undefined) pResolver(); }); + this.adapter.testStatesEmitter.fire( + {type: 'suite', suite: this, state: 'running'}); + return p .then(() => { this.releaseSlot(); diff --git a/src/test/C2TestAdapter.test.ts b/src/test/C2TestAdapter.test.ts new file mode 100644 index 00000000..188390f9 --- /dev/null +++ b/src/test/C2TestAdapter.test.ts @@ -0,0 +1,176 @@ +const sinon = require('sinon'); +const child_process = require('child_process'); + +// import * as path from 'path'; +import * as fs from 'fs-extra'; +import * as assert from 'assert'; +import {EventEmitter} from 'events'; +import * as vscode from 'vscode'; +import {TestEvent, TestLoadFinishedEvent, TestLoadStartedEvent, TestRunFinishedEvent, TestRunStartedEvent, TestSuiteEvent, TestSuiteInfo} from 'vscode-test-adapter-api'; +import {Log} from 'vscode-test-adapter-util'; + +import {C2AllTestSuiteInfo} from '../C2AllTestSuiteInfo'; +import * as myExtension from '../C2TestAdapter'; +import {C2TestSuiteInfo} from '../C2TestSuiteInfo'; + +const disposable: vscode.Disposable[] = []; + +const workspaceFolderPath = 'out/vscode-catch2-test/'; +fs.removeSync(workspaceFolderPath); +fs.ensureDirSync(workspaceFolderPath); + +// const setupSettings = function(json: any) { +// const p = path.join(workspaceFolderPath, '.vscode', 'settings.json'); +// fs.removeSync(p); +// fs.ensureFileSync(p); +// fs.writeJSON(p, json); +// }; + +const workspaceFolderUri = vscode.Uri.file(workspaceFolderPath); +vscode.workspace.updateWorkspaceFolders( + 0, 0, {uri: workspaceFolderUri, name: undefined}); +const workspaceFolder = + vscode.workspace.getWorkspaceFolder(workspaceFolderUri)!; +const logger = + new Log('Catch2TestAdapter', workspaceFolder, 'Catch2TestAdapter'); +const adapter = new myExtension.C2TestAdapter(workspaceFolder, logger); + +const testsEvents: (TestLoadStartedEvent|TestLoadFinishedEvent)[] = []; +disposable.push( + adapter.tests((e: TestLoadStartedEvent|TestLoadFinishedEvent) => { + testsEvents.push(e); + })); + +const testStatesEvents: (TestRunStartedEvent|TestRunFinishedEvent| + TestSuiteEvent|TestEvent)[] = []; +disposable.push(adapter.testStates( + (e: TestRunStartedEvent|TestRunFinishedEvent|TestSuiteEvent|TestEvent) => { + testStatesEvents.push(e); + })); + +const setupTemlateTestTree = function() { + return adapter.load() + .then(() => { + const suite = (testsEvents[1]).suite; + assert.notEqual(undefined, suite); + return suite!; + }) + .then((suite: TestSuiteInfo) => { + const allTests = suite; + const suite1 = allTests.createChildSuite('suite1', 'execPath', {}); + const s1t1 = suite1.createChildTest('test1', 'd', ['t1'], 'file', 1); + const s1t2 = suite1.createChildTest('test2', 'd', ['t1'], 'file', 1); + const suite2 = allTests.createChildSuite('suite2', 'execPath', {}); + const s2t1 = suite2.createChildTest('test1', 'd', ['t1'], 'file', 1); + const s2t2 = suite2.createChildTest('test2', 'd', ['t1'], 'file', 1); + + return { + allTests: allTests, suite1: suite1, s1t1: s1t1, s1t2: s1t2, + suite2: suite2, s2t1: s2t1, s2t2: s2t2 + } + }); +}; + +/// + +describe('C2TestAdapter', function() { + beforeEach(function() { + while (testsEvents.length > 0) testsEvents.pop(); + while (testStatesEvents.length > 0) testStatesEvents.pop(); + }); + + after(() => { + while (disposable.length > 0) disposable.pop()!.dispose(); + }) + + it('empty config load', function() { + return adapter.load().then(() => { + assert.equal(2, testsEvents.length); + assert.equal('started', testsEvents[0].type); + assert.equal('finished', testsEvents[1].type); + const suite = (testsEvents[1]).suite; + assert.notEqual(undefined, suite); + assert.equal(0, suite!.children.length); + }); + }); + + it('run1', function() { + this.timeout(10000); + return setupTemlateTestTree().then((s) => { + const spawnEvent: any = new EventEmitter(); + spawnEvent.stdout = new EventEmitter(); + + const stub = sinon.stub(child_process, 'spawn'); + stub.throws(); + stub.withArgs( + s.suite1.execPath, + [s.s1t1.testNameFull, '--reporter', 'xml', '--durations', 'yes'], + s.suite1.execOptions) + .returns(spawnEvent); + + const d = adapter.testStates( + (e: TestRunStartedEvent|TestRunFinishedEvent|TestSuiteEvent| + TestEvent) => { + if (e.type == 'suite' && e.state == 'running' && + (e.suite) === s.suite1) { + spawnEvent.stdout.emit( + 'data', + ` + + + + + + + + 1 == x % 2 + + + 1 == 0 + + + + + + + + `); + spawnEvent.emit('close', 1); + } + }); + + return adapter.run([s.s1t1.id]).then(() => { + assert.equal(6, testStatesEvents.length); + assert.equal('started', testStatesEvents[0].type); + + assert.equal('suite', testStatesEvents[1].type); + assert.equal('running', (testStatesEvents[1]).state); + assert.equal(s.suite1, (testStatesEvents[1]).suite); + + assert.equal('test', testStatesEvents[2].type); + assert.equal('running', (testStatesEvents[2]).state); + assert.equal(s.s1t1, (testStatesEvents[2]).test); + + { + assert.equal('test', testStatesEvents[3].type); + const res = (testStatesEvents[3]); + assert.equal('failed', res.state); + assert.equal(s.s1t1, res.test); + assert.ok(undefined != res.decorations); + assert.equal(1, res.decorations!.length); + assert.equal(213, res.decorations![0].line); + assert.equal('Expanded: 1 == 0', res.decorations![0].message); + } + + assert.equal('suite', testStatesEvents[4].type); + assert.equal('completed', (testStatesEvents[4]).state); + assert.equal(s.suite1, (testStatesEvents[4]).suite); + + assert.equal('finished', testStatesEvents[5].type); + + d.dispose(); + }); + }); + }); +}); diff --git a/src/test/index.ts b/src/test/index.ts new file mode 100644 index 00000000..261152fe --- /dev/null +++ b/src/test/index.ts @@ -0,0 +1,25 @@ +// +// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING +// +// This file is providing the test runner to use when running extension tests. +// By default the test runner in use is Mocha based. +// +// You can provide your own test runner if you want to override it by exporting +// a function run(testRoot: string, clb: (error:Error) => void) that the +// extension host can call to run the tests. The test runner is expected to use +// console.log to report the results back to the caller. When the tests are +// finished, return a possible error to the callback or null if none. + +import * as testRunner from 'vscode/lib/testrunner'; + +// You can directly control Mocha options by uncommenting the following lines +// See +// https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options +// for more info +testRunner.configure({ + ui: 'bdd', // the TDD UI is being used in extension.test.ts (suite, test, + // etc.) + useColors: true // colored output from test results +}); + +module.exports = testRunner; \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 41f9af63..ff7a12a6 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,7 +1,9 @@ { "compilerOptions": { - "target": "es2015", - "lib": [ "es2015" ], + "target": "es2018", + "lib": [ + "es2018", + ], "module": "commonjs", "outDir": "out", "importHelpers": true, @@ -16,6 +18,6 @@ }, "include": [ "src/main.ts", + "src/test/**/*.ts", ] -} - \ No newline at end of file +} \ No newline at end of file