initial commit
[squeep-lazy-property] / test / lazy.js
diff --git a/test/lazy.js b/test/lazy.js
new file mode 100644 (file)
index 0000000..b95be17
--- /dev/null
@@ -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