X-Git-Url: http://git.squeep.com/?p=squeep-lazy-property;a=blobdiff_plain;f=test%2Flazy.js;fp=test%2Flazy.js;h=b95be17d00f6e31306228cc2459913a4dd2939bd;hp=0000000000000000000000000000000000000000;hb=1017c96958b07004f5dae64d0004d6104fedebd9;hpb=2a09b88daec188d1e2c49ef56dbdb9c81bd3ff28 diff --git a/test/lazy.js b/test/lazy.js new file mode 100644 index 0000000..b95be17 --- /dev/null +++ b/test/lazy.js @@ -0,0 +1,58 @@ +/* eslint-env mocha */ +'use strict'; + +const assert = require('assert'); +const { lazy } = require('../index'); + +describe('lazy', function () { + let o, initializer, called; + + beforeEach(function () { + o = {}; + called = false; + initializer = () => { + called = true; + return 'value'; + }; + }); + + it('does not initialize if not accessed', function () { + lazy(o, 'p', initializer); + assert.strictEqual(called, false); + assert(Object.keys(o).includes('p')); + }); + + it('wants a callable initializer', function () { + try { + lazy(o, 'p', undefined); + assert.fail('should reject un-callable initializer'); + } catch (e) { + assert(e instanceof TypeError, `expected 'TypeError', got '${e.name}'`); + } + }); + + it('initializes if accessed', function () { + lazy(o, 'p', initializer); + const v = o.p; + assert.strictEqual(called, true); + assert.strictEqual(v, 'value'); + }); + + it('handles symbolic properties', function () { + const s = Symbol('s'); + lazy(o, s, initializer); + const v = o[s]; + assert.strictEqual(called, true); + assert.strictEqual(v, 'value'); + }); + + it('can be overwritten before being read', function () { + const expected = 'foobar'; + lazy(o, 'p', initializer); + o.p = expected; + const v = o.p; + assert.strictEqual(v, expected); + assert.strictEqual(called, false); + }); + +}); // lazy