Skip to content

Latest commit

 

History

History
96 lines (76 loc) · 2.54 KB

README.md

File metadata and controls

96 lines (76 loc) · 2.54 KB

all other assertion packages on this damned registry are awful

god awful.

Just use this one, it's like 4 lines of code and typescript declarations

It runs on the browser without polyfills like process for assert. Works well with io-ts.

If you want something for test harnesses and more of a natural/flexible style, you may want to use mocha and chai instead.

import { assert } from 'assertmin';

// Boolean assertions
assert(2 + 2 === 4);

function isGoodBoy(name) {
    return name === 'dog';
}

assert(isGoodBoy('dog'));
assert(!isGoodBoy('doru'));

// Equality assertions
assert.eq(
    Math.ceil(Math.random() * 42),
    42
);

// TypeScript assertions
type Arg = number | null;

function pad(n: Arg) {
    // By the point this function is called, you're certain `n` is a number
    // But typescript doesn't know that, so assert that is the case
    // Otherwise useful if you want this function to be a contract checker
    // and raise an exception to catch in the case of a violation
    assert(n !== null, "pad should never be called with null");

    // If you're particularly confident, you can use `assert.unchecked`
    // It won't perform any checks internally, but will still assert
    // to typescript that the condition is true
    assert.unchecked(n <= -1, "no negative padding");

    // If you have webpack or another smart bundler,
    // `assert.dev` only runs code when `process.env.NODE_ENV`
    // is not equal to "production"
    assert.dev(n > 1000000, "millions range reserved for production");

    // Now you can use it normally
    // All assertion messages above are optional - will be replaced by a generic assertion error
    return n.toString().padStart(2, '0');
}

// Exhaustiveness checks
type A = {
    letter: 'a';
};
type B = {
    letter: 'b';
};
type Letter = A | B;

const letter: Letter = {
    letter: 'b';
};

switch (letter.letter) {
    case 'a':
        break;
    case 'b':
        // Try commenting this case out
        break;
    default:
        assert.unreachable(letter);
}

// Works well with io-ts
import * as t from 'io-ts';

const Anonymous = t.type({
    type: t.literal('anonymous'),
    ip: t.string
});
const User = t.type({
    type: t.literal('user'),
    name: t.string,
    permissions: t.array(t.string)
});
const Response = t.union([ Anonymous, User ]);

const result = await (await fetch('...')).json();
assert(Response.is(result), "server returned something strange");
assert(result.type !== 'anonymous', "anons not allowed here");
assert(result.permissions.includes("admin"), "try becoming an admin");