array-gpio
Version:
array-gpio is low-level javascript library for Raspberry Pi using direct register access.
871 lines (672 loc) • 20.8 kB
JavaScript
const assert = require('assert');
//const sinon = require('sinon');
const r = require('array-gpio');
r.debug(1);
let pin1 = 11;
let pin2 = 13;
let pin3 = 15;
let pin4 = 19;
let pin5 = 33;
let pin6 = 35;
describe('\nCreating an output object ...', function () {
describe('Create a single output object using .setOutput() method', function () {
it('should return an output object', function (done) {
let output = r.setOutput(pin5);
assert.strictEqual( typeof output, 'object');
assert.strictEqual( output.pin, pin5);
assert.strictEqual( output.state, false);
assert.strictEqual( output.isOff, true);
assert.strictEqual( typeof output.on, 'function');
assert.strictEqual( typeof output.off, 'function');
assert.strictEqual( typeof output.write, 'function');
assert.strictEqual( typeof output.pulse, 'function');
done();
});
});
describe('Create an output object w/ invalid pin -1 and 41', function () {
it('should throw an error', function (done) {
try{
let output = r.setOutput(-1);
}
catch(e){
console.log(e.message);
assert.strictEqual(e.ReferenceError, undefined);
assert.strictEqual(e.message, 'invalid pin');
}
try{
let output = r.setOutput(41);
}
catch(e){
console.log(e.message);
assert.strictEqual(e.ReferenceError, undefined);
assert.strictEqual(e.message, 'invalid pin');
done();
}
throw 'unexpected error';
});
});
describe('Create an output object w/ valid pin 33', function () {
it('should not throw an error', function (done) {
let output = null;
try{
output = r.setOutput(33);
}
catch(e){
throw 'unexpected error';
}
output.close();
done();
});
});
describe('Create a single output object using .out() method', function () {
it('should return an output object', function (done) {
let output = r.out(pin6);
assert.strictEqual( typeof output, 'object');
assert.strictEqual( output.pin, pin6);
assert.strictEqual( typeof output.on, 'function');
assert.strictEqual( typeof output.write, 'function');
assert.strictEqual( typeof output.pulse, 'function');
output.write(1);
output.write(0);
output.close();
done();
});
});
describe('Create a single output object w/ .open() and .close() method', function () {
it('should return an output object', function (done) {
let output = r.out(pin6);
assert.strictEqual( typeof output, 'object');
// close the object
output.close();
// open again the object
output.open();
// turn it on and off
output.write(1, (state) => assert.strictEqual(1, state));
output.write(0, (state) => assert.strictEqual(0, state));
output.close();
done();
});
});
describe('Create an output object w/o any arguments', function () {
it('should throw an error', function (done) {
try{
let output = r.out();
}
catch(e){
console.log(e.message);
assert.strictEqual(e.message, 'invalid pin');
done();
}
throw 'unexpected error';
});
});
describe('Create an output object using a string argument "33" ', function () {
it('should throw an error', function (done) {
try{
let output = r.setOutput('33');
}
catch(e){
console.log(e.message);
assert.strictEqual(e.message, 'invalid pin');
done();
}
throw 'unexpected error';
});
});
describe('Create an output object w/ invalid argument type (function)', function () {
it('should throw an error', function (done) {
let callback = function(){}
try{
let output = r.Output(callback);
}
catch(e){
console.log(e.message);
assert.strictEqual(e.message, 'invalid pin');
done();
}
throw 'unexpected error';
});
});
describe('Creating a single output object using .out() method', function () {
it('should return an output object', function (done) {
try{
let output = r.out(pin5);
assert.strictEqual( typeof output, 'object');
assert.strictEqual( output.pin, pin5);
assert.strictEqual( typeof output.on, 'function');
output.write(0, (state) => assert.strictEqual(0, state));
assert.strictEqual(output.isOn, false);
assert.strictEqual(output.isOff, true);
output.delayOn(0, (state) => { assert.strictEqual( state, true) });
output.delayOff(3, (state) => {
assert.strictEqual( state, false)
output.close();
done();
});
}
catch(e){
throw 'unexpected error';
}
});
});
/*
* array object - using object argument
*/
describe('Create an output array object w/ a single pin array argument - setOutput({pin:[pin1]}) ', function () {
it('should return an array object', function (done) {
let output = null;
try{
output = r.setOutput({pin:[35]});
}
catch(e){
throw 'unexpected error';
}
assert.strictEqual( typeof output, 'object');
assert.strictEqual( Array.isArray(output), true);
assert.strictEqual( output[0].pin, 35);
assert.strictEqual( output[0].state, false);
assert.strictEqual( output[0].isOn, false);
assert.strictEqual( output[0].isOff, true);
done();
});
});
describe('Create an output array object w/ an empty object argument {}', function () {
it('should throw an error', function (done) {
try{
let output = r.out({});
}
catch(e){
assert.strictEqual(e.message, 'invalid pin');
done();
}
throw 'unexpected error';
});
});
describe('Create an output array object w/ empty pin property {pin:[]}', function () {
it('should throw an error', function (done) {
try{
let output = r.setOutput({pin:[]});
}
catch(e){
console.log(e.message);
assert.strictEqual(e.message, 'invalid pin');
done();
}
throw 'unexpected error';
});
});
describe('Create an array output object using .setOutput({pin:[pin1, pin2]}) method', function () {
it('should return an an array object w/ zero based indexing', function (done) {
try{
let output = r.setOutput({pin:[pin5, pin6]});
assert.strictEqual( Array.isArray(output), true);
assert.strictEqual( output[0].pin, pin5);
assert.strictEqual( output[1].pin, pin6);
assert.strictEqual( typeof output[0].on, 'function');
assert.strictEqual( typeof output[1].off, 'function');
assert.strictEqual( output[0].isOn, false );
assert.strictEqual( output[1].isOff, true );
output[0].close();
output[1].close();
done();
}
catch(e){
throw 'unexpected error';
}
});
});
describe('Create an array output object using .setOutput({pin:[pin1, pin2], index:"pin"}) method', function () {
it('should return an an array object w/ pin as index', function (done) {
try{
let output = r.setOutput({pin:[pin5, pin6], index:'pin'});
assert.strictEqual( Array.isArray(output), true);
assert.strictEqual( output[pin5].pin, pin5);
assert.strictEqual( output[pin6].pin, pin6);
assert.strictEqual( output[pin5].state, false);
assert.strictEqual( output[pin6].state, false);
assert.strictEqual( typeof output[pin5].on, 'function');
assert.strictEqual( typeof output[pin6].off, 'function');
output[pin5].close();
output[pin6].close();
done();
}
catch(e){
throw 'unexpected error';
}
});
});
describe('Create an array output object using .setOutput(pin1, pin2 ...) method', function () {
it('should return an an array object', function (done) {
try{
let output = r.setOutput(pin5, pin6);
assert.strictEqual( Array.isArray(output), true);
assert.strictEqual( output[0].pin, pin5);
assert.strictEqual( output[1].pin, pin6);
assert.strictEqual( output[0].state, false);
assert.strictEqual( output[1].state, false);
assert.strictEqual( typeof output[0].on, 'function');
assert.strictEqual( typeof output[1].off, 'function');
done();
}
catch(e){
throw 'unexpected error';
}
});
});
describe('Create an array output object using .setOutput(pin1, pin2, ..., {index:"pin"}) method', function () {
it('should return an an array object', function (done) {
try{
let output = r.setOutput(pin5, pin6, {index:'pin'});
assert.strictEqual( Array.isArray(output), true);
assert.strictEqual( output[pin5].pin, pin5);
assert.strictEqual( output[pin6].pin, pin6);
assert.strictEqual( output[pin5].state, false);
assert.strictEqual( output[pin6].state, false);
assert.strictEqual( typeof output[pin5].on, 'function');
assert.strictEqual( typeof output[pin6].off, 'function');
done();
}
catch(e){
throw 'unexpected error';
}
});
});
describe('Using .read() and write() method properties', function () {
it('should return an an array object', function (done) {
try{
let output = r.setOutput(pin6);
assert.strictEqual( typeof output , 'object');
if(output.read() === 0){
output.write(1, function(){});
}
if(output.read() === 1){
output.write(0, function(){});
}
if(output.read() === 0){
output.write(true, function(){});
}
if(output.read() === 1){
output.write(false, function(){});
}
done();
}
catch(e){
throw 'unexpected error';
}
});
});
describe('Using .read() and write() method properties from array object', function () {
it('should return an an array object', function (done) {
try{
let output = r.setOutput({pin:[pin5, pin6]});
assert.strictEqual( Array.isArray(output), true);
if(output[0].read() === 0){
output[0].write(1);
}
if(output[1].read() === 1){
output[1].write(0);
}
if(output[1].read() === 0){
output[1].write(true);
}
if(output[0].read() === 1){
output[0].write(false);
}
done();
}
catch(e){
throw 'unexpected error';
}
});
});
describe('Using .read() and write() method properties w/ callback from array object', function () {
it('should return an an array object', function (done) {
let output = r.setOutput({pin:[pin5, pin6]});
let count = 0;
assert.strictEqual( Array.isArray(output), true);
output[0].on();
output[1].on();
output[0].read((state) => {
if(state){
assert.strictEqual( state, 1);
output[0].write(0, (state) => {
assert.strictEqual( state, 0);
});
output[1].write(false, (state) => {
assert.strictEqual( state, 0);
output[0].close();
output[1].close();
done();
});
}
if(count = 0){
output[0].close();
output[1].close();
done();count++;
}
});
});
});
describe('Using .read() and write() method properties w/ callback from array object', function () {
it('should return an an array object', function (done) {
let output = r.setOutput({pin:[pin5, pin6]});
let count = 0;
assert.strictEqual( Array.isArray(output), true);
output[0].off();
output[0].read((state) => {
if(!state){
assert.strictEqual( state, 0);
output[0].write(1, (state) => {
assert.strictEqual( state, 1);
});
output[1].write(true, (state) => {
assert.strictEqual( state, 1);
if(count === 0){
output[0].off();
output[1].off();
output[0].close();
output[1].close();
done();count++;
}
});
}
});
});
});
describe('Using .read() and write() w/ invalid arguments', function () {
it('should return an an array object', function (done) {
let output = r.setOutput({pin:[pin5, pin6]});
assert.strictEqual( Array.isArray(output), true);
try{
output[0].read('cb');
}
catch(e){
assert.strictEqual( e.message, 'invalid callback argument');
}
try{
output[0].write();
}
catch(e){
assert.strictEqual( e.message, 'missing control bit argument');
}
try{
output[0].write('1');
}
catch(e){
assert.strictEqual( e.message, 'invalid control bit argument');
}
try{
output[0].write('0', 'cb' );
}
catch(e){
assert.strictEqual( e.message, 'invalid argument');
done();
}
});
});
describe('Using .On() and .Off() getter properties from array object', function () {
it('should return an an array object', function (done) {
let output = r.setOutput({pin:[pin5, pin6]});
assert.strictEqual( Array.isArray(output), true);
if(output[0].isOff){
output[0].on();
}
if(output[1].isOn){
output[1].off();
}
done();
});
});
describe('Using .delayOn(t) and .delayOff(t) methods from array output object', function () {
it('should return an an array object', function (done) {
try{
let output = r.out({pin:[pin5, pin6], index:'pin'});
assert.strictEqual(Array.isArray(output), true);
output[pin5].on();
output[pin6].on();
output[pin5].off();
output[pin6].off();
if(output[pin5].isOff){
output[pin5].delayOn(50);
}
else if(output[pin5].isOn){
output[pin5].delayOff(50);
}
done();
}
catch(e){
throw 'unexpected error';
}
});
});
describe('Using .on(cb) and .off(cb) methods w/ callback', function () {
it('should return an output state of true or false', function (done) {
let output = r.out(40);
output.on();
output.off();
assert.strictEqual( typeof output, 'object');
output.on(function(state) {
assert.strictEqual(state, true);
output.off(function(state) {
assert.strictEqual(state, false);
assert.strictEqual(output.state, false);
});
});
output.on(10, function (state) {
assert.strictEqual(state, true );
// using 1 ms time delay
output.off(0, function (state) {
assert.strictEqual(state, false );
assert.strictEqual(output.state, false);
done();
});
});
});
});
describe('Using .on(t, cb) and .off(t, cb) methods with delay time and callback', function () {
it('output should return an output state of false or OFF state', function (done) {
let output = r.out(pin6);
assert.strictEqual( typeof output, 'object');
output.on(10);
output.off(15);
output.on(25, function (state) {
assert.strictEqual(state, true);
});
output.off(50, function(state) {
assert.strictEqual(state, false);
done();
});
});
});
describe('Using .on[0].(t, cb) and .off[0].(t, cb) method with array object', function () {
it('output should return a true or false state', function (done) {
let output = r.out(36, 37);
output[0].on(23);
output[1].on(23);
output[0].off(24);
output[1].off(24);
output[0].on(25, function (state) {
assert.strictEqual(state, true);
output[0].off(25, function(state) {
assert.strictEqual(state, false);
});
});
output[1].on(25, function (state) {
assert.strictEqual(state, true);
output[1].off(25, function(state) {
assert.strictEqual(state, false);
done();
});
});
});
});
describe('Using .on() and .on() with invalid argument', function () {
it('should throw an invalid argument error', function (done) {
let output = r.out(pin5, pin6);
try{
output[0].on('100');
}
catch(e){
assert.strictEqual(e.message,'invalid argument');
}
try{
output[0].on(25, 'cb');
}
catch(e){
assert.strictEqual(e.message,'invalid callback argument');
}
try{
output[1].off('100');
}
catch(e){
assert.strictEqual(e.message,'invalid argument');
}
try{
output[1].off(25, 'cb');
}
catch(e){
assert.strictEqual(e.message,'invalid callback argument');
done();
}
throw 'unexpected error';
});
});
describe('using delayOn() w/ invalid argument t and valid cb', function () {
it('should throw an error', function (done) {
let output = r.out(pin5, pin6);
try{
output[1].delayOn('100', function() {});
}
catch(e){
assert.strictEqual( e.message, 'invalid delay argument');
}
try{
output[1].delayOn('100', {});
}
catch(e){
assert.strictEqual( e.message, 'invalid arguments');
done();
}
throw 'unexpected error';
});
});
describe('using delayOff() w/ invalid argument t and valid cb', function () {
it('should start the delayOff() function', function (done) {
let output = r.out(pin5, pin6);
try{
output[1].delayOff('100', function(){});
}
catch(e){
assert.strictEqual( e.message, 'invalid delay argument');
}
try{
output[1].delayOff('100', {});
}
catch(e){
assert.strictEqual( e.message, 'invalid arguments');
done();
}
throw 'unexpected error';
});
});
describe('create a pulse using .pulse(t) method with t as pulse duration', function () {
it('Should create a pulse with a duration of t', function (done) {
let output = r.out(pin5, pin6);
output[0].pulse(50, function (state) { assert.strictEqual(false, state) });
output[0].close();
done();
});
});
describe('create a pulse w/ invalid t argument', function () {
it('should throw an error', function (done) {
let output = r.out(pin5, pin6);
try{
output[0].pulse('50',(err, state) => assert.strictEqual(false, state));
}
catch(e){
assert.strictEqual( e.message, 'invalid pulse width time duration');
done();
}
throw 'unexpected error';
});
});
describe('create a pulse w/ invalid callback argument', function () {
it('should throw an error', function (done) {
let output = r.out(pin5, pin6);
try{
output[0].pulse(50, {});
}
catch(e){
assert.strictEqual( e.message, 'invalid callback argument');
done();
}
throw 'unexpected error';
});
});
describe('create a pulse(t) w/o callback', function () {
it('should start the pulse', function (done) {
let output = r.out(pin5, pin6);
try{
output[1].pulse(25);
}
catch(e){
throw 'unexpected error';
}
// turn on immediately
assert.strictEqual( output[1].isOn, true );
// turn off after 25 ms duration
setTimeout(function(){
assert.strictEqual( output[1].isOff, true );
done();
}, 30);
});
});
describe('create a pulse(t) w/ invalid t of string type', function () {
it('should throw an error', function (done) {
let output = r.out(pin5, pin6);
// w/o callback
try{
output[1].pulse('200');
}
catch(e){
assert.strictEqual( e.message, 'invalid pulse width time duration');
}
// w/ callback
try{
output[1].pulse('500', () => {});
}
catch(e){
assert.strictEqual( e.message, 'invalid pulse width time duration');
done();
}
throw 'unexpected error';
});
});
describe('create a pulse(t) w/ missing t', function () {
it('should throw an error', function (done) {
let output = r.out(pin5, pin6);
try{
output[1].pulse();
}
catch(e){
assert.strictEqual( e.message, 'invalid pulse width time duration');
done();
}
throw 'unexpected error';
});
});
describe('create a pulse(t, cb) w/ invalid arguments t and cb', function () {
it('should throw an error', function (done) {
let output = r.out(pin6);
r.mswait(200);
try{
output.pulse('25', {});
}
catch(e){
assert.strictEqual( e.message, 'invalid arguments');
done();
}
throw 'unexpected test';
});
});
});