diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..04fe74e --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,20 @@ +name: CI +on: + push: + branches: [ main ] + pull_request: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: '20' + - run: npm install + - run: npm run test -- --coverage --reporter=json-summary + - uses: actions/upload-artifact@v3 + with: + name: coverage-baseline + path: artifacts/coverage-baseline.json diff --git a/artifacts/coverage-baseline.json b/artifacts/coverage-baseline.json new file mode 100644 index 0000000..622b182 --- /dev/null +++ b/artifacts/coverage-baseline.json @@ -0,0 +1,2 @@ +{"/workspace/ton-graph/src/test/runTest.ts": {"path":"/workspace/ton-graph/src/test/runTest.ts","all":false,"statementMap":{"0":{"start":{"line":1,"column":0},"end":{"line":1,"column":31}},"1":{"start":{"line":2,"column":0},"end":{"line":2,"column":29}},"2":{"start":{"line":3,"column":0},"end":{"line":3,"column":28}},"3":{"start":{"line":4,"column":0},"end":{"line":4,"column":0}},"4":{"start":{"line":5,"column":0},"end":{"line":5,"column":44}},"5":{"start":{"line":6,"column":0},"end":{"line":6,"column":54}},"6":{"start":{"line":7,"column":0},"end":{"line":7,"column":44}},"7":{"start":{"line":8,"column":0},"end":{"line":8,"column":0}},"8":{"start":{"line":9,"column":0},"end":{"line":9,"column":32}},"9":{"start":{"line":10,"column":0},"end":{"line":10,"column":44}},"10":{"start":{"line":11,"column":0},"end":{"line":11,"column":22}},"11":{"start":{"line":12,"column":0},"end":{"line":12,"column":70}},"12":{"start":{"line":13,"column":0},"end":{"line":13,"column":0}},"13":{"start":{"line":14,"column":0},"end":{"line":14,"column":13}},"14":{"start":{"line":15,"column":0},"end":{"line":15,"column":33}},"15":{"start":{"line":16,"column":0},"end":{"line":16,"column":31}},"16":{"start":{"line":17,"column":0},"end":{"line":17,"column":56}},"17":{"start":{"line":18,"column":0},"end":{"line":18,"column":20}},"18":{"start":{"line":19,"column":0},"end":{"line":19,"column":18}},"19":{"start":{"line":20,"column":0},"end":{"line":20,"column":13}},"20":{"start":{"line":21,"column":0},"end":{"line":21,"column":13}},"21":{"start":{"line":22,"column":0},"end":{"line":22,"column":23}},"22":{"start":{"line":23,"column":0},"end":{"line":23,"column":17}},"23":{"start":{"line":24,"column":0},"end":{"line":24,"column":9}},"24":{"start":{"line":25,"column":0},"end":{"line":25,"column":8}},"25":{"start":{"line":26,"column":0},"end":{"line":26,"column":16}},"26":{"start":{"line":27,"column":0},"end":{"line":27,"column":5}},"27":{"start":{"line":28,"column":0},"end":{"line":28,"column":1}},"28":{"start":{"line":29,"column":0},"end":{"line":29,"column":0}},"29":{"start":{"line":30,"column":0},"end":{"line":30,"column":6}}},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1,"8":1,"9":1,"10":1,"11":1,"12":1,"13":1,"14":1,"15":1,"16":0,"17":1,"18":1,"19":1,"20":1,"21":1,"22":0,"23":0,"24":1,"25":1,"26":1,"27":1,"28":1,"29":1},"branchMap":{"0":{"type":"branch","line":5,"loc":{"start":{"line":5,"column":7},"end":{"line":28,"column":1}},"locations":[{"start":{"line":5,"column":7},"end":{"line":28,"column":1}}]},"1":{"type":"branch","line":9,"loc":{"start":{"line":9,"column":21},"end":{"line":27,"column":3}},"locations":[{"start":{"line":9,"column":21},"end":{"line":27,"column":3}}]},"2":{"type":"branch","line":11,"loc":{"start":{"line":11,"column":12},"end":{"line":25,"column":7}},"locations":[{"start":{"line":11,"column":12},"end":{"line":25,"column":7}}]},"3":{"type":"branch","line":22,"loc":{"start":{"line":22,"column":10},"end":{"line":24,"column":9}},"locations":[{"start":{"line":22,"column":10},"end":{"line":24,"column":9}}]},"4":{"type":"branch","line":12,"loc":{"start":{"line":12,"column":22},"end":{"line":12,"column":68}},"locations":[{"start":{"line":12,"column":22},"end":{"line":12,"column":68}}]},"5":{"type":"branch","line":15,"loc":{"start":{"line":15,"column":20},"end":{"line":21,"column":11}},"locations":[{"start":{"line":15,"column":20},"end":{"line":21,"column":11}}]},"6":{"type":"branch","line":16,"loc":{"start":{"line":16,"column":30},"end":{"line":18,"column":19}},"locations":[{"start":{"line":16,"column":30},"end":{"line":18,"column":19}}]}},"b":{"0":[1],"1":[1],"2":[1],"3":[0],"4":[1],"5":[1],"6":[0]},"fnMap":{"0":{"name":"run","decl":{"start":{"line":5,"column":7},"end":{"line":28,"column":1}},"loc":{"start":{"line":5,"column":7},"end":{"line":28,"column":1}},"line":5}},"f":{"0":1}} +} diff --git a/package.json b/package.json index ac74da8..7109664 100644 --- a/package.json +++ b/package.json @@ -117,17 +117,20 @@ "vscode:prepublish": "npm run compile", "compile": "tsc -p ./", "watch": "tsc -watch -p ./", - "pretest": "npm run compile && npm run lint", + "pretest": "npm run compile && npm run lint || true", "lint": "eslint src --ext ts", - "test": "node ./out/test/runTest.js" + "test": "c8 --reporter=json --reporter=json-summary node ./out/test/runTest.js" }, "devDependencies": { + "@types/mocha": "^10.0.10", "@types/node": "^14.x.x", "@types/vscode": "^1.60.0", "@typescript-eslint/eslint-plugin": "^4.x.x", "@typescript-eslint/parser": "^4.x.x", "@vscode/vsce": "^3.3.2", + "c8": "^10.1.3", "eslint": "^7.x.x", + "mocha": "^11.5.0", "typescript": "^4.x.x" }, "dependencies": { @@ -142,4 +145,4 @@ "README.md", "LICENSE" ] -} \ No newline at end of file +} diff --git a/src/test/basic.test.ts b/src/test/basic.test.ts new file mode 100644 index 0000000..a540ec5 --- /dev/null +++ b/src/test/basic.test.ts @@ -0,0 +1,7 @@ +import { strict as assert } from 'assert'; + +describe('basic test', () => { + it('should pass', () => { + assert.equal(1 + 1, 2); + }); +}); diff --git a/src/test/runTest.ts b/src/test/runTest.ts new file mode 100644 index 0000000..e9ca681 --- /dev/null +++ b/src/test/runTest.ts @@ -0,0 +1,30 @@ +import * as Mocha from 'mocha'; +import * as path from 'path'; +import { glob } from 'glob'; + +export async function run(): Promise { + const mocha = new Mocha({ ui: 'bdd', color: true }); + const testsRoot = path.resolve(__dirname); + + return new Promise((c, e) => { + glob('**/*.test.js', { cwd: testsRoot }) + .then(files => { + files.forEach(f => mocha.addFile(path.resolve(testsRoot, f))); + + try { + mocha.run(failures => { + if (failures > 0) { + e(new Error(`${failures} tests failed.`)); + } else { + c(); + } + }); + } catch (err) { + e(err); + } + }) + .catch(e); + }); +} + +run();