UNPKG

scandit-sdk

Version:

Scandit Barcode Scanner SDK for the Web

336 lines 16 kB
/* tslint:disable:no-implicit-dependencies no-any */ /** * BarcodePickerGui tests */ import test from "ava"; import * as sinon from "sinon"; import { BarcodePicker, BrowserHelper, ImageSettings, Scanner, ScanSettings } from ".."; import { BarcodePickerGui } from "./barcodePickerGui"; const defaultBarcodePickerGuiOptions = { scanner: sinon.createStubInstance(Scanner, { getScanSettings: new ScanSettings() }), originElement: document.createElement("div"), singleImageMode: false, scanningPaused: false, visible: true, guiStyle: BarcodePicker.GuiStyle.LASER, videoFit: BarcodePicker.ObjectFit.CONTAIN, laserArea: undefined, viewfinderArea: undefined, cameraUploadCallback: () => { return Promise.resolve(); }, hideLogo: false }; function defineConfigurableProperty(object, property, value) { Object.defineProperty(object, property, { value, configurable: true }); } test("constructor & destroy", async (t) => { let gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, visible: false }); gui.destroy(); t.pass(); BrowserHelper.userAgentInfo.setUA("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) " + "AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.2 Safari/605.1.15"); gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, singleImageMode: true, scanningPaused: true, guiStyle: BarcodePicker.GuiStyle.VIEWFINDER, videoFit: BarcodePicker.ObjectFit.COVER, hideLogo: true }); gui.destroy(); t.pass(); }); test("constructor visible option & isVisible & setVisible", async (t) => { let gui = new BarcodePickerGui(defaultBarcodePickerGuiOptions); t.true(gui.isVisible()); gui.setVisible(false); t.false(gui.isVisible()); gui.setVisible(true); t.true(gui.isVisible()); gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, visible: false, guiStyle: BarcodePicker.GuiStyle.VIEWFINDER }); t.false(gui.isVisible()); gui.setVisible(true); t.true(gui.isVisible()); }); test("constructor guiStyle option & setGuiStyle", async (t) => { let gui = new BarcodePickerGui(defaultBarcodePickerGuiOptions); t.is(gui.guiStyle, BarcodePicker.GuiStyle.LASER); t.false(gui.laserContainerElement.classList.contains(BarcodePickerGui.hiddenClassName)); t.true(gui.viewfinderElement.classList.contains(BarcodePickerGui.hiddenClassName)); gui.setGuiStyle(BarcodePicker.GuiStyle.VIEWFINDER); t.is(gui.guiStyle, BarcodePicker.GuiStyle.VIEWFINDER); t.true(gui.laserContainerElement.classList.contains(BarcodePickerGui.hiddenClassName)); t.false(gui.viewfinderElement.classList.contains(BarcodePickerGui.hiddenClassName)); gui.setGuiStyle(BarcodePicker.GuiStyle.NONE); t.is(gui.guiStyle, BarcodePicker.GuiStyle.NONE); t.true(gui.laserContainerElement.classList.contains(BarcodePickerGui.hiddenClassName)); t.true(gui.viewfinderElement.classList.contains(BarcodePickerGui.hiddenClassName)); gui.setGuiStyle(BarcodePicker.GuiStyle.VIEWFINDER); t.is(gui.guiStyle, BarcodePicker.GuiStyle.VIEWFINDER); gui.setGuiStyle("invalid"); t.is(gui.guiStyle, BarcodePicker.GuiStyle.NONE); t.true(gui.laserContainerElement.classList.contains(BarcodePickerGui.hiddenClassName)); t.true(gui.viewfinderElement.classList.contains(BarcodePickerGui.hiddenClassName)); gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, singleImageMode: true }); gui.flashGUI(); t.is(gui.guiStyle, BarcodePicker.GuiStyle.NONE); gui.setGuiStyle(BarcodePicker.GuiStyle.LASER); t.is(gui.guiStyle, BarcodePicker.GuiStyle.NONE); }); test("reassignOriginElement", async (t) => { const originElement1 = document.createElement("div"); const originElement2 = document.createElement("div"); const gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, originElement: originElement1 }); t.deepEqual(gui.originElement, originElement1); gui.reassignOriginElement(originElement2); t.deepEqual(gui.originElement, originElement2); gui.setVisible(false); gui.reassignOriginElement(originElement1); t.deepEqual(gui.originElement, originElement1); t.true(originElement1.classList.contains(BarcodePickerGui.hiddenClassName)); t.false(originElement2.classList.contains(BarcodePickerGui.hiddenClassName)); gui.reassignOriginElement(originElement2); t.deepEqual(gui.originElement, originElement2); t.false(originElement1.classList.contains(BarcodePickerGui.hiddenClassName)); t.true(originElement2.classList.contains(BarcodePickerGui.hiddenClassName)); }); test("flashGUI", async (t) => { const gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, guiStyle: BarcodePicker.GuiStyle.NONE }); const flashLaserSpy = sinon.spy(gui, "flashLaser"); const flashViewfinderSpy = sinon.spy(gui, "flashViewfinder"); t.is(flashLaserSpy.callCount, 0); t.is(flashViewfinderSpy.callCount, 0); gui.flashGUI(); t.is(flashLaserSpy.callCount, 0); t.is(flashViewfinderSpy.callCount, 0); gui.setGuiStyle(BarcodePicker.GuiStyle.LASER); gui.flashGUI(); t.is(flashLaserSpy.callCount, 1); t.is(flashViewfinderSpy.callCount, 0); gui.setGuiStyle(BarcodePicker.GuiStyle.VIEWFINDER); gui.flashGUI(); t.is(flashLaserSpy.callCount, 1); t.is(flashViewfinderSpy.callCount, 1); }); test("setCameraSwitcherVisible", async (t) => { const gui = new BarcodePickerGui(defaultBarcodePickerGuiOptions); gui.setCameraSwitcherVisible(false); t.true(gui.cameraSwitcherElement.classList.contains(BarcodePickerGui.hiddenClassName)); gui.setCameraSwitcherVisible(true); t.false(gui.cameraSwitcherElement.classList.contains(BarcodePickerGui.hiddenClassName)); }); test("setTorchTogglerVisible", async (t) => { const gui = new BarcodePickerGui(defaultBarcodePickerGuiOptions); gui.setTorchTogglerVisible(false); t.true(gui.torchTogglerElement.classList.contains(BarcodePickerGui.hiddenClassName)); gui.setTorchTogglerVisible(true); t.false(gui.torchTogglerElement.classList.contains(BarcodePickerGui.hiddenClassName)); }); test("resize video", async (t) => { const scanSettings = new ScanSettings(); const scanner = sinon.createStubInstance(Scanner, { getScanSettings: scanSettings }); const originElement = document.createElement("div"); const gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, originElement, scanner: scanner }); // No video dimensions available yet t.is(gui.parentElement.style.maxWidth, ""); t.is(gui.parentElement.style.maxHeight, ""); defineConfigurableProperty(originElement, "clientWidth", 100); defineConfigurableProperty(originElement, "clientHeight", 100); defineConfigurableProperty(gui.videoElement, "videoWidth", 100); defineConfigurableProperty(gui.videoElement, "videoHeight", 100); gui.setVideoFit(BarcodePicker.ObjectFit.CONTAIN); t.is(gui.parentElement.style.maxWidth, "100px"); t.is(gui.parentElement.style.maxHeight, "100px"); defineConfigurableProperty(originElement, "clientWidth", 100); defineConfigurableProperty(originElement, "clientHeight", 50); gui.resize(); t.is(gui.parentElement.style.maxWidth, "50px"); t.is(gui.parentElement.style.maxHeight, "50px"); defineConfigurableProperty(originElement, "clientWidth", 25); defineConfigurableProperty(originElement, "clientHeight", 100); gui.resize(); t.is(gui.parentElement.style.maxWidth, "25px"); t.is(gui.parentElement.style.maxHeight, "25px"); defineConfigurableProperty(originElement, "clientWidth", 100); defineConfigurableProperty(originElement, "clientHeight", 100); gui.resize(); t.is(gui.parentElement.style.maxWidth, "100px"); t.is(gui.parentElement.style.maxHeight, "100px"); gui.setVideoFit(BarcodePicker.ObjectFit.COVER); t.deepEqual(scanSettings.getBaseSearchArea(), { x: 0, y: 0, width: 1, height: 1 }); t.is(gui.parentElement.style.maxWidth, ""); t.is(gui.parentElement.style.maxHeight, ""); defineConfigurableProperty(gui.videoElement, "videoWidth", 200); defineConfigurableProperty(gui.videoElement, "videoHeight", 100); gui.setVideoFit(BarcodePicker.ObjectFit.CONTAIN); t.is(gui.parentElement.style.maxWidth, "100px"); t.is(gui.parentElement.style.maxHeight, "50px"); gui.setVideoFit(BarcodePicker.ObjectFit.COVER); t.deepEqual(scanSettings.getBaseSearchArea(), { x: 0.25, y: 0, width: 0.5, height: 1 }); t.is(gui.parentElement.style.maxWidth, ""); t.is(gui.parentElement.style.maxHeight, ""); defineConfigurableProperty(gui.videoElement, "videoWidth", 100); defineConfigurableProperty(gui.videoElement, "videoHeight", 200); gui.setVideoFit(BarcodePicker.ObjectFit.CONTAIN); t.is(gui.parentElement.style.maxWidth, "50px"); t.is(gui.parentElement.style.maxHeight, "100px"); gui.setVideoFit(BarcodePicker.ObjectFit.COVER); t.deepEqual(scanSettings.getBaseSearchArea(), { x: 0, y: 0.25, width: 1, height: 0.5 }); t.is(gui.parentElement.style.maxWidth, ""); t.is(gui.parentElement.style.maxHeight, ""); }); test("resize singleImage", async (t) => { const originElement = document.createElement("div"); const gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, originElement, singleImageMode: true }); t.is(gui.cameraUploadLabelElement.style.transform, "scale(0)"); defineConfigurableProperty(originElement, "clientWidth", 500); defineConfigurableProperty(originElement, "clientHeight", 300); gui.resize(); t.is(gui.cameraUploadLabelElement.style.transform, "scale(1)"); defineConfigurableProperty(originElement, "clientWidth", 1000); defineConfigurableProperty(originElement, "clientHeight", 600); gui.resize(); t.is(gui.cameraUploadLabelElement.style.transform, "scale(1)"); defineConfigurableProperty(originElement, "clientWidth", 250); gui.resize(); t.is(gui.cameraUploadLabelElement.style.transform, "scale(0.5)"); defineConfigurableProperty(originElement, "clientHeight", 30); gui.resize(); t.is(gui.cameraUploadLabelElement.style.transform, "scale(0.1)"); defineConfigurableProperty(originElement, "clientWidth", 5); gui.resize(); t.is(gui.cameraUploadLabelElement.style.transform, "scale(0.01)"); }); // tslint:disable-next-line:max-func-body-length test("cameraUploadFile", async (t) => { function base64StringtoPngFile(base64String) { const byteString = atob(base64String); const byteArray = new Uint8ClampedArray(byteString.length); for (let i = 0; i < byteString.length; i++) { byteArray[i] = byteString.charCodeAt(i); } return new File([byteArray], "/test", { type: "image/png" }); } let imageSettings; const scanner = sinon.createStubInstance(Scanner, { getScanSettings: new ScanSettings(), getImageSettings: sinon.stub().callsFake(() => { return imageSettings; }), applyImageSettings: sinon.stub().callsFake((newImageSettings) => { imageSettings = newImageSettings; return scanner; }) }); const gui = new BarcodePickerGui({ ...defaultBarcodePickerGuiOptions, scanner: scanner, singleImageMode: true }); Object.defineProperty(Image.prototype, "onprogress", { set: (value) => { value(new ProgressEvent("progress", { loaded: 0, total: 100, lengthComputable: true })); } }); gui.cameraUploadFile(); let fileList = [ // 4x4 white image base64StringtoPngFile("iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAQAAAAD+Fb1AAAAEElEQVR42mP8/58BDBhxMwCn1gf9tpc9tgAAAABJRU5ErkJggg==") ]; defineConfigurableProperty(gui.cameraUploadInputElement, "files", fileList); gui.cameraUploadFile(); await new Promise(resolve => { setTimeout(resolve, 200); }); t.deepEqual(scanner.getImageSettings(), { width: 4, height: 4, format: ImageSettings.Format.RGBA_8U }); fileList = [ // 1600x100 white image base64StringtoPngFile( // tslint:disable-next-line:max-line-length "iVBORw0KGgoAAAANSUhEUgAABkAAAABkCAQAAAB06DQ2AAABz0lEQVR42u3XQREAAAgDINc/9Czh+YIWpB0AAIAXERAAAEBAAAAAAQEAABAQAABAQAAAAAQEAAAQEAAAQEAAAAAEBAAAEBAAAAABAQAABAQAABAQAAAAAQEAAAQEAABAQAAAAAEBAAAEBAAAQEAAAAABAQAAEBAAAEBAAAAAAQEAABAQAABAQAAAAAQEAAAQEAAAQEAAAAAEBAAAEBAAAAABAQAABAQAAEBAAAAAAQEAAAQEAABAQAAAAAEBAAAQEAAAQEAAAAABAQAAEBAAAEBAAAAABAQAABAQAABAQAAAAAQEAAAQEAAAAAEBAAAEBAAAEBAAAAABAQAABAQAAEBAAAAAAQEAAAQEAABAQAAAAAEBAAAQEAAAQEAAAAAEBAAAEBAAAEBAAAAABAQAABAQAAAAAQEAAAQEAAAQEAAAAAEBAAAEBAAAQEAAAAABAQAABAQAAEBAAAAAAQEAABAQAABAQAAAAAEBAAAQEAAAQEAAAAAEBAAAEBAAAEBAAAAABAQAABAQAAAAAQEAAAQEAAAQEAEBAAAEBAAAEBAAAAABAQAABAQAAEBAAAAAAQEAAAQEAABAQAAAAAEBAAAQEAAAQEAAAAABAQAAuLNeC8edzcWfbQAAAABJRU5ErkJggg==") ]; defineConfigurableProperty(gui.cameraUploadInputElement, "files", fileList); gui.cameraUploadFile(); await new Promise(resolve => { setTimeout(resolve, 200); }); t.deepEqual(scanner.getImageSettings(), { width: 1440, height: 90, format: ImageSettings.Format.RGBA_8U }); fileList = [ // 100x1600 white image base64StringtoPngFile( // tslint:disable-next-line:max-line-length "iVBORw0KGgoAAAANSUhEUgAAAGQAAAZACAQAAAAlBi/FAAAE+UlEQVR42u3PAQ0AAAgDIN8/9M2hgwaknRciIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiJy2QLJ03p1wqRRzwAAAABJRU5ErkJggg==") ]; defineConfigurableProperty(gui.cameraUploadInputElement, "files", fileList); gui.cameraUploadFile(); await new Promise(resolve => { setTimeout(resolve, 200); }); t.deepEqual(scanner.getImageSettings(), { width: 90, height: 1440, format: ImageSettings.Format.RGBA_8U }); }); //# sourceMappingURL=barcodePickerGui.spec.js.map