<!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, Text} can be passed to
// postMessage().
const postMessageTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        mockTestName: "FaceDetectionTest",
        detectionResultTest: FaceDetectorDetectionResultTest,
        name: "Face - DetectedFace can be passed to postMessage()"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        mockTestName: "BarcodeDetectionTest",
        detectionResultTest: BarcodeDetectorDetectionResultTest,
        name: "Barcode - DetectedBarcode can be passed to postMessage()"
      },
      {
        createDetector: () => { return new TextDetector(); },
        mockTestName: "TextDetectionTest",
        detectionResultTest: TextDetectorDetectionResultTest,
        name: "Text - DetectedText can be passed to postMessage()",
      },
    ];

for (let postMessageTest of postMessageTests) {
  detection_test(postMessageTest.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 = postMessageTest.createDetector();
    const detectionResult = await detector.detect(canvas.getContext("2d")
        .getImageData(0, 0, canvas.width, canvas.height));

    const msgWatcher = new EventWatcher(t, window, ['message']);
    window.postMessage(detectionResult);
    const evt = await msgWatcher.wait_for('message');
    postMessageTest.detectionResultTest(evt.data)
  }, postMessageTest.name);
}

function FaceDetectorDetectionResultTest(detectionResult) {
  assert_equals(detectionResult.length, 3, "Number of faces");
  assert_equals(detectionResult[0].landmarks.length, 2, "Number of landmarks");
  assert_object_equals(detectionResult[0].landmarks[0],
                      {type : 'eye', locations : [{x : 4.0, y : 5.0}]},
                      "landmark #1");
  assert_equals(detectionResult[0].landmarks[1].locations.length, 8,
                "Number of locations along eye");
  assert_object_equals(detectionResult[1].landmarks[0],
                      {type : 'nose', locations : [{x : 100.0, y : 50.0}]},
                      "landmark #2");
  assert_equals(detectionResult[1].landmarks[1].locations.length, 9,
                "Number of locations along nose");
}

function BarcodeDetectorDetectionResultTest(detectionResult) {
  assert_equals(detectionResult.length, 2, "Number of barcodes");
  assert_equals(detectionResult[0].rawValue, "cats", "barcode 1");
  assert_equals(detectionResult[0].format, "qr_code", "barcode 1 format");
  assert_equals(detectionResult[1].rawValue, "dogs", "barcode 2");
  assert_equals(detectionResult[1].format, "code_128", "barcode 2 format");
}

function TextDetectorDetectionResultTest(detectionResult) {
  assert_equals(detectionResult.length, 2, "Number of textBlocks");
  assert_equals(detectionResult[0].rawValue, "cats", "textBlock 1");
  assert_equals(detectionResult[1].rawValue, "dogs", "textBlock 2");
  for (let i = 0; i < detectionResult.length; i++) {
    assert_equals(detectionResult[i].boundingBox.x, detectionResult[i].cornerPoints[0].x);
    assert_equals(detectionResult[i].boundingBox.y, detectionResult[i].cornerPoints[0].y);
    assert_equals(detectionResult[i].boundingBox.width,
                  detectionResult[i].cornerPoints[2].x - detectionResult[i].cornerPoints[3].x);
    assert_equals(detectionResult[i].boundingBox.height,
                  detectionResult[i].cornerPoints[2].y - detectionResult[i].cornerPoints[1].y);
  }

}

</script>
