<!DOCTYPE html>
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
<script src='resources/streams-utils.js'></script>
<script>
// This is updated till https://github.com/whatwg/streams/commit/4ba861e6f60c248060811830e11271c84b439cc3

test(function() {
    var theError = new Error('a unique string');

    assert_throws(theError, function() {
        new WritableStream({
            get start() {
                throw theError;
            }
        });
    });
}, 'Underlying sink: throwing start getter');

test(function() {
    var theError = new Error('a unique string');

    assert_throws(theError, function() {
        new WritableStream({
            start: function() {
                throw theError;
            }
        });
    });
}, 'Underlying sink: throwing start method');

var test1 = async_test('Underlying sink: throwing write getter');
test1.step(function() {
    var writeRejected = false;

    var theError = new Error('a unique string');
    var ws = new WritableStream({
        get write() {
            throw theError;
        }
    });

    ws.write('a').then(
        test1.step_func(function() { assert_unreached('write should not fulfill'); }),
        test1.step_func(function(r) {
            assert_equals(r, theError, 'write should reject with the thrown error');
            writeRejected = true;
        })
    );

    ws.closed.then(
        test1.step_func(function() { assert_unreached('closed should not fulfill'); }),
        test1.step_func(function(r) {
            assert_equals(r, theError, 'closed should reject with the thrown error');
            assert_true(writeRejected);
            test1.done();
        })
    );
});

var test2 = async_test('Underlying sink: throwing write method');
test2.step(function() {
    var writeRejected = false;

    var theError = new Error('a unique string');
    var ws = new WritableStream({
        write: function() {
            throw theError;
        }
    });

    ws.write('a').then(
        test2.step_func(function() { assert_unreached('write should not fulfill'); }),
        test2.step_func(function(r) {
            assert_equals(r, theError, 'write should reject with the thrown error');
            writeRejected = true;
        })
    );

    ws.closed.then(
        test2.step_func(function() { assert_unreached('closed should not fulfill'); }),
        test2.step_func(function(r) {
            assert_equals(r, theError, 'closed should reject with the thrown error');
            assert_true(writeRejected);
            test2.done();
        })
    );
});

var test3 = async_test('Underlying sink: throwing abort getter');
test3.step(function() {
    var closedRejected = false;
    var theError = new Error('a unique string');
    var abortReason = new Error('different string');
    var ws = new WritableStream({
        get abort() {
            throw theError;
        }
    });

    ws.abort(abortReason).then(
        test3.step_func(function() { assert_unreached('abort should not fulfill'); }),
        test3.step_func(function(r) {
            assert_equals(r, theError, 'abort should reject with the abort reason');
            assert_true(closedRejected);
            test3.done();
        })
    );

    ws.closed.then(
        test3.step_func(function() { assert_unreached('closed should not fulfill'); }),
        test3.step_func(function(r) {
            assert_equals(r, abortReason, 'closed should reject with the thrown error');
            closedRejected = true;
        })
    );
});

var test4 = async_test('Underlying sink: throwing abort method');
test4.step(function() {
    var closedRejected = false;
    var theError = new Error('a unique string');
    var abortReason = new Error('different string');
    var ws = new WritableStream({
        abort: function() {
            throw theError;
        }
    });

    ws.abort(abortReason).then(
        test4.step_func(function() { assert_unreached('abort should not fulfill'); }),
        test4.step_func(function(r) {
            assert_equals(r, theError, 'abort should reject with the abort reason');
            assert_true(closedRejected);
            test4.done();
        })
    );

    ws.closed.then(
        test4.step_func(function() { assert_unreached('closed should not fulfill'); }),
        test4.step_func(function(r) {
            assert_equals(r, abortReason, 'closed should reject with the thrown error');
            closedRejected = true;
        })
    );
});

var test5 = async_test('Underlying sink: throwing close getter');
test5.step(function() {
    var theError = new Error('a unique string');
    var ws = new WritableStream({
        get close() {
            throw theError;
        }
    });

    ws.close().then(
        test5.step_func(function() { assert_unreached('close should not fulfill'); }),
        test5.step_func(function(r) {
            assert_equals(r, theError, 'close should reject with the thrown error');
            test5.done();
        })
    );
});

var test6 = async_test('Underlying sink: throwing close method');
test6.step(function() {
    var theError = new Error('a unique string');
    var ws = new WritableStream({
        close: function() {
            throw theError;
        }
    });

    ws.close().then(
        test6.step_func(function() { assert_unreached('close should not fulfill'); }),
        test6.step_func(function(r) {
            assert_equals(r, theError, 'close should reject with the thrown error');
            test6.done();
        })
    );
});
</script>
