initial commit
[squeep-lazy-property] / test / lazy.js
1 /* eslint-env mocha */
2 'use strict';
3
4 const assert = require('assert');
5 const { lazy } = require('../index');
6
7 describe('lazy', function () {
8 let o, initializer, called;
9
10 beforeEach(function () {
11 o = {};
12 called = false;
13 initializer = () => {
14 called = true;
15 return 'value';
16 };
17 });
18
19 it('does not initialize if not accessed', function () {
20 lazy(o, 'p', initializer);
21 assert.strictEqual(called, false);
22 assert(Object.keys(o).includes('p'));
23 });
24
25 it('wants a callable initializer', function () {
26 try {
27 lazy(o, 'p', undefined);
28 assert.fail('should reject un-callable initializer');
29 } catch (e) {
30 assert(e instanceof TypeError, `expected 'TypeError', got '${e.name}'`);
31 }
32 });
33
34 it('initializes if accessed', function () {
35 lazy(o, 'p', initializer);
36 const v = o.p;
37 assert.strictEqual(called, true);
38 assert.strictEqual(v, 'value');
39 });
40
41 it('handles symbolic properties', function () {
42 const s = Symbol('s');
43 lazy(o, s, initializer);
44 const v = o[s];
45 assert.strictEqual(called, true);
46 assert.strictEqual(v, 'value');
47 });
48
49 it('can be overwritten before being read', function () {
50 const expected = 'foobar';
51 lazy(o, 'p', initializer);
52 o.p = expected;
53 const v = o.p;
54 assert.strictEqual(v, expected);
55 assert.strictEqual(called, false);
56 });
57
58 }); // lazy