Skip to content

Commit

Permalink
Improve tests
Browse files Browse the repository at this point in the history
  • Loading branch information
TrySound committed Nov 15, 2017
1 parent 8f1f3e8 commit b86d03c
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 109 deletions.
5 changes: 2 additions & 3 deletions package.json
Expand Up @@ -10,15 +10,14 @@
"prepublish": "npm run build",
"build": "rollup -c && cross-env MINIFY=true rollup -c && cp derivable.d.ts derivable.js.flow dist/",
"lint": "eslint src test",
"test": "npm run build && jest && npm run lint",
"test": "npm run build && jest --coverage && npm run lint",
"test-types": "cd test_flow && yarn && yarn test",
"bench": "node scripts/bench.js",
"coverage": "npm run build && jest --coverage",
"report-coverage": "jest --coverage && cat ./coverage/lcov.info | coveralls",
"stats": "node scripts/stats.js",
"toc": "doctoc README.md",
"clean": "rm -rf dist",
"all": "npm run clean && npm run coverage && npm run stats && npm run bench && npm run toc"
"all": "npm run clean && npm run test && npm run stats && npm run bench && npm run toc"
},
"main": "dist/derivable.js",
"module": "dist/derivable.es.js",
Expand Down
2 changes: 1 addition & 1 deletion src/derivable.js
Expand Up @@ -68,5 +68,5 @@ export var derivablePrototype = {

__equals: function (a, b) {
return (this._equals || util.equals)(a, b);
},
}
};
70 changes: 70 additions & 0 deletions test/derivable_test.js
@@ -0,0 +1,70 @@
'use strict';

const derivable = require('../dist/derivable');

test('derive derivable value with function', () => {
const a = derivable.atom(1);
const q = derivable.atom(10);
const b = a.derive(d => d + q.get());
const c = b.derive(d => d * q.get());
expect([b.get(), c.get()]).toEqual([11, 110]);

q.set(20);
expect([b.get(), c.get()]).toEqual([21, 420]);

a.set(null);
expect([b.get(), c.get()]).toEqual([20, 400]);

expect(() => {
a.derive();
}).toThrow();

expect(() => {
a.derive(new Date());
}).toThrow();
});

test('maybe derive derivable (non-null) value with function', () => {
const a = derivable.atom(1);
const q = derivable.atom(10);
const b = a.maybeDerive(d => d + q.get());
const c = b.maybeDerive(d => d * q.get());
expect([b.get(), c.get()]).toEqual([11, 110]);

q.set(20);
expect([b.get(), c.get()]).toEqual([21, 420]);

a.set(null);
expect([b.get(), c.get()]).toEqual([null, null]);

expect(() => {
a.maybeDerive();
}).toThrow();
});

test('is method', () => {
const a = derivable.atom(1);
const b = derivable.atom(1);
const fst = a.is(b);
const snd = b.is(a);
expect(fst.get()).toBeTruthy();
expect(snd.get()).toBeTruthy();

a.set({ equals: () => true });
b.set({ equals: () => false });
expect(fst.get()).toBeTruthy();
expect(snd.get()).toBeFalsy();
});

test('maybe default prefers passed value or derivable over null or undefined', () => {
const a = derivable.atom(null);
const r = a.orDefault(2);
expect(r.get()).toBe(2);

a.set(1);
expect(r.get()).toBe(1);

expect(() => {
a.orDefault(null);
}).toThrow();
});
114 changes: 9 additions & 105 deletions test/derivation_test.js
Expand Up @@ -6,23 +6,21 @@ const util = require('./util');

