<!DOCTYPE html>
<html>
<title>Tests various ways to call cancelWatchAvailability()</title>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="/common/media.js"></script>
<script>
async_test(t => {
  var v = document.createElement('video');
  v.src = getVideoURI('movie_5');

  v.remote.watchAvailability(function() {})
    .then(t.step_func(id => {
      v.remote.cancelWatchAvailability(id).then(t.step_func(function() {
        v.remote.cancelWatchAvailability(id).then(
          t.unreached_func(), t.step_func_done(e => {
            assert_equals(e.name, 'NotFoundError');
          })
        );
      }), t.unreached_func());
    }), t.unreached_func());
}, 'Test that calling cancelWatchAvailability() with an id does remove the callback.');

async_test(t => {
  var v = document.createElement('video');
  v.src = getVideoURI('movie_5');

  Promise.all([
      v.remote.watchAvailability(function() {}),
      v.remote.watchAvailability(function() {})
  ]).then(t.step_func(ids => {
    v.remote.cancelWatchAvailability().then(t.step_func(function() {
      v.remote.cancelWatchAvailability(ids[0]).then(t.unreached_func(), t.step_func(function(e) {
        assert_equals(e.name, 'NotFoundError');
        v.remote.cancelWatchAvailability(ids[1])
          .then(t.unreached_func(), t.step_func_done(function(e) {
            assert_equals(e.name, 'NotFoundError');
          }));
      }));
    }), t.unreached_func());
  }), t.unreached_func());
}, 'Test that calling cancelWatchAvailability() without an id removes all the callbacks.');
</script>
</html>
