| // Copyright (C) 2021 Rick Waldron. All rights reserved. |
| // This code is governed by the BSD license found in the LICENSE file. |
| /*--- |
| esid: sec-set.prototype.add |
| description: Observing the expected behavior of valid values |
| info: | |
| Set.prototype.add ( value ) |
| |
| ... |
| For each element e of entries, do |
| If e is not empty and SameValueZero(e, value) is true, then |
| Return S. |
| If value is -0, set value to +0. |
| Append value as the last element of entries. |
| ... |
| |
| features: [BigInt, Symbol, TypedArray, WeakRef] |
| ---*/ |
| |
| |
| const negativeZero = -0; |
| const positiveZero = +0; |
| const zero = 0; |
| const one = 1; |
| const twoRaisedToFiftyThreeMinusOne = 2 ** 53 - 1; |
| const int32Array = new Int32Array([zero, one]); |
| const uint32Array = new Uint32Array([zero, one]); |
| const n = 100000000000000000000000000000000000000000000000000000000000000000000000000000000001n; |
| const bigInt = BigInt('100000000000000000000000000000000000000000000000000000000000000000000000000000000001'); |
| const n1 = 1n; |
| const n53 = 9007199254740991n; |
| const fiftyThree = BigInt('9007199254740991'); |
| const bigInt64Array = new BigInt64Array([n1, n53]); |
| const bigUint64Array = new BigUint64Array([n1, n53]); |
| const symbol = Symbol(''); |
| const object = {}; |
| const array = {}; |
| const string = ''; |
| const booleanTrue = true; |
| const booleanFalse = true; |
| const functionExprValue = function() {}; |
| const arrowFunctionValue = () => {}; |
| const classValue = class {}; |
| const map = new Map(); |
| const set = new Set(); |
| const weakMap = new WeakMap(); |
| const weakRef = new WeakRef({}); |
| const weakSet = new WeakSet(); |
| const nullValue = null; |
| const undefinedValue = undefined; |
| let unassigned; |
| |
| { |
| const s = new Set([negativeZero, negativeZero]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(negativeZero), true); |
| s.delete(negativeZero); |
| assert.sameValue(s.size, 0); |
| s.add(negativeZero); |
| assert.sameValue(s.has(negativeZero), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([positiveZero, positiveZero]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(positiveZero), true); |
| s.delete(positiveZero); |
| assert.sameValue(s.size, 0); |
| s.add(positiveZero); |
| assert.sameValue(s.has(positiveZero), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([zero, zero]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(zero), true); |
| s.delete(zero); |
| assert.sameValue(s.size, 0); |
| s.add(zero); |
| assert.sameValue(s.has(zero), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([one, one]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(one), true); |
| s.delete(one); |
| assert.sameValue(s.size, 0); |
| s.add(one); |
| assert.sameValue(s.has(one), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([twoRaisedToFiftyThreeMinusOne, twoRaisedToFiftyThreeMinusOne]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(twoRaisedToFiftyThreeMinusOne), true); |
| s.delete(twoRaisedToFiftyThreeMinusOne); |
| assert.sameValue(s.size, 0); |
| s.add(twoRaisedToFiftyThreeMinusOne); assert.sameValue(s.has(twoRaisedToFiftyThreeMinusOne), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([int32Array, int32Array]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(int32Array), true); |
| s.delete(int32Array); |
| assert.sameValue(s.size, 0); |
| s.add(int32Array); |
| assert.sameValue(s.has(int32Array), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([uint32Array, uint32Array]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(uint32Array), true); |
| s.delete(uint32Array); |
| assert.sameValue(s.size, 0); |
| s.add(uint32Array); |
| assert.sameValue(s.has(uint32Array), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([n, n]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(n), true); |
| s.delete(n); |
| assert.sameValue(s.size, 0); |
| s.add(n); |
| assert.sameValue(s.has(n), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([bigInt, bigInt]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(bigInt), true); |
| s.delete(bigInt); |
| assert.sameValue(s.size, 0); |
| s.add(bigInt); |
| assert.sameValue(s.has(bigInt), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([n1, n1]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(n1), true); |
| s.delete(n1); |
| assert.sameValue(s.size, 0); |
| s.add(n1); |
| assert.sameValue(s.has(n1), true); |
| } |
| { const s = new Set([n53, n53]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(n53), true); |
| s.delete(n53); |
| assert.sameValue(s.size, 0); |
| s.add(n53); |
| assert.sameValue(s.has(n53), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([fiftyThree, fiftyThree]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(fiftyThree), true); |
| s.delete(fiftyThree); |
| assert.sameValue(s.size, 0); |
| s.add(fiftyThree); |
| assert.sameValue(s.has(fiftyThree), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([bigInt64Array, bigInt64Array]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(bigInt64Array), true); |
| s.delete(bigInt64Array); |
| assert.sameValue(s.size, 0); |
| s.add(bigInt64Array); |
| assert.sameValue(s.has(bigInt64Array), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([bigUint64Array, bigUint64Array]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(bigUint64Array), true); |
| s.delete(bigUint64Array); |
| assert.sameValue(s.size, 0); |
| s.add(bigUint64Array); |
| assert.sameValue(s.has(bigUint64Array), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([symbol, symbol]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(symbol), true); |
| s.delete(symbol); |
| assert.sameValue(s.size, 0); |
| s.add(symbol); |
| assert.sameValue(s.has(symbol), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([object, object]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(object), true); |
| s.delete(object); |
| assert.sameValue(s.size, 0); |
| s.add(object); |
| assert.sameValue(s.has(object), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([array, array]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(array), true); |
| s.delete(array); |
| assert.sameValue(s.size, 0); |
| s.add(array); |
| assert.sameValue(s.has(array), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([string, string]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(string), true); |
| s.delete(string); |
| assert.sameValue(s.size, 0); |
| s.add(string); |
| assert.sameValue(s.has(string), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([booleanTrue, booleanTrue]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(booleanTrue), true); |
| s.delete(booleanTrue); |
| assert.sameValue(s.size, 0); |
| s.add(booleanTrue); |
| assert.sameValue(s.has(booleanTrue), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([booleanFalse, booleanFalse]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(booleanFalse), true); |
| s.delete(booleanFalse); |
| assert.sameValue(s.size, 0); |
| s.add(booleanFalse); |
| assert.sameValue(s.has(booleanFalse), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([functionExprValue, functionExprValue]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(functionExprValue), true); |
| s.delete(functionExprValue); |
| assert.sameValue(s.size, 0); |
| s.add(functionExprValue); assert.sameValue(s.has(functionExprValue), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([arrowFunctionValue, arrowFunctionValue]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(arrowFunctionValue), true); |
| s.delete(arrowFunctionValue); |
| assert.sameValue(s.size, 0); |
| s.add(arrowFunctionValue); assert.sameValue(s.has(arrowFunctionValue), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([classValue, classValue]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(classValue), true); |
| s.delete(classValue); |
| assert.sameValue(s.size, 0); |
| s.add(classValue); |
| assert.sameValue(s.has(classValue), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([map, map]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(map), true); |
| s.delete(map); |
| assert.sameValue(s.size, 0); |
| s.add(map); |
| assert.sameValue(s.has(map), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([set, set]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(set), true); |
| s.delete(set); |
| assert.sameValue(s.size, 0); |
| s.add(set); |
| assert.sameValue(s.has(set), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([weakMap, weakMap]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(weakMap), true); |
| s.delete(weakMap); |
| assert.sameValue(s.size, 0); |
| s.add(weakMap); |
| assert.sameValue(s.has(weakMap), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([weakRef, weakRef]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(weakRef), true); |
| s.delete(weakRef); |
| assert.sameValue(s.size, 0); |
| s.add(weakRef); |
| assert.sameValue(s.has(weakRef), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([weakSet, weakSet]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(weakSet), true); |
| s.delete(weakSet); |
| assert.sameValue(s.size, 0); |
| s.add(weakSet); |
| assert.sameValue(s.has(weakSet), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([nullValue, nullValue]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(nullValue), true); |
| s.delete(nullValue); |
| assert.sameValue(s.size, 0); |
| s.add(nullValue); |
| assert.sameValue(s.has(nullValue), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([undefinedValue, undefinedValue]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(undefinedValue), true); |
| s.delete(undefinedValue); |
| assert.sameValue(s.size, 0); |
| s.add(undefinedValue); |
| assert.sameValue(s.has(undefinedValue), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |
| { |
| const s = new Set([unassigned, unassigned]); |
| assert.sameValue(s.size, 1); |
| assert.sameValue(s.has(unassigned), true); |
| s.delete(unassigned); |
| assert.sameValue(s.size, 0); |
| s.add(unassigned); |
| assert.sameValue(s.has(unassigned), true); |
| assert.sameValue(s.size, 1); |
| }; |
| |