UNPKG

johnny-five

Version:

The JavaScript Robotics and Hardware Programming Framework. Use with: Arduino (all models), Electric Imp, Beagle Bone, Intel Galileo & Edison, Linino One, Pinoccio, pcDuino3, Raspberry Pi, Particle/Spark Core & Photon, Tessel 2, TI Launchpad and more!

1,160 lines (908 loc) 27.7 kB
var MockFirmata = require("./util/mock-firmata"), five = require("../lib/johnny-five.js"), sinon = require("sinon"), Board = five.Board, Temperature = five.Temperature; function newBoard() { var io = new MockFirmata(); var board = new Board({ io: io, debug: false, repl: false }); io.emit("connect"); io.emit("ready"); return board; } function restore(target) { for (var prop in target) { if (Array.isArray(target[prop])) { continue; } if (target[prop] != null && typeof target[prop].restore === "function") { target[prop].restore(); } if (typeof target[prop] === "object") { restore(target[prop]); } } } // Global suite setUp exports.setUp = function(done) { // Base Shape for all Temperature tests this.proto = []; this.instance = [{ name: "celsius" }, { name: "fahrenheit" }, { name: "kelvin" }, { name: "C" }, { name: "F" }, { name: "K" }]; this.board = newBoard(); this.sandbox = sinon.sandbox.create(); this.clock = sinon.useFakeTimers(); this.freq = 100; done(); }; exports.tearDown = function(done) { Board.purge(); this.sandbox.restore(); this.clock.restore(); done(); }; function createAnalog(toCelsius) { return new Temperature({ pins: ["A0"], toCelsius: toCelsius, freq: this.freq, board: this.board }); } function makeTestAnalogConversion(opts) { return function testAnalogConversion(test) { var spy = this.sandbox.spy(); test.expect(15); if (opts.aref) { this.temperature.aref = opts.aref; } this.temperature.on("data", spy); this.analogRead.firstCall.yield(opts.raw); test.equal(spy.callCount, 0); test.equal(Math.round(this.temperature.C), opts.C, "temp.C"); test.equal(Math.round(this.temperature.celsius), opts.C, "temp.celsius"); test.equal(Math.round(this.temperature.K), opts.K, "temp.K"); test.equal(Math.round(this.temperature.kelvin), opts.K, "temp.kelvin"); test.equal(Math.round(this.temperature.F), opts.F, "temp.F"); test.equal(Math.round(this.temperature.fahrenheit), opts.F, "temp.fahrenheit"); this.clock.tick(this.freq); test.equal(spy.callCount, 1); var data = spy.firstCall.args[0]; test.equal(Math.round(data.C), opts.C, "data.C"); test.equal(Math.round(data.celsius), opts.C, "data.celsius"); test.equal(Math.round(data.K), opts.K, "data.K"); test.equal(Math.round(data.kelvin), opts.K, "data.kelvin"); test.equal(Math.round(data.F), opts.F, "data.F"); test.equal(Math.round(data.fahrenheit), opts.F, "data.fahrenheit"); this.clock.tick(this.freq); test.equal(spy.callCount, 2); test.done(); }; } function testAnalogChange(test) { var raw = this.analogRead.firstCall.yield.bind(this.analogRead.firstCall), spy = this.sandbox.spy(); test.expect(1); this.temperature.on("change", spy); raw(100); this.clock.tick(this.freq); raw(100); this.clock.tick(this.freq); raw(200); this.clock.tick(this.freq); raw(100); this.clock.tick(this.freq); raw(200); this.clock.tick(this.freq); raw(200); this.clock.tick(this.freq); test.equal(spy.callCount, 4); test.done(); } function testShape(test) { test.expect(this.proto.length + this.instance.length); this.proto.forEach(function testProtoMethods(method) { test.equal(typeof this.temperature[method.name], "function", method.name); }, this); this.instance.forEach(function testInstanceProperties(property) { test.notEqual(typeof this.temperature[property.name], "undefined", property.name); }, this); test.done(); } exports["Temperature -- ANALOG"] = { setUp: function(done) { this.analogRead = this.sandbox.stub(MockFirmata.prototype, "analogRead"); this.analogRead.yields(0); this.proto.push({ name: "toCelsius" }); done(); }, "picks aref from board.io": function(test) { this.board.io.aref = 3.3; this.temperature = createAnalog.call(this); test.expect(1); test.equal(this.temperature.aref, this.board.io.aref); test.done(); }, "picks aref from options": function(test) { this.board.io.aref = 3.3; this.temperature = new Temperature({ aref: 1.8, pins: ["A0"], freq: this.freq, board: this.board }); test.expect(1); test.equal(this.temperature.aref, 1.8); test.done(); }, "no controller": { setUp: function(done) { this.temperature = createAnalog.call(this); done(); }, shape: testShape, change: testAnalogChange, rawData: makeTestAnalogConversion({ raw: 50, C: 50, F: 122, K: 323 }), }, "custom toCelsius": { setUp: function(done) { this.toCelsius = this.sandbox.stub().returns(22); this.temperature = createAnalog.call(this, this.toCelsius); done(); }, shape: testShape, conversion: makeTestAnalogConversion({ raw: 50, C: 22, F: 72, K: 295 }), "raw doesnt matter": makeTestAnalogConversion({ raw: 100, C: 22, F: 72, K: 295 }), "toCelsius receives raw": function(test) { test.expect(6); this.analogRead.yield(10); test.equal(this.toCelsius.callCount, 0); test.equal(this.temperature.C, 22); test.equal(this.toCelsius.callCount, 1); test.equal(this.toCelsius.firstCall.args[0], 10); this.toCelsius.reset(); this.analogRead.yield(100); test.equal(this.temperature.C, 22); test.equal(this.toCelsius.firstCall.args[0], 100); test.done(); }, }, LM335: { setUp: function(done) { this.temperature = new Temperature({ controller: "LM335", pins: ["A0"], freq: 100, board: this.board }); done(); }, shape: testShape, aref: makeTestAnalogConversion({ aref: 3.3, raw: 950, C: 33, F: 91, K: 306 }), data: makeTestAnalogConversion({ raw: 100, C: -224, F: -372, K: 49, }), change: testAnalogChange, }, LM35: { setUp: function(done) { this.temperature = new Temperature({ controller: "LM35", pins: ["A0"], freq: 100, board: this.board }); done(); }, shape: testShape, aref: makeTestAnalogConversion({ aref: 3.3, raw: 200, C: 64, F: 148, K: 338 }), data: makeTestAnalogConversion({ raw: 200, C: 98, F: 208, K: 371 }), change: testAnalogChange, }, TMP36: { setUp: function(done) { this.temperature = new Temperature({ controller: "TMP36", pins: ["A0"], freq: this.freq, board: this.board }); done(); }, shape: testShape, change: testAnalogChange, aref: makeTestAnalogConversion({ aref: 3.3, raw: 150, C: -2, F: 29, K: 271 }), data: makeTestAnalogConversion({ raw: 150, C: 23, F: 74, K: 296 }), }, TMP102: { setUp: function(done) { this.i2cConfig = sinon.spy(MockFirmata.prototype, "i2cConfig"); this.i2cRead = sinon.spy(MockFirmata.prototype, "i2cRead"); this.temperature = new Temperature({ controller: "TMP102", freq: this.freq, board: this.board }); done(); }, tearDown: function(done) { Board.purge(); restore(this); done(); }, shape: testShape, value: function(test) { var raw = this.i2cRead.args[0][3]; test.expect(1); raw([100, 100]); test.equals(this.temperature.celsius, 100.375); test.done(); }, negative: function(test) { var raw = this.i2cRead.args[0][3]; test.expect(2); raw([0xFF, 0x00]); test.equals(this.temperature.celsius, -1); raw([0xE2, 0x44]); test.equals(this.temperature.celsius, -29.75); test.done(); }, change: function(test) { var changeHandler = sinon.spy(); var raw = this.i2cRead.args[0][3]; test.expect(1); this.temperature.on("change", changeHandler); raw([100, 0]); this.clock.tick(this.freq); raw([100, 0]); this.clock.tick(this.freq); raw([200, 0]); this.clock.tick(this.freq); raw([100, 0]); this.clock.tick(this.freq); raw([200, 0]); this.clock.tick(this.freq); raw([200, 0]); this.clock.tick(this.freq); test.equal(changeHandler.callCount, 4); test.done(); } }, GROVE: { setUp: function(done) { this.temperature = new Temperature({ controller: "GROVE", pin: "A0", freq: 100, board: this.board }); done(); }, shape: testShape, aref: makeTestAnalogConversion({ aref: 3.3, raw: 659, C: 39, F: 102, K: 312, }), data: makeTestAnalogConversion({ raw: 659, C: 39, F: 102, K: 312, }), }, TINKERKIT: { setUp: function(done) { this.temperature = new Temperature({ controller: "TINKERKIT", pin: "A0", freq: 100, board: this.board }); done(); }, aref: makeTestAnalogConversion({ aref: 3.3, raw: 810, C: 39, F: 102, K: 312, }), data: makeTestAnalogConversion({ raw: 810, C: 39, F: 102, K: 312, }), }, }; function createDS18B20(pin, address) { return new Temperature({ controller: "DS18B20", pin: pin, address: address, freq: 100, board: this.board }); } exports["Temperature -- DS18B20"] = { setUp: function(done) { this.pin = 2; this.sendOneWireConfig = this.sandbox.spy(MockFirmata.prototype, "sendOneWireConfig"); this.sendOneWireSearch = this.sandbox.spy(MockFirmata.prototype, "sendOneWireSearch"); this.sendOneWireDelay = this.sandbox.spy(MockFirmata.prototype, "sendOneWireDelay"); this.sendOneWireReset = this.sandbox.spy(MockFirmata.prototype, "sendOneWireReset"); this.sendOneWireWrite = this.sandbox.spy(MockFirmata.prototype, "sendOneWireWrite"); this.sendOneWireWriteAndRead = this.sandbox.spy(MockFirmata.prototype, "sendOneWireWriteAndRead"); done(); }, tearDown: function(done) { Temperature.Drivers.clear(); done(); }, initialize: function(test) { var device = [0x28, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF]; var search; test.expect(5); this.temperature = createDS18B20(this.pin); search = this.sendOneWireSearch.args[0][1]; search(null, [device]); test.ok(this.sendOneWireConfig.calledOnce); test.equals(this.sendOneWireConfig.args[0][0], this.pin); test.ok(this.sendOneWireSearch.calledOnce); test.equals(this.sendOneWireSearch.args[0][0], this.pin); test.equals(this.temperature.address, 0x050403020100); test.done(); }, data: function(test) { var device = [0x28, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF]; var search, data; var spy = this.sandbox.spy(); test.expect(18); this.temperature = createDS18B20(this.pin); this.temperature.on("data", spy); search = this.sendOneWireSearch.args[0][1]; search(null, [device]); data = this.sendOneWireWriteAndRead.args[0][4]; data(null, [0x01, 0x02]); test.ok(this.sendOneWireReset.calledTwice); test.equals(this.sendOneWireReset.args[0], this.pin); test.ok(this.sendOneWireWrite.calledOnce); test.equals(this.sendOneWireWrite.args[0][0], this.pin); test.equals(this.sendOneWireWrite.args[0][1], device); test.equals(this.sendOneWireWrite.args[0][2], 0x44); test.ok(this.sendOneWireDelay.calledOnce); test.equals(this.sendOneWireDelay.args[0][0], this.pin); test.equals(this.sendOneWireDelay.args[0][1], 1); test.equals(this.sendOneWireReset.args[1], 2); test.ok(this.sendOneWireWriteAndRead.calledOnce); test.equals(this.sendOneWireWriteAndRead.args[0][0], this.pin); test.equals(this.sendOneWireWriteAndRead.args[0][1], device); test.equals(this.sendOneWireWriteAndRead.args[0][2], 0xBE); test.equals(this.sendOneWireWriteAndRead.args[0][3], 2); this.clock.tick(100); test.equals(Math.round(spy.getCall(0).args[0].celsius), 32); test.equals(Math.round(spy.getCall(0).args[0].fahrenheit), 90); test.equals(Math.round(spy.getCall(0).args[0].kelvin), 305); test.done(); }, address: function(test) { var device1 = [0x28, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF]; var device2 = [0x28, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0xFF]; var search; test.expect(3); this.temperature = createDS18B20(this.pin, 0x554433221100); search = this.sendOneWireSearch.args[0][1]; search(null, [device1, device2]); test.equals(this.sendOneWireWrite.args[0][1], device2); test.equals(this.sendOneWireWriteAndRead.args[0][1], device2); test.equals(this.temperature.address, 0x554433221100); test.done(); }, twoAddressedUnits: function(test) { var spyA = this.sandbox.spy(); var spyB = this.sandbox.spy(); var deviceA = [0x28, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0xFF]; var deviceB = [0x28, 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0xFF]; var search, data; test.expect(2); this.temperatureA = createDS18B20(this.pin, 0x554433221100); this.temperatureA.on("data", spyA); this.temperatureB = createDS18B20(this.pin, 0x050403020100); this.temperatureB.on("data", spyB); search = this.sendOneWireSearch.args[0][1]; search(null, [deviceA, deviceB]); data = this.sendOneWireWriteAndRead.args[0][4]; data(null, [0x01, 0x02]); data = this.sendOneWireWriteAndRead.args[1][4]; data(null, [0x03, 0x04]); this.clock.tick(100); test.equals(Math.round(spyA.getCall(0).args[0].celsius), 32); test.equals(Math.round(spyB.getCall(0).args[0].celsius), 64); test.done(); }, twoAddresslessUnitsThrowsError: function(test) { var failedToCreate = false; test.expect(1); this.temperature = createDS18B20(this.pin); try { createDS18B20(this.pin); } catch (err) { failedToCreate = true; } test.equals(failedToCreate, true); test.done(); } }; exports["Temperature -- MPU6050"] = { setUp: function(done) { this.i2cConfig = this.sandbox.spy(MockFirmata.prototype, "i2cConfig"); this.i2cWrite = this.sandbox.spy(MockFirmata.prototype, "i2cWrite"); this.i2cRead = this.sandbox.spy(MockFirmata.prototype, "i2cRead"); this.temperature = new Temperature({ controller: "MPU6050", freq: 100, board: this.board }); done(); }, fwdOptionsToi2cConfig: function(test) { test.expect(3); this.i2cConfig.reset(); new Temperature({ controller: "MPU6050", address: 0xff, bus: "i2c-1", board: this.board }); var forwarded = this.i2cConfig.lastCall.args[0]; test.equal(this.i2cConfig.callCount, 1); test.equal(forwarded.address, 0xff); test.equal(forwarded.bus, "i2c-1"); test.done(); }, data: function(test) { var read, spy = this.sandbox.spy(); test.expect(12); this.temperature.on("data", spy); read = this.i2cRead.args[0][3]; read([ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // accelerometer 0x11, 0x22, // temperature 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 // gyro ]); test.ok(this.i2cConfig.calledOnce); test.ok(this.i2cWrite.calledOnce); test.equals(this.i2cWrite.args[0][0], 0x68); test.deepEqual(this.i2cWrite.args[0][1], [0x6B, 0x00]); test.ok(this.i2cRead.calledOnce); test.equals(this.i2cRead.args[0][0], 0x68); test.deepEqual(this.i2cRead.args[0][1], 0x3B); test.equals(this.i2cRead.args[0][2], 14); this.clock.tick(100); test.ok(spy.calledOnce); test.equals(Math.round(spy.getCall(0).args[0].celsius), 49); test.equals(Math.round(spy.getCall(0).args[0].fahrenheit), 121); test.equals(Math.round(spy.getCall(0).args[0].kelvin), 323); test.done(); } }; exports["Temperature -- MPL115A2"] = { setUp: function(done) { this.i2cConfig = this.sandbox.spy(MockFirmata.prototype, "i2cConfig"); this.i2cWrite = this.sandbox.spy(MockFirmata.prototype, "i2cWrite"); this.i2cRead = this.sandbox.spy(MockFirmata.prototype, "i2cRead"); this.i2cReadOnce = this.sandbox.spy(MockFirmata.prototype, "i2cReadOnce"); this.temperature = new Temperature({ controller: "MPL115A2", board: this.board, freq: 10 }); done(); }, tearDown: function(done) { Board.purge(); restore(this); done(); }, fwdOptionsToi2cConfig: function(test) { test.expect(3); this.i2cConfig.reset(); new Temperature({ controller: "MPL115A2", address: 0xff, bus: "i2c-1", board: this.board }); var forwarded = this.i2cConfig.lastCall.args[0]; test.equal(this.i2cConfig.callCount, 1); test.equal(forwarded.address, 0xff); test.equal(forwarded.bus, "i2c-1"); test.done(); }, data: function(test) { test.expect(8); // var spy = sinon.spy(); // this.temperature.on("data", spy); var readOnce = this.i2cReadOnce.firstCall.args[3]; readOnce([ 67, 111, // A0 176, 56, // B1 179, 101, // B2 56, 116 // C12 ]); // In order to handle the Promise used for initialization, // there can be no fake timers in this test, which means we // can't use the clock.tick to move the interval forward // in time. this.clock.restore(); setImmediate(function() { test.ok(this.i2cConfig.calledOnce); test.ok(this.i2cWrite.calledOnce); test.equals(this.i2cWrite.firstCall.args[0], 0x60); test.deepEqual(this.i2cWrite.firstCall.args[1], [0x12, 0x00]); test.ok(this.i2cRead.calledOnce); test.equals(this.i2cRead.firstCall.args[0], 0x60); test.deepEqual(this.i2cRead.firstCall.args[1], 0x00); test.equals(this.i2cRead.firstCall.args[2], 4); // read = this.i2cRead.args[0][3]; // read([ // 0, 0, // barometer // 129, 64, // temperature // ]); // this.clock.tick(100); // test.ok(spy.called); // test.equals(Math.round(spy.args[0][0].temperature), 70); test.done(); }.bind(this)); } }; exports["Temperature -- SI7020"] = { setUp: function(done) { this.i2cConfig = this.sandbox.spy(MockFirmata.prototype, "i2cConfig"); this.i2cRead = this.sandbox.spy(MockFirmata.prototype, "i2cRead"); this.temperature = new Temperature({ controller: "SI7020", board: this.board, freq: 10 }); done(); }, fwdOptionsToi2cConfig: function(test) { test.expect(3); this.i2cConfig.reset(); new Temperature({ controller: "SI7020", address: 0xff, bus: "i2c-1", board: this.board }); var forwarded = this.i2cConfig.lastCall.args[0]; test.equal(this.i2cConfig.callCount, 1); test.equal(forwarded.address, 0xff); test.equal(forwarded.bus, "i2c-1"); test.done(); }, enforceExplicitReadDelay: function(test) { test.expect(1); this.i2cConfig.reset(); new Temperature({ controller: "SI7020", address: 0xff, bus: "i2c-1", board: this.board }); var forwarded = this.i2cConfig.lastCall.args[0]; test.equal(forwarded.delay, 50000); test.done(); }, data: function(test) { test.expect(8); test.equal(this.i2cRead.callCount, 2); // address test.equal(this.i2cRead.firstCall.args[0], 0x40); // register test.equal(this.i2cRead.firstCall.args[1], 0xE3); // byte count test.equal(this.i2cRead.firstCall.args[2], 2); var spy = this.sandbox.spy(); var read = this.i2cRead.firstCall.args[3]; this.temperature.on("data", spy); read([103, 4, 63]); this.clock.tick(10); test.ok(spy.calledOnce); test.equals(Math.round(spy.getCall(0).args[0].celsius), 24); test.equals(Math.round(spy.getCall(0).args[0].fahrenheit), 75); test.equals(Math.round(spy.getCall(0).args[0].kelvin), 297); test.done(); } }; exports["Temperature -- HTU21D"] = { setUp: function(done) { this.i2cConfig = this.sandbox.spy(MockFirmata.prototype, "i2cConfig"); this.i2cReadOnce = this.sandbox.spy(MockFirmata.prototype, "i2cReadOnce"); this.temperature = new Temperature({ controller: "HTU21D", board: this.board, freq: 10 }); done(); }, fwdOptionsToi2cConfig: function(test) { test.expect(3); this.i2cConfig.reset(); new Temperature({ controller: "HTU21D", address: 0xff, bus: "i2c-1", board: this.board }); var forwarded = this.i2cConfig.lastCall.args[0]; test.equal(this.i2cConfig.callCount, 1); test.equal(forwarded.address, 0xff); test.equal(forwarded.bus, "i2c-1"); test.done(); }, enforceExplicitReadDelay: function(test) { test.expect(1); this.i2cConfig.reset(); new Temperature({ controller: "SI7020", address: 0xff, bus: "i2c-1", board: this.board }); var forwarded = this.i2cConfig.lastCall.args[0]; test.equal(forwarded.delay, 50000); test.done(); }, data: function(test) { test.expect(6); test.equal(this.i2cReadOnce.callCount, 1); test.deepEqual(this.i2cReadOnce.lastCall.args.slice(0, 3), [ 0x40, // address 0xE5, // register 3, // data length ]); var spy = this.sandbox.spy(); var read = this.i2cReadOnce.lastCall.args[3]; this.temperature.on("data", spy); read([0x00, 0x00, 0x00]); // humidity read = this.i2cReadOnce.lastCall.args[3]; read([0x67, 0x0F, 0x00]); // temperature read = this.i2cReadOnce.lastCall.args[3]; read([0x00, 0x00, 0x00]); // humidity again this.clock.tick(10); test.ok(spy.calledOnce); test.equals(Math.round(spy.getCall(0).args[0].celsius), 24); test.equals(Math.round(spy.getCall(0).args[0].fahrenheit), 75); test.equals(Math.round(spy.getCall(0).args[0].kelvin), 297); test.done(); } }; function mpl3115aDataLoop(test, initialCount, data) { test.equal(this.i2cReadOnce.callCount, initialCount + 1); test.deepEqual(this.i2cReadOnce.lastCall.args.slice(0, 3), [ 0x60, // address 0x00, // status register 1, // data length ]); var read = this.i2cReadOnce.lastCall.args[3]; read([0x04]); // write status bit test.equal(this.i2cReadOnce.callCount, initialCount + 2); test.deepEqual(this.i2cReadOnce.lastCall.args.slice(0, 3), [ 0x60, // address 0x01, // altitude register 6, // data length (pressure + temp) ]); read = this.i2cReadOnce.lastCall.args[3]; read(data); } exports["Temperature -- MPL3115A2"] = { setUp: function(done) { this.i2cConfig = this.sandbox.spy(MockFirmata.prototype, "i2cConfig"); this.i2cWrite = this.sandbox.spy(MockFirmata.prototype, "i2cWrite"); this.i2cWriteReg = this.sandbox.spy(MockFirmata.prototype, "i2cWriteReg"); this.i2cReadOnce = this.sandbox.spy(MockFirmata.prototype, "i2cReadOnce"); this.temperature = new Temperature({ controller: "MPL3115A2", board: this.board, freq: 10 }); done(); }, fwdOptionsToi2cConfig: function(test) { test.expect(3); this.i2cConfig.reset(); new Temperature({ controller: "MPL3115A2", address: 0xff, bus: "i2c-1", board: this.board }); var forwarded = this.i2cConfig.lastCall.args[0]; test.equal(this.i2cConfig.callCount, 1); test.equal(forwarded.address, 0xff); test.equal(forwarded.bus, "i2c-1"); test.done(); }, data: function(test) { test.expect(19); test.equal(this.i2cWrite.callCount, 1); test.equal(this.i2cWriteReg.callCount, 4); test.deepEqual(this.i2cWriteReg.getCall(0).args.slice(0, 3), [ 0x60, // address 0x2D, // config register 0x00, // config value ]); test.deepEqual(this.i2cWriteReg.getCall(1).args.slice(0, 3), [ 0x60, // address 0x14, // config register 0x00, // config value ]); test.deepEqual(this.i2cWriteReg.getCall(2).args.slice(0, 3), [ 0x60, // address 0x15, // config register 0x00, // config value ]); test.deepEqual(this.i2cWriteReg.getCall(3).args.slice(0, 3), [ 0x60, // address 0x13, // config register 0x07, // config value ]); test.deepEqual(this.i2cWrite.firstCall.args.slice(0, 3), [ 0x60, // address 0x26, // config register 0xB9, // config value ]); // test.deepEqual(this.i2cWrite.lastCall.args.slice(0, 3), [ // 0x60, // address // 0x26, // control register // 0xB9, // config value // ]); var spy = this.sandbox.spy(); this.temperature.on("data", spy); // Altitude Loop mpl3115aDataLoop.call(this, test, 0, [ 0x00, // status 0x00, 0x00, 0x00, // altitude 0x66, 0x77 // temperature ]); // Pressure Loop mpl3115aDataLoop.call(this, test, 2, [ 0x00, // status 0x00, 0x00, 0x00, // pressure 0x18, 0x20 // temperature ]); this.clock.tick(10); test.ok(spy.calledOnce); test.equals(Math.round(spy.getCall(0).args[0].celsius), 24); test.equals(Math.round(spy.getCall(0).args[0].fahrenheit), 75); test.equals(Math.round(spy.getCall(0).args[0].kelvin), 297); test.done(); }, change: function(test) { test.expect(39); var spy = this.sandbox.spy(); this.temperature.on("change", spy); // First Pass -- initial mpl3115aDataLoop.call(this, test, 0, [ 0x00, // status 0x00, 0x00, 0x00, // altitude 0x18, 0x20 // temperature ]); mpl3115aDataLoop.call(this, test, 2, [ 0x00, // status 0x00, 0x00, 0x00, // pressure 0x18, 0x20 // temperature ]); this.clock.tick(10); // Second Pass -- same mpl3115aDataLoop.call(this, test, 4, [ 0x00, // status 0x00, 0x00, 0x00, // altitude 0x18, 0x20 // temperature ]); mpl3115aDataLoop.call(this, test, 6, [ 0x00, // status 0x00, 0x00, 0x00, // pressure 0x18, 0x20 // temperature ]); this.clock.tick(10); // Third Pass -- change mpl3115aDataLoop.call(this, test, 8, [ 0x00, // status 0x00, 0x00, 0x00, // altitude 0x28, 0x20 // temperature ]); mpl3115aDataLoop.call(this, test, 10, [ 0x00, // status 0x00, 0x00, 0x00, // pressure 0x28, 0x20 // temperature ]); this.clock.tick(10); // Fourth Pass -- same mpl3115aDataLoop.call(this, test, 12, [ 0x00, // status 0x00, 0x00, 0x00, // altitude 0x28, 0x20 // temperature ]); mpl3115aDataLoop.call(this, test, 14, [ 0x00, // status 0x00, 0x00, 0x00, // pressure 0x28, 0x20 // temperature ]); this.clock.tick(10); test.ok(spy.calledTwice); test.equals(Math.round(spy.getCall(0).args[0].celsius), 24); test.equals(Math.round(spy.getCall(0).args[0].fahrenheit), 75); test.equals(Math.round(spy.getCall(0).args[0].kelvin), 297); test.equals(Math.round(spy.getCall(1).args[0].celsius), 40); test.equals(Math.round(spy.getCall(1).args[0].fahrenheit), 104); test.equals(Math.round(spy.getCall(1).args[0].kelvin), 313); test.done(); } };