<!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 HTMLCanvasElement
// and on an OffscreenCanvas.
const canvasElementTests =
    [
      {
        createDetector: () => { return new FaceDetector(); },
        createCanvas: () => { return document.createElement("canvas"); },
        mockTestName: "FaceDetectionTest",
        detectionResultTest: FaceDetectorDetectionResultTest,
        name: "Face - detect(HTMLCanvasElement)"
      },
      {
        createDetector: () => { return new FaceDetector(); },
        createCanvas: () => { return new OffscreenCanvas(300, 150); },
        mockTestName: "FaceDetectionTest",
        detectionResultTest: FaceDetectorDetectionResultTest,
        name: "Face - detect(OffscreenCanvas)"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        createCanvas: () => { return document.createElement("canvas"); },
        mockTestName: "BarcodeDetectionTest",
        detectionResultTest: BarcodeDetectorDetectionResultTest,
        name: "Barcode - detect(HTMLCanvasElement)"
      },
      {
        createDetector: () => { return new BarcodeDetector(); },
        createCanvas: () => { return new OffscreenCanvas(300, 150); },
        mockTestName: "BarcodeDetectionTest",
        detectionResultTest: BarcodeDetectorDetectionResultTest,
        name: "Barcode - detect(OffscreenCanvas)"
      },
      {
        createDetector: () => { return new TextDetector(); },
        createCanvas: () => { return document.createElement("canvas"); },
        mockTestName: "TextDetectionTest",
        detectionResultTest: TextDetectorDetectionResultTest,
        name: "Text - detect(HTMLCanvasElement)"
      },
      {
        createDetector: () => { return new TextDetector(); },
        createCanvas: () => { return new OffscreenCanvas(300, 150); },
        mockTestName: "TextDetectionTest",
        detectionResultTest: TextDetectorDetectionResultTest,
        name: "Text - detect(OffscreenCanvas)"
      }
    ];

for (let canvasElementTest of canvasElementTests) {
  detection_test(canvasElementTest.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 canvas = canvasElementTest.createCanvas();
    canvas.getContext("2d").drawImage(img, 0, 0);

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

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