<!doctype html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>

<body>
<script>
'use strict';

promise_test(async t => {
  return promise_rejects_js(t, TypeError, sharedStorage.set());
}, 'sharedStorage.set with 0 argument');

promise_test(async t => {
  return promise_rejects_js(t, TypeError, sharedStorage.set("a"));
}, 'sharedStorage.set with 1 argument');

promise_test(() => {
  return sharedStorage.set("a", "b");
}, 'sharedStorage.set with 2 arguments');

promise_test(() => {
  return sharedStorage.set("a", "b", {ignoreIfPresent: true});
}, 'sharedStorage.set with options');

promise_test(async t => {
  return promise_rejects_js(t, TypeError, sharedStorage.set("a", "b", "c"));
}, 'sharedStorage.set with invalid options');

promise_test(async t => {
  try {
      await sharedStorage.set('', 'b');
  } catch (e) {
    assert_equals(e.name, 'DataError');
    return;
  }
  assert_unreached("did not reject");
}, 'sharedStorage.set with empty key');

promise_test(() => {
  return sharedStorage.append("a", "b");
}, 'sharedStorage.append');

promise_test(() => {
  return sharedStorage.clear();
}, 'sharedStorage.clear');

promise_test(() => {
  return sharedStorage.delete("a");
}, 'sharedStorage.delete');

test(() => {
  try {
    let a = new SharedStorageSetMethod('a');
  } catch (e) {
    assert_equals(e.name, 'TypeError');
    return;
  }
  assert_unreached("did not throw");
}, 'new SharedStorageSetMethod with 1 argument');

test(() => {
  let a = new SharedStorageSetMethod('a', 'b');
}, 'new SharedStorageSetMethod with 2 arguments');

test(() => {
  try {
    let a = new SharedStorageAppendMethod('a');
  } catch (e) {
    assert_equals(e.name, 'TypeError');
    return;
  }
  assert_unreached("did not throw");
}, 'new SharedStorageAppendMethod with 1 argument');

test(() => {
  let a = new SharedStorageAppendMethod('a', 'b');
}, 'new SharedStorageAppendMethod with 2 arguments');

test(() => {
  try {
    let a = new SharedStorageDeleteMethod();
  } catch (e) {
    assert_equals(e.name, 'TypeError');
    return;
  }
  assert_unreached("did not throw");
}, 'new SharedStorageDeleteMethod with no arguments');

test(() => {
  let a = new SharedStorageDeleteMethod('a');
}, 'new SharedStorageDeleteMethod with 1 argument');

test(() => {
  try {
    let a = SharedStorageClearMethod();
  } catch (e) {
    assert_equals(e.name, 'TypeError');
    return;
  }
  assert_unreached("did not throw");
}, 'call SharedStorageClearMethod() as a function');

test(() => {
  let a = new SharedStorageClearMethod();
}, 'new SharedStorageClearMethod with no arguments');

promise_test(() => {
  return sharedStorage.batchUpdate([
    new SharedStorageSetMethod("key0", "value0"),
    new SharedStorageAppendMethod("key1", "value1"),
    new SharedStorageDeleteMethod("key2"),
    new SharedStorageClearMethod()
  ], {withLock: "lock3"});
}, 'sharedStorage.batchUpdate');

promise_test(async t => {
  return promise_rejects_js(t, TypeError, sharedStorage.batchUpdate());
}, 'sharedStorage.batchUpdate without \'methods\' argument');

promise_test(async t => {
  return promise_rejects_js(t, TypeError, sharedStorage.batchUpdate(["123"]));
}, 'sharedStorage.batchUpdate with invalid \'methods\' argument');

</script>
</body>
