mirror of
https://github.com/tc39/test262.git
synced 2025-07-28 16:34:27 +02:00
Move Map.prototype.getOrInsertComputed tests from staging to built-ins
This commit is contained in:
parent
3cd73c15f2
commit
81ba0de350
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Append a new value in the map normalizing +0 and -0.
|
Append a new value in the map normalizing +0 and -0.
|
||||||
info: |
|
info: |
|
||||||
@ -17,7 +17,6 @@ info: |
|
|||||||
8. Append p to M.[[MapData]].
|
8. Append p to M.[[MapData]].
|
||||||
...
|
...
|
||||||
features: [Symbol, arrow-function, upsert]
|
features: [Symbol, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var map = new Map();
|
var map = new Map();
|
||||||
map.getOrInsertComputed(-0, () => 42);
|
map.getOrInsertComputed(-0, () => 42);
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Append a new value as the last element of entries.
|
Append a new value as the last element of entries.
|
||||||
info: |
|
info: |
|
||||||
@ -17,7 +17,6 @@ info: |
|
|||||||
8. Append p to M.[[MapData]].
|
8. Append p to M.[[MapData]].
|
||||||
...
|
...
|
||||||
features: [Symbol, arrow-function, upsert]
|
features: [Symbol, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var s = Symbol(2);
|
var s = Symbol(2);
|
||||||
var map = new Map([[4, 4], ['foo3', 3], [s, 2]]);
|
var map = new Map([[4, 4], ['foo3', 3], [s, 2]]);
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Inserts the value for the specified key on different types, when key not present.
|
Inserts the value for the specified key on different types, when key not present.
|
||||||
info: |
|
info: |
|
||||||
@ -13,20 +13,22 @@ info: |
|
|||||||
8. Append p to M.[[MapData]].
|
8. Append p to M.[[MapData]].
|
||||||
...
|
...
|
||||||
features: [Symbol, arrow-function, upsert]
|
features: [Symbol, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var map = new Map();
|
var map = new Map();
|
||||||
|
|
||||||
map.getOrInsertComputed('bar', () => 0);
|
var item = 'bar';
|
||||||
assert.sameValue(map.get('bar'), 0);
|
map.getOrInsertComputed(item, () => 0);
|
||||||
|
assert.sameValue(map.get(item), 0);
|
||||||
|
|
||||||
map.getOrInsertComputed(1, () => 42);
|
item = 1;
|
||||||
assert.sameValue(map.get(1), 42);
|
map.getOrInsertComputed(item, () => 42);
|
||||||
|
assert.sameValue(map.get(item), 42);
|
||||||
|
|
||||||
map.getOrInsertComputed(NaN, () => 1);
|
item = NaN;
|
||||||
assert.sameValue(map.get(NaN), 1);
|
map.getOrInsertComputed(item, () => 1);
|
||||||
|
assert.sameValue(map.get(item), 1);
|
||||||
|
|
||||||
var item = {};
|
item = {};
|
||||||
map.getOrInsertComputed(item, () => 2);
|
map.getOrInsertComputed(item, () => 2);
|
||||||
assert.sameValue(map.get(item), 2);
|
assert.sameValue(map.get(item), 2);
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Map.getOrInsertComputed throws when callbackfn throws return if abrubt completion Call(callbackfn, key)
|
Map.getOrInsertComputed throws when callbackfn throws return if abrubt completion Call(callbackfn, key)
|
||||||
info: |
|
info: |
|
||||||
@ -13,7 +13,6 @@ info: |
|
|||||||
6. Let value be ? Call(callbackfn, key).
|
6. Let value be ? Call(callbackfn, key).
|
||||||
...
|
...
|
||||||
features: [upsert]
|
features: [upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var map = new Map();
|
var map = new Map();
|
||||||
|
|
||||||
@ -21,5 +20,5 @@ assert.throws(Error, function() {
|
|||||||
map.getOrInsertComputed(1, function() {
|
map.getOrInsertComputed(1, function() {
|
||||||
throw new Error('throw in callback');
|
throw new Error('throw in callback');
|
||||||
})
|
})
|
||||||
}, Error);
|
});
|
||||||
|
|
23
test/built-ins/Map/prototype/getOrInsertComputed/check-callback-fn-args.js
vendored
Normal file
23
test/built-ins/Map/prototype/getOrInsertComputed/check-callback-fn-args.js
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (C) 2025 Daniel Minor. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
|
description: |
|
||||||
|
Check that callbackfn receives undefined for this and exactly one argument.
|
||||||
|
info: |
|
||||||
|
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
6. Let value be ? Call(callbackfn, key).
|
||||||
|
...
|
||||||
|
features: [upsert]
|
||||||
|
flags: [onlyStrict]
|
||||||
|
---*/
|
||||||
|
var map = new Map();
|
||||||
|
|
||||||
|
map.getOrInsertComputed(1, function(...args) {
|
||||||
|
assert.sameValue(this, undefined);
|
||||||
|
assert.sameValue(args.length, 1);
|
||||||
|
assert.sameValue(args[0], 1);
|
||||||
|
});
|
57
test/built-ins/Map/prototype/getOrInsertComputed/check-state-after-callback-fn-throws.js
vendored
Normal file
57
test/built-ins/Map/prototype/getOrInsertComputed/check-state-after-callback-fn-throws.js
vendored
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
// Copyright (C) 2025 Daniel Minor. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
|
description: |
|
||||||
|
Check state after callback function throws
|
||||||
|
info: |
|
||||||
|
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
||||||
|
|
||||||
|
...
|
||||||
|
|
||||||
|
6. Let value be ? Call(callbackfn, key).
|
||||||
|
...
|
||||||
|
features: [upsert]
|
||||||
|
---*/
|
||||||
|
var map = new Map();
|
||||||
|
map.set(0, 'zero');
|
||||||
|
map.set(1, 'one');
|
||||||
|
map.set(2, 'two');
|
||||||
|
|
||||||
|
assert.throws(Error, function() {
|
||||||
|
map.getOrInsertComputed(3, function() {
|
||||||
|
throw new Error('throw in callback');
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check the values after throwing in callbackfn.
|
||||||
|
assert.sameValue(map.get(0), 'zero');
|
||||||
|
assert.sameValue(map.get(1), 'one');
|
||||||
|
assert.sameValue(map.get(2), 'two');
|
||||||
|
assert.sameValue(map.has(3), false)
|
||||||
|
|
||||||
|
assert.throws(Error, function() {
|
||||||
|
map.getOrInsertComputed(3, function() {
|
||||||
|
map.set(1, 'mutated');
|
||||||
|
throw new Error('throw in callback');
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check the values after throwing in callbackfn, with mutation.
|
||||||
|
assert.sameValue(map.get(0), 'zero');
|
||||||
|
assert.sameValue(map.get(1), 'mutated',);
|
||||||
|
assert.sameValue(map.get(2), 'two');
|
||||||
|
assert.sameValue(map.has(3), false)
|
||||||
|
|
||||||
|
assert.throws(Error, function() {
|
||||||
|
map.getOrInsertComputed(3, function() {
|
||||||
|
map.set(3, 'mutated');
|
||||||
|
throw new Error('throw in callback');
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// Check the values after throwing in callbackfn, with mutation.
|
||||||
|
assert.sameValue(map.get(0), 'zero');
|
||||||
|
assert.sameValue(map.get(1), 'mutated',);
|
||||||
|
assert.sameValue(map.get(2), 'two');
|
||||||
|
assert.sameValue(map.get(3), 'mutated')
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (C) 2024 Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Does not throw if `callbackfn` is callable.
|
Does not throw if `callbackfn` is callable.
|
||||||
info: |
|
info: |
|
||||||
@ -12,40 +12,21 @@ info: |
|
|||||||
...
|
...
|
||||||
|
|
||||||
features: [arrow-function, upsert]
|
features: [arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var m = new Map();
|
var m = new Map();
|
||||||
|
|
||||||
|
assert.sameValue(m.getOrInsertComputed(1, function () { return 1; }), 1);
|
||||||
assert.sameValue(
|
|
||||||
m.getOrInsertComputed(1, function() {return 1;})
|
|
||||||
, 1);
|
|
||||||
assert.sameValue(m.get(1), 1);
|
assert.sameValue(m.get(1), 1);
|
||||||
|
|
||||||
|
assert.sameValue(m.getOrInsertComputed(2, () => 2), 2);
|
||||||
assert.sameValue(
|
|
||||||
m.getOrInsertComputed(2, () => 2)
|
|
||||||
, 2);
|
|
||||||
assert.sameValue(m.get(2), 2);
|
assert.sameValue(m.get(2), 2);
|
||||||
|
|
||||||
|
|
||||||
function three() { return 3; }
|
function three() { return 3; }
|
||||||
|
assert.sameValue(m.getOrInsertComputed(3, three), 3);
|
||||||
assert.sameValue(
|
|
||||||
m.getOrInsertComputed(3, three)
|
|
||||||
, 3);
|
|
||||||
assert.sameValue(m.get(3), 3);
|
assert.sameValue(m.get(3), 3);
|
||||||
|
|
||||||
|
assert.sameValue(m.getOrInsertComputed(4, new Function()), undefined);
|
||||||
assert.sameValue(
|
|
||||||
m.getOrInsertComputed(4, new Function())
|
|
||||||
, undefined);
|
|
||||||
assert.sameValue(m.get(4), undefined);
|
assert.sameValue(m.get(4), undefined);
|
||||||
|
|
||||||
|
assert.sameValue(m.getOrInsertComputed(5, (function () { return 5; }).bind(m)), 5);
|
||||||
assert.sameValue(
|
|
||||||
m.getOrInsertComputed(5, (function() {return 5;}).bind(m))
|
|
||||||
, 5);
|
|
||||||
assert.sameValue(m.get(5), 5);
|
assert.sameValue(m.get(5), 5);
|
||||||
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (C) 2025 Jonas Haukenes. All rights reserved.
|
// Copyright (C) 2025 Jonas Haukenes. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Does not evaluate the callback function if the key is already in the map.
|
Does not evaluate the callback function if the key is already in the map.
|
||||||
info: |
|
info: |
|
||||||
@ -13,13 +13,14 @@ info: |
|
|||||||
6. Let value be ? Call(callbackfn, undefined, « key »).
|
6. Let value be ? Call(callbackfn, undefined, « key »).
|
||||||
...
|
...
|
||||||
features: [WeakMap, upsert]
|
features: [WeakMap, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var map = new Map([
|
var map = new Map([
|
||||||
[1, 0]
|
[1, 0]
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
var callbackCalls = 0;
|
||||||
function callback() {
|
function callback() {
|
||||||
|
callbackCalls += 1;
|
||||||
throw new Error('Callbackfn should not be evaluated if key is present');
|
throw new Error('Callbackfn should not be evaluated if key is present');
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,3 +36,4 @@ assert.throws(Error, function() {
|
|||||||
map.getOrInsertComputed(4, callback)}
|
map.getOrInsertComputed(4, callback)}
|
||||||
, Error);
|
, Error);
|
||||||
|
|
||||||
|
assert.sameValue(callbackCalls, 1);
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Throws a TypeError if `this` is a Set Object
|
Throws a TypeError if `this` is a Set Object
|
||||||
info: |
|
info: |
|
||||||
@ -13,14 +13,14 @@ info: |
|
|||||||
2. Perform ? RequireInternalSlot(M, [[MapData]])
|
2. Perform ? RequireInternalSlot(M, [[MapData]])
|
||||||
...
|
...
|
||||||
features: [Set, arrow-function, upsert]
|
features: [Set, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
|
var set = new Set();
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
Map.prototype.getOrInsertComputed.call(new Set(), 1, () => 1);
|
Map.prototype.getOrInsertComputed.call(set, 1, () => 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
|
||||||
var map = new Map();
|
var map = new Map();
|
||||||
map.getOrInsertComputed.call(new Set(), 1, () => 1);
|
assert.throws(TypeError, function () {
|
||||||
|
map.getOrInsertComputed.call(set, 1, () => 1);
|
||||||
});
|
});
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Throws a TypeError if `this` is a WeakMap object.
|
Throws a TypeError if `this` is a WeakMap object.
|
||||||
info: |
|
info: |
|
||||||
@ -13,14 +13,14 @@ info: |
|
|||||||
2. Perform ? RequireInternalSlot(M, [[MapData]]).
|
2. Perform ? RequireInternalSlot(M, [[MapData]]).
|
||||||
...
|
...
|
||||||
features: [WeakMap, arrow-function, upsert]
|
features: [WeakMap, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
|
var weakmap = new WeakMap();
|
||||||
assert.throws(TypeError, function() {
|
assert.throws(TypeError, function() {
|
||||||
Map.prototype.getOrInsertComputed.call(new WeakMap(), 1, () => 1);
|
Map.prototype.getOrInsertComputed.call(weakmap, 1, () => 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function() {
|
|
||||||
var map = new Map();
|
var map = new Map();
|
||||||
map.getOrInsertComputed.call(new WeakMap(), 1, () => 1);
|
assert.throws(TypeError, function() {
|
||||||
|
map.getOrInsertComputed.call(weakmap, 1, () => 1);
|
||||||
});
|
});
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Property type and descriptor.
|
Property type and descriptor.
|
||||||
info: |
|
info: |
|
||||||
@ -10,16 +10,9 @@ info: |
|
|||||||
|
|
||||||
17 ECMAScript Standard Built-in Objects
|
17 ECMAScript Standard Built-in Objects
|
||||||
includes: [propertyHelper.js]
|
includes: [propertyHelper.js]
|
||||||
features: [arrow-function, upsert]
|
features: [upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
assert.sameValue(
|
verifyPrimordialCallableProperty(Map.prototype, "getOrInsertComputed", "getOrInsertComputed", 2, {
|
||||||
typeof Map.prototype.getOrInsertComputed,
|
|
||||||
'function',
|
|
||||||
'`typeof Map.prototype.getOrInsertComputed` is `function`'
|
|
||||||
);
|
|
||||||
|
|
||||||
verifyProperty(Map.prototype, "getOrInsertComputed", {
|
|
||||||
value: Map.prototype.getOrInsertComputed,
|
value: Map.prototype.getOrInsertComputed,
|
||||||
writable: true,
|
writable: true,
|
||||||
enumerable: false,
|
enumerable: false,
|
@ -3,7 +3,7 @@
|
|||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Map.prototype.getOrInsertComputed does not implement [[Construct]], is not new-able
|
Map.prototype.getOrInsertComputed does not implement [[Construct]], is not new-able
|
||||||
info: |
|
info: |
|
||||||
@ -20,11 +20,11 @@ info: |
|
|||||||
...
|
...
|
||||||
includes: [isConstructor.js]
|
includes: [isConstructor.js]
|
||||||
features: [Map, Reflect.construct, arrow-function, upsert]
|
features: [Map, Reflect.construct, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
assert.sameValue(isConstructor(Map.prototype.getOrInsertComputed), false, 'isConstructor(Map.prototype.getOrInsertComputed) must return false');
|
assert.sameValue(isConstructor(Map.prototype.getOrInsertComputed), false, 'isConstructor(Map.prototype.getOrInsertComputed) must return false');
|
||||||
|
|
||||||
|
var m = new Map();
|
||||||
assert.throws(TypeError, () => {
|
assert.throws(TypeError, () => {
|
||||||
let m = new Map(); new m.getOrInsertComputed();
|
new m.getOrInsertComputed();
|
||||||
});
|
});
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Throws a TypeError if `callbackfn` is not callable.
|
Throws a TypeError if `callbackfn` is not callable.
|
||||||
info: |
|
info: |
|
||||||
@ -12,39 +12,43 @@ info: |
|
|||||||
3. If IsCallable(callbackfn) is false, throw a TypeError exception.
|
3. If IsCallable(callbackfn) is false, throw a TypeError exception.
|
||||||
...
|
...
|
||||||
features: [Symbol, upsert]
|
features: [Symbol, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var m = new Map();
|
var m = new Map();
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, 1);
|
m.getOrInsertComputed(1, 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, "");
|
m.getOrInsertComputed(1, "");
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, true);
|
m.getOrInsertComputed(1, true);
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, undefined);
|
m.getOrInsertComputed(1, undefined);
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, null);
|
m.getOrInsertComputed(1, null);
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, {});
|
m.getOrInsertComputed(1, {});
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, []);
|
m.getOrInsertComputed(1, []);
|
||||||
});
|
});
|
||||||
|
|
||||||
assert.throws(TypeError, function () {
|
assert.throws(TypeError, function () {
|
||||||
m.getOrInsertComputed.call(m, 1, Symbol());
|
m.getOrInsertComputed(1, Symbol());
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Check that it also throws if the key is already present (thus it does not try to call the callback)
|
||||||
|
m.set(1, "foo");
|
||||||
|
assert.throws(TypeError, function () {
|
||||||
|
m.getOrInsertComputed(1, 1);
|
||||||
|
});
|
@ -1,7 +1,7 @@
|
|||||||
// Copyright (C) 2025 Jonas Haukenes. All rights reserved.
|
// Copyright (C) 2025 Jonas Haukenes. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
If the callbackfn inserts a value on the given key, the value is overwritten.
|
If the callbackfn inserts a value on the given key, the value is overwritten.
|
||||||
info: |
|
info: |
|
||||||
@ -16,7 +16,6 @@ info: |
|
|||||||
8. Let p be the Record { [[Key]]: key, [[Value]]: value }.
|
8. Let p be the Record { [[Key]]: key, [[Value]]: value }.
|
||||||
9. Append p to M.[[WeakMapData]].
|
9. Append p to M.[[WeakMapData]].
|
||||||
...
|
...
|
||||||
flags: [noStrict]
|
|
||||||
features: [upsert]
|
features: [upsert]
|
||||||
---*/
|
---*/
|
||||||
var map = new Map();
|
var map = new Map();
|
@ -2,9 +2,9 @@
|
|||||||
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Returns the value from the specified key on different types, when key not present.
|
Test insertion of value returned from callback with different key types.
|
||||||
info: |
|
info: |
|
||||||
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
||||||
|
|
||||||
@ -14,17 +14,18 @@ info: |
|
|||||||
9. Return p.[[Value]].
|
9. Return p.[[Value]].
|
||||||
...
|
...
|
||||||
features: [Symbol, arrow-function, upsert]
|
features: [Symbol, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var map = new Map();
|
var map = new Map();
|
||||||
|
var item = 'bar';
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 0), 0);
|
||||||
|
|
||||||
assert.sameValue(map.getOrInsertComputed('bar', () => 0), 0);
|
item = 1;
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 42), 42);
|
||||||
|
|
||||||
assert.sameValue(map.getOrInsertComputed(1, () => 42), 42);
|
item = NaN;
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 1), 1);
|
||||||
|
|
||||||
assert.sameValue(map.getOrInsertComputed(NaN, () => 1), 1);
|
item = {};
|
||||||
|
|
||||||
var item = {};
|
|
||||||
assert.sameValue(map.getOrInsertComputed(item, () => 2), 2);
|
assert.sameValue(map.getOrInsertComputed(item, () => 2), 2);
|
||||||
|
|
||||||
item = [];
|
item = [];
|
@ -0,0 +1,50 @@
|
|||||||
|
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
||||||
|
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
||||||
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
|
/*---
|
||||||
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
|
description: |
|
||||||
|
Returns the value set before getOrInsertComputed from the specified key on different types.
|
||||||
|
info: |
|
||||||
|
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
||||||
|
|
||||||
|
...
|
||||||
|
5. For each Record { [[Key]], [[Value]] } p of M.[[MapData]], do
|
||||||
|
a. If p.[[Key]] is not empty and SameValue(p.[[Key]], key) is true, return p.[[Value]].
|
||||||
|
...
|
||||||
|
features: [Symbol, arrow-function, upsert]
|
||||||
|
---*/
|
||||||
|
var map = new Map();
|
||||||
|
|
||||||
|
var item = 'bar';
|
||||||
|
map.set(item, 0);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 1), 0);
|
||||||
|
|
||||||
|
item = 1;
|
||||||
|
map.set(item, 42);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 43), 42);
|
||||||
|
|
||||||
|
item = NaN;
|
||||||
|
map.set(item, 1);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 2), 1);
|
||||||
|
|
||||||
|
item = {};
|
||||||
|
map.set(item, 2);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 3), 2);
|
||||||
|
|
||||||
|
item = [];
|
||||||
|
map.set(item, 3);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 4), 3);
|
||||||
|
|
||||||
|
item = Symbol('item');
|
||||||
|
map.set(item, 4);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 5), 4);
|
||||||
|
|
||||||
|
item = null;
|
||||||
|
map.set(item, 5);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 6), 5);
|
||||||
|
|
||||||
|
item = undefined;
|
||||||
|
map.set(item, 6);
|
||||||
|
assert.sameValue(map.getOrInsertComputed(item, () => 7), 6);
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Returns the value from the specified key normalizing +0 and -0.
|
Returns the value from the specified key normalizing +0 and -0.
|
||||||
info: |
|
info: |
|
||||||
@ -14,7 +14,6 @@ info: |
|
|||||||
...
|
...
|
||||||
|
|
||||||
features: [arrow-function, upsert]
|
features: [arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var map = new Map();
|
var map = new Map();
|
||||||
|
|
@ -2,7 +2,7 @@
|
|||||||
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
// This code is governed by the BSD license found in the LICENSE file.
|
||||||
/*---
|
/*---
|
||||||
esid: proposal-upsert
|
esid: sec-map.prototype.getorinsertcomputed
|
||||||
description: |
|
description: |
|
||||||
Throws a TypeError if `this` is not an Object.
|
Throws a TypeError if `this` is not an Object.
|
||||||
info: |
|
info: |
|
||||||
@ -12,7 +12,6 @@ info: |
|
|||||||
2. Perform ? RequireInternalSlot(M, [[MapData]])
|
2. Perform ? RequireInternalSlot(M, [[MapData]])
|
||||||
...
|
...
|
||||||
features: [Symbol, arrow-function, upsert]
|
features: [Symbol, arrow-function, upsert]
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
---*/
|
||||||
var m = new Map();
|
var m = new Map();
|
||||||
|
|
||||||
@ -40,3 +39,6 @@ assert.throws(TypeError, function () {
|
|||||||
m.getOrInsertComputed.call(Symbol(), 1, () => 1);
|
m.getOrInsertComputed.call(Symbol(), 1, () => 1);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
assert.throws(TypeError, function () {
|
||||||
|
m.getOrInsertComputed.call(1n, 1, () => 1);
|
||||||
|
});
|
@ -1,22 +0,0 @@
|
|||||||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
|
||||||
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
|
||||||
/*---
|
|
||||||
esid: proposal-upsert
|
|
||||||
description: |
|
|
||||||
Map.prototype.getOrInsert.length value and descriptor.
|
|
||||||
info: |
|
|
||||||
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
|
||||||
|
|
||||||
17 ECMAScript Standard Built-in Objects
|
|
||||||
includes: [propertyHelper.js]
|
|
||||||
features: [upsert]
|
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
|
||||||
verifyProperty(Map.prototype.getOrInsertComputed, "length", {
|
|
||||||
value: 2,
|
|
||||||
writable: false,
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true
|
|
||||||
});
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
|||||||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
|
||||||
// Copyright (C) 2024 Jonas Haukenes, Mathias Ness. All rights reserved.
|
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
|
||||||
/*---
|
|
||||||
esid: proposal-upsert
|
|
||||||
description: |
|
|
||||||
Map.prototype.getOrInsertComputed.name value and descriptor.
|
|
||||||
info: |
|
|
||||||
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
|
||||||
|
|
||||||
17 ECMAScript Standard Built-in Objects
|
|
||||||
includes: [propertyHelper.js]
|
|
||||||
features: [upsert]
|
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
|
||||||
verifyProperty(Map.prototype.getOrInsertComputed, "name", {
|
|
||||||
value: "getOrInsertComputed",
|
|
||||||
writable: false,
|
|
||||||
enumerable: false,
|
|
||||||
configurable: true
|
|
||||||
});
|
|
||||||
|
|
@ -1,56 +0,0 @@
|
|||||||
// Copyright (C) 2015 the V8 project authors. All rights reserved.
|
|
||||||
// Copyright (C) 2024 Sune Eriksson Lianes, Mathias Ness. All rights reserved.
|
|
||||||
// This code is governed by the BSD license found in the LICENSE file.
|
|
||||||
/*---
|
|
||||||
esid: proposal-upsert
|
|
||||||
description: |
|
|
||||||
Returns the value set before getOrInsertComputed from the specified key on different types.
|
|
||||||
info: |
|
|
||||||
Map.prototype.getOrInsertComputed ( key , callbackfn )
|
|
||||||
|
|
||||||
...
|
|
||||||
5. For each Record { [[Key]], [[Value]] } p of M.[[MapData]], do
|
|
||||||
a. If p.[[Key]] is not empty and SameValue(p.[[Key]], key) is true, return p.[[Value]].
|
|
||||||
...
|
|
||||||
features: [Symbol, arrow-function, upsert]
|
|
||||||
flags: [noStrict]
|
|
||||||
---*/
|
|
||||||
var map = new Map();
|
|
||||||
|
|
||||||
map.set('bar', 0);
|
|
||||||
assert.sameValue(map.get('bar'), map.getOrInsertComputed('bar', () => 1));
|
|
||||||
assert.sameValue(0, map.getOrInsertComputed('bar', () => 1));
|
|
||||||
|
|
||||||
map.set(1, 42);
|
|
||||||
assert.sameValue(map.get(1), map.getOrInsertComputed(1, () => 43));
|
|
||||||
assert.sameValue(42, map.getOrInsertComputed(1, () => 43));
|
|
||||||
|
|
||||||
map.set(NaN, 1);
|
|
||||||
assert.sameValue(map.get(NaN), map.getOrInsertComputed(NaN, () => 2));
|
|
||||||
assert.sameValue(1, map.getOrInsertComputed(NaN, () => 2));
|
|
||||||
|
|
||||||
var item = {};
|
|
||||||
map.set(item, 2);
|
|
||||||
assert.sameValue(map.get(item), map.getOrInsertComputed(item, () => 3));
|
|
||||||
assert.sameValue(2, map.getOrInsertComputed(item, () => 3));
|
|
||||||
|
|
||||||
item = [];
|
|
||||||
map.set(item, 3);
|
|
||||||
assert.sameValue(map.get(item), map.getOrInsertComputed(item, () => 4));
|
|
||||||
assert.sameValue(3, map.getOrInsertComputed(item, () => 4));
|
|
||||||
|
|
||||||
item = Symbol('item');
|
|
||||||
map.set(item, 4);
|
|
||||||
assert.sameValue(map.get(item), map.getOrInsertComputed(item, () => 5));
|
|
||||||
assert.sameValue(4, map.getOrInsertComputed(item, () => 5));
|
|
||||||
|
|
||||||
item = null;
|
|
||||||
map.set(item, 5);
|
|
||||||
assert.sameValue(map.get(item), map.getOrInsertComputed(item, () => 6));
|
|
||||||
assert.sameValue(5, map.getOrInsertComputed(item, () => 6));
|
|
||||||
|
|
||||||
item = undefined;
|
|
||||||
map.set(item, 6);
|
|
||||||
assert.sameValue(map.get(item), map.getOrInsertComputed(item, () => 7));
|
|
||||||
assert.sameValue(6, map.getOrInsertComputed(item, () => 7));
|
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user