MIRROR: javascript for 馃悳's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at master 130 lines 3.4 kB view raw
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();