// META: script=/resources/testdriver.js
// META: script=/resources/testdriver-vendor.js
// META: title=Idle Detection API: Basics

'use strict';

promise_setup(async t => {
  await test_driver.set_permission({ name: 'notifications' }, 'granted', false);
})

promise_test(async t => {
  let detector = new IdleDetector();
  let watcher = new EventWatcher(t, detector, ["change"]);
  let initial_state = watcher.wait_for("change");

  await detector.start();
  await initial_state;

  assert_true(['active', 'idle'].includes(detector.userState),
                'has a valid user state');
  assert_true(['locked', 'unlocked'].includes(detector.screenState),
                'has a valid screen state');
}, 'start() basics');

promise_test(async t => {
  let used = false;

  const detector = new IdleDetector();
  detector.start({
    get threshold() {
      used = true;
      return 60000;
    }
  });

  assert_true(used, 'start() options "threshold" member was used');
}, 'start() uses threshold property');

promise_test(async t => {
  let used = false;

  const controller = new AbortController();
  const detector = new IdleDetector();
  detector.start({
    get signal() {
      used = true;
      return controller.signal;
    }
  });

  assert_true(used, 'start() options "signal" member was used');
}, 'start() uses signal property');


promise_test(async t => {
  const detector = new IdleDetector();
  await promise_rejects_js(t, TypeError, detector.start({threshold: 0}));
}, 'start() rejects with invalid threshold (0)');

promise_test(async t => {
  const detector = new IdleDetector();
  await promise_rejects_js(t, TypeError, detector.start({threshold: 59000}));
}, 'start() rejects with threshold below minimum (59000)');

promise_test(async t => {
  const detector = new IdleDetector();
  await detector.start({threshold: 60000});
}, 'start() rejects threshold (60000)');

promise_test(async t => {
  const detector = new IdleDetector();
  await detector.start({threshold: 61000});
}, 'start() allows threshold (61000)');

promise_test(async t => {
  const detector = new IdleDetector();
  await promise_rejects_js(t, TypeError, detector.start({threshold: null}));
}, 'start() rejects with invalid threshold (null)');

promise_test(async t => {
  const detector = new IdleDetector();
  await promise_rejects_js(t, TypeError, detector.start({threshold: -1}));
}, 'start() rejects with invalid threshold (-1)');

promise_test(async t => {
  const detector = new IdleDetector();
  await promise_rejects_js(t, TypeError, detector.start({threshold: NaN}));
}, 'start() rejects with invalid threshold (NaN)');

promise_test(async t => {
  const detector = new IdleDetector();
  await detector.start();
}, 'start() uses a default value for the threshold when none is passed');

promise_test(async t => {
  const detector = new IdleDetector();
  await detector.start({threshold: undefined});
}, 'start() uses a default value for the threshold');
