source: frontend/node_modules/es-iterator-helpers/test/Iterator.from.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 9.1 KB
Line 
1'use strict';
2
3var defineProperties = require('define-properties');
4var test = require('tape');
5var callBind = require('call-bind');
6var functionsHaveNames = require('functions-have-names')();
7var hasProto = require('has-proto')();
8var forEach = require('for-each');
9var debug = require('object-inspect');
10var v = require('es-value-fixtures');
11var hasSymbols = require('has-symbols/shams')();
12var hasPropertyDescriptors = require('has-property-descriptors')();
13var mockProperty = require('mock-property');
14
15var index = require('../Iterator.from');
16var impl = require('../Iterator.from/implementation');
17
18var isEnumerable = Object.prototype.propertyIsEnumerable;
19
20var testIterator = require('./helpers/testIterator');
21
22var $Iterator = require('../Iterator/implementation');
23var iterProto = require('iterator.prototype');
24
25var getCodePoints = function getCodePoints(str) {
26 var chars = [];
27 for (var i = 0; i < str.length; i++) {
28 var c1 = str.charCodeAt(i);
29 if (c1 >= 0xD800 && c1 < 0xDC00 && i + 1 < str.length) {
30 var c2 = str.charCodeAt(i + 1);
31 if (c2 >= 0xDC00 && c2 < 0xE000) {
32 chars.push(str.charAt(i) + str.charAt(i + 1));
33 i += 1;
34 continue; // eslint-disable-line no-continue, no-restricted-syntax
35 }
36 }
37 chars.push(str.charAt(i));
38 }
39 return chars;
40};
41
42module.exports = {
43 tests: function (from, name, t) {
44 t['throws'](
45 function () { return new from(); }, // eslint-disable-line new-cap
46 TypeError,
47 '`' + name + '` itself is not a constructor'
48 );
49 t['throws'](
50 function () { return new from({}); }, // eslint-disable-line new-cap
51 TypeError,
52 '`' + name + '` itself is not a constructor, with an argument'
53 );
54
55 forEach(v.primitives.concat(v.objects), function (nonIterator) {
56 if (typeof nonIterator !== 'string') {
57 t['throws'](
58 function () { from(nonIterator).next(); },
59 TypeError,
60 debug(nonIterator) + ' is not an iterable Object'
61 );
62 }
63 });
64
65 t.test('actual iteration', { skip: !hasSymbols }, function (st) {
66 forEach(v.nonFunctions, function (nonFunction) {
67 var badIterable = {};
68 badIterable[Symbol.iterator] = nonFunction;
69 st['throws'](
70 function () { from(badIterable).next(); },
71 TypeError,
72 debug(badIterable) + ' is not a function'
73 );
74 });
75
76 // st['throws'](
77 // function () { return new from([]); }, // eslint-disable-line new-cap
78 // RangeError,
79 // '`' + name + '` iterator is not a constructor'
80 // );
81
82 forEach(v.strings, function (string) {
83 var stringIt = from(string);
84 testIterator(stringIt, getCodePoints(string), st, 'string iterator: ' + debug(string));
85 });
86
87 var arrayIt = from([1, 2, 3]);
88 st.equal(typeof arrayIt.next, 'function', 'has a `next` function');
89
90 st.test('__proto__ is Iterator.prototype', { skip: !hasProto }, function (s2t) {
91 var fakeIterator = {
92 __proto__: iterProto,
93 next: function () {}
94 };
95 s2t.ok(fakeIterator instanceof $Iterator, 'is an instanceof Iterator');
96 s2t.equal(typeof fakeIterator.next, 'function', 'fake iterator `.next` is a function');
97 s2t.equal(from(fakeIterator), fakeIterator, 'returns input when it is an instanceof Iterator');
98
99 s2t.end();
100 });
101
102 st.test('real iterators', { skip: !hasSymbols }, function (s2t) {
103 var iter = [][Symbol.iterator]();
104 // eslint-disable-next-line no-proto
105 var arrayIterHasIterProto = hasProto && iter.__proto__.__proto__ !== Object.prototype;
106 s2t.equal(
107 from(iter),
108 iter,
109 'array iterator becomes itself',
110 { skip: !arrayIterHasIterProto && 'node 0.12 - 3 do not have Iterator.prototype in the proto chains' }
111 );
112
113 s2t.end();
114 });
115
116 st.test('observability in a replaced String iterator', function (s2t) {
117 var originalStringIterator = String.prototype[Symbol.iterator];
118 var observedType;
119 s2t.teardown(mockProperty(String.prototype, Symbol.iterator, {
120 get: function () {
121 'use strict'; // eslint-disable-line strict, lines-around-directive
122
123 observedType = typeof this;
124 return originalStringIterator;
125 }
126 }));
127
128 from('');
129 s2t.equal(observedType, 'string', 'string primitive -> primitive receiver in Symbol.iterator getter');
130 from(Object(''));
131 s2t.equal(observedType, 'object', 'boxed string -> boxed string in Symbol.iterator getter');
132
133 s2t.end();
134 });
135
136 st.test('262: get-next-method-only-once', { skip: !hasPropertyDescriptors }, function (s2t) {
137 var nextGets = 0;
138 var testIter = {
139 next: function () {
140 return { done: true, value: undefined };
141 }
142 };
143 Object.defineProperty(testIter, 'next', {
144 get: function () {
145 nextGets += 1;
146 return function () {
147 return { done: true, value: undefined };
148 };
149 }
150 });
151
152 var iter = from(testIter);
153 s2t.equal(nextGets, 1, 'next retrieved once on creation');
154 iter.next();
155 s2t.equal(nextGets, 1, 'next not retrieved again on next()');
156 iter.next();
157 s2t.equal(nextGets, 1, 'next still not retrieved again');
158
159 s2t.end();
160 });
161
162 st.test('262: get-next-method-throws', { skip: !hasPropertyDescriptors }, function (s2t) {
163 var testIter = {};
164 Object.defineProperty(testIter, 'next', {
165 get: function () {
166 throw new EvalError('next getter threw');
167 }
168 });
169
170 s2t['throws'](
171 function () { from(testIter); },
172 EvalError,
173 'throws when getting next throws'
174 );
175
176 s2t.end();
177 });
178
179 st.test('262: iterable-to-iterator-fallback', function (s2t) {
180 // When Symbol.iterator is null/undefined, treat object as iterator
181 var iteratorObj = {
182 next: function () {
183 return { done: true, value: undefined };
184 }
185 };
186 iteratorObj[Symbol.iterator] = null;
187 var iter1 = from(iteratorObj);
188 s2t.equal(typeof iter1.next, 'function', 'iterator with null Symbol.iterator is treated as iterator');
189
190 var iteratorObj2 = {
191 next: function () {
192 return { done: true, value: undefined };
193 }
194 };
195 iteratorObj2[Symbol.iterator] = undefined;
196 var iter2 = from(iteratorObj2);
197 s2t.equal(typeof iter2.next, 'function', 'iterator with undefined Symbol.iterator is treated as iterator');
198
199 s2t.end();
200 });
201
202 st.test('262: return-is-forwarded', function (s2t) {
203 var returnCalls = 0;
204 var testIter = {
205 next: function () {
206 return { done: false, value: 1 };
207 },
208 'return': function () {
209 returnCalls += 1;
210 return { done: true, value: undefined };
211 }
212 };
213
214 var iter = from(testIter);
215 iter.next();
216 s2t.equal(returnCalls, 0, 'return not called before calling return()');
217 iter['return']();
218 s2t.equal(returnCalls, 1, 'return called once after return()');
219
220 s2t.end();
221 });
222
223 st.test('262: return-method-returns-iterator-result', function (s2t) {
224 // When base iterator has no return method, wrapper's return() returns { done: true, value: undefined }
225 var testIter = {
226 next: function () {
227 return { done: false, value: 1 };
228 }
229 };
230
231 var iter = from(testIter);
232 iter.next();
233 var result = iter['return']();
234 s2t.equal(result.done, true, 'done is true');
235 s2t.equal(result.value, undefined, 'value is undefined');
236
237 s2t.end();
238 });
239
240 st.test('262: get-return-method-throws', { skip: !hasPropertyDescriptors }, function (s2t) {
241 var testIter = {
242 next: function () {
243 return { done: false, value: 1 };
244 }
245 };
246 Object.defineProperty(testIter, 'return', {
247 get: function () {
248 throw new SyntaxError('return getter threw');
249 }
250 });
251
252 var iter = from(testIter);
253 iter.next();
254 s2t['throws'](
255 function () { iter['return'](); },
256 SyntaxError,
257 'throws when getting return throws'
258 );
259
260 s2t.end();
261 });
262
263 st.test('262: supports-iterator', function (s2t) {
264 // Non-iterable iterator objects (no Symbol.iterator, but has next)
265 var plainIterator = {
266 next: function () {
267 return { done: true, value: 42 };
268 }
269 };
270
271 var iter = from(plainIterator);
272 s2t.equal(typeof iter.next, 'function', 'wrapped iterator has next method');
273 var result = iter.next();
274 s2t.equal(result.done, true, 'done is true');
275 s2t.equal(result.value, 42, 'value is passed through');
276
277 s2t.end();
278 });
279
280 st.test('262: supports-iterable', function (s2t) {
281 // Iterable objects work
282 var arr = [1, 2, 3];
283 testIterator(from(arr), [1, 2, 3], s2t, 'array iterable');
284
285 s2t.end();
286 });
287
288 st.end();
289 });
290 },
291 index: function () {
292 test('Iterator.from: index', function (t) {
293 module.exports.tests(index, 'Iterator.from', t);
294
295 t.end();
296 });
297 },
298 implementation: function () {
299 test('Iterator.from: implementation', function (t) {
300 module.exports.tests(impl, 'Iterator.from', t);
301
302 t.end();
303 });
304 },
305 shimmed: function () {
306 test('Iterator.from: shimmed', function (t) {
307 t.test('Function name', { skip: !functionsHaveNames }, function (st) {
308 st.equal(Iterator.from.name, 'from', 'Iterator.from has name "from"');
309 st.end();
310 });
311
312 t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
313 et.equal(false, isEnumerable.call(Iterator, 'from'), 'Iterator.from is not enumerable');
314 et.end();
315 });
316
317 module.exports.tests(callBind(Iterator.from, Iterator), 'Iterator.from', t);
318
319 t.end();
320 });
321 }
322};
Note: See TracBrowser for help on using the repository browser.