Skip to content

Commit 39946c4

Browse files
committed
Make the output of .list undefined if it’s an empty string (#740)
Add some tests to start defining the bindings.
1 parent f0d7319 commit 39946c4

File tree

3 files changed

+108
-20
lines changed

3 files changed

+108
-20
lines changed

src/serialport.cpp

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -171,7 +171,7 @@ void EIO_AfterOpen(uv_work_t* req) {
171171
}
172172

173173
NAN_METHOD(Update) {
174-
174+
175175
// file descriptor
176176
if(!info[0]->IsInt32()) {
177177
Nan::ThrowTypeError("First argument must be an int");
@@ -461,16 +461,52 @@ void EIO_AfterList(uv_work_t* req) {
461461
int i = 0;
462462
for(std::list<ListResultItem*>::iterator it = data->results.begin(); it != data->results.end(); ++it, i++) {
463463
v8::Local<v8::Object> item = Nan::New<v8::Object>();
464-
Nan::Set(item, Nan::New<v8::String>("comName").ToLocalChecked(), Nan::New<v8::String>((*it)->comName.c_str()).ToLocalChecked());
465-
Nan::Set(item, Nan::New<v8::String>("manufacturer").ToLocalChecked(), Nan::New<v8::String>((*it)->manufacturer.c_str()).ToLocalChecked());
466-
Nan::Set(item, Nan::New<v8::String>("serialNumber").ToLocalChecked(), Nan::New<v8::String>((*it)->serialNumber.c_str()).ToLocalChecked());
467-
Nan::Set(item, Nan::New<v8::String>("pnpId").ToLocalChecked(), Nan::New<v8::String>((*it)->pnpId.c_str()).ToLocalChecked());
468-
Nan::Set(item, Nan::New<v8::String>("locationId").ToLocalChecked(), Nan::New<v8::String>((*it)->locationId.c_str()).ToLocalChecked());
469-
Nan::Set(item, Nan::New<v8::String>("vendorId").ToLocalChecked(), Nan::New<v8::String>((*it)->vendorId.c_str()).ToLocalChecked());
470-
Nan::Set(item, Nan::New<v8::String>("productId").ToLocalChecked(), Nan::New<v8::String>((*it)->productId.c_str()).ToLocalChecked());
464+
465+
if (strlen((*it)->comName.c_str()) > 0) {
466+
Nan::Set(item, Nan::New<v8::String>("comName").ToLocalChecked(), Nan::New<v8::String>((*it)->comName.c_str()).ToLocalChecked());
467+
} else {
468+
Nan::Set(item, Nan::New<v8::String>("comName").ToLocalChecked(), Nan::Undefined());
469+
}
470+
471+
if (strlen((*it)->manufacturer.c_str()) > 0) {
472+
Nan::Set(item, Nan::New<v8::String>("manufacturer").ToLocalChecked(), Nan::New<v8::String>((*it)->manufacturer.c_str()).ToLocalChecked());
473+
} else {
474+
Nan::Set(item, Nan::New<v8::String>("manufacturer").ToLocalChecked(), Nan::Undefined());
475+
}
476+
477+
if (strlen((*it)->serialNumber.c_str()) > 0) {
478+
Nan::Set(item, Nan::New<v8::String>("serialNumber").ToLocalChecked(), Nan::New<v8::String>((*it)->serialNumber.c_str()).ToLocalChecked());
479+
} else {
480+
Nan::Set(item, Nan::New<v8::String>("serialNumber").ToLocalChecked(), Nan::Undefined());
481+
}
482+
483+
if (strlen((*it)->pnpId.c_str()) > 0) {
484+
Nan::Set(item, Nan::New<v8::String>("pnpId").ToLocalChecked(), Nan::New<v8::String>((*it)->pnpId.c_str()).ToLocalChecked());
485+
} else {
486+
Nan::Set(item, Nan::New<v8::String>("pnpId").ToLocalChecked(), Nan::Undefined());
487+
}
488+
489+
if (strlen((*it)->locationId.c_str()) > 0) {
490+
Nan::Set(item, Nan::New<v8::String>("locationId").ToLocalChecked(), Nan::New<v8::String>((*it)->locationId.c_str()).ToLocalChecked());
491+
} else {
492+
Nan::Set(item, Nan::New<v8::String>("locationId").ToLocalChecked(), Nan::Undefined());
493+
}
494+
495+
if (strlen((*it)->vendorId.c_str()) > 0) {
496+
Nan::Set(item, Nan::New<v8::String>("vendorId").ToLocalChecked(), Nan::New<v8::String>((*it)->vendorId.c_str()).ToLocalChecked());
497+
} else {
498+
Nan::Set(item, Nan::New<v8::String>("vendorId").ToLocalChecked(), Nan::Undefined());
499+
}
500+
501+
if (strlen((*it)->productId.c_str()) > 0) {
502+
Nan::Set(item, Nan::New<v8::String>("productId").ToLocalChecked(), Nan::New<v8::String>((*it)->productId.c_str()).ToLocalChecked());
503+
} else {
504+
Nan::Set(item, Nan::New<v8::String>("productId").ToLocalChecked(), Nan::Undefined());
505+
}
506+
471507
Nan::Set(results, i, item);
472508
}
473-
argv[0] = Nan::Undefined();
509+
argv[0] = Nan::Null();
474510
argv[1] = results;
475511
}
476512
data->callback->Call(2, argv);

src/serialport_unix.cpp

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
#ifndef WIN32
21
#include "serialport.h"
32
#include "serialport_poller.h"
43
#include <unistd.h>
@@ -635,21 +634,21 @@ static stDeviceListItem* GetSerialDevices()
635634
#endif
636635

637636
void EIO_List(uv_work_t* req) {
638-
// This code exists in javascript for unix platforms
637+
ListBaton* data = static_cast<ListBaton*>(req->data);
639638

640-
#ifdef __APPLE__
641-
if(!lockInitialised)
642-
{
639+
#ifndef __APPLE__
640+
// This code exists in javascript for unix platforms
641+
snprintf(data->errorString, sizeof(data->errorString), "List is not Implemented");
642+
return;
643+
# else
644+
if(!lockInitialised) {
643645
uv_mutex_init(&list_mutex);
644646
lockInitialised = TRUE;
645647
}
646648

647-
ListBaton* data = static_cast<ListBaton*>(req->data);
648-
649649
stDeviceListItem* devices = GetSerialDevices();
650650

651-
if (*(devices->length) > 0)
652-
{
651+
if (*(devices->length) > 0) {
653652
stDeviceListItem* next = devices;
654653

655654
for (int i = 0, len = *(devices->length); i < len; i++) {
@@ -735,5 +734,3 @@ void EIO_Drain(uv_work_t* req) {
735734

736735
data->result = tcdrain(data->fd);
737736
}
738-
739-
#endif

test/serialport-bindings.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
'use strict';
2+
3+
var assert = require('chai').assert;
4+
var SerialPortBinding = require('bindings')('serialport.node');
5+
6+
var platform;
7+
switch (process.platform) {
8+
case 'win32':
9+
platform = 'win32';
10+
break;
11+
case 'darwin':
12+
platform = 'darwin';
13+
break;
14+
default:
15+
platform = 'unix';
16+
}
17+
18+
describe('SerialPortBinding', function () {
19+
describe('.list', function () {
20+
if (platform === 'unix') {
21+
describe('on unix', function() {
22+
it('throws an error', function(done) {
23+
SerialPortBinding.list(function(err) {
24+
assert.instanceOf(err, Error);
25+
done();
26+
});
27+
});
28+
});
29+
return;
30+
}
31+
describe('on windows and darwin', function() {
32+
it('returns an array', function(done) {
33+
SerialPortBinding.list(function(err, data) {
34+
assert.isNull(err);
35+
assert.isArray(data);
36+
done();
37+
});
38+
});
39+
40+
it('has objects with undefined when there is no data', function(done) {
41+
SerialPortBinding.list(function(err, data) {
42+
assert.isNull(err);
43+
assert.isArray(data);
44+
assert.isAtLeast(data.length, 1);
45+
var obj = data[0];
46+
Object.keys(obj).forEach(function(key) {
47+
assert.notEqual(obj[key], '', 'empty values should be undefined');
48+
assert.isNotNull(obj[key], 'empty values should be undefined');
49+
});
50+
done();
51+
});
52+
});
53+
});
54+
});
55+
});

0 commit comments

Comments
 (0)