describe("a derivation", () => {
const oneGigabyte = 1024 * 1024 * 1024;
const bytes = derivable.atom(oneGigabyte);
let kiloBytes = void 0;
let megaBytes = void 0;

const orderUp = (n, ...args) => {
const order = args.length === 0 || args[0] === undefined ? 1 : args[0];
return order > 0 ? orderUp(n / 1024, order - 1) : n;
};
const bytes = derivable.atom(oneGigabyte);
const kiloBytes = bytes.derive(orderUp);
const megaBytes = derivable.derive(() => orderUp(kiloBytes.get()));

it("can be created via the Atom.derive(f) method", () => {
kiloBytes = bytes.derive(orderUp);
expect(kiloBytes.get()).toBe(1024 * 1024);
});

it("can also be created via the derive function in the derivable package", () => {
megaBytes = derivable.derive(() => orderUp(kiloBytes.get()));
it("can be created via the derive function in the derivable package", () => {
expect(megaBytes.get()).toBe(1024);

expect(() => {
derivable.derive();
}).toThrow();
});

it("can derive from more than one atom", () => {
Expand Down Expand Up @@ -84,42 +82,6 @@ describe("a derivation", () => {
});
});

describe("the derive method", () => {
it("throws when given no aguments", () => {
expect(() => {
derivable.atom(null).derive();
}).toThrow();
});

it('can\'t derive with some kinds of things', () => {
expect(() => {
derivable.atom("blah").derive(new Date());
}).toThrow();
});
});

describe("maybeDerive", () => {
it('is like derive, but propagates nulls', () => {
const thing = derivable.atom({ prop: 'val' });
const val = thing.maybeDerive(d => d.prop);

expect(val.get()).toBe('val');
thing.set(null);
expect(val.get() == null).toBeTruthy();

const foo = thing.maybeDerive(d => d.foo);
const bar = thing.maybeDerive(d => d.bar);

expect(foo.get()).toBe(null);
expect(bar.get()).toBe(null);

thing.set({ foo: 'FOO!', bar: 'BAR!' });

expect(foo.get()).toBe('FOO!');
expect(bar.get()).toBe('BAR!');
});
});

describe("derivations inside a transaction", () => {
it("can take on temporary values", () => {
const a = derivable.atom(0);
Expand Down Expand Up @@ -149,6 +111,7 @@ describe("derivations inside a transaction", () => {
expect(thrown).toBe("death");
expect(plusOne.get()).toBe(1);
});

it('can take on temporary values even in nested transactions', () => {
const a = derivable.atom(0);
const plusOne = a.derive(d => d + 1);
Expand Down Expand Up @@ -339,62 +302,3 @@ describe("nested derivables", () => {
expect(running).toBeTruthy();
});
});

test('derive derivable value with function', () => {
const a = derivable.atom(1);
const q = derivable.atom(10);
const b = a.derive(d => d + q.get());
const c = b.derive(d => d * q.get());
expect([b.get(), c.get()]).toEqual([11, 110]);

q.set(20);
expect([b.get(), c.get()]).toEqual([21, 420]);

a.set(null);
expect([b.get(), c.get()]).toEqual([20, 400]);

expect(() => {
derivable.map();
}).toThrow();
});

test('maybe derive derivable (non-null) value with function', () => {
const a = derivable.atom(1);
const q = derivable.atom(10);
const b = a.maybeDerive(d => d + q.get());
const c = b.maybeDerive(d => d * q.get());
expect([b.get(), c.get()]).toEqual([11, 110]);

q.set(20);
expect([b.get(), c.get()]).toEqual([21, 420]);

a.set(null);
expect([b.get(), c.get()]).toEqual([null, null]);

expect(() => {
derivable.map();
}).toThrow();
});

test('is method', () => {
const a = derivable.atom(1);
const b = derivable.atom(1);
const fst = a.is(b);
const snd = b.is(a);
expect(fst.get()).toBeTruthy();
expect(snd.get()).toBeTruthy();

a.set({ equals: () => true });
b.set({ equals: () => false });
expect(fst.get()).toBeTruthy();
expect(snd.get()).toBeFalsy();
});

test('maybe default prefers passed value or derivable over null or undefined', () => {
const a = derivable.atom(null);
const r = a.orDefault(2);
expect(r.get()).toBe(2);

a.set(1);
expect(r.get()).toBe(1);
});

0 comments on commit b86d03c

Please sign in to comment.