Compare commits

...

62 Commits

Author SHA1 Message Date
10ab777e7f 5.0.5 2022-07-24 14:03:45 +02:00
898eed4584 fix(core): update 2022-07-24 14:03:44 +02:00
7a1eae2bfb 5.0.4 2022-07-24 14:03:30 +02:00
8f7167f201 fix(core): update 2022-07-24 14:03:29 +02:00
6fa151f933 5.0.3 2022-03-24 13:17:20 +01:00
f846b91378 fix(core): update 2022-03-24 13:17:20 +01:00
a0840ee9f4 5.0.2 2022-03-14 13:17:55 +01:00
041534f363 fix(core): update 2022-03-14 13:17:54 +01:00
c89362ba8a 5.0.1 2022-03-14 12:56:17 +01:00
f07879d2c1 fix(core): update 2022-03-14 12:56:17 +01:00
eba3a19488 5.0.0 2022-03-14 11:23:02 +01:00
f83479a407 4.0.9 2022-03-14 11:22:18 +01:00
da711c119f fix(core): update 2022-03-14 11:22:17 +01:00
6690238251 4.0.8 2022-02-28 13:17:00 +01:00
27a794b83c fix(core): update 2022-02-28 13:16:59 +01:00
b3c4a58491 4.0.7 2022-02-15 16:49:29 +01:00
50c34f89ee fix(core): update 2022-02-15 16:49:29 +01:00
b813453c5f 4.0.6 2022-02-15 16:48:59 +01:00
9a6dc33b6b fix(core): update 2022-02-15 16:48:59 +01:00
8bf99ae7ec 4.0.5 2022-02-15 16:48:04 +01:00
cc708b29ae fix(core): update 2022-02-15 16:48:03 +01:00
5798d3e808 4.0.4 2022-02-15 16:40:22 +01:00
37fe299a45 fix(core): update 2022-02-15 16:40:21 +01:00
e24cdd9f0f 4.0.3 2022-02-02 08:11:01 +01:00
ae7aaab456 fix(core): update 2022-02-02 08:11:00 +01:00
bab360cc59 4.0.2 2022-02-02 07:38:27 +01:00
36dcd228fd fix(core): update 2022-02-02 07:38:26 +01:00
c7d6451758 4.0.1 2022-02-02 03:03:03 +01:00
aeedf14336 fix(core): update 2022-02-02 03:03:03 +01:00
14b95cfbc3 4.0.0 2022-01-21 19:54:08 +01:00
0884da7941 BREAKING CHANGE(core): switxh to @pushrocks/smartexpect 2022-01-21 19:54:07 +01:00
22df58b8bc 3.2.15 2021-12-10 17:34:06 +01:00
33399126f7 fix(core): update 2021-12-10 17:34:06 +01:00
d1e46fd2a7 3.2.14 2021-02-13 16:06:38 +00:00
9304e6d736 fix(core): update 2021-02-13 16:06:38 +00:00
588c532d6d 3.2.13 2021-02-13 16:02:40 +00:00
e3a756c775 fix(core): update 2021-02-13 16:02:40 +00:00
05defe6031 3.2.12 2021-01-26 03:19:50 +00:00
f4bb17dea1 fix(core): update 2021-01-26 03:19:49 +00:00
1023a94ff2 3.2.11 2021-01-26 03:15:50 +00:00
8ee456da5f fix(core): update 2021-01-26 03:15:50 +00:00
45ee6eca31 3.2.10 2021-01-26 02:35:03 +00:00
1eaf1e9a77 fix(core): update 2021-01-26 02:35:02 +00:00
715108b11b 3.2.9 2020-07-11 16:07:53 +00:00
7b1e8f47b1 fix(core): update 2020-07-11 16:07:52 +00:00
2b71ffe8c2 3.2.8 2020-07-11 16:07:31 +00:00
29ec99e63e fix(core): update 2020-07-11 16:07:30 +00:00
50f1aad895 3.2.7 2020-07-08 00:46:44 +00:00
f7e95df2b9 fix(core): update 2020-07-08 00:46:43 +00:00
a00536996c 3.2.6 2020-07-08 00:17:32 +00:00
66f49cf8aa fix(core): update 2020-07-08 00:17:31 +00:00
aa3f1eb21f update readme 2020-07-08 00:17:25 +00:00
d81a8006b1 3.2.5 2020-07-08 00:16:10 +00:00
5fa4c1cd85 fix(core): update 2020-07-08 00:16:09 +00:00
fc609858ff 3.2.4 2020-07-08 00:15:45 +00:00
19ecca0179 fix(core): update 2020-07-08 00:15:44 +00:00
ff55e596cb 3.2.3 2020-07-08 00:11:16 +00:00
ed8c8312c2 fix(core): update 2020-07-08 00:11:16 +00:00
a6dd8de0db 3.2.2 2020-07-07 22:54:15 +00:00
081347b23b fix(core): update 2020-07-07 22:54:15 +00:00
f23575a8a2 3.2.1 2020-03-15 16:36:26 +00:00
b2dbc9160b fix(core): update 2020-03-15 16:36:25 +00:00
26 changed files with 13662 additions and 1123 deletions

