| Leo Repp | 58b9f11 | 2021-11-22 11:57:47 +0100 | [diff] [blame^] | 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 | }); |