<!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 HTMLVideoElement.
const videoElementTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        mockTestName: "FaceDetectionTest",
        detectionResultTest: FaceDetectorDetectionResultTest,
        name: "Face - detect(HTMLVideoElement)"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        mockTestName: "BarcodeDetectionTest",
        detectionResultTest: BarcodeDetectorDetectionResultTest,
        name: "Barcode - detect(HTMLVideoElement)"
      },
      {
        createDetector: () => { return new TextDetector(); },
        mockTestName: "TextDetectionTest",
        detectionResultTest: TextDetectorDetectionResultTest,
        name: "Text - detect(HTMLVideoElement)"
      }
    ];

for (let videoElementTest of videoElementTests) {
  detection_test(videoElementTest.mockTestName, async (t, detectionTest) => {
    const video = document.createElement("video");
    video.src = "/media/white.webm";
    video.loop = true;
    video.autoplay = true;
    const videoWatcher = new EventWatcher(t, video, ["play", "error"]);
    video.load();
    await videoWatcher.wait_for("play");

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

function FaceDetectorDetectionResultTest(detectionResult, mockTest) {
  const imageReceivedByMock =
      mockTest.MockFaceDetectionProvider().getFrameData();
  assert_equals(imageReceivedByMock.byteLength, 307200, "Image length");
  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>
