# basictap
![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/markwylde/basictap?style=flat-square)
[![GitHub package.json version](https://img.shields.io/github/package-json/v/markwylde/basictap?style=flat-square)](https://github.com/markwylde/basictap/blob/master/package.json)
[![GitHub](https://img.shields.io/github/license/markwylde/basictap?style=flat-square)](https://github.com/markwylde/basictap/blob/master/LICENSE)
[![js-semistandard-style](https://img.shields.io/badge/code%20style-semistandard-brightgreen.svg?style=flat-square)](https://github.com/standard/semistandard)

Light tap adherent test runner.

- Asyncronous tests run in parallel
- Outputs tap syntax
- Uses built in node `assert` library

## Installation
```bash
npm install --save basictap
```

## Features

```javascript
test.only('will only run this (and other only) tests', t => {});
test.skip('will not run this (or other skip) test', t => {});
test.todo('will not run and will remind you at the end')
test('will run', t => {});
```

## Assertions
Adheres and uses the built in [assert](https://nodejs.org/api/assert.html) library from node.

```javascript
t.plan(1) // number of expected assertions
t.timeout(1000) // in milliseconds
t.waitFor(() => true), { timeout: 500 }) // continuously try until passes or timesout (in milliseconds)
t.pass()
t.fail()
t.ok(true)
t.notOk(null)
t.equal('test', 'test')
t.notEqual('test', 'no')
t.deepEqual({ a: 1 }, { a: 1 })
t.notDeepEqual({ a: 1 }, { a: 2 })
t.deepStrictEqual({ a: 1 }, { a: 1 })
t.notDeepStrictEqual({ a: 1 }, { a: 2 })
t.strictEqual('test', 'test')
t.notStrictEqual('test', 'no')
t.throws(result, new Error('oh noes'))
t.rejects(result, new Error('oh noes'))
t.doesNotThrow(result, new Error('oh noes'))
t.doesNotReject(result, new Error('oh noes'))
t.match('I will pass', /pass/);
t.doesNotMatch('I will fail', /pass/);
```

## Example
```javascript
const test = require('basictap');

// default is 1
// setting to 5 will run a maximum of 5 tests at a time
// setting to Infinity will run all tests at once
test.maximumConcurrentTests = Infinity;

test.on('finish', totalAssertionsFailed => console.log('run once all tests have finished'));

test('basic test that passes', t => {
  t.plan(1);

  t.equal(1, 1);
});

test('basic test that assets with a description', t => {
  t.plan(1);

  t.equal(1, 1, 'optional message to describe assertion');
});

test('plan is optional, but recommended', t => {
  t.equal(1, 1);
});

test('basic test that passes with async', async t => {
  t.plan(1);

  const something = await doSomething();

  t.equal(something, 1);
});

test('basic test that passes with timer', async t => {
  t.plan(1);

  setTimeout(() => {
    t.equal(something, 1);
  }, 100);
});

test('cleanup', async t => {
  t.plan(1);

  const server = http.createServer((request, response) => {
    response.end('ok');
  }).listen(8080);

  fetch('http://localhost:8080')
    .then(response => response.text())
    .then(text => {
      t.equal(text, 'ok');
    });

  // this will run once the number of planned tests is reached
  return () => {
    server.close();
  };
});
```
