<!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 a Detector's detect() works on an ImageBitmap.
const imageBitmapTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        mockTestName: "FaceDetectionTest",
        detectionResultTest: FaceDetectorDetectionResultTest,
        name: "Face - detect(ImageBitmap)"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        mockTestName: "BarcodeDetectionTest",
        detectionResultTest: BarcodeDetectorDetectionResultTest,
        name: "Barcode - detect(ImageBitmap)"
      },
      {
        createDetector: () => { return new TextDetector(); },
        mockTestName: "TextDetectionTest",
        detectionResultTest: TextDetectorDetectionResultTest,
        name: "Text - detect(ImageBitmap)",
      }
    ];

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

    const detector = imageBitmapTest.createDetector();
    const detectionResult = await detector.detect(imageBitmap);
    imageBitmapTest.detectionResultTest(detectionResult, detectionTest);
  }, imageBitmapTest.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");
}

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");
}

</script>
