<!DOCTYPE html>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
<script src="file:///gen/layout_test_data/mojo/public/js/mojo_bindings.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/barcodedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/facedetection_provider.mojom.js"></script>
<script src="file:///gen/services/shape_detection/public/interfaces/textdetection.mojom.js"></script>
<script src="resources/mock-barcodedetection.js"></script>
<script src="resources/mock-facedetection.js"></script>
<script src="resources/mock-textdetection.js"></script>
<script>

var createTestForImageBitmap = function(createDetector, mock,
                                        detectionResultTest) {
  async_test(function(t) {
    var img = new Image();

    img.onload = async function() {
      var imageBitmap = await createImageBitmap(img);
      var detector = createDetector();

      try {
        var detectionResult = await detector.detect(imageBitmap);
        detectionResultTest(detectionResult, mock);
        t.done();
      } catch (error) {
        assert_unreached("Error during detect(img): " + error);
      }
    }
    img.src = "../media/content/greenbox.png";
  });
};

function FaceDetectorDetectionResultTest(detectionResult, mock) {
  const imageReceivedByMock = mock.getFrameData();
  assert_equals(imageReceivedByMock.byteLength, 2500,"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, mock) {
  assert_equals(detectionResult.length, 2, "Number of barcodes");
  assert_equals(detectionResult[0].rawValue, "cats", "barcode 1");
  assert_equals(detectionResult[1].rawValue, "dogs", "barcode 2");
}

function TextDetectorDetectionResultTest(detectionResult, mock) {
  assert_equals(detectionResult.length, 2, "Number of textBlocks");
  assert_equals(detectionResult[0].rawValue, "cats", "textBlock 1");
  assert_equals(detectionResult[1].rawValue, "dogs", "textBlock 2");
}

// These tests verify that a Detector's detect() works on an ImageBitmap.
// Use the mock mojo server implemented in mock-{barcode,face}detection.js.
generate_tests(createTestForImageBitmap, [
  [
    "Face - detect(ImageBitmap)",
    () => { return new FaceDetector(); },
    mockFaceDetectionProvider,
    FaceDetectorDetectionResultTest
  ],
  [
    "Barcode - detect(ImageBitmap)",
    () => { return new BarcodeDetector(); },
    mockBarcodeDetection,
    BarcodeDetectorDetectionResultTest
  ],
  [
    "Text - detect(ImageBitmap)",
    () => { return new TextDetector(); },
    mockTextDetection,
    TextDetectorDetectionResultTest
  ]
]);

</script>
