scandit-sdk
Version:
Scandit Barcode Scanner SDK for the Web
619 lines • 32.6 kB
JavaScript
"use strict";
var _this = this;
Object.defineProperty(exports, "__esModule", { value: true });
var tslib_1 = require("tslib");
/* tslint:disable:no-implicit-dependencies no-any */
/**
* BarcodePickerCameraManager tests
*/
var ava_1 = tslib_1.__importDefault(require("ava"));
var sinon = tslib_1.__importStar(require("sinon"));
var __1 = require("..");
var barcodePickerCameraManager_1 = require("./barcodePickerCameraManager");
var barcodePickerGui_1 = require("./barcodePickerGui");
Object.defineProperty(screen, "width", {
writable: true
});
Object.defineProperty(screen, "height", {
writable: true
});
screen.width = 100;
screen.height = 100;
var triggerFatalErrorSpy = sinon.spy();
// Speed up times
barcodePickerCameraManager_1.BarcodePickerCameraManager.cameraAccessTimeoutMs /= 10;
barcodePickerCameraManager_1.BarcodePickerCameraManager.cameraMetadataCheckTimeoutMs /= 10;
barcodePickerCameraManager_1.BarcodePickerCameraManager.cameraMetadataCheckIntervalMs /= 10;
barcodePickerCameraManager_1.BarcodePickerCameraManager.getCapabilitiesTimeoutMs /= 10;
barcodePickerCameraManager_1.BarcodePickerCameraManager.autofocusIntervalMs /= 10;
barcodePickerCameraManager_1.BarcodePickerCameraManager.manualToAutofocusResumeTimeoutMs /= 10;
barcodePickerCameraManager_1.BarcodePickerCameraManager.manualFocusWaitTimeoutMs /= 10;
function wait(ms) {
return tslib_1.__awaiter(this, void 0, void 0, function () {
return tslib_1.__generator(this, function (_a) {
return [2 /*return*/, new Promise(function (resolve) {
setTimeout(resolve, ms);
})];
});
});
}
function fakeGetCameras(cameraAmount, cameraTypes, cameraLabels) {
if (__1.CameraAccess.getCameras.restore != null) {
__1.CameraAccess.getCameras.restore();
}
sinon.stub(__1.CameraAccess, "getCameras").resolves(
// tslint:disable-next-line:prefer-array-literal
Array.from(Array(cameraAmount), function (_, index) {
var cameraType = cameraTypes == null || cameraTypes[index] == null ? __1.Camera.Type.BACK : cameraTypes[index];
var label = cameraLabels == null || cameraLabels[index] == null
? "Fake Camera Device (" + cameraType + ")"
: cameraLabels[index];
return {
deviceId: "unknown",
groupId: "1",
kind: "videoinput",
label: label,
cameraType: cameraType
};
}));
}
function fakeAccessCameraStream(facingMode, mediaTrackCapabilities) {
if (__1.CameraAccess.accessCameraStream.restore != null) {
__1.CameraAccess.accessCameraStream.restore();
}
sinon.stub(__1.CameraAccess, "accessCameraStream").callsFake(function () {
var mediaStreamTrack = {
stop: sinon.spy(),
addEventListener: sinon.spy(),
getSettings: function () {
return {
width: 640,
height: 480,
deviceId: "1",
facingMode: facingMode
};
},
label: ""
};
if (mediaTrackCapabilities != null) {
mediaStreamTrack.getCapabilities = function () {
return mediaTrackCapabilities;
};
}
return Promise.resolve({
getTracks: function () {
return [mediaStreamTrack];
},
getVideoTracks: function () {
return [mediaStreamTrack];
}
});
});
}
function fakeAccessCameraStreamFailure(error) {
if (__1.CameraAccess.accessCameraStream.restore != null) {
__1.CameraAccess.accessCameraStream.restore();
}
sinon.stub(__1.CameraAccess, "accessCameraStream").rejects(error);
}
function fakeMediaStream(cameraManager, mediaTrackCapabilities) {
var mediaStreamTrack = {
constraints: {},
stop: sinon.spy(),
// tslint:disable-next-line:no-accessor-field-mismatch
getConstraints: function () {
return this.constraints;
},
applyConstraints: sinon.stub().callsFake(function (mediaTrackConstraints) {
mediaStreamTrack.constraints = mediaTrackConstraints;
return Promise.resolve();
})
};
if (mediaTrackCapabilities != null) {
mediaStreamTrack.getCapabilities = function () {
return mediaTrackCapabilities;
};
}
var mediaStream = {
getVideoTracks: function () {
return [mediaStreamTrack];
}
};
cameraManager.mediaStream = mediaStream;
cameraManager.storeStreamCapabilities();
return mediaStream;
}
ava_1.default("isCameraSwitcherEnabled & setCameraSwitcherEnabled", function (t) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var barcodePickerGui, cameraManager;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
cameraManager.setInteractionOptions(false, false, false, false);
t.false(cameraManager.isCameraSwitcherEnabled());
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 0);
fakeGetCameras(1);
return [4 /*yield*/, cameraManager.setCameraSwitcherEnabled(true)];
case 1:
_a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 0);
fakeGetCameras(2);
return [4 /*yield*/, cameraManager.setCameraSwitcherEnabled(true)];
case 2:
_a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 1);
t.deepEqual(barcodePickerGui.setCameraSwitcherVisible.lastCall.args, [true]);
t.true(cameraManager.isCameraSwitcherEnabled());
return [4 /*yield*/, cameraManager.setCameraSwitcherEnabled(false)];
case 3:
_a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 2);
t.deepEqual(barcodePickerGui.setCameraSwitcherVisible.lastCall.args, [false]);
t.false(cameraManager.isCameraSwitcherEnabled());
return [2 /*return*/];
}
});
}); });
ava_1.default("isTorchToggleEnabled & setTorchToggleEnabled", function (t) {
var barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
var cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
cameraManager.setInteractionOptions(false, false, false, false);
t.false(cameraManager.isTorchToggleEnabled());
t.is(barcodePickerGui.setTorchTogglerVisible.callCount, 0);
cameraManager.setTorchToggleEnabled(true);
t.is(barcodePickerGui.setTorchTogglerVisible.callCount, 0);
fakeMediaStream(cameraManager, {
torch: true
});
cameraManager.setTorchToggleEnabled(true);
t.is(barcodePickerGui.setTorchTogglerVisible.callCount, 1);
t.deepEqual(barcodePickerGui.setTorchTogglerVisible.lastCall.args, [true]);
t.true(cameraManager.isTorchToggleEnabled());
cameraManager.setTorchToggleEnabled(false);
t.is(barcodePickerGui.setTorchTogglerVisible.callCount, 2);
t.deepEqual(barcodePickerGui.setTorchTogglerVisible.lastCall.args, [false]);
t.false(cameraManager.isTorchToggleEnabled());
});
ava_1.default("isTapToFocusEnabled & setTapToFocusEnabled & isPinchToZoomEnabled & setPinchToZoomEnabled", function (t) {
var barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
var videoElementAddEventListener = sinon.spy();
var videoElementRemoveEventListener = sinon.spy();
barcodePickerGui.videoElement = {
addEventListener: videoElementAddEventListener,
removeEventListener: videoElementRemoveEventListener
};
var cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
cameraManager.setInteractionOptions(false, false, false, false);
t.false(cameraManager.isTapToFocusEnabled());
t.false(cameraManager.isPinchToZoomEnabled());
t.is(videoElementAddEventListener.callCount, 0);
cameraManager.setTapToFocusEnabled(true);
cameraManager.setPinchToZoomEnabled(true);
t.is(videoElementAddEventListener.callCount, 0);
fakeMediaStream(cameraManager);
cameraManager.setTapToFocusEnabled(true);
t.is(videoElementAddEventListener.callCount, 2);
t.true(videoElementAddEventListener.calledWith("mousedown"));
t.true(videoElementAddEventListener.calledWith("touchend"));
cameraManager.setPinchToZoomEnabled(true);
t.is(videoElementAddEventListener.callCount, 4);
t.true(videoElementAddEventListener.calledWith("touchstart"));
t.true(videoElementAddEventListener.calledWith("touchmove"));
t.true(cameraManager.isTapToFocusEnabled());
t.true(cameraManager.isPinchToZoomEnabled());
t.is(videoElementRemoveEventListener.callCount, 0);
cameraManager.setTapToFocusEnabled(false);
t.is(videoElementRemoveEventListener.callCount, 2);
t.true(videoElementRemoveEventListener.calledWith("mousedown"));
t.true(videoElementRemoveEventListener.calledWith("touchend"));
cameraManager.setPinchToZoomEnabled(false);
t.is(videoElementRemoveEventListener.callCount, 4);
t.true(videoElementRemoveEventListener.calledWith("touchstart"));
t.true(videoElementRemoveEventListener.calledWith("touchmove"));
t.false(cameraManager.isTapToFocusEnabled());
t.false(cameraManager.isPinchToZoomEnabled());
});
ava_1.default("setTorchEnabled & toggleTorch", function (t) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var barcodePickerGui, cameraManager, mediaTrackCapabilities, applyConstraintsStub;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
return [4 /*yield*/, cameraManager.setTorchEnabled(true)];
case 1:
_a.sent();
mediaTrackCapabilities = {
torch: true
};
applyConstraintsStub = (fakeMediaStream(cameraManager, mediaTrackCapabilities).getVideoTracks()[0].applyConstraints);
t.true(applyConstraintsStub.notCalled);
return [4 /*yield*/, cameraManager.setTorchEnabled(true)];
case 2:
_a.sent();
t.true(applyConstraintsStub.calledOnce);
t.true(applyConstraintsStub.calledWith({ advanced: [{ torch: true }] }));
return [4 /*yield*/, cameraManager.setTorchEnabled(false)];
case 3:
_a.sent();
t.true(applyConstraintsStub.calledTwice);
t.true(applyConstraintsStub.calledWith({ advanced: [{ torch: false }] }));
applyConstraintsStub.resetHistory();
return [4 /*yield*/, cameraManager.toggleTorch()];
case 4:
_a.sent();
t.true(applyConstraintsStub.calledOnce);
t.true(applyConstraintsStub.calledWith({ advanced: [{ torch: true }] }));
return [4 /*yield*/, cameraManager.toggleTorch()];
case 5:
_a.sent();
t.true(applyConstraintsStub.calledTwice);
t.true(applyConstraintsStub.calledWith({ advanced: [{ torch: false }] }));
return [2 /*return*/];
}
});
}); });
ava_1.default("setZoom", function (t) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var barcodePickerGui, cameraManager, mediaTrackCapabilities, applyConstraintsStub;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
return [4 /*yield*/, cameraManager.setZoom(2)];
case 1:
_a.sent();
mediaTrackCapabilities = {
zoom: {
max: 9,
min: 1,
step: 0.1
}
};
applyConstraintsStub = (fakeMediaStream(cameraManager, mediaTrackCapabilities).getVideoTracks()[0].applyConstraints);
t.true(applyConstraintsStub.notCalled);
return [4 /*yield*/, cameraManager.setZoom(0)];
case 2:
_a.sent();
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 1 }] }]);
return [4 /*yield*/, cameraManager.setZoom(1)];
case 3:
_a.sent();
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 9 }] }]);
return [4 /*yield*/, cameraManager.setZoom(0.5)];
case 4:
_a.sent();
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 5 }] }]);
return [4 /*yield*/, cameraManager.setZoom(10)];
case 5:
_a.sent();
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 9 }] }]);
return [4 /*yield*/, cameraManager.setZoom(0.25, 5)];
case 6:
_a.sent();
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 7 }] }]);
return [2 /*return*/];
}
});
}); });
ava_1.default("triggerZoomStart & triggerZoomMove", function (t) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var barcodePickerGui, cameraManager, touchStartEvent, touchStart0xEvent, touchStart25xEvent, touchStart50xEvent, mediaTrackCapabilities, applyConstraintsStub;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
touchStartEvent = {
preventDefault: sinon.spy(),
type: "touchstart"
};
touchStart0xEvent = tslib_1.__assign({}, touchStartEvent, { touches: [
{
screenX: 0,
screenY: 0
},
{
screenX: 0,
screenY: 0
}
] });
touchStart25xEvent = tslib_1.__assign({}, touchStartEvent, { touches: [
{
screenX: 0,
screenY: 0
},
{
screenX: 25,
screenY: 0
}
] });
touchStart50xEvent = tslib_1.__assign({}, touchStartEvent, { touches: [
{
screenX: 0,
screenY: 0
},
{
screenX: 50,
screenY: 0
}
] });
cameraManager.triggerZoomStart(tslib_1.__assign({}, touchStartEvent, { touches: [1] }));
cameraManager.triggerZoomMove(tslib_1.__assign({}, touchStartEvent, { touches: [1] }));
cameraManager.triggerZoomStart(touchStart25xEvent);
mediaTrackCapabilities = {
torch: true,
zoom: {
max: 9,
min: 1,
step: 0.1
}
};
applyConstraintsStub = (fakeMediaStream(cameraManager, mediaTrackCapabilities).getVideoTracks()[0].applyConstraints);
t.true(applyConstraintsStub.notCalled);
cameraManager.triggerZoomStart(touchStart0xEvent);
return [4 /*yield*/, cameraManager.setTorchEnabled(true)];
case 1:
_a.sent();
cameraManager.triggerZoomStart(touchStart0xEvent);
cameraManager.triggerZoomMove(touchStart0xEvent);
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 1 }] }]);
cameraManager.triggerZoomMove(touchStart25xEvent);
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 5 }] }]);
cameraManager.triggerZoomMove(touchStart50xEvent);
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 9 }] }]);
cameraManager.triggerZoomStart(touchStart25xEvent);
cameraManager.triggerZoomMove(touchStart0xEvent);
t.deepEqual(applyConstraintsStub.lastCall.args, [{ advanced: [{ zoom: 5 }] }]);
return [2 /*return*/];
}
});
}); });
// tslint:disable-next-line:max-func-body-length
ava_1.default("manual / auto focus", function (t) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var barcodePickerGui, cameraManager, mediaTrackCapabilities, applyConstraintsStub;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
cameraManager.triggerManualFocus({
preventDefault: sinon.spy(),
type: "touchend",
touches: [1, 2]
});
cameraManager.pinchToZoomDistance = 1;
cameraManager.triggerManualFocus({
preventDefault: sinon.spy(),
type: "mousedown"
});
cameraManager.triggerManualFocus({
preventDefault: sinon.spy(),
type: "touchend",
touches: []
});
mediaTrackCapabilities = {};
applyConstraintsStub = (fakeMediaStream(cameraManager, mediaTrackCapabilities).getVideoTracks()[0].applyConstraints);
t.true(applyConstraintsStub.notCalled);
cameraManager.triggerManualFocus();
t.true(applyConstraintsStub.notCalled);
mediaTrackCapabilities = {
focusMode: [barcodePickerCameraManager_1.MeteringMode.SINGLE_SHOT, barcodePickerCameraManager_1.MeteringMode.CONTINUOUS] // this is a weird mix
};
applyConstraintsStub = (fakeMediaStream(cameraManager, mediaTrackCapabilities).getVideoTracks()[0].applyConstraints);
t.true(applyConstraintsStub.notCalled);
cameraManager.triggerManualFocus();
t.true(applyConstraintsStub.notCalled);
// Trigger manual focus when single-shot only is supported
mediaTrackCapabilities = {
focusMode: [barcodePickerCameraManager_1.MeteringMode.SINGLE_SHOT]
};
applyConstraintsStub = (fakeMediaStream(cameraManager, mediaTrackCapabilities).getVideoTracks()[0].applyConstraints);
t.true(applyConstraintsStub.notCalled);
cameraManager.triggerManualFocus();
t.true(applyConstraintsStub.calledOnce);
t.true(applyConstraintsStub.calledWith({ advanced: [{ focusMode: barcodePickerCameraManager_1.MeteringMode.SINGLE_SHOT }] }));
// Enable background single-shot autofocus
applyConstraintsStub.resetHistory();
cameraManager.storeStreamCapabilities();
cameraManager.setupAutofocus();
return [4 /*yield*/, wait(barcodePickerCameraManager_1.BarcodePickerCameraManager.autofocusIntervalMs * 4)];
case 1:
_a.sent();
t.true(applyConstraintsStub.callCount >= 2);
t.true(applyConstraintsStub.alwaysCalledWith({ advanced: [{ focusMode: barcodePickerCameraManager_1.MeteringMode.SINGLE_SHOT }] }));
// Trigger manual focus when single-shot only is supported (while background single-shot autofocus is active)
cameraManager.triggerManualFocus();
applyConstraintsStub.resetHistory();
// Background single-shot autofocus should be disabled for a while
return [4 /*yield*/, wait(barcodePickerCameraManager_1.BarcodePickerCameraManager.autofocusIntervalMs * 2)];
case 2:
// Background single-shot autofocus should be disabled for a while
_a.sent();
t.true(applyConstraintsStub.notCalled);
return [4 /*yield*/, wait(barcodePickerCameraManager_1.BarcodePickerCameraManager.manualToAutofocusResumeTimeoutMs * 2)];
case 3:
_a.sent();
// Background single-shot autofocus should be enabled now
t.true(applyConstraintsStub.called);
t.true(applyConstraintsStub.alwaysCalledWith({ advanced: [{ focusMode: barcodePickerCameraManager_1.MeteringMode.SINGLE_SHOT }] }));
cameraManager.stopStream();
// Trigger manual focus when all focus modes are supported
mediaTrackCapabilities = {
focusMode: [barcodePickerCameraManager_1.MeteringMode.SINGLE_SHOT, barcodePickerCameraManager_1.MeteringMode.CONTINUOUS, barcodePickerCameraManager_1.MeteringMode.MANUAL]
};
applyConstraintsStub = (fakeMediaStream(cameraManager, mediaTrackCapabilities).getVideoTracks()[0].applyConstraints);
cameraManager.triggerManualFocus();
t.true(applyConstraintsStub.calledOnce);
t.true(applyConstraintsStub.calledWith({ advanced: [{ focusMode: barcodePickerCameraManager_1.MeteringMode.CONTINUOUS }] }));
applyConstraintsStub.resetHistory();
return [4 /*yield*/, wait(barcodePickerCameraManager_1.BarcodePickerCameraManager.manualFocusWaitTimeoutMs * 2)];
case 4:
_a.sent();
t.true(applyConstraintsStub.calledOnce);
t.true(applyConstraintsStub.calledWith({ advanced: [{ focusMode: barcodePickerCameraManager_1.MeteringMode.MANUAL }] }));
applyConstraintsStub.resetHistory();
return [4 /*yield*/, wait(barcodePickerCameraManager_1.BarcodePickerCameraManager.manualToAutofocusResumeTimeoutMs * 2)];
case 5:
_a.sent();
t.true(applyConstraintsStub.calledOnce);
t.true(applyConstraintsStub.calledWith({ advanced: [{ focusMode: barcodePickerCameraManager_1.MeteringMode.CONTINUOUS }] }));
return [2 /*return*/];
}
});
}); });
// tslint:disable-next-line:max-func-body-length
ava_1.default.serial("setupCameras", function (t) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
var barcodePickerGui, videoElementRemoveEventListener, cameraManager, error, mediaTrackCapabilities;
return tslib_1.__generator(this, function (_a) {
switch (_a.label) {
case 0:
barcodePickerGui = sinon.createStubInstance(barcodePickerGui_1.BarcodePickerGui);
videoElementRemoveEventListener = sinon.spy();
barcodePickerGui.videoElement = {
loadedmetadataEventListener: null,
addEventListener: function (eventType, listener) {
if (eventType === "loadedmetadata") {
this.loadedmetadataEventListener = listener;
}
},
removeEventListener: videoElementRemoveEventListener,
dispatchEvent: sinon.spy()
};
barcodePickerGui.videoElement.load = function () {
var _this = this;
this.loadedmetadataEventListener();
this.videoWidth = 640;
this.videoHeight = 480;
this.currentTime = 0;
this.onloadeddata();
setTimeout(function () {
_this.currentTime = 1;
}, barcodePickerCameraManager_1.BarcodePickerCameraManager.cameraMetadataCheckIntervalMs * 2);
};
cameraManager = new barcodePickerCameraManager_1.BarcodePickerCameraManager(triggerFatalErrorSpy, barcodePickerGui);
cameraManager.setInteractionOptions(true, true, true, true);
t.true(cameraManager.isCameraSwitcherEnabled());
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 0);
// Intentionally make optimistic initial back camera access fail
fakeAccessCameraStream("user");
fakeGetCameras(2, [__1.Camera.Type.FRONT, __1.Camera.Type.FRONT]);
return [4 /*yield*/, cameraManager.setupCameras()];
case 1:
_a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 1);
barcodePickerGui.setCameraSwitcherVisible.resetHistory();
t.is(__1.CameraAccess.accessCameraStream.callCount, 2);
t.is(__1.CameraAccess.getCameras.callCount, 1);
cameraManager.selectedCamera = undefined;
fakeAccessCameraStream("user");
fakeGetCameras(2, [__1.Camera.Type.BACK, __1.Camera.Type.FRONT]);
return [4 /*yield*/, cameraManager.setupCameras()];
case 2:
_a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 1);
barcodePickerGui.setCameraSwitcherVisible.resetHistory();
t.is(__1.CameraAccess.accessCameraStream.callCount, 2);
t.is(__1.CameraAccess.getCameras.callCount, 1);
cameraManager.selectedCamera = undefined;
fakeAccessCameraStream("user");
fakeGetCameras(0);
return [4 /*yield*/, t.throwsAsync(cameraManager.setupCameras())];
case 3:
error = _a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 0);
t.is(error.message, "No camera available");
// Access primary back camera in common triple camera setups
cameraManager.selectedCamera = undefined;
fakeAccessCameraStream("user");
fakeGetCameras(3, [__1.Camera.Type.FRONT, __1.Camera.Type.BACK, __1.Camera.Type.BACK], ["", "camera2 2, facing back", "camera2 0, facing back"]);
return [4 /*yield*/, cameraManager.setupCameras()];
case 4:
_a.sent();
t.not(cameraManager.selectedCamera, null);
t.is(cameraManager.selectedCamera.label, "camera2 0, facing back");
mediaTrackCapabilities = {
torch: true
};
cameraManager.selectedCamera = undefined;
fakeAccessCameraStream("environment", mediaTrackCapabilities);
fakeGetCameras(1);
barcodePickerGui.setCameraSwitcherVisible.resetHistory();
return [4 /*yield*/, cameraManager.setupCameras()];
case 5:
_a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 0);
t.is(__1.CameraAccess.accessCameraStream.callCount, 2);
t.is(__1.CameraAccess.getCameras.callCount, 1);
return [4 /*yield*/, wait(barcodePickerCameraManager_1.BarcodePickerCameraManager.getCapabilitiesTimeoutMs * 2)];
case 6:
_a.sent();
t.deepEqual(cameraManager.mediaTrackCapabilities, mediaTrackCapabilities);
mediaTrackCapabilities = {
torch: false,
focusMode: [barcodePickerCameraManager_1.MeteringMode.SINGLE_SHOT]
};
cameraManager.selectedCamera = undefined;
fakeAccessCameraStream("environment", mediaTrackCapabilities);
fakeGetCameras(2);
return [4 /*yield*/, cameraManager.setupCameras()];
case 7:
_a.sent();
t.is(barcodePickerGui.setCameraSwitcherVisible.callCount, 1);
t.is(__1.CameraAccess.accessCameraStream.callCount, 2);
t.is(__1.CameraAccess.getCameras.callCount, 1);
return [4 /*yield*/, wait(barcodePickerCameraManager_1.BarcodePickerCameraManager.getCapabilitiesTimeoutMs * 2)];
case 8:
_a.sent();
t.deepEqual(cameraManager.mediaTrackCapabilities, mediaTrackCapabilities);
barcodePickerGui.videoElement.load = function () {
this.loadedmetadataEventListener();
this.videoWidth = 640;
this.videoHeight = 480;
this.currentTime = 0;
this.onloadeddata();
// Intentionally never have valid metadata
};
return [4 /*yield*/, t.throwsAsync(cameraManager.setupCameras())];
case 9:
error = _a.sent();
t.is(error.message, "Could not initialize camera correctly");
barcodePickerGui.videoElement.load = function () {
this.loadedmetadataEventListener();
// Intentionally never call onloadeddata()
};
return [4 /*yield*/, t.throwsAsync(cameraManager.setupCameras())];
case 10:
error = _a.sent();
t.is(error.message, "Could not initialize camera correctly");
fakeAccessCameraStreamFailure(new Error("Test error 1"));
fakeGetCameras(1);
cameraManager.selectedCamera = undefined;
return [4 /*yield*/, t.throwsAsync(cameraManager.setupCameras())];
case 11:
error = _a.sent();
t.is(error.message, "Test error 1");
t.true(__1.CameraAccess.accessCameraStream
.getCall(0)
.calledBefore(__1.CameraAccess.getCameras.firstCall));
t.true(__1.CameraAccess.accessCameraStream
.getCall(4)
.calledAfter(__1.CameraAccess.getCameras.firstCall));
t.is(__1.CameraAccess.accessCameraStream.callCount, 8); // 2 times 4 calls (resolution fallbacks)
t.is(__1.CameraAccess.getCameras.callCount, 1);
fakeAccessCameraStreamFailure(new Error("Test error 2"));
fakeGetCameras(1);
return [4 /*yield*/, t.throwsAsync(cameraManager.setupCameras())];
case 12:
error = _a.sent();
t.is(error.message, "Test error 2");
t.true(__1.CameraAccess.accessCameraStream
.getCall(0)
.calledAfter(__1.CameraAccess.getCameras.firstCall));
t.is(__1.CameraAccess.accessCameraStream.callCount, 4); // 1 time 4 calls (resolution fallbacks)
t.is(__1.CameraAccess.getCameras.callCount, 1);
return [2 /*return*/];
}
});
}); });
//# sourceMappingURL=barcodePickerCameraManager.spec.js.map