blob: b14115e80641d7b30a62682e5f2fc6933ab96733 [file] [log] [blame]
const assert = require('assert');
const LazilyEvaluatedFunction = require('../public/v3/lazily-evaluated-function.js').LazilyEvaluatedFunction;
describe('LazilyEvaluatedFunction', () => {
describe('evaluate', () => {
it('should invoke the callback on the very first call with no arguments', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate();
assert.deepEqual(calls, [[]]);
});
it('should retrun the cached results without invoking the callback on the second call with no arguments', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate();
assert.deepEqual(calls, [[]]);
lazyFunction.evaluate();
assert.deepEqual(calls, [[]]);
});
it('should invoke the callback when calld with an argument after being called with no argument', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate();
assert.deepEqual(calls, [[]]);
lazyFunction.evaluate(1);
assert.deepEqual(calls, [[], [1]]);
});
it('should invoke the callback when calld with no arguments after being called with an argument', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate('foo');
assert.deepEqual(calls, [['foo']]);
lazyFunction.evaluate();
assert.deepEqual(calls, [['foo'], []]);
});
it('should invoke the callback when calld with null after being called with undefined', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate(undefined);
assert.deepEqual(calls, [[undefined]]);
lazyFunction.evaluate(null);
assert.deepEqual(calls, [[undefined], [null]]);
});
it('should invoke the callback when calld with 0 after being called with "0"', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate(0);
assert.deepEqual(calls, [[0]]);
lazyFunction.evaluate("0");
assert.deepEqual(calls, [[0], ["0"]]);
});
it('should invoke the callback when calld with an object after being called with another object with the same set of properties', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
const x = {};
const y = {};
lazyFunction.evaluate(x);
assert.deepEqual(calls, [[x]]);
lazyFunction.evaluate(y);
assert.deepEqual(calls, [[x], [y]]);
});
it('should return the cached result without invoking the callback when calld with a string after being called with the same string', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate("foo");
assert.deepEqual(calls, [["foo"]]);
lazyFunction.evaluate("foo");
assert.deepEqual(calls, [["foo"]]);
});
it('should invoke the callback when calld with a string after being called with another string', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate("foo");
assert.deepEqual(calls, [["foo"]]);
lazyFunction.evaluate("bar");
assert.deepEqual(calls, [["foo"], ["bar"]]);
});
it('should return the cached result without invoking the callback when calld with a number after being called with the same number', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate(8);
assert.deepEqual(calls, [[8]]);
lazyFunction.evaluate(8);
assert.deepEqual(calls, [[8]]);
});
it('should invoke the callback when calld with a number after being called with another number', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate(4);
assert.deepEqual(calls, [[4]]);
lazyFunction.evaluate(2);
assert.deepEqual(calls, [[4], [2]]);
});
it('should return the cached result without invoking the callback when calld with ["hello", 3, "world"] for the second time', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate("hello", 3, "world");
assert.deepEqual(calls, [["hello", 3, "world"]]);
lazyFunction.evaluate("hello", 3, "world");
assert.deepEqual(calls, [["hello", 3, "world"]]);
});
it('should invoke the callback when calld with ["hello", 3, "world"] after being called with ["hello", 4, "world"]', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate("hello", 3, "world");
assert.deepEqual(calls, [["hello", 3, "world"]]);
lazyFunction.evaluate("hello", 4, "world");
assert.deepEqual(calls, [["hello", 3, "world"], ["hello", 4, "world"]]);
});
it('should return the cached result without invoking the callback when called with [null, null] for the second time', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate(null, null);
assert.deepEqual(calls, [[null, null]]);
lazyFunction.evaluate(null, null);
assert.deepEqual(calls, [[null, null]]);
});
it('should invoke the callback when calld with [null] after being called with [null, null]', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate(null, null);
assert.deepEqual(calls, [[null, null]]);
lazyFunction.evaluate(null);
assert.deepEqual(calls, [[null, null], [null]]);
});
it('should invoke the callback when calld with [null, 4] after being called with [null]', () => {
const calls = [];
const lazyFunction = new LazilyEvaluatedFunction((...args) => calls.push(args));
assert.deepEqual(calls, []);
lazyFunction.evaluate(null, 4);
assert.deepEqual(calls, [[null, 4]]);
lazyFunction.evaluate(null);
assert.deepEqual(calls, [[null, 4], [null]]);
});
});
});