4
.gitignore vendored
View File

@ -15,8 +15,6 @@ node_modules/
# builds # builds
dist/ dist/
dist_web/ dist_*/
dist_serve/
dist_ts_web/
# custom # custom

View File

@ -19,22 +19,35 @@ mirror:
stage: security stage: security
script: script:
- npmci git mirror - npmci git mirror
only:
- tags
tags: tags:
- lossless - lossless
- docker - docker
- notpriv - notpriv
snyk: auditProductionDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security stage: security
script: script:
- npmci npm prepare - npmci npm prepare
- npmci command npm install -g snyk - npmci command npm install --production --ignore-scripts
- npmci command npm install --ignore-scripts - npmci command npm config set registry https://registry.npmjs.org
- npmci command snyk test - npmci command npm audit --audit-level=high --only=prod --production
tags: tags:
- lossless
- docker - docker
- notpriv
auditDevDependencies:
image: registry.gitlab.com/hosttoday/ht-docker-node:npmci
stage: security
script:
- npmci npm prepare
- npmci command npm install --ignore-scripts
- npmci command npm config set registry https://registry.npmjs.org
- npmci command npm audit --audit-level=high --only=dev
tags:
- docker
allow_failure: true
# ==================== # ====================
# test stage # test stage
@ -49,9 +62,7 @@ testStable:
- npmci npm test - npmci npm test
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- priv
testBuild: testBuild:
stage: test stage: test
@ -62,9 +73,7 @@ testBuild:
- npmci command npm run build - npmci command npm run build
coverage: /\d+.?\d+?\%\s*coverage/ coverage: /\d+.?\d+?\%\s*coverage/
tags: tags:
- lossless
- docker - docker
- notpriv
release: release:
stage: release stage: release
@ -84,6 +93,8 @@ release:
codequality: codequality:
stage: metadata stage: metadata
allow_failure: true allow_failure: true
only:
- tags
script: script:
- npmci command npm install -g tslint typescript - npmci command npm install -g tslint typescript
- npmci npm prepare - npmci npm prepare

15
.snyk
View File

@ -1,15 +0,0 @@
# Snyk (https://snyk.io) policy file, patches or ignores known vulnerabilities.
version: v1.12.0
# ignores vulnerabilities until expiry date; change duration by modifying expiry date
ignore:
'npm:shelljs:20140723':
- smartdelay > typings-global > smartshell > shelljs:
reason: None given
expires: '2018-07-28T21:47:33.536Z'
- early > typings-global > smartshell > shelljs:
reason: None given
expires: '2018-07-28T21:47:33.537Z'
- early > beautycolor > typings-global > smartshell > shelljs:
reason: None given
expires: '2018-07-28T21:47:33.537Z'
patch: {}

29
.vscode/launch.json vendored Normal file
View File

@ -0,0 +1,29 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "current file",
"type": "node",
"request": "launch",
"args": [
"${relativeFile}"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
},
{
"name": "test.ts",
"type": "node",
"request": "launch",
"args": [
"test/test.ts"
],
"runtimeArgs": ["-r", "@gitzone/tsrun"],
"cwd": "${workspaceRoot}",
"protocol": "inspector",
"internalConsoleOptions": "openOnSessionStart"
}
]
}

26
.vscode/settings.json vendored Normal file
View File

@ -0,0 +1,26 @@
{
"json.schemas": [
{
"fileMatch": ["/npmextra.json"],
"schema": {
"type": "object",
"properties": {
"npmci": {
"type": "object",
"description": "settings for npmci"
},
"gitzone": {
"type": "object",
"description": "settings for gitzone",
"properties": {
"projectType": {
"type": "string",
"enum": ["website", "element", "service", "npm", "wcc"]
}
}
}
}
}
}
]
}

View File

