portfolio/packages/frptools/spec/observable.spec.js
Timothy Farrell c386545cb6 FRPtools 1.2.0
- add the ability to have comparators for complex types
- computed.unsubscribeAll() to give more cleanup options
2017-11-02 21:04:08 -05:00

87 lines
2.2 KiB
JavaScript

const { observable } = require('../lib/index.js');
describe('observable', () => {
it('returns its initialized value', () => {
const a = observable(true);
expect(a()).toEqual(true);
});
it('returns its set value', () => {
const a = observable();
expect(a()).toEqual(undefined);
expect(a(true)).toEqual(true);
});
it('returns notifies dependents of updates', () => {
let runCount = 0;
let currentValue = 1;
const a = observable();
a.subscribe(val => {
runCount += 1;
expect(val).toEqual(currentValue);
});
expect(a(1)).toEqual(1);
expect(runCount).toEqual(1);
expect(a(1)).toEqual(1);
expect(runCount).toEqual(1);
currentValue = 2;
expect(a(2)).toEqual(2);
expect(runCount).toEqual(2);
expect(a(2)).toEqual(2);
expect(runCount).toEqual(2);
currentValue = 1;
expect(a(1)).toEqual(1);
expect(runCount).toEqual(3);
expect(a(1)).toEqual(1);
expect(runCount).toEqual(3);
});
it('honors cancelled subscriptions', () => {
let runCount = 0;
let currentValue = 1;
const a = observable();
const cancelSubscription = a.subscribe(val => {
runCount += 1;
expect(val).toEqual(currentValue);
});
const cancelSubscription2 = a.subscribe(val => {
runCount += 1;
expect(val).toEqual(currentValue);
});
expect(a(1)).toEqual(1);
expect(runCount).toEqual(2);
expect(a(1)).toEqual(1);
expect(runCount).toEqual(2);
expect(cancelSubscription()).toEqual(1);
currentValue = 3;
expect(a(3)).toEqual(3);
expect(runCount).toEqual(3);
expect(cancelSubscription2()).toEqual(0);
currentValue = 4;
expect(a(4)).toEqual(4);
expect(runCount).toEqual(3);
});
it('uses a comparator', () => {
function setEquals(a, b) {
return (
a instanceof Set &&
b instanceof Set &&
[...a].reduce((acc, d) => acc && b.has(d), true) &&
[...b].reduce((acc, d) => acc && a.has(d), true)
);
}
let runCount = 0;
const a = observable(new Set([1, 2]), setEquals);
a.subscribe(() => (runCount += 1));
expect([...a()]).toEqual([1, 2]);
expect(runCount).toEqual(0);
expect([...a(new Set([2, 1]))]).toEqual([1, 2]);
expect(runCount).toEqual(0);
expect([...a(new Set([3, 2, 1]))]).toEqual([3, 2, 1]);
expect(runCount).toEqual(1);
});
});