errors-iterabletolist-failures.js (3758B)
1 // Copyright (C) 2019 Leo Balter. All rights reserved. 2 // This code is governed by the BSD license found in the LICENSE file. 3 4 /*--- 5 esid: sec-aggregate-error 6 description: > 7 Return abrupt completion from IterableToList(errors) 8 info: | 9 AggregateError ( errors, message ) 10 11 ... 12 3. Let errorsList be ? IterableToList(errors). 13 4. Set O.[[AggregateErrors]] to errorsList. 14 ... 15 6. Return O. 16 17 Runtime Semantics: IterableToList ( items [ , method ] ) 18 19 1. If method is present, then 20 ... 21 2. Else, 22 b. Let iteratorRecord be ? GetIterator(items, sync). 23 3. Let values be a new empty List. 24 4. Let next be true. 25 5. Repeat, while next is not false 26 a. Set next to ? IteratorStep(iteratorRecord). 27 b. If next is not false, then 28 i. Let nextValue be ? IteratorValue(next). 29 ii. Append nextValue to the end of the List values. 30 6. Return values. 31 32 GetIterator ( obj [ , hint [ , method ] ] ) 33 34 ... 35 3. If method is not present, then 36 a. If hint is async, then 37 ... 38 b. Otherwise, set method to ? GetMethod(obj, @@iterator). 39 4. Let iterator be ? Call(method, obj). 40 5. If Type(iterator) is not Object, throw a TypeError exception. 41 6. Let nextMethod be ? GetV(iterator, "next"). 42 ... 43 8. Return iteratorRecord. 44 features: [AggregateError, Symbol.iterator] 45 ---*/ 46 47 var case1 = { 48 get [Symbol.iterator]() { 49 throw new Test262Error(); 50 } 51 }; 52 53 assert.throws(Test262Error, () => { 54 var obj = new AggregateError(case1); 55 }, 'get Symbol.iterator'); 56 57 var case2 = { 58 get [Symbol.iterator]() { 59 return {}; 60 } 61 }; 62 63 assert.throws(TypeError, () => { 64 var obj = new AggregateError(case2); 65 }, 'GetMethod(obj, @@iterator) abrupts from non callable'); 66 67 var case3 = { 68 [Symbol.iterator]() { 69 throw new Test262Error(); 70 } 71 }; 72 73 assert.throws(Test262Error, () => { 74 var obj = new AggregateError(case3); 75 }, 'Abrupt from @@iterator call'); 76 77 var case4 = { 78 [Symbol.iterator]() { 79 return 'a string'; 80 } 81 }; 82 83 assert.throws(TypeError, () => { 84 var obj = new AggregateError(case4); 85 }, '@@iterator call returns a string'); 86 87 var case5 = { 88 [Symbol.iterator]() { 89 return undefined; 90 } 91 }; 92 93 assert.throws(TypeError, () => { 94 var obj = new AggregateError(case5); 95 }, '@@iterator call returns undefined'); 96 97 var case6 = { 98 [Symbol.iterator]() { 99 return { 100 get next() { 101 throw new Test262Error(); 102 } 103 } 104 } 105 }; 106 107 assert.throws(Test262Error, () => { 108 var obj = new AggregateError(case6); 109 }, 'GetV(iterator, next) returns abrupt'); 110 111 var case7 = { 112 [Symbol.iterator]() { 113 return { 114 get next() { 115 return {}; 116 } 117 } 118 } 119 }; 120 121 assert.throws(TypeError, () => { 122 var obj = new AggregateError(case7); 123 }, 'GetV(iterator, next) returns a non callable'); 124 125 var case8 = { 126 [Symbol.iterator]() { 127 return { 128 next() { 129 throw new Test262Error(); 130 } 131 } 132 } 133 }; 134 135 assert.throws(Test262Error, () => { 136 var obj = new AggregateError(case8); 137 }, 'abrupt from iterator.next()'); 138 139 var case9 = { 140 [Symbol.iterator]() { 141 return { 142 next() { 143 return undefined; 144 } 145 } 146 } 147 }; 148 149 assert.throws(TypeError, () => { 150 var obj = new AggregateError(case9); 151 }, 'iterator.next() returns undefined'); 152 153 var case10 = { 154 [Symbol.iterator]() { 155 return { 156 next() { 157 return 'a string'; 158 } 159 } 160 } 161 }; 162 163 assert.throws(TypeError, () => { 164 var obj = new AggregateError(case10); 165 }, 'iterator.next() returns a string'); 166 167 var case11 = { 168 [Symbol.iterator]() { 169 return { 170 next() { 171 return { 172 get done() { 173 throw new Test262Error(); 174 } 175 }; 176 } 177 } 178 } 179 }; 180 181 assert.throws(Test262Error, () => { 182 var obj = new AggregateError(case11); 183 }, 'IteratorCompete abrupts getting the done property'); 184 185 reportCompare(0, 0);