@ -1,76 +0,0 @@
# @pushrocks/tapbundle
tap bundled for tapbuffer
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/tapbundle)
* [gitlab.com (source)](https://gitlab.com/pushrocks/tapbundle)
* [github.com (source mirror)](https://github.com/pushrocks/tapbundle)
* [docs (typedoc)](https://pushrocks.gitlab.io/tapbundle/)
## Status for master
[![build status](https://gitlab.com/pushrocks/tapbundle/badges/master/build.svg)](https://gitlab.com/pushrocks/tapbundle/commits/master)
[![coverage report](https://gitlab.com/pushrocks/tapbundle/badges/master/coverage.svg)](https://gitlab.com/pushrocks/tapbundle/commits/master)
[![npm downloads per month](https://img.shields.io/npm/dm/@pushrocks/tapbundle.svg)](https://www.npmjs.com/package/@pushrocks/tapbundle)
[![Known Vulnerabilities](https://snyk.io/test/npm/@pushrocks/tapbundle/badge.svg)](https://snyk.io/test/npm/@pushrocks/tapbundle)
[![TypeScript](https://img.shields.io/badge/TypeScript->=%203.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
[![JavaScript Style Guide](https://img.shields.io/badge/code%20style-prettier-ff69b4.svg)](https://prettier.io/)
## Usage
Use TypeScript for best in class instellisense.
A few words on TypeScript
### Included in this package
- tap compatible testing framework written in TypeScript
- a collection of test tools
- **code** testing framework with typings
### Write your first tests
```javascript
import { tap, expect } from 'tapbundle'; // has typings in place
import * as myAwesomeModuleToTest from '../dist/index'; // '../dist/index' is the standard path for npmts modules
tap.test('my awesome description', async tools => {
// tools are optional parameter
tools.timeout(2000); // test will fail if it takes longer than 2000 millisenconds
});
let myTest2 = tap.test('my awesome test 2', async tools => {
myAwsomeModuleToTest.doSomethingAsync(); // we don't wait here
await tools.delayFor(3000); // yay! :) promise based timeouts :)
console.log('This gets logged 3000 ms into the test');
});
tap.test('my awesome test 3', async tools => {
expect(true).to.be.true; // will not throw
await expect(tools.delayFor(2000)).to.eventually.be.fulfilled; // yay expect promises :)
expect((await myTest2.promise).hrtMeasurement.milliSeconds > 1000).to.be.true; // access other tests metadata :)
});
let myTest4 = tap.testParallel('my awesome test 4', async tools => {
await tools.delayFor(4000);
console.log('logs to console after 4 seconds into this test');
});
tap.test('my awesome test 5', async () => {
expect(myTest4.status).to.equal('pending'); // since this test will likely finish before myTest4.
});
tap.start(); // start the test, will automtically plan tests for you (so the tap parser knows when tests exit bofore they are finished)
```
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -9,6 +9,7 @@
} }
}, },
"gitzone": { "gitzone": {
"projectType": "npm",
"module": { "module": {
"githost": "gitlab.com", "githost": "gitlab.com",
"gitscope": "pushrocks", "gitscope": "pushrocks",

14135
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -1,13 +1,14 @@
{ {
"name": "@pushrocks/tapbundle", "name": "@pushrocks/tapbundle",
"private": false, "private": false,
"version": "3.2.0", "version": "5.0.5",
"description": "tap bundled for tapbuffer", "description": "tap bundled for tapbuffer",
"main": "dist/index.js", "main": "dist_ts/index.js",
"typings": "dist/index.d.ts", "typings": "dist_ts/index.d.ts",
"type": "module",
"scripts": { "scripts": {
"test": "(tstest test/)", "test": "(tstest test/)",
"build": "(tsbuild)" "build": "(tsbuild --web --allowimplicitany)"
}, },
"repository": { "repository": {
"type": "git", "type": "git",
@ -20,30 +21,33 @@
}, },
"homepage": "https://gitlab.com/pushrocks/tapbundle#README", "homepage": "https://gitlab.com/pushrocks/tapbundle#README",
"dependencies": { "dependencies": {
"@pushrocks/early": "^3.0.3", "@open-wc/testing": "^3.1.6",
"@pushrocks/smartdelay": "^2.0.3", "@pushrocks/smartdelay": "^2.0.13",
"@pushrocks/smartfile": "^7.0.6", "@pushrocks/smartenv": "^5.0.2",
"@pushrocks/smartpromise": "^3.0.2", "@pushrocks/smartexpect": "^1.0.14",
"smartchai": "^2.0.1" "@pushrocks/smartpromise": "^3.1.7",
"@pushrocks/smarttime": "^3.0.45"
}, },
"devDependencies": { "devDependencies": {
"@gitzone/tsbuild": "^2.1.11", "@gitzone/tsbuild": "^2.1.63",
"@gitzone/tsrun": "^1.2.8", "@gitzone/tsrun": "^1.2.37",
"@gitzone/tstest": "^1.0.24", "@gitzone/tstest": "^1.0.71",
"@types/node": "^12.7.2", "@types/node": "^18.0.6",
"randomstring": "^1.1.5", "randomstring": "^1.2.2"
"tslint": "^5.19.0",
"tslint-config-prettier": "^1.18.0"
}, },
"files": [ "files": [
"ts/**/*", "ts/**/*",
"ts_web/**/*", "ts_web/**/*",
"dist/**/*", "dist/**/*",
"dist_web/**/*", "dist_*/**/*",
"dist_ts/**/*",
"dist_ts_web/**/*", "dist_ts_web/**/*",
"assets/**/*", "assets/**/*",
"cli.js", "cli.js",
"npmextra.json", "npmextra.json",
"readme.md" "readme.md"
],
"browserslist": [
"last 1 chrome versions"
] ]
} }

88
readme.md Normal file
View File

@ -0,0 +1,88 @@
# @pushrocks/tapbundle
tap based testing framework for use with @gitzone/tstest
## Availabililty and Links
* [npmjs.org (npm package)](https://www.npmjs.com/package/@pushrocks/tapbundle)
* [gitlab.com (source)](https://gitlab.com/pushrocks/tapbundle)
* [github.com (source mirror)](https://github.com/pushrocks/tapbundle)
* [docs (typedoc)](https://pushrocks.gitlab.io/tapbundle/)
## Status for master
Status Category | Status Badge
-- | --
GitLab Pipelines | [![pipeline status](https://gitlab.com/pushrocks/tapbundle/badges/master/pipeline.svg)](https://lossless.cloud)
GitLab Pipline Test Coverage | [![coverage report](https://gitlab.com/pushrocks/tapbundle/badges/master/coverage.svg)](https://lossless.cloud)
npm | [![npm downloads per month](https://badgen.net/npm/dy/@pushrocks/tapbundle)](https://lossless.cloud)
Snyk | [![Known Vulnerabilities](https://badgen.net/snyk/pushrocks/tapbundle)](https://lossless.cloud)
TypeScript Support | [![TypeScript](https://badgen.net/badge/TypeScript/>=%203.x/blue?icon=typescript)](https://lossless.cloud)
node Support | [![node](https://img.shields.io/badge/node->=%2010.x.x-blue.svg)](https://nodejs.org/dist/latest-v10.x/docs/api/)
Code Style | [![Code Style](https://badgen.net/badge/style/prettier/purple)](https://lossless.cloud)
PackagePhobia (total standalone install weight) | [![PackagePhobia](https://badgen.net/packagephobia/install/@pushrocks/tapbundle)](https://lossless.cloud)
PackagePhobia (package size on registry) | [![PackagePhobia](https://badgen.net/packagephobia/publish/@pushrocks/tapbundle)](https://lossless.cloud)
BundlePhobia (total size when bundled) | [![BundlePhobia](https://badgen.net/bundlephobia/minzip/@pushrocks/tapbundle)](https://lossless.cloud)
Platform support | [![Supports Windows 10](https://badgen.net/badge/supports%20Windows%2010/yes/green?icon=windows)](https://lossless.cloud) [![Supports Mac OS X](https://badgen.net/badge/supports%20Mac%20OS%20X/yes/green?icon=apple)](https://lossless.cloud)
## Usage
Use TypeScript for best in class instellisense.
A few words on TypeScript
### Included in this package
* tap compatible testing framework written in TypeScript
* `expect` and `expectAsync` from the package `@pushrocks/smartexpect`
### A few words on tap
**"tap"** stands for **"test anything protocol"**. Its programming language agnostic as long as the test interpreter can read the tap console output. This package is optimized to work with @gitzone/tstest as interpreter, which offers different V8 based runtime environments like nodejs, chrome, and deno.
### Write your first tests
```typescript
import { tap, expect, expectAsync } from 'tapbundle'; // has typings in place
import * as myAwesomeModuleToTest from '../dist/index'; // '../dist/index' is the standard path for npmts modules
tap.test('my awesome description', async (tools) => {
// tools are optional parameter
tools.timeout(2000); // test will fail if it takes longer than 2000 millisenconds
});
const myTest2 = tap.test('my awesome test 2', async (tools) => {
myAwsomeModuleToTest.doSomethingAsync(); // we don't wait here
await tools.delayFor(3000); // yay! :) promise based timeouts :)
console.log('This gets logged 3000 ms into the test');
});
tap.test('my awesome test 3', async (tools) => {
expect(true).toBeTrue(); // will not throw
await expectAsync(tools.delayFor(2000)).toBeUndefined(); // yay expect promises :)
expectAsync(myTest2.promise) // access other tests metadata :)
.property('hrtMeasurement') // and drill down into properties
.property('milliSeconds').toBeGreaterThan(1000);
});
const myTest4 = tap.testParallel('my awesome test 4', async (tools) => {
await tools.delayFor(4000);
console.log('logs to console after 4 seconds into this test');
});
tap.test('my awesome test 5', async () => {
expect(myTest4.status).toEqual('pending'); // since this test will likely finish before myTest4.
});
tap.start(); // start the test, will automtically plan tests for you (so the tap parser knows when tests exit bofore they are finished)
```
## Contribution
We are always happy for code contributions. If you are not the code contributing type that is ok. Still, maintaining Open Source repositories takes considerable time and thought. If you like the quality of what we do and our modules are useful to you we would appreciate a little monthly contribution: You can [contribute one time](https://lossless.link/contribute-onetime) or [contribute monthly](https://lossless.link/contribute). :)
For further information read the linked docs at the top of this readme.
> MIT licensed | **©** [Lossless GmbH](https://lossless.gmbh)
| By using this npm module you agree to our [privacy policy](https://lossless.gmbH/privacy)
[![repo-footer](https://lossless.gitlab.io/publicrelations/repofooter.svg)](https://maintainedby.lossless.com)

View File

@ -0,0 +1,45 @@
import { tap, expect, webhelpers } from '../ts/index.js';
tap.preTask('custompretask', async () => {
console.log('this is a pretask');
});
tap.test('should have access to webhelpers', async () => {
const myElement = await webhelpers.fixture(webhelpers.html`<div></div>`);
expect(myElement).toBeInstanceOf(HTMLElement);
console.log(myElement);
});
const test1 = tap.test('my first test -> expect true to be true', async () => {
return expect(true).toBeTrue();
});
const test2 = tap.test('my second test', async (tools) => {
await tools.delayFor(50);
});
const test3 = tap.test(
'my third test -> test2 should take longer than test1 and endure at least 1000ms',
async () => {
expect((await test1.testPromise).hrtMeasurement.milliSeconds < (await test2).hrtMeasurement.milliSeconds).toBeTrue();
expect((await test2.testPromise).hrtMeasurement.milliSeconds > 10).toBeTrue();
}
);
const test4 = tap.skip.test('my 4th test -> should fail', async (tools) => {
tools.allowFailure();
expect(false).toBeTrue();
});
const test5 = tap.test('my 5th test -> should pass in about 500ms', async (tools) => {
tools.timeout(1000);
await tools.delayFor(500);
});
const test6 = tap.skip.test('my 6th test -> should fail after 1000ms', async (tools) => {
tools.allowFailure();
tools.timeout(1000);
await tools.delayFor(100);
});
tap.start();

View File

@ -1,21 +0,0 @@
import { tap, expect } from '../ts/index';
import * as randomstring from 'randomstring';
const test1 = tap.test('my first test -> expect true to be true', async tools => {
await tools.checkIterationLeak(async () => {
const domain = randomstring.generate(1000);
});
});
const outsideArray = [];
const test2 = tap.test('should throw', async tools => {
const err = await tools.returnError(async () => {
await tools.checkIterationLeak(async () => {
outsideArray.push(randomstring.generate(1000));
});
});
expect(err).to.be.undefined;
});
tap.start();

View File

@ -1,10 +1,5 @@
import { tap, expect } from '../ts/index'; import { tap, expect, TapWrap } from '../ts/index.js';
const tapwrap = tap.wrap(async () => { tap.test('should run a test', async () => {});
tap.test('should do something', async () => {
console.log('test1');
});
tap.start();
});
tapwrap.run(); tap.start();

View File

@ -1,33 +1,41 @@
import { tap, expect } from '../ts/index'; import { tap, expect } from '../ts/index.js';
const test1 = tap.test('my first test -> expect true to be true', async () => { tap.preTask('hi there', async () => {
return expect(true).to.be.true; console.log('this is a pretask');
}); });
const test2 = tap.test('my second test', async tools => { const test1 = tap.test('my first test -> expect true to be true', async () => {
return expect(true).toBeTrue();
});
const test2 = tap.test('my second test', async (tools) => {
await tools.delayFor(1000); await tools.delayFor(1000);
}); });
const test3 = tap.test( const test3 = tap.test(
'my third test -> test2 should take longer than test1 and endure at least 1000ms', 'my third test -> test2 should take longer than test1 and endure at least 1000ms',
async () => { async () => {
expect((await test1).hrtMeasurement.milliSeconds < (await test2).hrtMeasurement.milliSeconds).to expect(
.be.true; (await test1.testPromise).hrtMeasurement.milliSeconds <
expect((await test2).hrtMeasurement.milliSeconds > 1000).to.be.true; (await test2).hrtMeasurement.milliSeconds
).toBeTrue();
expect((await test2.testPromise).hrtMeasurement.milliSeconds > 1000).toBeTrue();
} }
); );
const test4 = tap.skip.test('my 4th test -> should fail', async tools => { const test4 = tap.test('my 4th test -> should fail', async (tools) => {
tools.allowFailure(); tools.allowFailure();
expect(false).to.be.true; expect(false).toBeFalse();
return 'hello';
}); });
const test5 = tap.test('my 5th test -> should pass in about 500ms', async tools => { const test5 = tap.test('my 5th test -> should pass in about 500ms', async (tools) => {
const test4Result = await test4.testResultPromise;
tools.timeout(1000); tools.timeout(1000);
await tools.delayFor(500); await tools.delayFor(500);
}); });
const test6 = tap.skip.test('my 6th test -> should fail after 1000ms', async tools => { const test6 = tap.skip.test('my 6th test -> should fail after 1000ms', async (tools) => {
tools.allowFailure(); tools.allowFailure();
tools.timeout(1000); tools.timeout(1000);
await tools.delayFor(2000); await tools.delayFor(2000);

8
ts/00_commitinfo_data.ts Normal file
View File

@ -0,0 +1,8 @@
/**
* autocreated commitinfo by @pushrocks/commitinfo
*/
export const commitinfo = {
name: '@pushrocks/tapbundle',
version: '5.0.5',
description: 'tap bundled for tapbuffer'
}

View File

@ -1,2 +1,10 @@
export { expect } from 'smartchai'; export { tap } from './tapbundle.classes.tap.js';
export { tap } from './tapbundle.classes.tap'; export { TapWrap } from './tapbundle.classes.tapwrap.js';
export { webhelpers } from './webhelpers.js';
import { expect, expectAsync } from '@pushrocks/smartexpect';
export {
expect,
expectAsync
}

View File

@ -1,19 +1,21 @@
import * as plugins from './tapbundle.plugins'; import * as plugins from './tapbundle.plugins.js';
import { TapTools } from './tapbundle.classes.taptools'; import { TapTools } from './tapbundle.classes.taptools.js';
export interface IPreTaskFunction { export interface IPreTaskFunction {
(tapTools?: TapTools): Promise<any>; (tapTools?: TapTools): Promise<any>;
} }
export class PreTask { export class PreTask {
public description: string;
public preTaskFunction: IPreTaskFunction; public preTaskFunction: IPreTaskFunction;
constructor(preTaskFunctionArg: IPreTaskFunction) { constructor(descriptionArg: string, preTaskFunctionArg: IPreTaskFunction) {
this.description = descriptionArg;
this.preTaskFunction = preTaskFunctionArg; this.preTaskFunction = preTaskFunctionArg;
} }
public async run () { public async run() {
console.log(`::__PRETASK: ${this.description}`);
await this.preTaskFunction(new TapTools(null)); await this.preTaskFunction(new TapTools(null));
} }
} }

View File

@ -1,49 +1,48 @@
import * as plugins from './tapbundle.plugins'; import * as plugins from './tapbundle.plugins.js';
import { IPreTaskFunction, PreTask } from './tapbundle.classes.pretask'; import { IPreTaskFunction, PreTask } from './tapbundle.classes.pretask.js';
import { TapTest, ITestFunction } from './tapbundle.classes.taptest'; import { TapTest, ITestFunction } from './tapbundle.classes.taptest.js';
import { TapWrap, ITapWrapFunction } from './tapbundle.classes.tapwrap'; export class Tap <T> {
export class Tap {
/** /**
* skips a test * skips a test
* tests marked with tap.skip.test() are never executed * tests marked with tap.skip.test() are never executed
*/ */
public skip = { public skip = {
test: (descriptionArg: string, functionArg: ITestFunction) => { test: (descriptionArg: string, functionArg: ITestFunction<T>) => {
console.log(`skipped test: ${descriptionArg}`); console.log(`skipped test: ${descriptionArg}`);
}, },
testParallel: (descriptionArg: string, functionArg: ITestFunction) => { testParallel: (descriptionArg: string, functionArg: ITestFunction<T>) => {
console.log(`skipped test: ${descriptionArg}`); console.log(`skipped test: ${descriptionArg}`);
} },
}; };
/** /**
* only executes tests marked as ONLY * only executes tests marked as ONLY
*/ */
public only = { public only = {
test: (descriptionArg: string, testFunctionArg: ITestFunction) => { test: (descriptionArg: string, testFunctionArg: ITestFunction<T>) => {
this.test(descriptionArg, testFunctionArg, 'only'); this.test(descriptionArg, testFunctionArg, 'only');
} },
}; };
private _tapPreTasks: PreTask[] = []; private _tapPreTasks: PreTask[] = [];
private _tapTests: TapTest[] = []; private _tapTests: TapTest<any>[] = [];
private _tapTestsOnly: TapTest[] = []; private _tapTestsOnly: TapTest<any>[] = [];
/** /**
* Normal test function, will run one by one * Normal test function, will run one by one
* @param testDescription - A description of what the test does * @param testDescription - A description of what the test does
* @param testFunction - A Function that returns a Promise and resolves or rejects * @param testFunction - A Function that returns a Promise and resolves or rejects
*/ */
public async test( public test(
testDescription: string, testDescription: string,
testFunction: ITestFunction, testFunction: ITestFunction<T>,
modeArg: 'normal' | 'only' | 'skip' = 'normal' modeArg: 'normal' | 'only' | 'skip' = 'normal'
) { ): TapTest<T> {
const localTest = new TapTest({ const localTest = new TapTest<T>({
description: testDescription, description: testDescription,
testFunction, testFunction,
parallel: false parallel: false,
}); });
if (modeArg === 'normal') { if (modeArg === 'normal') {
this._tapTests.push(localTest); this._tapTests.push(localTest);
@ -53,15 +52,8 @@ export class Tap {
return localTest; return localTest;
} }
public preTask (functionArg: IPreTaskFunction) { public preTask(descriptionArg: string, functionArg: IPreTaskFunction) {
this._tapPreTasks.push(new PreTask(functionArg)); this._tapPreTasks.push(new PreTask(descriptionArg, functionArg));
}
/**
* wraps function
*/
public wrap(functionArg: ITapWrapFunction) {
return new TapWrap(functionArg);
} }
/** /**
@ -69,12 +61,12 @@ export class Tap {
* @param testDescription - A description of what the test does * @param testDescription - A description of what the test does
* @param testFunction - A Function that returns a Promise and resolves or rejects * @param testFunction - A Function that returns a Promise and resolves or rejects
*/ */
public testParallel(testDescription: string, testFunction: ITestFunction) { public testParallel(testDescription: string, testFunction: ITestFunction<T>) {
this._tapTests.push( this._tapTests.push(
new TapTest({ new TapTest({
description: testDescription, description: testDescription,
testFunction, testFunction,
parallel: true parallel: true,
}) })
); );
} }
@ -83,6 +75,13 @@ export class Tap {
* starts the test evaluation * starts the test evaluation
*/ */
public async start(optionsArg?: { throwOnError: boolean }) { public async start(optionsArg?: { throwOnError: boolean }) {
// lets set the tapbundle promise
const smartenvInstance = new plugins.smartenv.Smartenv();
smartenvInstance.isBrowser
? ((globalThis as any).tapbundleDeferred = plugins.smartpromise.defer())
: null;
// lets continue with running the tests
const promiseArray: Array<Promise<any>> = []; const promiseArray: Array<Promise<any>> = [];
// safeguard against empty test array // safeguard against empty test array
@ -137,14 +136,17 @@ export class Tap {
} }
if (optionsArg && optionsArg.throwOnError && failReasons.length > 0) { if (optionsArg && optionsArg.throwOnError && failReasons.length > 0) {
process.exit(1); if (!smartenvInstance.isBrowser) process.exit(1);
}
if (smartenvInstance.isBrowser) {
(globalThis as any).tapbundleDeferred.resolve();
} }
} }
/** /**
* handle errors * handle errors
*/ */
public threw(err) { public threw(err: Error) {
console.log(err); console.log(err);
} }
} }

View File

@ -1,31 +1,33 @@
import * as plugins from './tapbundle.plugins'; import * as plugins from './tapbundle.plugins.js';
import { tapCreator } from './tapbundle.tapcreator'; import { tapCreator } from './tapbundle.tapcreator.js';
import { TapTools } from './tapbundle.classes.taptools'; import { TapTools } from './tapbundle.classes.taptools.js';
// imported interfaces // imported interfaces
import { HrtMeasurement } from '@pushrocks/early';
import { Deferred } from '@pushrocks/smartpromise'; import { Deferred } from '@pushrocks/smartpromise';
import { HrtMeasurement } from '@pushrocks/smarttime';
// interfaces // interfaces
export type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout'; export type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout';
export type ITestFunction = (tapTools?: TapTools) => Promise<any>; export interface ITestFunction <T> { (tapTools?: TapTools): Promise<T> };
export class TapTest { export class TapTest <T = unknown> {
public description: string; public description: string;
public failureAllowed: boolean; public failureAllowed: boolean;
public hrtMeasurement: HrtMeasurement; public hrtMeasurement: HrtMeasurement;
public parallel: boolean; public parallel: boolean;
public status: TTestStatus; public status: TTestStatus;
public tapTools: TapTools; public tapTools: TapTools;
public testFunction: ITestFunction; public testFunction: ITestFunction<T>;
public testKey: number; // the testKey the position in the test qeue. Set upon calling .run() public testKey: number; // the testKey the position in the test qeue. Set upon calling .run()
public testDeferred: Deferred<TapTest> = plugins.smartpromise.defer(); private testDeferred: Deferred<TapTest<T>> = plugins.smartpromise.defer();
public testPromise: Promise<TapTest> = this.testDeferred.promise; public testPromise: Promise<TapTest<T>> = this.testDeferred.promise;
private testResultDeferred: Deferred<T> = plugins.smartpromise.defer();
public testResultPromise: Promise<T> = this.testResultDeferred.promise;
/** /**
* constructor * constructor
*/ */
constructor(optionsArg: { description: string; testFunction: ITestFunction; parallel: boolean }) { constructor(optionsArg: { description: string; testFunction: ITestFunction<T>; parallel: boolean }) {
this.description = optionsArg.description; this.description = optionsArg.description;
this.hrtMeasurement = new HrtMeasurement(); this.hrtMeasurement = new HrtMeasurement();
this.parallel = optionsArg.parallel; this.parallel = optionsArg.parallel;
@ -42,7 +44,7 @@ export class TapTest {
this.testKey = testKeyArg; this.testKey = testKeyArg;
const testNumber = testKeyArg + 1; const testNumber = testKeyArg + 1;
try { try {
await this.testFunction(this.tapTools); const testReturnValue = await this.testFunction(this.tapTools);
if (this.status === 'timeout') { if (this.status === 'timeout') {
throw new Error('Test succeeded, but timed out...'); throw new Error('Test succeeded, but timed out...');
} }
@ -52,12 +54,14 @@ export class TapTest {
); );
this.status = 'success'; this.status = 'success';
this.testDeferred.resolve(this); this.testDeferred.resolve(this);
} catch (err) { this.testResultDeferred.resolve(testReturnValue);
} catch (err: any) {
this.hrtMeasurement.stop(); this.hrtMeasurement.stop();
console.log( console.log(
`not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms` `not ok ${testNumber} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`
); );
this.testDeferred.resolve(this); this.testDeferred.resolve(this);
this.testResultDeferred.resolve(err);
// if the test has already succeeded before // if the test has already succeeded before
if (this.status === 'success') { if (this.status === 'success') {

View File

@ -1,5 +1,5 @@
import * as plugins from './tapbundle.plugins'; import * as plugins from './tapbundle.plugins.js';
import { TapTest } from './tapbundle.classes.taptest'; import { TapTest } from './tapbundle.classes.taptest.js';
export interface IPromiseFunc { export interface IPromiseFunc {
(): Promise<any>; (): Promise<any>;
@ -11,7 +11,7 @@ export class TapTools {
*/ */
private _tapTest: TapTest; private _tapTest: TapTest;
constructor(TapTestArg) { constructor(TapTestArg: TapTest<any>) {
this._tapTest = TapTestArg; this._tapTest = TapTestArg;
} }
@ -25,11 +25,11 @@ export class TapTools {
/** /**
* async/await delay method * async/await delay method
*/ */
public async delayFor(timeMilliArg) { public async delayFor(timeMilliArg: number) {
await plugins.smartdelay.delayFor(timeMilliArg); await plugins.smartdelay.delayFor(timeMilliArg);
} }
public async delayForRandom(timeMilliMinArg, timeMilliMaxArg) { public async delayForRandom(timeMilliMinArg: number, timeMilliMaxArg: number) {
await plugins.smartdelay.delayForRandom(timeMilliMinArg, timeMilliMaxArg); await plugins.smartdelay.delayForRandom(timeMilliMinArg, timeMilliMaxArg);
} }
@ -42,19 +42,11 @@ export class TapTools {
} }
} }
public async ensureDir(pathArg: string) {
await plugins.smartfile.fs.ensureDir(pathArg);
}
public async checkIterationLeak(iterationfuncArg: IPromiseFunc) {
console.log('iteration leakage checks disabled for now due to incompatibilities with node v12');
}
public async returnError(throwingFuncArg: IPromiseFunc) { public async returnError(throwingFuncArg: IPromiseFunc) {
let funcErr: Error; let funcErr: Error;
try { try {
await throwingFuncArg(); await throwingFuncArg();
} catch (err) { } catch (err: any) {
funcErr = err; funcErr = err;
} }
return funcErr; return funcErr;

View File

@ -1,25 +1,13 @@
import * as plugins from './tapbundle.plugins'; import * as plugins from './tapbundle.plugins.js';
export interface ITapWrapFunction { export interface ITapWrapOptions {
(): Promise<any>; before: () => Promise<any>;
after: () => {};
} }
export class TapWrap { export class TapWrap {
wrapFunction: ITapWrapFunction; public options: ITapWrapOptions;
constructor(optionsArg: ITapWrapOptions) {
/** this.options = optionsArg;
* the constructor
*/
constructor(wrapFunctionArg: ITapWrapFunction) {
// nothing here
this.wrapFunction = wrapFunctionArg;
}
/**
* run the wrapFunction
*/
async run() {
// TODO: make sure it makes sense what we do here.
await this.wrapFunction();
} }
} }

View File

@ -1,12 +1,7 @@
// pushrocks // pushrocks
import * as early from '@pushrocks/early';
import * as smartdelay from '@pushrocks/smartdelay'; import * as smartdelay from '@pushrocks/smartdelay';
import * as smartfile from '@pushrocks/smartfile'; import * as smartenv from '@pushrocks/smartenv';
import * as smartexpect from '@pushrocks/smartexpect';
import * as smartpromise from '@pushrocks/smartpromise'; import * as smartpromise from '@pushrocks/smartpromise';
export { early, smartfile, smartdelay, smartpromise }; export { smartdelay, smartenv, smartexpect, smartpromise };
// third party
/* import * as leakage from 'leakage';
export { leakage }; */

View File

@ -1,4 +1,4 @@
import * as plugins from './tapbundle.plugins'; import * as plugins from './tapbundle.plugins.js';
export class TapCreator { export class TapCreator {
// TODO: // TODO:

25
ts/webhelpers.ts Normal file
View File

@ -0,0 +1,25 @@
import * as plugins from './tapbundle.plugins.js';
import type { fixture, html } from '@open-wc/testing-helpers';
import { tap } from './tapbundle.classes.tap.js';
class WebHelpers {
html: typeof html;
fixture: typeof fixture;
constructor() {
const smartenv = new plugins.smartenv.Smartenv();
if(smartenv.isBrowser) {
this.enable();
}
}
public enable() {
tap.preTask('enable webhelpers', async () => {
const webhelpers = await import('@open-wc/testing')
this.html = webhelpers.html;
this.fixture = webhelpers.fixture;
})
}
}
export const webhelpers = new WebHelpers();

10
tsconfig.json Normal file
View File

@ -0,0 +1,10 @@
{
"compilerOptions": {
"experimentalDecorators": true,
"useDefineForClassFields": false,
"target": "ES2022",
"module": "ES2022",
"moduleResolution": "nodenext",
"esModuleInterop": true
}
}

View File

@ -1,17 +0,0 @@
{
"extends": ["tslint:latest", "tslint-config-prettier"],
"rules": {
"semicolon": [true, "always"],
"no-console": false,
"ordered-imports": false,
"object-literal-sort-keys": false,
"member-ordering": {
"options":{
"order": [
"static-method"
]
}
}
},
"defaultSeverity": "warning"
}