--- /dev/null
+/* 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