<!DOCTYPE html>
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
<script src="resources/shapedetection-helpers.js"></script>
<body>
<img id="img" src="/images/green-16x16.png"/>
</body>
<script>

// These tests verify that a Detector's detect() works on an HTMLImageElement.
const imageElementTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        mockTestName: "FaceDetectionTest",
        detectionResultTest: FaceDetectorDetectionResultTest,
        name: "Face - detect(HTMLImageElement)"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        mockTestName: "BarcodeDetectionTest",
        detectionResultTest: BarcodeDetectorDetectionResultTest,
        name: "Barcode - detect(HTMLImageElement)",
      },
      {
        createDetector: () => { return new TextDetector(); },
        mockTestName: "TextDetectionTest",
        detectionResultTest: TextDetectorDetectionResultTest,
        name: "Text - detect(HTMLImageElement)"
      }
    ];

for (let imageElementTest of imageElementTests) {
  detection_test(imageElementTest.mockTestName, async (t, detectionTest) => {
    const img = document.getElementById("img");

    const detector = imageElementTest.createDetector();
    const detectionResult = await detector.detect(img);
    imageElementTest.detectionResultTest(detectionResult, detectionTest);
  }, imageElementTest.name);
}

function FaceDetectorDetectionResultTest(detectionResult, mockTest) {
  const imageReceivedByMock =
      mockTest.MockFaceDetectionProvider().getFrameData();
  assert_equals(imageReceivedByMock.byteLength, 1024, "Image length");
  const GREEN_PIXEL = 0xFF00FF00;
  assert_equals(imageReceivedByMock[0], GREEN_PIXEL, "Pixel color");
  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, mockTest) {
  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, mockTest) {
  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>
