[6a3a178] | 1 | 'use strict';
|
---|
| 2 |
|
---|
| 3 | var define = require('../');
|
---|
| 4 | var test = require('tape');
|
---|
| 5 | var keys = require('object-keys');
|
---|
| 6 |
|
---|
| 7 | var arePropertyDescriptorsSupported = function () {
|
---|
| 8 | var obj = { a: 1 };
|
---|
| 9 | try {
|
---|
| 10 | Object.defineProperty(obj, 'x', { value: obj });
|
---|
| 11 | return obj.x === obj;
|
---|
| 12 | } catch (e) { /* this is IE 8. */
|
---|
| 13 | return false;
|
---|
| 14 | }
|
---|
| 15 | };
|
---|
| 16 | var descriptorsSupported = !!Object.defineProperty && arePropertyDescriptorsSupported();
|
---|
| 17 |
|
---|
| 18 | var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol';
|
---|
| 19 |
|
---|
| 20 | test('defineProperties', function (dt) {
|
---|
| 21 | dt.test('with descriptor support', { skip: !descriptorsSupported }, function (t) {
|
---|
| 22 | var getDescriptor = function (value) {
|
---|
| 23 | return {
|
---|
| 24 | configurable: true,
|
---|
| 25 | enumerable: false,
|
---|
| 26 | value: value,
|
---|
| 27 | writable: true
|
---|
| 28 | };
|
---|
| 29 | };
|
---|
| 30 |
|
---|
| 31 | var obj = {
|
---|
| 32 | a: 1,
|
---|
| 33 | b: 2,
|
---|
| 34 | c: 3
|
---|
| 35 | };
|
---|
| 36 | t.deepEqual(keys(obj), ['a', 'b', 'c'], 'all literal-set keys start enumerable');
|
---|
| 37 | define(obj, {
|
---|
| 38 | b: 3,
|
---|
| 39 | c: 4,
|
---|
| 40 | d: 5
|
---|
| 41 | });
|
---|
| 42 | t.deepEqual(obj, {
|
---|
| 43 | a: 1,
|
---|
| 44 | b: 2,
|
---|
| 45 | c: 3
|
---|
| 46 | }, 'existing properties were not overridden');
|
---|
| 47 | t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'new property "d" was added and is not enumerable');
|
---|
| 48 | t.deepEqual(['a', 'b', 'c'], keys(obj), 'new keys are not enumerable');
|
---|
| 49 |
|
---|
| 50 | define(obj, {
|
---|
| 51 | a: 2,
|
---|
| 52 | b: 3,
|
---|
| 53 | c: 4
|
---|
| 54 | }, {
|
---|
| 55 | a: function () { return true; },
|
---|
| 56 | b: function () { return false; }
|
---|
| 57 | });
|
---|
| 58 | t.deepEqual(obj, {
|
---|
| 59 | b: 2,
|
---|
| 60 | c: 3
|
---|
| 61 | }, 'properties only overriden when predicate exists and returns true');
|
---|
| 62 | t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'd'), getDescriptor(5), 'existing property "d" remained and is not enumerable');
|
---|
| 63 | t.deepEqual(Object.getOwnPropertyDescriptor(obj, 'a'), getDescriptor(2), 'existing property "a" was overridden and is not enumerable');
|
---|
| 64 | t.deepEqual(['b', 'c'], keys(obj), 'overridden keys are not enumerable');
|
---|
| 65 |
|
---|
| 66 | t.end();
|
---|
| 67 | });
|
---|
| 68 |
|
---|
| 69 | dt.test('without descriptor support', { skip: descriptorsSupported }, function (t) {
|
---|
| 70 | var obj = {
|
---|
| 71 | a: 1,
|
---|
| 72 | b: 2,
|
---|
| 73 | c: 3
|
---|
| 74 | };
|
---|
| 75 | define(obj, {
|
---|
| 76 | b: 3,
|
---|
| 77 | c: 4,
|
---|
| 78 | d: 5
|
---|
| 79 | });
|
---|
| 80 | t.deepEqual(obj, {
|
---|
| 81 | a: 1,
|
---|
| 82 | b: 2,
|
---|
| 83 | c: 3,
|
---|
| 84 | d: 5
|
---|
| 85 | }, 'existing properties were not overridden, new properties were added');
|
---|
| 86 |
|
---|
| 87 | define(obj, {
|
---|
| 88 | a: 2,
|
---|
| 89 | b: 3,
|
---|
| 90 | c: 4
|
---|
| 91 | }, {
|
---|
| 92 | a: function () { return true; },
|
---|
| 93 | b: function () { return false; }
|
---|
| 94 | });
|
---|
| 95 | t.deepEqual(obj, {
|
---|
| 96 | a: 2,
|
---|
| 97 | b: 2,
|
---|
| 98 | c: 3,
|
---|
| 99 | d: 5
|
---|
| 100 | }, 'properties only overriden when predicate exists and returns true');
|
---|
| 101 |
|
---|
| 102 | t.end();
|
---|
| 103 | });
|
---|
| 104 |
|
---|
| 105 | dt.end();
|
---|
| 106 | });
|
---|
| 107 |
|
---|
| 108 | test('symbols', { skip: !hasSymbols }, function (t) {
|
---|
| 109 | var sym = Symbol('foo');
|
---|
| 110 | var obj = {};
|
---|
| 111 | var aValue = {};
|
---|
| 112 | var bValue = {};
|
---|
| 113 | var properties = { a: aValue };
|
---|
| 114 | properties[sym] = bValue;
|
---|
| 115 |
|
---|
| 116 | define(obj, properties);
|
---|
| 117 |
|
---|
| 118 | t.deepEqual(Object.keys(obj), [], 'object has no enumerable keys');
|
---|
| 119 | t.deepEqual(Object.getOwnPropertyNames(obj), ['a'], 'object has non-enumerable "a" key');
|
---|
| 120 | t.deepEqual(Object.getOwnPropertySymbols(obj), [sym], 'object has non-enumerable symbol key');
|
---|
| 121 | t.equal(obj.a, aValue, 'string keyed value is defined');
|
---|
| 122 | t.equal(obj[sym], bValue, 'symbol keyed value is defined');
|
---|
| 123 |
|
---|
| 124 | t.end();
|
---|
| 125 | });
|
---|