<!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 detect()ed Detected{Barcode,Face, Text}'s individual
// fields are [SameObject].
const imageDataTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        mockTestName: "FaceDetectionTest",
        detectionResultTest: CheckDetectedFaceSameObjects,
        name: "Face - detect(ImageData), [SameObject]"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        mockTestName: "BarcodeDetectionTest",
        detectionResultTest: CheckDetectedBarcodesSameObjects,
        name: "Barcode - detect(ImageData), [SameObject]"
      },
      {
        createDetector: () => { return new TextDetector(); },
        mockTestName: "TextDetectionTest",
        detectionResultTest: CheckDetectedTextBlocksSameObjects,
        name: "Text - detect(ImageData), [SameObject]",
      }
    ];

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));
    imageDataTest.detectionResultTest(detectionResult);
  }, imageDataTest.name);
}

function CheckDetectedFaceSameObjects(detectedFaces) {
  assert_greater_than(detectedFaces.length, 0, "Number of faces");
  assert_equals(detectedFaces[0].boundingBox, detectedFaces[0].boundingBox);
  assert_equals(detectedFaces[0].landmarks, detectedFaces[0].landmarks);
}

function CheckDetectedBarcodesSameObjects(detectedBarcodes) {
  assert_greater_than(detectedBarcodes.length, 0, "Number of barcodes");
  assert_equals(detectedBarcodes[0].rawValue, detectedBarcodes[0].rawValue);
  assert_equals(detectedBarcodes[0].boundingBox, detectedBarcodes[0].boundingBox);
  assert_equals(detectedBarcodes[0].format, detectedBarcodes[0].format);
  assert_equals(detectedBarcodes[0].cornerPoints, detectedBarcodes[0].cornerPoints);
}

function CheckDetectedTextBlocksSameObjects(detectedTextBlocks) {
  assert_greater_than(detectedTextBlocks.length, 0, "Number of textBlocks");
  assert_equals(detectedTextBlocks[0].rawValue, detectedTextBlocks[0].rawValue);
  assert_equals(detectedTextBlocks[0].boundingBox, detectedTextBlocks[0].boundingBox);
}

</script>
