summaryrefslogtreecommitdiffstats
path: root/js/src/tests/non262/Iterator/prototype/lazy-methods-interleaved.js
blob: 9a79ad5fd5d496ff8ad0c8a8fadec0bc6538d091 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// |reftest| skip-if(!this.hasOwnProperty('Iterator'))

//
//
/*---
esid: pending
description: Lazy %Iterator.prototype% method calls can be interleaved.
info: >
  Iterator Helpers proposal 2.1.5
features: [iterator-helpers]
---*/

class TestIterator extends Iterator {
  value = 0;
  next() { 
    return {done: false, value: this.value++};
  }
}

function unwrapResult(result) {
  return result;
}

const methods = [
  iter => iter.map(x => x),
  iter => iter.filter(x => true),
  iter => iter.take(2),
  iter => iter.drop(0),
  iter => iter.flatMap(x => [x]),
];

for (const firstMethod of methods) {
  for (const secondMethod of methods) {
    const iterator = new TestIterator();
    const firstHelper = firstMethod(iterator);
    const secondHelper = secondMethod(iterator);

    let firstResult = unwrapResult(firstHelper.next());
    assertEq(firstResult.done, false);
    assertEq(firstResult.value, 0);

    let secondResult = unwrapResult(secondHelper.next());
    assertEq(secondResult.done, false);
    assertEq(secondResult.value, 1);

    firstResult = unwrapResult(firstHelper.next());
    assertEq(firstResult.done, false);
    assertEq(firstResult.value, 2);

    secondResult = unwrapResult(secondHelper.next());
    assertEq(secondResult.done, false);
    assertEq(secondResult.value, 3);
  }
}

if (typeof reportCompare == 'function')
  reportCompare(0, 0);