<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/shapedetection-helpers.js"></script>
<script>

// Detectors should reject undecodable images with an InvalidStateError.
const badImageTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        name: "Face - detect(broken image)"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        name: "Barcode - detect(broken image)",
      }
    ];

for (let badImageTest of badImageTests) {
  // This test verifies that a Detector will reject an undecodable image.
  promise_test(async t => {
    const img = new Image();
    const error =
        await detectOnElementAndExpectError(badImageTest.createDetector,
                                            img, "/images/broken.png");
    assert_equals(error.name, "InvalidStateError");
  }, badImageTest.name);
}

// Detectors should reject undecodable videos with an InvalidStateError.
const badVideoTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        name: "Face - detect(broken video)"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        name: "Barcode - detect(broken video)"
      }
    ];

for (let badVideoTest of badVideoTests) {
  // This test verifies that a Detector will reject a broken video.
  promise_test(async t => {
    const video = document.createElement('video');
    const error =
        await detectOnElementAndExpectError(badVideoTest.createDetector,
                                            video, "garbage.webm");
    assert_equals(error.name, "InvalidStateError");
  }, badVideoTest.name);
}

// Returns a Promise that is resolve()d if detect() is rejected. Needs an input
// |element| (e.g. an HTMLImageElement or HTMLVideoElement) and a |url| to load.
function detectOnElementAndExpectError(createDetector, element, url) {
  return new Promise((resolve, reject) => {
    const tryDetection = async () => {
      const detector = createDetector();
      try {
        const detectionResult = await detector.detect(element);
        reject("Promise should have been rejected.");
      } catch (error) {
        resolve(error);
      }
    };
    element.onload = tryDetection;
    element.onerror = tryDetection;
    element.src = url;
  });
};

</script>
