MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1import { test, summary } from './helpers.js';
2
3console.log('Set Tests\n');
4
5const set = new Set();
6
7set.add('value1');
8set.add('value2');
9set.add(42);
10set.add(true);
11
12test('set size after add', set.size, 4);
13test('set has string', set.has('value1'), true);
14test('set has number', set.has(42), true);
15test('set has boolean', set.has(true), true);
16test('set has missing', set.has('missing'), false);
17
18test('set delete returns true', set.delete('value2'), true);
19test('set has after delete', set.has('value2'), false);
20test('set size after delete', set.size, 3);
21
22set.add('value1');
23test('set size after duplicate', set.size, 3);
24
25set.add(123);
26set.add(null);
27
28test('set has 123', set.has(123), true);
29test('set has null', set.has(null), true);
30test('set size after more adds', set.size, 5);
31
32set.clear();
33test('set size after clear', set.size, 0);
34test('set has after clear', set.has('value1'), false);
35
36set.add('a').add('b').add('c');
37test('set chaining size', set.size, 3);
38test('set chaining has a', set.has('a'), true);
39test('set chaining has b', set.has('b'), true);
40test('set chaining has c', set.has('c'), true);
41
42test('set delete nonexistent', set.delete('nonexistent'), false);
43
44const setLike = {
45 size: 2,
46 has(value) {
47 return value === 2 || value === 3;
48 },
49 keys() {
50 return [2, 3][Symbol.iterator]();
51 }
52};
53
54test('set union accepts set-like object', [...new Set([1, 2]).union(setLike)].join(','), '1,2,3');
55test('set intersection accepts set-like object', [...new Set([1, 2]).intersection(setLike)].join(','), '2');
56test('set difference accepts set-like object', [...new Set([1, 2]).difference(setLike)].join(','), '1');
57test('set isSubsetOf accepts set-like object', new Set([2]).isSubsetOf(setLike), true);
58
59const duplicateKeysSetLike = {
60 size: 3,
61 has(value) {
62 return value === 2 || value === 3;
63 },
64 keys() {
65 return [2, 3, 3][Symbol.iterator]();
66 }
67};
68
69test('set symmetricDifference ignores duplicate set-like keys', [...new Set([1, 2]).symmetricDifference(duplicateKeysSetLike)].join(','), '1,3');
70
71const directIteratorSetLike = {
72 size: 2,
73 has(value) {
74 return value === 2 || value === 4;
75 },
76 keys() {
77 const values = [2, 4];
78 let index = 0;
79 return {
80 next() {
81 return index < values.length ? { value: values[index++], done: false } : { done: true };
82 }
83 };
84 }
85};
86
87test('set union accepts direct keys iterator', [...new Set([1, 2]).union(directIteratorSetLike)].join(','), '1,2,4');
88
89let closedKeysIterator = false;
90const nonSubsetSetLike = {
91 size: 1,
92 has() {
93 return false;
94 },
95 keys() {
96 return {
97 next() {
98 return { value: 2, done: false };
99 },
100 return() {
101 closedKeysIterator = true;
102 return {};
103 }
104 };
105 }
106};
107
108test('set isSupersetOf closes keys iterator on early false', new Set([1]).isSupersetOf(nonSubsetSetLike), false);
109test('set isSupersetOf called keys iterator return', closedKeysIterator, true);
110
111const getSetRecordOrder = [];
112try {
113 new Set().union({
114 get size() {
115 getSetRecordOrder.push('size');
116 return NaN;
117 },
118 get has() {
119 getSetRecordOrder.push('has');
120 return () => true;
121 },
122 keys() {
123 return [][Symbol.iterator]();
124 }
125 });
126} catch (e) {}
127
128test('set GetSetRecord rejects NaN size before reading has', getSetRecordOrder.join(','), 'size');
129
130summary();