<!doctype html>
<meta charset="utf-8">
<title>ClipboardItem tests</title>
<link rel="help" href="https://w3c.github.io/clipboard-apis/#async-clipboard-api">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script>

const blob = new Blob(['hello'], {type: 'text/plain'});
const blob2 = new Blob(['this should work'], {type: 'not a/real type'});

test(() => {
  new ClipboardItem({'text/plain': blob});
  new ClipboardItem({'text/plain': blob, 'not a/real type': blob2});
}, "ClipboardItem({string, Blob}) succeeds with different types");

test(() => {
  new ClipboardItem({'text/plain': blob}, {});
}, "ClipboardItem() succeeds with empty options");

test(() => {
  assert_throws_js(TypeError, () => {new ClipboardItem({});});
}, "ClipboardItem({}) fails with empty dictionary input");

test(() => {
  assert_throws_js(TypeError, () => {new ClipboardItem(blob);});
}, "ClipboardItem(Blob) fails");

test(() => {
  assert_throws_js(TypeError, () => {new ClipboardItem(null);});
}, "ClipboardItem() fails with null input");

test(() => {
  assert_throws_js(TypeError, () => {new ClipboardItem();});
}, "ClipboardItem() fails with no input");

test(() => {
  const item = new ClipboardItem({'text/plain': blob});
  const types = item.types;
  assert_equals(types.length, 1);
  assert_equals(types[0], 'text/plain');
  const item2 =
      new ClipboardItem({'text/plain': blob, 'not a/real type': blob2});
  const types2 = item2.types;
  assert_equals(types2.length, 2);
  assert_equals(types2[0], 'text/plain');
  assert_equals(types2[1], 'not a/real type');
}, "types() returns correct values");

test(() => {
  const item = new ClipboardItem({'text/plain': blob});
  assert_equals(item.raw, false);

  const item2 = new ClipboardItem({'text/plain': blob}, {});
  assert_equals(item2.raw, false);

  const item3 = new ClipboardItem({'text/plain': blob}, {raw: false});
  assert_equals(item3.raw, false);

  const item4 = new ClipboardItem({'text/plain': blob}, {raw: true});
  assert_equals(item4.raw, true);
}, "raw() returns correct values, defaulting to false");

promise_test(async () => {
  const item =
      new ClipboardItem({'text/plain': blob, 'not a/real type': blob2});

  const blobOutput = await item.getType('text/plain');
  assert_true(blobOutput.type.includes('text/plain'));
  const text = await (new Response(blobOutput)).text();

  assert_equals('hello', text);
}, "getType(DOMString valid type) succeeds with correct output");

promise_test(async () => {
  const item =
      new ClipboardItem({'text/plain': blob, 'not a/real type': blob2});

  const blobOutput = await item.getType('not a/real type');
  assert_true(blobOutput.type.includes('not a/real type'));
  const text = await (new Response(blobOutput)).text();

  assert_equals('this should work', text);
}, "getType(DOMString invalid type) succeeds with correct output");

promise_test(async t => {
  const item =
      new ClipboardItem({'text/plain': blob, 'not a/real type': blob2});
  promise_rejects_dom(t, "NotFoundError", item.getType('type not in item'));
  promise_rejects_dom(t, "NotFoundError", item.getType('text/plain:subtype'));
}, "getType(DOMString type) rejects correctly when querying for missing type");
</script>
