From 86e8b47b5aeeae5f2fc3b87bb5930fb4c25f88ab Mon Sep 17 00:00:00 2001 From: "(quasar) nebula" Date: Sun, 7 May 2023 19:21:41 -0300 Subject: contract: BlackBox stub & NormalizedArrayMap Spooky scary skeletons Also includes a bonus very dumb performance test! --- test/unit/contract/black-box.js | 81 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 test/unit/contract/black-box.js (limited to 'test') diff --git a/test/unit/contract/black-box.js b/test/unit/contract/black-box.js new file mode 100644 index 00000000..21c05b52 --- /dev/null +++ b/test/unit/contract/black-box.js @@ -0,0 +1,81 @@ +import {BlackBox} from '../../../src/contract.js'; +import {mockFunction} from '../../lib/generic-mock.js'; +import {showAggregate} from '../../../src/util/sugar.js'; + +import t from 'tap'; + +t.test(`BlackBox - caching`, t => { + t.plan(8); + + const obj1 = {foo: 3, bar: 4}; + const obj2 = {baz: 5, qux: 6}; + + let {value: fn, close: closeMock} = + mockFunction((object, key) => object[key] ** 2) + + fn = fn + .args([obj1, 'foo']).next() + .args([obj2, 'qux']).next() + .args([obj1, 'bar']).next() + .args([obj2, 'baz']); + + const bb = new BlackBox(fn); + const evaluate = bb.getEvaluator(); + + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + t.equal(evaluate(obj2, 'qux'), 6 ** 2); + t.equal(evaluate(obj2, 'qux'), 6 ** 2); + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + + t.equal(evaluate(obj1, 'bar'), 4 ** 2); + t.equal(evaluate(obj2, 'baz'), 5 ** 2); + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + + try { + closeMock(); + } catch (error) { + showAggregate(error); + throw error; + } +}); + +t.test(`BlackBox - no caching`, t => { + t.plan(8); + + const obj1 = {foo: 3, bar: 4}; + const obj2 = {baz: 5, qux: 6}; + + let {value: fn, close: closeMock} = + mockFunction((object, key) => object[key] ** 2) + + fn = fn + .args([obj1, 'foo']).repeat(2) + .args([obj2, 'qux']).repeat(2) + .args([obj1, 'foo']).next() + .args([obj1, 'bar']).next() + .args([obj2, 'baz']).next() + .args([obj1, 'foo']); + + const bb = new BlackBox(fn); + const evaluate = bb.getEvaluator(); + + bb.caching = false; + + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + t.equal(evaluate(obj2, 'qux'), 6 ** 2); + t.equal(evaluate(obj2, 'qux'), 6 ** 2); + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + + t.equal(evaluate(obj1, 'bar'), 4 ** 2); + t.equal(evaluate(obj2, 'baz'), 5 ** 2); + t.equal(evaluate(obj1, 'foo'), 3 ** 2); + + try { + closeMock(); + } catch (error) { + showAggregate(error); + throw error; + } +}); -- cgit 1.3.0-6-gf8a5