<!DOCTYPE HTML>
<html>
<head>
<title>Promise Tests</title>
</head>
<body>
<h1>Promise Tests</h1>
<p>This test demonstrates the use of <tt>promise_test</tt>. Assumes ECMAScript 6
Promise support. Some failures are expected.</p>
<div id="log"></div>
<script src="../testharness.js"></script>
<script src="../testharnessreport.js"></script>
<script>
test(
    function() {
        var p = new Promise(function(resolve, reject){});
        assert_true("then" in p);
        assert_equals(typeof Promise.resolve, "function");
        assert_equals(typeof Promise.reject, "function");
    },
    "Promises are supported in your browser");

promise_test(
    function() {
        return Promise.resolve("x")
            .then(
                function(value) {
                    assert_equals(value,
                                  "x",
                                  "Fulfilled promise should pass result to " +
                                  "fulfill reaction.");
                });
    },
    "Promise fulfillment with result");

promise_test(
    function(t) {
        return Promise.reject(new Error("fail"))
            .then(t.unreached_func("Promise should reject"),
                function(reason) {
                    assert_true(
                        reason instanceof Error,
                        "Rejected promise should pass reason to fulfill reaction.");
                    assert_equals(
                        reason.message,
                        "fail",
                        "Rejected promise should pass reason to reject reaction.");
                });
    },
    "Promise rejection with result");

promise_test(
    function() {
        var resolutions = [];
        return Promise.resolve("a")
            .then(
                function(value) {
                    resolutions.push(value);
                    return "b";
                })
            .then(
                function(value) {
                    resolutions.push(value);
                    return "c";
                })
            .then(
                function(value) {
                    resolutions.push(value);
                    assert_array_equals(resolutions, ["a", "b", "c"]);
                });
    },
    "Chain of promise resolutions");

promise_test(
    function(t) {
        var resolutions = [];
        return Promise.resolve("x")
            .then(
                function(value) {
                    assert_true(false, "Expected failure.");
                })
            .then(t.unreached_func("UNEXPECTED FAILURE: Promise should not have resolved."));
    },
    "Assertion failure in a fulfill reaction (should FAIL with an expected failure)");

promise_test(
    function(t) {
        return new Promise(
                function(resolve, reject) {
                    reject(123);
                })
            .then(t.unreached_func("UNEXPECTED FAILURE: Fulfill reaction reached after rejection."),
                  t.unreached_func("Expected failure."));
    },
    "unreached_func as reactor (should FAIL with an expected failure)");

promise_test(
    function() {
        return true;
    },
    "promise_test with function that doesn't return a Promise");

promise_test(function(){},
             "promise_test with function that doesn't return anything");

promise_test(
    function() {
        return Promise.reject("Expected rejection");
    },
    "promise_test with unhandled rejection (should FAIL)");

promise_test(
    function() {
        return Promise.resolve(10)
            .then(
                function(value) {
                    throw Error("Expected exception.");
                });
    },
    "promise_test with unhandled exception in fulfill reaction (should FAIL)");

promise_test(
    function(t) {
        return Promise.reject(10)
            .then(
                t.unreached_func("UNEXPECTED FAILURE: Fulfill reaction reached after rejection."),
                function(value) {
                    throw Error("Expected exception.");
                });
    },
    "promise_test with unhandled exception in reject reaction (should FAIL)");
</script>
