From e98b2afee8b4123b9922c74c9c89b15924889ba0 Mon Sep 17 00:00:00 2001 From: Donovan Buck Date: Sat, 4 Jul 2020 18:12:53 -0500 Subject: [PATCH 1/4] Add tests for button --- test/button.js | 291 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 290 insertions(+), 1 deletion(-) diff --git a/test/button.js b/test/button.js index cd92510..5284857 100644 --- a/test/button.js +++ b/test/button.js @@ -1,5 +1,6 @@ import assert from "assert"; import sinon from "sinon"; +import chai from "chai"; import { Digital } from "@dtex/mock-io"; import Button from "j5e/button"; @@ -16,6 +17,103 @@ describe("Button", function() { assert.equal(button instanceof Button, true); assert.equal(button.io instanceof Digital, true); }); + + describe("Options", function() { + + describe("invert", function() { + + it("should invert state when the invert option is true", async function() { + const button = await new Button({ + pin: 13, + io: Digital, + invert: true + }); + + button.io.write(0); + assert.equal(button.isClosed, true); + assert.equal(button.isOpen, false); + + button.io.write(1); + assert.equal(button.isClosed, false); + assert.equal(button.isOpen, true); + + }); + }); + + describe("isPullup", function() { + + it("should invert state when the isPullup option is true", async function() { + const button = await new Button({ + pin: 13, + io: Digital, + isPullup: true + }); + + button.io.write(0); + assert.equal(button.isClosed, true); + assert.equal(button.isOpen, false); + + button.io.write(1); + assert.equal(button.isClosed, false); + assert.equal(button.isOpen, true); + + }); + + it("should not invert state when the isPullup and invert options are true", async function() { + const button = await new Button({ + pin: 13, + io: Digital, + isPullup: true, + invert: true + }); + + button.io.write(1); + assert.equal(button.isClosed, true); + assert.equal(button.isOpen, false); + + button.io.write(0); + assert.equal(button.isClosed, false); + assert.equal(button.isOpen, true); + + }); + + }); + + describe("isPulldown", function() { + + it("should not invert state when the isPulldown option is true", async function() { + const button = await new Button({ + pin: 13, + io: Digital, + isPulldown: true + }); + + button.io.write(1); + assert.equal(button.isClosed, true); + assert.equal(button.isOpen, false); + + button.io.write(0); + assert.equal(button.isClosed, false); + assert.equal(button.isOpen, true); + + }); + }); + + describe("holdtime", function() { + + it("should set the holdtime state when passed a value in options", async function() { + const button = await new Button({ + pin: 13, + io: Digital, + holdtime: 2000 + }); + + assert.equal(button.holdtime, 2000); + + }); + }); + + }); }); describe("Properties", function() { @@ -70,6 +168,198 @@ describe("Button", function() { assert.equal(button.isOpen, true); }); }); + + describe("holdtime", function() { + + it("should be settable and getable", async function() { + const button = await new Button({ + pin: 13, + io: Digital + }); + + assert.equal(button.holdtime, 500); + button.holdtime = 1000; + assert.equal(button.holdtime, 1000); + + }); + + it("should emit hold event after 500ms", async function() { + + const clock = sinon.useFakeTimers(); + const holdSpy = sinon.spy(); + const button = await new Button({ + pin: 13, + io: Digital + }); + + button.on("hold", holdSpy); + + clock.tick(1); + button.io.write(1); + assert.equal(holdSpy.callCount, 0); + clock.tick(499); + assert.equal(holdSpy.callCount, 0); + clock.tick(10); + assert.equal(holdSpy.callCount, 1); + + clock.restore(); + + }); + + it("should emit hold event after 2000ms", async function() { + + const clock = sinon.useFakeTimers(); + const holdSpy = sinon.spy(); + const button = await new Button({ + pin: 13, + io: Digital, + holdtime: 2000 + }); + + button.on("hold", holdSpy); + + clock.tick(1); + button.io.write(1); + assert.equal(holdSpy.callCount, 0); + clock.tick(1999); + assert.equal(holdSpy.callCount, 0); + clock.tick(10); + assert.equal(holdSpy.callCount, 1); + + clock.restore(); + + }); + + + + }); + + describe("downValue", function() { + + it("should have the correct default value", async function() { + + const button = await new Button({ + pin: 13, + io: Digital + }); + + assert.equal(button.downValue, 1); + + }); + + it("should have the correct value when invert is true", async function() { + + const button = await new Button({ + pin: 13, + io: Digital, + invert: true + }); + + assert.equal(button.downValue, 0); + + }); + + it("should have the correct value when isPullup is true", async function() { + + const button = await new Button({ + pin: 13, + io: Digital, + isPullup: true + }); + + assert.equal(button.downValue, 0); + + }); + + it("should have the correct value when isPullup and invert are true", async function() { + + const button = await new Button({ + pin: 13, + io: Digital, + isPullup: true, + invert: true + }); + + assert.equal(button.downValue, 1); + + }); + + it("should not be settable", async function() { + const button = await new Button({ + pin: 13, + io: Digital + }); + + chai.expect(() => { + button.downValue = 1; + }).to.throw(TypeError); + }); + + }); + + describe("upValue", function() { + + it("should have the correct default value", async function() { + + const button = await new Button({ + pin: 13, + io: Digital + }); + + assert.equal(button.upValue, 0); + + }); + + it("should have the correct value when invert is true", async function() { + + const button = await new Button({ + pin: 13, + io: Digital, + invert: true + }); + + assert.equal(button.upValue, 1); + + }); + + it("should have the correct value when isPullup is true", async function() { + + const button = await new Button({ + pin: 13, + io: Digital, + isPullup: true + }); + + assert.equal(button.upValue, 1); + + }); + + it("should have the correct value when isPullup and invert are true", async function() { + + const button = await new Button({ + pin: 13, + io: Digital, + isPullup: true, + invert: true + }); + + assert.equal(button.upValue, 0); + + }); + + it("should not be settable", async function() { + const button = await new Button({ + pin: 13, + io: Digital + }); + + chai.expect(() => { + button.upValue = 1; + }).to.throw(TypeError); + }); + + }); + }); describe("Events", function() { @@ -167,5 +457,4 @@ describe("Button", function() { }); }); - }); From 53b52137754ba86f4a9890280d1dbc4073a79522 Mon Sep 17 00:00:00 2001 From: Donovan Buck Date: Sat, 4 Jul 2020 18:13:13 -0500 Subject: [PATCH 2/4] Bug fixes for button Caught by tests --- lib/button/index.js | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/lib/button/index.js b/lib/button/index.js index a8c02cd..cbdafa8 100644 --- a/lib/button/index.js +++ b/lib/button/index.js @@ -70,10 +70,10 @@ class Button extends Emitter { const Provider = await getProvider(options, "builtin/digital"); let mode = Provider.Input; - if (!options.isPullup) { + if (typeof options.isPullup !== "undefined") { mode = Provider.InputPullUp; } - if (!options.isPulldown) { + if (typeof options.isPulldown !== "undefined") { mode = Provider.InputPullDown; } @@ -99,12 +99,12 @@ class Button extends Emitter { }, downValue: { get: () => { - return 1 ^ this.isPullup ^ this.invert; + return 1 ^ this.#state.isPullup ^ this.invert; } }, upValue: { get: () => { - return 0 ^ this.isPullup ^ this.invert; + return 0 ^ this.#state.isPullup ^ this.invert; } }, holdtime: { @@ -145,7 +145,6 @@ class Button extends Emitter { intialize(options, callback) { } processRead() { - if (this.isOpen) { this.emit("open"); timer.clearTimeout(this.#state.interval); From 6bbf6e9a9e4339e4262a39cb47a7405352406d27 Mon Sep 17 00:00:00 2001 From: Donovan Buck Date: Sat, 4 Jul 2020 18:13:20 -0500 Subject: [PATCH 3/4] Update docs --- docs/button_index.js.html | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/button_index.js.html b/docs/button_index.js.html index 37fd534..8d27e80 100644 --- a/docs/button_index.js.html +++ b/docs/button_index.js.html @@ -166,10 +166,10 @@

button/index.js

const Provider = await getProvider(options, "builtin/digital"); let mode = Provider.Input; - if (!options.isPullup) { + if (typeof options.isPullup !== "undefined") { mode = Provider.InputPullUp; } - if (!options.isPulldown) { + if (typeof options.isPulldown !== "undefined") { mode = Provider.InputPullDown; } @@ -195,12 +195,12 @@

button/index.js

}, downValue: { get: () => { - return 1 ^ this.isPullup ^ this.invert; + return 1 ^ this.#state.isPullup ^ this.invert; } }, upValue: { get: () => { - return 0 ^ this.isPullup ^ this.invert; + return 0 ^ this.#state.isPullup ^ this.invert; } }, holdtime: { @@ -241,7 +241,6 @@

button/index.js

intialize(options, callback) { } processRead() { - if (this.isOpen) { this.emit("open"); timer.clearTimeout(this.#state.interval); From 644556b68c451fb233c62781e58abba3c27818b7 Mon Sep 17 00:00:00 2001 From: Donovan Buck Date: Sat, 4 Jul 2020 18:13:29 -0500 Subject: [PATCH 4/4] Version bump --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 14555f3..98c88d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "j5e", - "version": "0.4.2", + "version": "0.4.3", "description": "j5e is a device framework built for ECMA TC-53's IO pattern", "main": "index.js", "exports": {