<!DOCTYPE HTML>
<html>
<head>
<title>Async Tests and Promises</title>
</head>
<body>
<h1>Async Tests and Promises</h1>
<p>This test 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");

(function() {
  var t = async_test("Promise resolution");
  t.step(function() {
    Promise.resolve('x').then(
      t.step_func(function(value) {
        assert_equals(value, 'x');
        t.done();
      }),
      t.unreached_func('Promise should not reject')
    );
  });
}());

(function() {
  var t = async_test("Promise rejection");
  t.step(function() {
    Promise.reject(Error('fail')).then(
      t.unreached_func('Promise should reject'),
      t.step_func(function(reason) {
        assert_true(reason instanceof Error);
        assert_equals(reason.message, 'fail');
        t.done();
      })
    );
  });
}());

(function() {
  var t = async_test("Promises resolution chaining");
  t.step(function() {
    var resolutions = [];
    Promise.resolve('a').then(
      t.step_func(function(value) {
        resolutions.push(value);
        return 'b';
      })
    ).then(
      t.step_func(function(value) {
        resolutions.push(value);
        return 'c';
      })
    ).then(
      t.step_func(function(value) {
        resolutions.push(value);

        assert_array_equals(resolutions, ['a', 'b', 'c']);
        t.done();
      })
    ).catch(
      t.unreached_func('promise should not have rejected')
    );
  });
}());

(function() {
  var t = async_test("Use of step_func with Promises");
  t.step(function() {
    var resolutions = [];
    Promise.resolve('x').then(
      t.step_func_done(),
      t.unreached_func('Promise should not have rejected')
    );
  });
}());

(function() {
  var t = async_test("Promises and test assertion failures (should fail)");
  t.step(function() {
    var resolutions = [];
    Promise.resolve('x').then(
      t.step_func(function(value) {
        assert_true(false, 'This failure is expected');
      })
    ).then(
      t.unreached_func('Promise should not have resolved')
    ).catch(
      t.unreached_func('Promise should not have rejected')
    );
  });
}());

(function() {
  var t = async_test("Use of unreached_func with Promises (should fail)");
  t.step(function() {
    var resolutions = [];
    var r;
    var p = new Promise(function(resolve, reject) {
      // Reject instead of resolve, to demonstrate failure.
      reject(123);
    });
    p.then(
      function(value) {
        assert_equals(value, 123, 'This should not actually happen');
      },
      t.unreached_func('This failure is expected')
    );
  });
}());
</script>
