From f16e25b413c5b21e5c37b3360e07e1f12c269295 Mon Sep 17 00:00:00 2001 From: Phil Kunz Date: Thu, 4 May 2017 23:15:08 +0200 Subject: [PATCH] update docs --- dist/tapbundle.classes.taptest.d.ts | 3 ++ dist/tapbundle.classes.taptest.js | 9 +++++- docs/index.md | 47 +++++++++++++++++++++++++---- ts/tapbundle.classes.taptest.ts | 12 +++++++- 4 files changed, 63 insertions(+), 8 deletions(-) diff --git a/dist/tapbundle.classes.taptest.d.ts b/dist/tapbundle.classes.taptest.d.ts index 22bd02a..2b6f990 100644 --- a/dist/tapbundle.classes.taptest.d.ts +++ b/dist/tapbundle.classes.taptest.d.ts @@ -1,5 +1,6 @@ import { TapTools } from './tapbundle.classes.taptools'; import { HrtMeasurement } from 'early'; +import { Deferred } from 'smartq'; export declare type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout'; export interface ITestFunction { (tapTools?: TapTools): Promise; @@ -12,6 +13,8 @@ export declare class TapTest { status: TTestStatus; tapTools: TapTools; testFunction: ITestFunction; + testDeferred: Deferred; + testPromise: Promise; /** * constructor */ diff --git a/dist/tapbundle.classes.taptest.js b/dist/tapbundle.classes.taptest.js index 6038beb..5f1e472 100644 --- a/dist/tapbundle.classes.taptest.js +++ b/dist/tapbundle.classes.taptest.js @@ -8,6 +8,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", { value: true }); +const plugins = require("./tapbundle.plugins"); const tapbundle_classes_taptools_1 = require("./tapbundle.classes.taptools"); // imported interfaces const early_1 = require("early"); @@ -16,6 +17,8 @@ class TapTest { * constructor */ constructor(optionsArg) { + this.testDeferred = plugins.smartq.defer(); + this.testPromise = this.testDeferred.promise; this.description = optionsArg.description; this.hrtMeasurement = new early_1.HrtMeasurement(); this.parallel = optionsArg.parallel; @@ -37,14 +40,18 @@ class TapTest { this.hrtMeasurement.stop(); console.log(`ok ${testKeyArg + 1} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`); this.status = 'success'; + this.testDeferred.resolve(this); } catch (err) { this.hrtMeasurement.stop(); console.log(`not ok ${testKeyArg + 1} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`); + this.testDeferred.reject(); + // if the test has already succeeded before if (this.status === 'success') { this.status = 'errorAfterSuccess'; console.log('!!! ALERT !!!: weird behaviour, since test has been already successfull'); } + // if the test is allowed to fail if (this.failureAllowed) { console.log(`please note: failure allowed!`); } @@ -54,4 +61,4 @@ class TapTest { } } exports.TapTest = TapTest; -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3RhcGJ1bmRsZS5jbGFzc2VzLnRhcHRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUNBLDZFQUF1RDtBQUV2RCxzQkFBc0I7QUFDdEIsaUNBQXNDO0FBVXRDO0lBUUU7O09BRUc7SUFDSCxZQUFhLFVBSVo7UUFDQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUE7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHNCQUFjLEVBQUUsQ0FBQTtRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFDQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFBO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNHLEdBQUcsQ0FBRSxVQUFrQjs7WUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUMzQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDdEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUM5QixNQUFNLElBQUksS0FBSyxDQUFFLGtDQUFrQyxDQUFDLENBQUE7Z0JBQ3RELENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtnQkFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUE7Z0JBQ3RHLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBO1lBQ3pCLENBQUM7WUFBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNiLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUE7Z0JBQzFCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxVQUFVLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLFdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFBO2dCQUMxRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUE7b0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUVBQXlFLENBQUMsQ0FBQTtnQkFDeEYsQ0FBQztnQkFDRCxFQUFFLENBQUEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztvQkFDdkIsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsQ0FBQyxDQUFBO2dCQUM5QyxDQUFDO2dCQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDbEIsQ0FBQztRQUNILENBQUM7S0FBQTtDQUNGO0FBbERELDBCQWtEQyJ9 \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwYnVuZGxlLmNsYXNzZXMudGFwdGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL3RhcGJ1bmRsZS5jbGFzc2VzLnRhcHRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7OztBQUFBLCtDQUE4QztBQUU5Qyw2RUFBdUQ7QUFFdkQsc0JBQXNCO0FBQ3RCLGlDQUFzQztBQVd0QztJQVVFOztPQUVHO0lBQ0gsWUFBYSxVQUlaO1FBVEQsaUJBQVksR0FBc0IsT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtRQUN4RCxnQkFBVyxHQUFxQixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQTtRQVN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxXQUFXLENBQUE7UUFDekMsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLHNCQUFjLEVBQUUsQ0FBQTtRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLFVBQVUsQ0FBQyxRQUFRLENBQUE7UUFDbkMsSUFBSSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUE7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLHFDQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDbEMsSUFBSSxDQUFDLFlBQVksR0FBRyxVQUFVLENBQUMsWUFBWSxDQUFBO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNHLEdBQUcsQ0FBRSxVQUFrQjs7WUFDM0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtZQUMzQixJQUFJLENBQUM7Z0JBQ0gsTUFBTSxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQTtnQkFDdEMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO29CQUM5QixNQUFNLElBQUksS0FBSyxDQUFFLGtDQUFrQyxDQUFDLENBQUE7Z0JBQ3RELENBQUM7Z0JBQ0QsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtnQkFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFdBQVcsV0FBVyxJQUFJLENBQUMsY0FBYyxDQUFDLFlBQVksSUFBSSxDQUFDLENBQUE7Z0JBQ3RHLElBQUksQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFBO2dCQUN2QixJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtZQUNqQyxDQUFDO1lBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDYixJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFBO2dCQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsVUFBVSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxXQUFXLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQTtnQkFDMUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQTtnQkFFMUIsMkNBQTJDO2dCQUMzQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQzlCLElBQUksQ0FBQyxNQUFNLEdBQUcsbUJBQW1CLENBQUE7b0JBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMseUVBQXlFLENBQUMsQ0FBQTtnQkFDeEYsQ0FBQztnQkFFRCxpQ0FBaUM7Z0JBQ2pDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO29CQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLCtCQUErQixDQUFDLENBQUE7Z0JBQzlDLENBQUM7Z0JBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUNsQixDQUFDO1FBQ0gsQ0FBQztLQUFBO0NBQ0Y7QUExREQsMEJBMERDIn0= \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 7640276..22e5a31 100644 --- a/docs/index.md +++ b/docs/index.md @@ -24,16 +24,51 @@ Use TypeScript for best in class instellisense. This package includes * tap compatible testing framework written in TypeScript -* npm package chai -* npm package chai-as-promised -* npm package @types/tap -* npm pacakge @types/chai -* npm package @types/chai-as-promised +* npm package chai (through smartchai) +* npm package chai-as-promised (through smartchai) +* npm package chai-string (through smartchai) +* npm pacakge @types/chai (through smartchi) +* npm package @types/chai-as-promised (through smartchai) +* npm package @types/chai-string (through smartchai) -In other words: This pacakge is fully typed :) +It also implements its own tap testing engine, that is fully typed. +In other words: This package is fully typed :) + + +### Get started with writing your first test file. ```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.eventuall.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) + ``` For further information read the linked docs at the top of this README. diff --git a/ts/tapbundle.classes.taptest.ts b/ts/tapbundle.classes.taptest.ts index 6591eaf..1003118 100644 --- a/ts/tapbundle.classes.taptest.ts +++ b/ts/tapbundle.classes.taptest.ts @@ -1,8 +1,10 @@ +import * as plugins from './tapbundle.plugins' import { tapCreator } from './tapbundle.tapcreator' import { TapTools } from './tapbundle.classes.taptools' // imported interfaces import { HrtMeasurement } from 'early' +import { Deferred } from 'smartq' // interfaces export type TTestStatus = 'success' | 'error' | 'pending' | 'errorAfterSuccess' | 'timeout' @@ -20,6 +22,8 @@ export class TapTest { status: TTestStatus tapTools: TapTools testFunction: ITestFunction + testDeferred: Deferred = plugins.smartq.defer() + testPromise: Promise = this.testDeferred.promise /** * constructor */ @@ -49,14 +53,20 @@ export class TapTest { this.hrtMeasurement.stop() console.log(`ok ${testKeyArg + 1} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`) this.status = 'success' + this.testDeferred.resolve(this) } catch (err) { this.hrtMeasurement.stop() console.log(`not ok ${testKeyArg + 1} - ${this.description} # time=${this.hrtMeasurement.milliSeconds}ms`) + this.testDeferred.reject() + + // if the test has already succeeded before if (this.status === 'success') { this.status = 'errorAfterSuccess' console.log('!!! ALERT !!!: weird behaviour, since test has been already successfull') } - if(this.failureAllowed) { + + // if the test is allowed to fail + if (this.failureAllowed) { console.log(`please note: failure allowed!`) } console.log(err)