summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/streams/piping/throwing-options.any.js
blob: b9f906778f632b32a83800c806c8fc72294ae3cc (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
58
59
60
61
62
63
64
65
// META: global=window,worker
'use strict';

class ThrowingOptions {
  constructor(whatShouldThrow) {
    this.whatShouldThrow = whatShouldThrow;
    this.touched = [];
  }

  get preventClose() {
    this.maybeThrow('preventClose');
    return false;
  }

  get preventAbort() {
    this.maybeThrow('preventAbort');
    return false;
  }

  get preventCancel() {
    this.maybeThrow('preventCancel');
    return false;
  }

  get signal() {
    this.maybeThrow('signal');
    return undefined;
  }

  maybeThrow(forWhat) {
    this.touched.push(forWhat);
    if (this.whatShouldThrow === forWhat) {
      throw new Error(this.whatShouldThrow);
    }
  }
}

const checkOrder = ['preventAbort', 'preventCancel', 'preventClose', 'signal'];

for (let i = 0; i < checkOrder.length; ++i) {
  const whatShouldThrow = checkOrder[i];
  const whatShouldBeTouched = checkOrder.slice(0, i + 1);

  promise_test(t => {
    const options = new ThrowingOptions(whatShouldThrow);
    return promise_rejects_js(
               t, Error,
               new ReadableStream().pipeTo(new WritableStream(), options),
               'pipeTo should reject')
        .then(() => assert_array_equals(
            options.touched, whatShouldBeTouched,
            'options should be touched in the right order'));
  }, `pipeTo should stop after getting ${whatShouldThrow} throws`);

  test(() => {
    const options = new ThrowingOptions(whatShouldThrow);
    assert_throws_js(
        Error,
        () => new ReadableStream().pipeThrough(new TransformStream(), options),
        'pipeThrough should throw');
    assert_array_equals(
        options.touched, whatShouldBeTouched,
        'options should be touched in the right order');
  }, `pipeThrough should stop after getting ${whatShouldThrow} throws`);
}