mirror of
https://github.com/hanzoai/core-js.git
synced 2026-09-24 16:58:15 +00:00
89 lines
2.8 KiB
JavaScript
89 lines
2.8 KiB
JavaScript
import { createIterable, createSetLike } from '../helpers/helpers.js';
|
|
|
|
QUnit.test('Set#difference', assert => {
|
|
const { difference } = Set.prototype;
|
|
const { from } = Array;
|
|
|
|
assert.isFunction(difference);
|
|
assert.arity(difference, 1);
|
|
assert.name(difference, 'difference');
|
|
assert.looksNative(difference);
|
|
assert.nonEnumerable(Set.prototype, 'difference');
|
|
|
|
const set = new Set([1]);
|
|
assert.notSame(set.difference(new Set()), set);
|
|
|
|
assert.deepEqual(from(new Set([1, 2, 3]).difference(new Set([4, 5]))), [1, 2, 3]);
|
|
assert.deepEqual(from(new Set([1, 2, 3]).difference(new Set([3, 4]))), [1, 2]);
|
|
assert.deepEqual(from(new Set([1, 2, 3]).difference(createSetLike([4, 5]))), [1, 2, 3]);
|
|
assert.deepEqual(from(new Set([1, 2, 3]).difference(createSetLike([3, 4]))), [1, 2]);
|
|
|
|
// TODO: drop from core-js@4
|
|
assert.deepEqual(from(new Set([1, 2, 3]).difference([4, 5])), [1, 2, 3]);
|
|
assert.deepEqual(from(new Set([1, 2, 3]).difference([3, 4])), [1, 2]);
|
|
assert.deepEqual(from(new Set([1, 2, 3]).difference(createIterable([3, 4]))), [1, 2]);
|
|
|
|
assert.same(new Set([42, 43]).difference({
|
|
size: Infinity,
|
|
has() {
|
|
return true;
|
|
},
|
|
keys() {
|
|
throw new Error('Unexpected call to |keys| method');
|
|
},
|
|
}).size, 0);
|
|
|
|
assert.throws(() => new Set().difference({
|
|
size: -Infinity,
|
|
has() {
|
|
return true;
|
|
},
|
|
keys() {
|
|
throw new Error('Unexpected call to |keys| method');
|
|
},
|
|
}));
|
|
|
|
assert.throws(() => new Set([1, 2, 3]).difference(), TypeError);
|
|
|
|
assert.throws(() => difference.call({}, [1, 2, 3]), TypeError);
|
|
assert.throws(() => difference.call(undefined, [1, 2, 3]), TypeError);
|
|
assert.throws(() => difference.call(null, [1, 2, 3]), TypeError);
|
|
|
|
// A WebKit bug occurs when `this` is updated while Set.prototype.difference is being executed
|
|
// https://bugs.webkit.org/show_bug.cgi?id=288595
|
|
const values = [2];
|
|
const setLike = {
|
|
size: values.length,
|
|
has() { return true; },
|
|
keys() {
|
|
let index = 0;
|
|
return {
|
|
next() {
|
|
const done = index >= values.length;
|
|
if (baseSet.has(1)) baseSet.clear();
|
|
return { done, value: values[index++] };
|
|
},
|
|
};
|
|
},
|
|
};
|
|
|
|
const baseSet = new Set([1, 2, 3, 4]);
|
|
const result = baseSet.difference(setLike);
|
|
assert.deepEqual(from(result), [1, 3, 4], 'incorrect behavior when this updated while Set#difference is being executed');
|
|
|
|
// Mutation via has() in the size(O) <= otherRec.size branch should not skip elements
|
|
const mutatingSet = new Set([1, 2, 3]);
|
|
const mutatingResult = mutatingSet.difference({
|
|
size: 10,
|
|
has(v) {
|
|
if (v === 1) {
|
|
mutatingSet.delete(2);
|
|
return true;
|
|
}
|
|
return false;
|
|
},
|
|
keys() { return { next() { return { done: true }; } }; },
|
|
});
|
|
assert.deepEqual(from(mutatingResult), [2, 3], 'iterates copy, not live set in has() branch');
|
|
});
|