1// META: global=window,worker 2'use strict'; 3 4test(() => { 5 6 new ReadableStream({}, new CountQueuingStrategy({ highWaterMark: 4 })); 7 8}, 'Can construct a readable stream with a valid CountQueuingStrategy'); 9 10promise_test(() => { 11 12 let controller; 13 const rs = new ReadableStream( 14 { 15 start(c) { 16 controller = c; 17 } 18 }, 19 new CountQueuingStrategy({ highWaterMark: 0 }) 20 ); 21 const reader = rs.getReader(); 22 23 assert_equals(controller.desiredSize, 0, '0 reads, 0 enqueues: desiredSize should be 0'); 24 controller.enqueue('a'); 25 assert_equals(controller.desiredSize, -1, '0 reads, 1 enqueue: desiredSize should be -1'); 26 controller.enqueue('b'); 27 assert_equals(controller.desiredSize, -2, '0 reads, 2 enqueues: desiredSize should be -2'); 28 controller.enqueue('c'); 29 assert_equals(controller.desiredSize, -3, '0 reads, 3 enqueues: desiredSize should be -3'); 30 controller.enqueue('d'); 31 assert_equals(controller.desiredSize, -4, '0 reads, 4 enqueues: desiredSize should be -4'); 32 33 return reader.read() 34 .then(result => { 35 assert_object_equals(result, { value: 'a', done: false }, 36 '1st read gives back the 1st chunk enqueued (queue now contains 3 chunks)'); 37 return reader.read(); 38 }) 39 .then(result => { 40 assert_object_equals(result, { value: 'b', done: false }, 41 '2nd read gives back the 2nd chunk enqueued (queue now contains 2 chunks)'); 42 return reader.read(); 43 }) 44 .then(result => { 45 assert_object_equals(result, { value: 'c', done: false }, 46 '3rd read gives back the 3rd chunk enqueued (queue now contains 1 chunk)'); 47 48 assert_equals(controller.desiredSize, -1, '3 reads, 4 enqueues: desiredSize should be -1'); 49 controller.enqueue('e'); 50 assert_equals(controller.desiredSize, -2, '3 reads, 5 enqueues: desiredSize should be -2'); 51 52 return reader.read(); 53 }) 54 .then(result => { 55 assert_object_equals(result, { value: 'd', done: false }, 56 '4th read gives back the 4th chunk enqueued (queue now contains 1 chunks)'); 57 return reader.read(); 58 59 }).then(result => { 60 assert_object_equals(result, { value: 'e', done: false }, 61 '5th read gives back the 5th chunk enqueued (queue now contains 0 chunks)'); 62 63 assert_equals(controller.desiredSize, 0, '5 reads, 5 enqueues: desiredSize should be 0'); 64 controller.enqueue('f'); 65 assert_equals(controller.desiredSize, -1, '5 reads, 6 enqueues: desiredSize should be -1'); 66 controller.enqueue('g'); 67 assert_equals(controller.desiredSize, -2, '5 reads, 7 enqueues: desiredSize should be -2'); 68 }); 69 70}, 'Correctly governs a ReadableStreamController\'s desiredSize property (HWM = 0)'); 71 72promise_test(() => { 73 74 let controller; 75 const rs = new ReadableStream( 76 { 77 start(c) { 78 controller = c; 79 } 80 }, 81 new CountQueuingStrategy({ highWaterMark: 1 }) 82 ); 83 const reader = rs.getReader(); 84 85 assert_equals(controller.desiredSize, 1, '0 reads, 0 enqueues: desiredSize should be 1'); 86 controller.enqueue('a'); 87 assert_equals(controller.desiredSize, 0, '0 reads, 1 enqueue: desiredSize should be 0'); 88 controller.enqueue('b'); 89 assert_equals(controller.desiredSize, -1, '0 reads, 2 enqueues: desiredSize should be -1'); 90 controller.enqueue('c'); 91 assert_equals(controller.desiredSize, -2, '0 reads, 3 enqueues: desiredSize should be -2'); 92 controller.enqueue('d'); 93 assert_equals(controller.desiredSize, -3, '0 reads, 4 enqueues: desiredSize should be -3'); 94 95 return reader.read() 96 .then(result => { 97 assert_object_equals(result, { value: 'a', done: false }, 98 '1st read gives back the 1st chunk enqueued (queue now contains 3 chunks)'); 99 return reader.read(); 100 }) 101 .then(result => { 102 assert_object_equals(result, { value: 'b', done: false }, 103 '2nd read gives back the 2nd chunk enqueued (queue now contains 2 chunks)'); 104 return reader.read(); 105 }) 106 .then(result => { 107 assert_object_equals(result, { value: 'c', done: false }, 108 '3rd read gives back the 3rd chunk enqueued (queue now contains 1 chunk)'); 109 110 assert_equals(controller.desiredSize, 0, '3 reads, 4 enqueues: desiredSize should be 0'); 111 controller.enqueue('e'); 112 assert_equals(controller.desiredSize, -1, '3 reads, 5 enqueues: desiredSize should be -1'); 113 114 return reader.read(); 115 }) 116 .then(result => { 117 assert_object_equals(result, { value: 'd', done: false }, 118 '4th read gives back the 4th chunk enqueued (queue now contains 1 chunks)'); 119 return reader.read(); 120 }) 121 .then(result => { 122 assert_object_equals(result, { value: 'e', done: false }, 123 '5th read gives back the 5th chunk enqueued (queue now contains 0 chunks)'); 124 125 assert_equals(controller.desiredSize, 1, '5 reads, 5 enqueues: desiredSize should be 1'); 126 controller.enqueue('f'); 127 assert_equals(controller.desiredSize, 0, '5 reads, 6 enqueues: desiredSize should be 0'); 128 controller.enqueue('g'); 129 assert_equals(controller.desiredSize, -1, '5 reads, 7 enqueues: desiredSize should be -1'); 130 }); 131 132}, 'Correctly governs a ReadableStreamController\'s desiredSize property (HWM = 1)'); 133 134promise_test(() => { 135 136 let controller; 137 const rs = new ReadableStream( 138 { 139 start(c) { 140 controller = c; 141 } 142 }, 143 new CountQueuingStrategy({ highWaterMark: 4 }) 144 ); 145 const reader = rs.getReader(); 146 147 assert_equals(controller.desiredSize, 4, '0 reads, 0 enqueues: desiredSize should be 4'); 148 controller.enqueue('a'); 149 assert_equals(controller.desiredSize, 3, '0 reads, 1 enqueue: desiredSize should be 3'); 150 controller.enqueue('b'); 151 assert_equals(controller.desiredSize, 2, '0 reads, 2 enqueues: desiredSize should be 2'); 152 controller.enqueue('c'); 153 assert_equals(controller.desiredSize, 1, '0 reads, 3 enqueues: desiredSize should be 1'); 154 controller.enqueue('d'); 155 assert_equals(controller.desiredSize, 0, '0 reads, 4 enqueues: desiredSize should be 0'); 156 controller.enqueue('e'); 157 assert_equals(controller.desiredSize, -1, '0 reads, 5 enqueues: desiredSize should be -1'); 158 controller.enqueue('f'); 159 assert_equals(controller.desiredSize, -2, '0 reads, 6 enqueues: desiredSize should be -2'); 160 161 162 return reader.read() 163 .then(result => { 164 assert_object_equals(result, { value: 'a', done: false }, 165 '1st read gives back the 1st chunk enqueued (queue now contains 5 chunks)'); 166 return reader.read(); 167 }) 168 .then(result => { 169 assert_object_equals(result, { value: 'b', done: false }, 170 '2nd read gives back the 2nd chunk enqueued (queue now contains 4 chunks)'); 171 172 assert_equals(controller.desiredSize, 0, '2 reads, 6 enqueues: desiredSize should be 0'); 173 controller.enqueue('g'); 174 assert_equals(controller.desiredSize, -1, '2 reads, 7 enqueues: desiredSize should be -1'); 175 176 return reader.read(); 177 }) 178 .then(result => { 179 assert_object_equals(result, { value: 'c', done: false }, 180 '3rd read gives back the 3rd chunk enqueued (queue now contains 4 chunks)'); 181 return reader.read(); 182 }) 183 .then(result => { 184 assert_object_equals(result, { value: 'd', done: false }, 185 '4th read gives back the 4th chunk enqueued (queue now contains 3 chunks)'); 186 return reader.read(); 187 }) 188 .then(result => { 189 assert_object_equals(result, { value: 'e', done: false }, 190 '5th read gives back the 5th chunk enqueued (queue now contains 2 chunks)'); 191 return reader.read(); 192 }) 193 .then(result => { 194 assert_object_equals(result, { value: 'f', done: false }, 195 '6th read gives back the 6th chunk enqueued (queue now contains 0 chunks)'); 196 197 assert_equals(controller.desiredSize, 3, '6 reads, 7 enqueues: desiredSize should be 3'); 198 controller.enqueue('h'); 199 assert_equals(controller.desiredSize, 2, '6 reads, 8 enqueues: desiredSize should be 2'); 200 controller.enqueue('i'); 201 assert_equals(controller.desiredSize, 1, '6 reads, 9 enqueues: desiredSize should be 1'); 202 controller.enqueue('j'); 203 assert_equals(controller.desiredSize, 0, '6 reads, 10 enqueues: desiredSize should be 0'); 204 controller.enqueue('k'); 205 assert_equals(controller.desiredSize, -1, '6 reads, 11 enqueues: desiredSize should be -1'); 206 }); 207 208}, 'Correctly governs a ReadableStreamController\'s desiredSize property (HWM = 4)'); 209