source: frontend/node_modules/es-iterator-helpers/test/Iterator.concat.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: 18.3 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 forEach = require('for-each');
8var debug = require('object-inspect');
9var v = require('es-value-fixtures');
10var hasSymbols = require('has-symbols/shams')();
11var mockProperty = require('mock-property');
12var hasPropertyDescriptors = require('has-property-descriptors')();
13
14var index = require('../Iterator.concat');
15var impl = require('../Iterator.concat/implementation');
16var from = require('../Iterator.from/polyfill')();
17
18var isEnumerable = Object.prototype.propertyIsEnumerable;
19
20var testIterator = require('./helpers/testIterator');
21
22module.exports = {
23 tests: function (concat, name, t) {
24 t['throws'](
25 function () { return new concat(); }, // eslint-disable-line new-cap
26 TypeError,
27 '`' + name + '` itself is not a constructor'
28 );
29 t['throws'](
30 function () { return new concat({}); }, // eslint-disable-line new-cap
31 TypeError,
32 '`' + name + '` itself is not a constructor, with an argument'
33 );
34
35 forEach(v.primitives.concat(v.objects), function (nonIterator) {
36 t['throws'](
37 function () { concat(nonIterator); },
38 TypeError,
39 debug(nonIterator) + ' is not an iterable Object'
40 );
41 });
42
43 t.deepEqual(concat().next(), { value: undefined, done: true }, 'no arguments -> empty iterator');
44
45 t.test('actual iteration', { skip: !hasSymbols }, function (st) {
46 forEach(v.nonFunctions, function (nonFunction) {
47 var badIterable = {};
48 badIterable[Symbol.iterator] = nonFunction;
49 st['throws'](
50 function () { concat([], badIterable, []); },
51 TypeError,
52 debug(badIterable) + '[Symbol.iterator] is not a function'
53 );
54 });
55
56 forEach(v.primitives, function (nonObject) {
57 var badIterable = {};
58 badIterable[Symbol.iterator] = function () { return nonObject; };
59 st['throws'](
60 function () { concat([], badIterable, []).next(); },
61 TypeError,
62 debug(badIterable) + '[Symbol.iterator] does not return an object'
63 );
64 });
65
66 forEach(v.strings, function (string) {
67 st['throws'](
68 function () { concat(string); },
69 TypeError,
70 'non-objects are not considered iterable'
71 );
72 var stringIt = concat(['a'], [string], ['c']);
73 testIterator(stringIt, ['a', string, 'c'], st, 'string iterator: ' + debug(string));
74 });
75
76 var arrayIt = concat([1, 2, 3]);
77 st.equal(typeof arrayIt.next, 'function', 'has a `next` function');
78
79 st.test('real iterators', { skip: !hasSymbols }, function (s2t) {
80 var iter = [1, 2][Symbol.iterator]();
81 testIterator(concat(iter, [3]), [1, 2, 3], s2t, 'array iterator + array yields combined results');
82
83 s2t.end();
84 });
85
86 st.test('observability in a replaced String iterator', function (s2t) {
87 var originalStringIterator = String.prototype[Symbol.iterator];
88 var observedType;
89 s2t.teardown(mockProperty(String.prototype, Symbol.iterator, {
90 get: function () {
91 'use strict'; // eslint-disable-line strict, lines-around-directive
92
93 observedType = typeof this;
94 return originalStringIterator;
95 }
96 }));
97
98 concat(from(''));
99 s2t.equal(observedType, 'string', 'string primitive -> primitive receiver in Symbol.iterator getter');
100 concat(from(Object('')));
101 s2t.equal(observedType, 'object', 'boxed string -> boxed string in Symbol.iterator getter');
102
103 s2t.end();
104 });
105
106 st.test('test262: test/built-ins/Iterator/concat/arguments-checked-in-order', { skip: !hasPropertyDescriptors }, function (s2t) {
107 var getIterator = 0;
108
109 var iterable1 = {};
110 Object.defineProperty(iterable1, Symbol.iterator, {
111 get: function () {
112 getIterator += 1;
113 return function () {
114 throw new EvalError();
115 };
116 }
117 });
118
119 var iterable2 = {};
120 Object.defineProperty(iterable2, Symbol.iterator, {
121 get: function () {
122 throw new EvalError();
123 }
124 });
125
126 s2t.equal(getIterator, 0);
127
128 s2t['throws'](function () { concat(iterable1, null, iterable2); }, TypeError);
129
130 s2t.equal(getIterator, 1);
131
132 s2t.end();
133 });
134
135 st.test('test262: test/built-ins/Iterator/concat/fresh-iterator-result', function (s2t) {
136 var oldIterResult = {
137 done: false,
138 value: 123
139 };
140
141 var testIterator1 = {
142 next: function () {
143 return oldIterResult;
144 }
145 };
146
147 var iterable = {};
148 iterable[Symbol.iterator] = function () {
149 return testIterator1;
150 };
151
152 var iterator = concat(iterable);
153
154 var iterResult = iterator.next();
155
156 s2t.equal(iterResult.done, false);
157 s2t.equal(iterResult.value, 123);
158
159 s2t.notEqual(iterResult, oldIterResult);
160
161 s2t.end();
162 });
163
164 st.test('test262: test/built-ins/Iterator/concat/get-iterator-method-only-once', { skip: !hasPropertyDescriptors }, function (s2t) {
165 var iteratorGets = 0;
166 var iteratorCalls = 0;
167 var array = [1, 2, 3];
168
169 function CountingIterable() {}
170 Object.defineProperty(
171 CountingIterable.prototype,
172 Symbol.iterator,
173 {
174 get: function () {
175 iteratorGets += 1;
176
177 return function () {
178 iteratorCalls += 1;
179 return array[Symbol.iterator]();
180 };
181 }
182 }
183 );
184
185 var iterable = new CountingIterable();
186
187 s2t.equal(iteratorGets, 0);
188 s2t.equal(iteratorCalls, 0);
189
190 var iter = concat(iterable);
191
192 s2t.equal(iteratorGets, 1);
193 s2t.equal(iteratorCalls, 0);
194
195 testIterator(iter, array, s2t, 'iterating over the iterator calls the iterator function once');
196
197 s2t.equal(iteratorGets, 1);
198 s2t.equal(iteratorCalls, 1);
199
200 s2t.end();
201 });
202
203 st.test('test262: test/built-ins/Iterator/concat/get-iterator-method-throws', { skip: !hasPropertyDescriptors }, function (s2t) {
204 var iterable = {};
205 Object.defineProperty(iterable, Symbol.iterator, {
206 get: function () {
207 throw new EvalError();
208 }
209 });
210
211 s2t['throws'](function () { concat(iterable); }, EvalError);
212
213 s2t.end();
214 });
215
216 st.test('test262: test/built-ins/Iterator/concat/inner-iterator-created-in-order', function (s2t) {
217 var calledIterator = [];
218
219 var iterable1 = {};
220 iterable1[Symbol.iterator] = function () {
221 calledIterator.push('iterable1');
222 return [1][Symbol.iterator]();
223 };
224
225 var iterable2 = {};
226 iterable2[Symbol.iterator] = function () {
227 calledIterator.push('iterable2');
228 return [2][Symbol.iterator]();
229 };
230
231 var iterator = concat(iterable1, iterable2);
232
233 s2t.deepEqual(calledIterator, []);
234
235 s2t.deepEqual(iterator.next(), { done: false, value: 1 });
236
237 s2t.deepEqual(calledIterator, ['iterable1']);
238
239 s2t.deepEqual(iterator.next(), { done: false, value: 2 });
240
241 s2t.deepEqual(calledIterator, ['iterable1', 'iterable2']);
242
243 s2t.end();
244 });
245
246 st.test('test262: test/built-ins/Iterator/concat/next-method-called-with-zero-arguments', function (s2t) {
247 var nextCalled = 0;
248
249 var testIterator1 = {
250 next: function () {
251 nextCalled += 1;
252 s2t.equal(arguments.length, 0);
253
254 return {
255 done: false,
256 value: 0
257 };
258 }
259 };
260
261 var iterable = {};
262 iterable[Symbol.iterator] = function () {
263 return testIterator1;
264 };
265
266 var iterator = concat(iterable);
267 s2t.equal(nextCalled, 0);
268
269 iterator.next();
270 s2t.equal(nextCalled, 1);
271
272 iterator.next(1);
273 s2t.equal(nextCalled, 2);
274
275 iterator.next(1, 2);
276 s2t.equal(nextCalled, 3);
277
278 s2t.end();
279 });
280
281 st.test('test262: test/built-ins/Iterator/concat/next-method-returns-non-object', function (s2t) {
282 var nonObjectIterator = {
283 next: function () {
284 return null;
285 }
286 };
287
288 var iterable = {};
289 iterable[Symbol.iterator] = function () {
290 return nonObjectIterator;
291 };
292
293 var iterator = concat(iterable);
294
295 s2t['throws'](function () { iterator.next(); }, TypeError);
296
297 s2t.end();
298 });
299
300 st.test('test262: test/built-ins/Iterator/concat/next-method-returns-throwing-done', { skip: !hasPropertyDescriptors }, function (s2t) {
301 var throwingIterator = {
302 next: function () {
303 var result = { done: null, value: 1 };
304 Object.defineProperty(result, 'done', {
305 get: function () {
306 throw new EvalError();
307 }
308 });
309 return result;
310 },
311 'return': function () {
312 throw new Error();
313 }
314 };
315
316 var iterable = {};
317 iterable[Symbol.iterator] = function () {
318 return throwingIterator;
319 };
320
321 var iterator = concat(iterable);
322
323 s2t['throws'](function () { iterator.next(); }, EvalError);
324
325 s2t.end();
326 });
327
328 st.test('test262: test/built-ins/Iterator/concat/next-method-returns-throwing-value-done', { skip: !hasPropertyDescriptors }, function (s2t) {
329 function ReturnCalledError() {}
330 function ValueGetterError() {}
331
332 var throwingIterator = {
333 next: function () {
334 var result = { value: null, done: true };
335 Object.defineProperty(result, 'value', {
336 get: function () {
337 throw new ValueGetterError();
338 }
339 });
340 return result;
341 },
342 'return': function () {
343 throw new ReturnCalledError();
344 }
345 };
346
347 var iterable = {};
348 iterable[Symbol.iterator] = function () {
349 return throwingIterator;
350 };
351
352 var iterator = concat(iterable);
353
354 var iterResult = iterator.next();
355
356 s2t.equal(iterResult.done, true);
357 s2t.equal(iterResult.value, undefined);
358
359 s2t.end();
360 });
361
362 st.test('test262: test/built-ins/Iterator/concat/next-method-returns-throwing-value', { skip: !hasPropertyDescriptors }, function (s2t) {
363 var throwingIterator = {
364 next: function () {
365 var result = { value: null, done: false };
366 Object.defineProperty(result, 'value', {
367 get: function () {
368 throw new EvalError();
369 }
370 });
371 return result;
372 },
373 'return': function () {
374 throw new Error();
375 }
376 };
377
378 var iterable = {};
379 iterable[Symbol.iterator] = function () {
380 return throwingIterator;
381 };
382
383 var iterator = concat(iterable);
384
385 s2t['throws'](function () { iterator.next(); }, EvalError);
386
387 s2t.end();
388 });
389
390 st.test('test262: test/built-ins/Iterator/concat/next-method-throws', function (s2t) {
391 var throwingIterator = {
392 next: function () {
393 throw new EvalError();
394 }
395 };
396
397 var iterable = {};
398 iterable[Symbol.iterator] = function () {
399 return throwingIterator;
400 };
401
402 var iterator = concat(iterable);
403
404 s2t['throws'](function () { iterator.next(); }, EvalError);
405
406 s2t.end();
407 });
408
409 st.test('test262: test/built-ins/Iterator/concat/return-is-not-forwarded-after-exhaustion', function (s2t) {
410 var testIterator1 = {
411 next: function () {
412 return {
413 done: true,
414 value: undefined
415 };
416 },
417 'return': function () {
418 throw new EvalError();
419 }
420 };
421
422 var iterable = {};
423 iterable[Symbol.iterator] = function () {
424 return testIterator1;
425 };
426
427 var iterator = concat(iterable);
428 iterator.next();
429 iterator['return']();
430
431 s2t.end();
432 });
433
434 t.test('test262: test/built-ins/Iterator/concat/return-is-not-forwarded-before-initial-start', function (s2t) {
435 var testIterator1 = {
436 next: function () {
437 return {
438 done: false,
439 value: 1
440 };
441 },
442 'return': function () {
443 throw new EvalError();
444 }
445 };
446
447 var iterable = {};
448 iterable[Symbol.iterator] = function () {
449 return testIterator1;
450 };
451
452 var iterator = concat(iterable);
453 iterator['return']();
454 iterator.next();
455 iterator['return']();
456
457 s2t.end();
458 });
459
460 st.test('test262: test/built-ins/Iterator/concat/return-method-called-with-zero-arguments', function (s2t) {
461 var returnCalled = 0;
462
463 var testIterator1 = {
464 next: function () {
465 return { done: false };
466 },
467 'return': function () {
468 returnCalled += 1;
469 s2t.equal(arguments.length, 0);
470 return { done: true };
471 }
472 };
473
474 var iterable = {};
475 iterable[Symbol.iterator] = function () {
476 return testIterator1;
477 };
478
479 var iterator;
480
481 // Call with zero arguments.
482 iterator = concat(iterable);
483 iterator.next();
484 s2t.equal(returnCalled, 0);
485
486 iterator['return']();
487 s2t.equal(returnCalled, 1);
488
489 // Call with one argument.
490 iterator = concat(iterable);
491 iterator.next();
492 s2t.equal(returnCalled, 1);
493
494 iterator['return'](1);
495 s2t.equal(returnCalled, 2);
496
497 // Call with two arguments.
498 iterator = concat(iterable);
499 iterator.next();
500 s2t.equal(returnCalled, 2);
501
502 iterator['return'](1, 2);
503 s2t.equal(returnCalled, 3);
504
505 s2t.end();
506 });
507
508 st.test('test262: test/built-ins/Iterator/concat/throws-typeerror-when-generator-is-running-next', function (s2t) {
509 var enterCount = 0;
510
511 var iterator;
512
513 var testIterator1 = {
514 next: function () {
515 enterCount += 1;
516 iterator.next();
517 return { done: false };
518 }
519 };
520
521 var iterable = {};
522 iterable[Symbol.iterator] = function () {
523 return testIterator1;
524 };
525
526 iterator = concat(iterable);
527
528 s2t.equal(enterCount, 0);
529
530 s2t['throws'](function () { iterator.next(); }, TypeError);
531
532 s2t.equal(enterCount, 1);
533
534 s2t.end();
535 });
536
537 st.test('test262: test/built-ins/Iterator/concat/result-is-iterator', function (s2t) {
538 var iter = concat();
539 s2t.equal(typeof iter.next, 'function', 'concat() result has next method');
540 s2t.equal(typeof iter[Symbol.iterator], 'function', 'concat() result has Symbol.iterator');
541 s2t.equal(iter[Symbol.iterator](), iter, 'concat() result Symbol.iterator returns itself');
542
543 var customIter = { next: function () { return { done: true, value: undefined }; } };
544 var iterable = {};
545 iterable[Symbol.iterator] = function () { return customIter; };
546 iter = concat(iterable);
547 s2t.equal(typeof iter.next, 'function', 'concat(iterable) result has next method');
548 s2t.equal(typeof iter[Symbol.iterator], 'function', 'concat(iterable) result has Symbol.iterator');
549 s2t.equal(iter[Symbol.iterator](), iter, 'concat(iterable) result Symbol.iterator returns itself');
550
551 s2t.end();
552 });
553
554 st.test('test262: test/built-ins/Iterator/concat/single-argument', function (s2t) {
555 var array = [1, 2, 3];
556 var iterator = concat(array);
557
558 for (var i = 0; i < array.length; i += 1) {
559 var iterResult = iterator.next();
560 s2t.equal(iterResult.done, false, 'not done at index ' + i);
561 s2t.equal(iterResult.value, array[i], 'correct value at index ' + i);
562 }
563
564 var finalResult = iterator.next();
565 s2t.equal(finalResult.done, true, 'done after all values');
566 s2t.equal(finalResult.value, undefined, 'value is undefined when done');
567
568 s2t.end();
569 });
570
571 st.test('test262: test/built-ins/Iterator/concat/many-arguments', function (s2t) {
572 var iterables = [
573 [],
574 [1],
575 [2, 3],
576 [4, 5, 6],
577 [7, 8, 9, 10]
578 ];
579
580 var iterator = concat(iterables[0], iterables[1], iterables[2], iterables[3], iterables[4]);
581
582 var expected = [].concat(iterables[0], iterables[1], iterables[2], iterables[3], iterables[4]);
583
584 for (var i = 0; i < expected.length; i += 1) {
585 var iterResult = iterator.next();
586 s2t.equal(iterResult.done, false, 'not done at index ' + i);
587 s2t.equal(iterResult.value, expected[i], 'correct value at index ' + i);
588 }
589
590 var finalResult = iterator.next();
591 s2t.equal(finalResult.done, true, 'done after all values');
592 s2t.equal(finalResult.value, undefined, 'value is undefined when done');
593
594 s2t.end();
595 });
596
597 st.test('test262: test/built-ins/Iterator/concat/zero-arguments', function (s2t) {
598 var iterator = concat();
599
600 var iterResult = iterator.next();
601 s2t.equal(iterResult.done, true, 'done immediately with zero arguments');
602 s2t.equal(iterResult.value, undefined, 'value is undefined');
603
604 s2t.end();
605 });
606
607 st.test('test262: test/built-ins/Iterator/concat/return-is-forwarded', function (s2t) {
608 var returnCount = 0;
609
610 var testIterator1 = {
611 next: function () {
612 return { done: false, value: 1 };
613 },
614 'return': function () {
615 returnCount += 1;
616 return { done: true, value: undefined };
617 }
618 };
619
620 var iterable = {};
621 iterable[Symbol.iterator] = function () {
622 return testIterator1;
623 };
624
625 var iterator = concat(iterable);
626
627 s2t.equal(returnCount, 0, 'return not called before next()');
628
629 iterator.next();
630
631 s2t.equal(returnCount, 0, 'return not called after next()');
632
633 iterator['return']();
634
635 s2t.equal(returnCount, 1, 'return called once after iterator.return()');
636
637 // Subsequent return() calls should not forward again
638 iterator['return']();
639
640 s2t.equal(returnCount, 1, 'return not called again on subsequent return()');
641
642 s2t.end();
643 });
644
645 st.test('test262: test/built-ins/Iterator/concat/throws-typeerror-when-generator-is-running-return', function (s2t) {
646 var enterCount = 0;
647 var iterator;
648
649 var reentrantTestIterator = {
650 next: function () {
651 return { done: false };
652 },
653 'return': function () {
654 enterCount += 1;
655 iterator['return'](); // re-entrant call
656 return { done: false };
657 }
658 };
659
660 var iterable = {};
661 iterable[Symbol.iterator] = function () {
662 return reentrantTestIterator;
663 };
664
665 iterator = concat(iterable);
666
667 iterator.next();
668
669 s2t.equal(enterCount, 0, 'return not entered before calling return()');
670
671 s2t['throws'](
672 function () { iterator['return'](); },
673 TypeError,
674 'throws TypeError when generator is running during return()'
675 );
676
677 s2t.equal(enterCount, 1, 'return entered exactly once before throwing');
678
679 s2t.end();
680 });
681
682 st.end();
683 });
684 },
685 index: function () {
686 test('Iterator.concat: index', function (t) {
687 module.exports.tests(index, 'Iterator.concat', t);
688
689 t.end();
690 });
691 },
692 implementation: function () {
693 test('Iterator.concat: implementation', function (t) {
694 module.exports.tests(impl, 'Iterator.concat', t);
695
696 t.end();
697 });
698 },
699 shimmed: function () {
700 test('Iterator.concat: shimmed', function (t) {
701 t.test('Function name', { skip: !functionsHaveNames }, function (st) {
702 st.equal(Iterator.concat.name, 'concat', 'Iterator.concat has name "concat"');
703 st.end();
704 });
705
706 t.test('enumerability', { skip: !defineProperties.supportsDescriptors }, function (et) {
707 et.equal(false, isEnumerable.call(Iterator, 'concat'), 'Iterator.concat is not enumerable');
708 et.end();
709 });
710
711 t.equal(Iterator.concat.length, 0, 'Iterator.concat has length 0');
712
713 module.exports.tests(callBind(Iterator.concat, Iterator), 'Iterator.concat', t);
714
715 t.end();
716 });
717 }
718};
Note: See TracBrowser for help on using the repository browser.