Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(387)

Side by Side Diff: test/mjsunit/harmony/object-assign.js

Issue 548833002: [es6] implement Object.assign (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased again Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(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 Array.of() tests at http://dxr.mozilla.org/mozilla-central/s ource/js/src/tests/ecma_6/Object/assign.js
arv (Not doing code reviews) 2015/04/03 21:15:09 Is this comment really correct?
caitp (gmail) 2015/04/03 21:28:41 The Array.of() part certainly isn't! fixing that
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 })();
OLDNEW
« src/harmony-object.js ('K') | « src/harmony-object.js ('k') | tools/gyp/v8.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698