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

// These tests verify that detected{Face, Barcode}'s boundingBox
// should be DOMRectReadOnly.
const imageDataTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        mockTestName: "FaceDetectionTest",
        name: "Face - detectedFace.boundingBox should be DOMRectReadOnly"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        mockTestName: "BarcodeDetectionTest",
        name: "Barcode - detectedBarcode.boundingBox should be DOMRectReadOnly"
      }
    ];

for (let imageDataTest of imageDataTests) {
  detection_test(imageDataTest.mockTestName, async t => {
    const img = new Image();
    const imgWatcher = new EventWatcher(t, img, ["load", "error"]);
    img.src = "/images/green-16x16.png";
    await imgWatcher.wait_for("load");

    const canvas = document.createElement("canvas");
    canvas.getContext("2d").drawImage(img, 0, 0);

    const detector = imageDataTest.createDetector();
    const detectionResult = await detector.detect(canvas.getContext("2d")
        .getImageData(0, 0, canvas.width, canvas.height));
    CheckDetectedReadOnlyBoundingBoxes(detectionResult);
  }, imageDataTest.name);
}

function CheckDetectedReadOnlyBoundingBoxes(detectedObjects) {
  const properties =
      ['x', 'y', 'width', 'height', 'top', 'right', 'bottom', 'left'];

  detectedObjects.forEach(detectedObject => {
    properties.forEach(property => {
      assert_readonly(detectedObject.boundingBox, property);
    });
  });
}

</script>
