OLD | NEW |
(Empty) | |
| 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 // Flags: --harmony-object |
| 6 |
| 7 // Based on Mozilla Object.assign() tests |
| 8 |
| 9 function checkDataProperty(object, propertyKey, value, writable, enumerable, con
figurable) { |
| 10 var desc = Object.getOwnPropertyDescriptor(object, propertyKey); |
| 11 assertFalse(desc === undefined); |
| 12 assertTrue('value' in desc); |
| 13 assertEquals(desc.value, value); |
| 14 assertEquals(desc.writable, writable); |
| 15 assertEquals(desc.enumerable, enumerable); |
| 16 assertEquals(desc.configurable, configurable); |
| 17 } |
| 18 |
| 19 // 19.1.2.1 Object.assign ( target, ...sources ) |
| 20 assertEquals(Object.assign.length, 2); |
| 21 |
| 22 // Basic functionality works with multiple sources |
| 23 (function basicMultipleSources() { |
| 24 var a = {}; |
| 25 var b = { bProp: 1 }; |
| 26 var c = { cProp: 2 }; |
| 27 Object.assign(a, b, c); |
| 28 assertEquals(a, { |
| 29 bProp: 1, |
| 30 cProp: 2 |
| 31 }); |
| 32 })(); |
| 33 |
| 34 // Basic functionality works with symbols |
| 35 (function basicSymbols() { |
| 36 var a = {}; |
| 37 var b = { bProp: 1 }; |
| 38 var aSymbol = Symbol("aSymbol"); |
| 39 b[aSymbol] = 2; |
| 40 Object.assign(a, b); |
| 41 assertEquals(1, a.bProp); |
| 42 assertEquals(2, a[aSymbol]); |
| 43 })(); |
| 44 |
| 45 // Dies if target is null or undefined |
| 46 assertThrows(function() { return Object.assign(null, null); }, TypeError); |
| 47 assertThrows(function() { return Object.assign(null, {}); }, TypeError); |
| 48 assertThrows(function() { return Object.assign(undefined); }, TypeError); |
| 49 assertThrows(function() { return Object.assign(); }, TypeError); |
| 50 |
| 51 // Calls ToObject for target |
| 52 assertTrue(Object.assign(true, {}) instanceof Boolean); |
| 53 assertTrue(Object.assign(1, {}) instanceof Number); |
| 54 assertTrue(Object.assign("string", {}) instanceof String); |
| 55 var o = {}; |
| 56 assertSame(Object.assign(o, {}), o); |
| 57 |
| 58 // Only [[Enumerable]] properties are assigned to target |
| 59 (function onlyEnumerablePropertiesAssigned() { |
| 60 var source = Object.defineProperties({}, { |
| 61 a: {value: 1, enumerable: true}, |
| 62 b: {value: 2, enumerable: false}, |
| 63 }); |
| 64 var target = Object.assign({}, source); |
| 65 assertTrue("a" in target); |
| 66 assertFalse("b" in target); |
| 67 })(); |
| 68 |
| 69 // Properties are retrieved through Get() |
| 70 // Properties are assigned through Put() |
| 71 (function testPropertiesAssignedThroughPut() { |
| 72 var setterCalled = false; |
| 73 Object.assign({set a(v) { setterCalled = v }}, {a: true}); |
| 74 assertTrue(setterCalled); |
| 75 })(); |
| 76 |
| 77 // Properties are retrieved through Get() |
| 78 // Properties are assigned through Put(): Existing property attributes are not a
ltered |
| 79 (function propertiesAssignedExistingNotAltered() { |
| 80 var source = {a: 1, b: 2, c: 3}; |
| 81 var target = {a: 0, b: 0, c: 0}; |
| 82 Object.defineProperty(target, "a", {enumerable: false}); |
| 83 Object.defineProperty(target, "b", {configurable: false}); |
| 84 Object.defineProperty(target, "c", {enumerable: false, configurable: false}); |
| 85 Object.assign(target, source); |
| 86 checkDataProperty(target, "a", 1, true, false, true); |
| 87 checkDataProperty(target, "b", 2, true, true, false); |
| 88 checkDataProperty(target, "c", 3, true, false, false); |
| 89 })(); |
| 90 |
| 91 // Properties are retrieved through Get() |
| 92 // Properties are assigned through Put(): Throws TypeError if non-writable |
| 93 (function propertiesAssignedTypeErrorNonWritable() { |
| 94 var source = {a: 1}; |
| 95 var target = {a: 0}; |
| 96 Object.defineProperty(target, "a", {writable: false}); |
| 97 assertThrows(function() { return Object.assign(target, source); }, TypeError); |
| 98 checkDataProperty(target, "a", 0, false, true, true); |
| 99 })(); |
| 100 |
| 101 // Properties are retrieved through Get() |
| 102 // Put() creates standard properties; Property attributes from source are |
| 103 // ignored |
| 104 (function createsStandardProperties() { |
| 105 var source = {a: 1, b: 2, c: 3, get d() { return 4 }}; |
| 106 Object.defineProperty(source, "b", {writable: false}); |
| 107 Object.defineProperty(source, "c", {configurable: false}); |
| 108 var target = Object.assign({}, source); |
| 109 checkDataProperty(target, "a", 1, true, true, true); |
| 110 checkDataProperty(target, "b", 2, true, true, true); |
| 111 checkDataProperty(target, "c", 3, true, true, true); |
| 112 checkDataProperty(target, "d", 4, true, true, true); |
| 113 })(); |
| 114 |
| 115 // Properties created during traversal are not copied |
| 116 (function propertiesCreatedDuringTraversalNotCopied() { |
| 117 var source = {get a() { this.b = 2 }}; |
| 118 var target = Object.assign({}, source); |
| 119 assertTrue("a" in target); |
| 120 assertFalse("b" in target); |
| 121 })(); |
| 122 |
| 123 // String and Symbol valued properties are copied |
| 124 (function testStringAndSymbolPropertiesCopied() { |
| 125 var keyA = "str-prop"; |
| 126 var source = {"str-prop": 1}; |
| 127 var target = Object.assign({}, source); |
| 128 checkDataProperty(target, keyA, 1, true, true, true); |
| 129 })(); |
| 130 |
| 131 (function testExceptionsStopFirstException() { |
| 132 var ErrorA = function ErrorA() {}; |
| 133 var ErrorB = function ErrorB() {}; |
| 134 var log = ""; |
| 135 var source = { b: 1, a: 1 }; |
| 136 var target = { |
| 137 set a(v) { log += "a"; throw new ErrorA }, |
| 138 set b(v) { log += "b"; throw new ErrorB }, |
| 139 }; |
| 140 assertThrows(function() { return Object.assign(target, source); }, ErrorB); |
| 141 assertEquals(log, "b"); |
| 142 })(); |
OLD | NEW |