diff --git a/.eslintrc b/.eslintrc index 6b052b1..35784c2 100644 --- a/.eslintrc +++ b/.eslintrc @@ -46,7 +46,7 @@ "no-extra-boolean-cast": 1, "no-multi-spaces": 2, "no-underscore-dangle": 0, - "comma-dangle": 2, + "comma-dangle": 0, "camelcase": 0, "curly": 2, "eqeqeq": 2, diff --git a/src/quagga.js b/src/quagga.js index 690e7a7..d0bd132 100644 --- a/src/quagga.js +++ b/src/quagga.js @@ -10,7 +10,6 @@ import {createConfigFromSource} from './input/config_factory'; function fromSource(config, source, inputConfig = {}) { config = createConfigFromSource(config, inputConfig, source); - console.log(config); const scanner = createScanner(); return { addEventListener(eventType, cb) { @@ -36,6 +35,7 @@ function fromSource(config, source, inputConfig = {}) { return this; }, toPromise() { + // how to cancel?? timeout! return new Promise((resolve, reject) => { scanner.decodeSingle(config, (result) => { if (result && result.codeResult && result.codeResult.code) { diff --git a/test/integration/integration.spec.js b/test/integration/integration.spec.js index fdd4a0b..421f5d2 100644 --- a/test/integration/integration.spec.js +++ b/test/integration/integration.spec.js @@ -47,7 +47,7 @@ describe('decodeSingle', function () { config.readers = readers; Quagga .config(config) - .fromImage(config.src) + .fromSource(config.src) .addEventListener('processed', function(result){ console.log(sample.name); expect(result.codeResult.code).to.equal(sample.result); diff --git a/test/spec/camera_access.spec.js b/test/spec/camera_access.spec.js index 40bf977..d2cac72 100644 --- a/test/spec/camera_access.spec.js +++ b/test/spec/camera_access.spec.js @@ -5,173 +5,175 @@ var originalURL, video, stream; -beforeEach(function() { - var tracks = [{ - stop: function() {} - }]; - - originalURL = window.URL; - originalMediaStreamTrack = window.MediaStreamTrack; - window.MediaStreamTrack = {}; - window.URL = { - createObjectURL(stream) { - return stream; - } - }; - - stream = { - getVideoTracks: function() { - return tracks; - } - }; - sinon.spy(tracks[0], "stop"); - - video = { - srcObject: null, - addEventListener: function() {}, - removeEventListener: function() {}, - setAttribute: sinon.spy(), - play: function() {}, - videoWidth: 320, - videoHeight: 480 - }; - sinon.stub(video, "addEventListener", function(event, cb) { - cb(); - }); - sinon.stub(video, "play"); -}); - -afterEach(function() { - window.URL = originalURL; - window.MediaStreamTrack = originalMediaStreamTrack; -}); - -describe('success', function() { +describe("CameraAccess", () => { beforeEach(function() { - sinon.stub(navigator.mediaDevices, "getUserMedia", function(constraints) { - return Promise.resolve(stream); + var tracks = [{ + stop: function() {} + }]; + + originalURL = window.URL; + originalMediaStreamTrack = window.MediaStreamTrack; + window.MediaStreamTrack = {}; + window.URL = { + createObjectURL() { + return stream; + } + }; + + stream = { + getVideoTracks: function() { + return tracks; + } + }; + sinon.spy(tracks[0], "stop"); + + video = { + srcObject: null, + addEventListener: function() {}, + removeEventListener: function() {}, + setAttribute: sinon.spy(), + play: function() {}, + videoWidth: 320, + videoHeight: 480 + }; + sinon.stub(video, "addEventListener", function(event, cb) { + cb(); }); + sinon.stub(video, "play"); }); afterEach(function() { - navigator.mediaDevices.getUserMedia.restore(); + window.URL = originalURL; + window.MediaStreamTrack = originalMediaStreamTrack; }); - describe('request', function () { - it('should request the camera', function (done) { - CameraAccess.request(video, {}) - .then(function () { - expect(navigator.mediaDevices.getUserMedia.calledOnce).to.equal(true); - expect(video.srcObject).to.deep.equal(stream); - done(); - }) - }); - it("should allow deprecated constraints to be used", (done) => { - CameraAccess.request(video, { - width: 320, - height: 240, - facing: "user", - minAspectRatio: 2, - maxAspectRatio: 100 - }) - .then(function () { - const call = navigator.mediaDevices.getUserMedia.getCall(0), - args = call.args; - expect(call).to.be.defined; - expect(args[0].video.width).to.equal(320); - expect(args[0].video.height).to.equal(240); - expect(args[0].video.facingMode).to.equal("user"); - expect(args[0].video.aspectRatio).to.equal(2); - expect(args[0].video.facing).not.to.be.defined; - expect(args[0].video.minAspectRatio).not.to.be.defined; - expect(args[0].video.maxAspectRatio).not.to.be.defined; - done(); - }) + describe('success', function() { + beforeEach(function() { + sinon.stub(navigator.mediaDevices, "getUserMedia", function(constraints) { + return Promise.resolve(stream); + }); }); - }); - describe('facingMode fallback in Chrome', () => { - beforeEach(() => { - window.MediaStreamTrack.getSources = (cb) => { - return cb([ - {kind: "video", facing: "environment", id: "environment"}, - {kind: "audio", id: "audio"}, - {kind: "video", facing: "user", id: "user"} - ]); - }; + afterEach(function() { + navigator.mediaDevices.getUserMedia.restore(); }); + describe('request', function () { + it('should request the camera', function (done) { + CameraAccess.request(video, {}) + .then(function () { + expect(navigator.mediaDevices.getUserMedia.calledOnce).to.equal(true); + expect(video.srcObject).to.deep.equal(stream); + done(); + }); + }); - afterEach(() => { - window.MediaStreamTrack = {}; - }) - - it("should set deviceId in case facingMode is not supported", (done) => { - CameraAccess.request(video, { - facing: "user" - }) - .then(function () { - const call = navigator.mediaDevices.getUserMedia.getCall(0), - args = call.args; - expect(call).to.be.defined; - expect(args[0].video.facingMode).not.to.be.defined; - expect(args[0].video.deviceId).to.equal("user"); - done(); - }) + it("should allow deprecated constraints to be used", (done) => { + CameraAccess.request(video, { + width: 320, + height: 240, + facing: "user", + minAspectRatio: 2, + maxAspectRatio: 100 + }) + .then(function () { + const call = navigator.mediaDevices.getUserMedia.getCall(0), + args = call.args; + expect(call).to.be.defined; + expect(args[0].video.width).to.equal(320); + expect(args[0].video.height).to.equal(240); + expect(args[0].video.facingMode).to.equal("user"); + expect(args[0].video.aspectRatio).to.equal(2); + expect(args[0].video.facing).not.to.be.defined; + expect(args[0].video.minAspectRatio).not.to.be.defined; + expect(args[0].video.maxAspectRatio).not.to.be.defined; + done(); + }); + }); }); - }); - describe('release', function () { - it('should release the camera', function (done) { - CameraAccess.request(video, {}) - .then(function () { - expect(video.srcObject).to.deep.equal(stream); - CameraAccess.release(); - expect(video.srcObject.getVideoTracks()).to.have.length(1); - expect(video.srcObject.getVideoTracks()[0].stop.calledOnce).to.equal(true); - done(); + describe('facingMode fallback in Chrome', () => { + beforeEach(() => { + window.MediaStreamTrack.getSources = (cb) => { + return cb([ + {kind: "video", facing: "environment", id: "environment"}, + {kind: "audio", id: "audio"}, + {kind: "video", facing: "user", id: "user"} + ]); + }; }); - }); - }); -}); -describe('failure', function() { - describe("permission denied", function(){ - beforeEach(function() { - sinon.stub(navigator.mediaDevices, "getUserMedia", function(constraints, success, failure) { - return Promise.reject(new Error()); + afterEach(() => { + window.MediaStreamTrack = {}; }); - }); - afterEach(function() { - navigator.mediaDevices.getUserMedia.restore(); + it("should set deviceId in case facingMode is not supported", (done) => { + CameraAccess.request(video, { + facing: "user" + }) + .then(function () { + const call = navigator.mediaDevices.getUserMedia.getCall(0), + args = call.args; + expect(call).to.be.defined; + expect(args[0].video.facingMode).not.to.be.defined; + expect(args[0].video.deviceId).to.equal("user"); + done(); + }); + }); }); - it('should throw if getUserMedia not available', function(done) { - CameraAccess.request(video, {}) - .catch(function (err) { - expect(err).to.be.defined; - done(); + describe('release', function () { + it('should release the camera', function (done) { + CameraAccess.request(video, {}) + .then(function () { + expect(video.srcObject).to.deep.equal(stream); + CameraAccess.release(); + expect(video.srcObject.getVideoTracks()).to.have.length(1); + expect(video.srcObject.getVideoTracks()[0].stop.calledOnce).to.equal(true); + done(); + }); }); }); }); - describe("not available", function(){ - var originalGetUserMedia; + describe('failure', function() { + describe("permission denied", function(){ + beforeEach(function() { + sinon.stub(navigator.mediaDevices, "getUserMedia", function(constraints, success, failure) { + return Promise.reject(new Error()); + }); + }); - beforeEach(function() { - originalGetUserMedia = navigator.mediaDevices.getUserMedia; - navigator.mediaDevices.getUserMedia = undefined; - }); + afterEach(function() { + navigator.mediaDevices.getUserMedia.restore(); + }); - afterEach(function() { - navigator.mediaDevices.getUserMedia = originalGetUserMedia; + it('should throw if getUserMedia not available', function(done) { + CameraAccess.request(video, {}) + .catch(function (err) { + expect(err).to.be.defined; + done(); + }); + }); }); - it('should throw if getUserMedia not available', function(done) { - CameraAccess.request(video, {}) - .catch((err) => { - expect(err).to.be.defined; - done(); + describe("not available", function(){ + var originalGetUserMedia; + + beforeEach(function() { + originalGetUserMedia = navigator.mediaDevices.getUserMedia; + navigator.mediaDevices.getUserMedia = undefined; + }); + + afterEach(function() { + navigator.mediaDevices.getUserMedia = originalGetUserMedia; + }); + + it('should throw if getUserMedia not available', function(done) { + CameraAccess.request(video, {}) + .catch((err) => { + expect(err).to.be.defined; + done(); + }); }); }); }); diff --git a/test/spec/config_factory.spec.js b/test/spec/config_factory.spec.js index a2571d5..d169a55 100644 --- a/test/spec/config_factory.spec.js +++ b/test/spec/config_factory.spec.js @@ -9,14 +9,6 @@ MyFileList.prototype.constructor = MyFileList; const OriginalFileList = window.FileList; -beforeEach(function() { - window.FileList = MyFileList; -}); - -afterEach(function() { - window.FileList = OriginalFileList; -}); - function expectImageConfig(config) { expect(config.inputStream.type).to.equal("ImageStream"); expect(config.inputStream.sequence).to.equal(false); @@ -37,6 +29,14 @@ function expectLiveConfig(config) { } describe("createConfigFromSource", () => { + beforeEach(function() { + window.FileList = MyFileList; + }); + + afterEach(function() { + window.FileList = OriginalFileList; + }); + it("should create an image config for an image-file", () => { const file = new File([], "image.jpg", {type: 'image/jpg'}); const config = createConfigFromSource({}, {}, file); diff --git a/test/spec/result_collector.spec.js b/test/spec/result_collector.spec.js index ef45678..43d8f3f 100644 --- a/test/spec/result_collector.spec.js +++ b/test/spec/result_collector.spec.js @@ -5,99 +5,101 @@ var canvasMock, imageSize, config; -beforeEach(function() { - imageSize = {x: 320, y: 240}; - config = { - capture: true, - capacity: 20, - blacklist: [{code: "3574660239843", format: "ean_13"}], - filter: function() { - return true; - } - }; - canvasMock = { - getContext: function() { - return {}; - }, - toDataURL: sinon.spy(), - width: 0, - height: 0 - }; - sinon.stub(document, "createElement", function(type) { - if (type === "canvas") { - return canvasMock; - } +describe("ResultCollector", () => { + beforeEach(function() { + imageSize = {x: 320, y: 240}; + config = { + capture: true, + capacity: 20, + blacklist: [{code: "3574660239843", format: "ean_13"}], + filter: function() { + return true; + } + }; + canvasMock = { + getContext: function() { + return {}; + }, + toDataURL: sinon.spy(), + width: 0, + height: 0 + }; + sinon.stub(document, "createElement", function(type) { + if (type === "canvas") { + return canvasMock; + } + }); }); -}); -afterEach(function() { - document.createElement.restore(); -}); + afterEach(function() { + document.createElement.restore(); + }); -describe('create', function () { - it("should return a new collector", function() { - ResultCollector.create(config); - expect(document.createElement.calledOnce).to.be.equal(true); - expect(document.createElement.getCall(0).args[0]).to.equal("canvas"); + describe('create', function () { + it("should return a new collector", function() { + ResultCollector.create(config); + expect(document.createElement.calledOnce).to.be.equal(true); + expect(document.createElement.getCall(0).args[0]).to.equal("canvas"); + }); }); -}); -describe('addResult', function() { - beforeEach(function() { - sinon.stub(ImageDebug, "drawImage", function() {}); - }); + describe('addResult', function() { + beforeEach(function() { + sinon.stub(ImageDebug, "drawImage", function() {}); + }); - afterEach(function() { - ImageDebug.drawImage.restore(); - }); + afterEach(function() { + ImageDebug.drawImage.restore(); + }); - it("should not add result if capacity is full", function(){ - config.capacity = 1; - var collector = ResultCollector.create(config); - collector.addResult([], imageSize, {}); - collector.addResult([], imageSize, {}); - collector.addResult([], imageSize, {}); - expect(collector.getResults()).to.have.length(1); - }); + it("should not add result if capacity is full", function(){ + config.capacity = 1; + var collector = ResultCollector.create(config); + collector.addResult([], imageSize, {}); + collector.addResult([], imageSize, {}); + collector.addResult([], imageSize, {}); + expect(collector.getResults()).to.have.length(1); + }); - it("should only add results which match constraints", function(){ - var collector = ResultCollector.create(config), - results; + it("should only add results which match constraints", function(){ + var collector = ResultCollector.create(config), + results; - collector.addResult([], imageSize, {code: "423423443", format: "ean_13"}); - collector.addResult([], imageSize, {code: "3574660239843", format: "ean_13"}); - collector.addResult([], imageSize, {code: "3574660239843", format: "code_128"}); + collector.addResult([], imageSize, {code: "423423443", format: "ean_13"}); + collector.addResult([], imageSize, {code: "3574660239843", format: "ean_13"}); + collector.addResult([], imageSize, {code: "3574660239843", format: "code_128"}); - results = collector.getResults(); - expect(results).to.have.length(2); + results = collector.getResults(); + expect(results).to.have.length(2); - results.forEach(function(result) { - expect(result).not.to.deep.equal(config.blacklist[0]); + results.forEach(function(result) { + expect(result).not.to.deep.equal(config.blacklist[0]); + }); }); - }); - it("should add result if no filter is set", function() { - delete config.filter; - var collector = ResultCollector.create(config); + it("should add result if no filter is set", function() { + delete config.filter; + var collector = ResultCollector.create(config); - collector.addResult([], imageSize, {code: "423423443", format: "ean_13"}); - expect(collector.getResults()).to.have.length(1); - }); + collector.addResult([], imageSize, {code: "423423443", format: "ean_13"}); + expect(collector.getResults()).to.have.length(1); + }); - it("should not add results if filter returns false", function() { - config.filter = () => (false); - var collector = ResultCollector.create(config); + it("should not add results if filter returns false", function() { + config.filter = () => (false); + var collector = ResultCollector.create(config); - collector.addResult([], imageSize, {code: "423423443", format: "ean_13"}); - expect(collector.getResults()).to.have.length(0); - }); + collector.addResult([], imageSize, {code: "423423443", format: "ean_13"}); + expect(collector.getResults()).to.have.length(0); + }); - it("should add result if no blacklist is set", function() { - delete config.blacklist; - var collector = ResultCollector.create(config); + it("should add result if no blacklist is set", function() { + delete config.blacklist; + var collector = ResultCollector.create(config); - collector.addResult([], imageSize, {code: "3574660239843", format: "ean_13"}); - expect(collector.getResults()).to.have.length(1); + collector.addResult([], imageSize, {code: "3574660239843", format: "ean_13"}); + expect(collector.getResults()).to.have.length(1); + }); }); });