1// META: global=window,worker 2'use strict'; 3 4const error1 = new Error('a unique string'); 5error1.name = 'error1'; 6 7test(() => { 8 assert_throws_exactly(error1, () => { 9 new WritableStream({}, { 10 get size() { 11 throw error1; 12 }, 13 highWaterMark: 5 14 }); 15 }, 'construction should re-throw the error'); 16}, 'Writable stream: throwing strategy.size getter'); 17 18test(() => { 19 assert_throws_js(TypeError, () => { 20 new WritableStream({}, { size: 'a string' }); 21 }); 22}, 'reject any non-function value for strategy.size'); 23 24test(() => { 25 assert_throws_exactly(error1, () => { 26 new WritableStream({}, { 27 size() { 28 return 1; 29 }, 30 get highWaterMark() { 31 throw error1; 32 } 33 }); 34 }, 'construction should re-throw the error'); 35}, 'Writable stream: throwing strategy.highWaterMark getter'); 36 37test(() => { 38 39 for (const highWaterMark of [-1, -Infinity, NaN, 'foo', {}]) { 40 assert_throws_js(RangeError, () => { 41 new WritableStream({}, { 42 size() { 43 return 1; 44 }, 45 highWaterMark 46 }); 47 }, `construction should throw a RangeError for ${highWaterMark}`); 48 } 49}, 'Writable stream: invalid strategy.highWaterMark'); 50 51promise_test(t => { 52 const ws = new WritableStream({}, { 53 size() { 54 throw error1; 55 }, 56 highWaterMark: 5 57 }); 58 59 const writer = ws.getWriter(); 60 61 const p1 = promise_rejects_exactly(t, error1, writer.write('a'), 'write should reject with the thrown error'); 62 63 const p2 = promise_rejects_exactly(t, error1, writer.closed, 'closed should reject with the thrown error'); 64 65 return Promise.all([p1, p2]); 66}, 'Writable stream: throwing strategy.size method'); 67 68promise_test(() => { 69 const sizes = [NaN, -Infinity, Infinity, -1]; 70 return Promise.all(sizes.map(size => { 71 const ws = new WritableStream({}, { 72 size() { 73 return size; 74 }, 75 highWaterMark: 5 76 }); 77 78 const writer = ws.getWriter(); 79 80 return writer.write('a').then(() => assert_unreached('write must reject'), writeE => { 81 assert_equals(writeE.name, 'RangeError', `write must reject with a RangeError for ${size}`); 82 83 return writer.closed.then(() => assert_unreached('write must reject'), closedE => { 84 assert_equals(closedE, writeE, `closed should reject with the same error as write`); 85 }); 86 }); 87 })); 88}, 'Writable stream: invalid strategy.size return value'); 89 90test(() => { 91 assert_throws_js(TypeError, () => new WritableStream(undefined, { 92 size: 'not a function', 93 highWaterMark: NaN 94 }), 'WritableStream constructor should throw a TypeError'); 95}, 'Writable stream: invalid size beats invalid highWaterMark'); 96