Skip to content

Commit

Permalink
Complete HeaderSet documentation and tests.
Browse files Browse the repository at this point in the history
  • Loading branch information
danielwippermann committed Feb 13, 2014
1 parent b2746b5 commit 4aced40
Show file tree
Hide file tree
Showing 2 changed files with 172 additions and 1 deletion.
74 changes: 73 additions & 1 deletion src/header-set.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,29 @@ var optionKeys = [



var HeaderSet = extend(EventEmitter, {
var HeaderSet = extend(EventEmitter, /** @lends HeaderSet# */ {

/**
* Timestamp of the youngest Header instance added to this set.
* @type {Date}
*/
timestamp: null,

/**
* Array of Header instances in this set.
* @type {Header[]}
*/
headerList: null,

/**
* Creates a new header set instance and optionally initializes its members with the given values.
*
* @constructs
* @augments EventEmitter
* @param {object} options Initialization values for this instance's members
* @param {Date} options.timestamp {@link HeaderSet#timestamp}
* @param {Header[]} options.headers Array of Headers to add to this instance
*/
constructor: function(options) {
EventEmitter.call(this);

Expand All @@ -52,6 +69,11 @@ var HeaderSet = extend(EventEmitter, {
});
},

/**
* Adds a Header instance to this set, replacing a previously added Header of same kind.
*
* @param {Header} header The Header instance to add to this set.
*/
addHeader: function(header) {
var index = this._findIndex(header);
if (index >= 0) {
Expand All @@ -64,9 +86,20 @@ var HeaderSet = extend(EventEmitter, {
this.timestamp = header.timestamp;
}

/**
* This event is fired whenever a Header instance is added to this set.
*
* @event HeaderSet#addHeader
* @type {Header}
*/
this.emit('addHeader', header);
},

/**
* Adds a list of Header instances to this set, replacing previously added Headers of same kind.
*
* @param {Header[]} headers The list of Header instances to add.
*/
addHeaders: function(headers) {
var _this = this;

Expand All @@ -78,6 +111,12 @@ var HeaderSet = extend(EventEmitter, {
_removeHeader: function(header) {
var index = this._findIndex(header);
if (index >= 0) {
/**
* This event is fired whenever a Header is removed from this set.
*
* @event HeaderSet#removeHeader
* @type {Header}
*/
this.emit('removeHeader', this.headerList [index]);

this.headerList.splice(index, 1);
Expand All @@ -92,10 +131,18 @@ var HeaderSet = extend(EventEmitter, {
});
},

/**
* Removes all Header instances from this set.
*/
removeAllHeaders: function() {
this._removeHeaders(this.headerList.slice(0));
},

/**
* Removes all Header instances from this set which are older than the given timestamp.
*
* @param {Date} timestamp Timestamp to compare Header instances against.
*/
removeHeadersOlderThan: function(timestamp) {
var _this = this;

Expand All @@ -111,14 +158,29 @@ var HeaderSet = extend(EventEmitter, {
this._removeHeaders(headers);
},

/**
* Returns the count of Header instances currently stored in this set.
*
* @returns {number} Number of Header instances in this set.
*/
getHeaderCount: function() {
return this.headerList.length;
},

/**
* Returns an unsorted list of Header instances stored in this set.
*
* @returns {Header[]} List of headers stored in this set.
*/
getHeaders: function() {
return this.headerList.slice(0);
},

/**
* Returns a sorted list of Header instances stored in this set.
*
* @returns {Header[]} List of headers stored in this set.
*/
getSortedHeaders: function() {
var _this = this;

Expand All @@ -129,6 +191,11 @@ var HeaderSet = extend(EventEmitter, {
return sortedHeaders;
},

/**
* Returns an ID composed of the IDs of all headers stored in this set.
*
* @returns {string} ID of this HeaderSet.
*/
getId: function() {
var sortedHeaders = this.getSortedHeaders();

Expand All @@ -141,6 +208,11 @@ var HeaderSet = extend(EventEmitter, {
return id;
},

/**
* Returns an ID hash for this HeaderSet instance.
*
* @returns {string} ID hash for this HeaderSet
*/
getIdHash: function() {
var id = this.getId();

Expand Down
99 changes: 99 additions & 0 deletions test/specs/header-set.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@



var crypto = require('crypto');


var Packet = require('./resol-vbus').Packet;
var HeaderSet = require('./resol-vbus').HeaderSet;

Expand Down Expand Up @@ -84,6 +87,24 @@ describe('HeaderSet', function() {
expect(headerSet.headerList).to.eql([ header1, header3 ]);
});

it('should update the timestamp', function() {
var header1 = new Packet({
channel: 1
});

var startTimestamp = new Date(0);

var headerSet = new HeaderSet({
timestamp: startTimestamp,
});

expect(headerSet.timestamp).to.equal(startTimestamp);

headerSet.addHeader(header1);

expect(headerSet.timestamp).to.equal(header1.timestamp);
});

});

describe('#addHeaders', function() {
Expand Down Expand Up @@ -114,6 +135,54 @@ describe('HeaderSet', function() {

});

describe('#_removeHeader', function() {

it('should be a method', function() {
expect(HeaderSet.prototype._removeHeader).to.be.a('function');
});

it('should work correctly', function() {
var header1 = new Packet({
channel: 1
});

var header2 = new Packet({
channel: 2
});

var headerSet = new HeaderSet({
headers: [ header1, header2 ],
});

headerSet._removeHeader(header1);

expect(headerSet.headerList).to.eql([ header2 ]);
});

it('should ignore unknown headers', function() {
var header1 = new Packet({
channel: 1
});

var header2 = new Packet({
channel: 2
});

var header3 = new Packet({
channel: 3
});

var headerSet = new HeaderSet({
headers: [ header1, header2 ],
});

headerSet._removeHeader(header3);

expect(headerSet.headerList).to.eql([ header1, header2 ]);
});

});

describe('#removeAllHeaders', function() {

it('should be a method', function() {
Expand Down Expand Up @@ -299,6 +368,36 @@ describe('HeaderSet', function() {
expect(id).to.equal('5c9c71b01aca96a35c15cffd0ec382e8a1be99b3e42eeff57ecd7836aa7f1a24');
});

it('should cache hashes and return them', function() {
var header1 = new Packet({
channel: 1,
command: 0x7654,
});

var header2 = new Packet({
channel: 2,
command: 0x7654,
});

var headerSet = new HeaderSet({
headers: [ header2, header1 ]
});

var spy = sinon.spy(crypto, 'createHash');

var id = headerSet.getIdHash();

expect(id).to.equal('28ee1aa76e488e1d87ebd79573b08b2cf20f08f1991fae46ecca3197812cca86');
expect(spy.callCount).to.equal(1);

id = headerSet.getIdHash();

expect(id).to.equal('28ee1aa76e488e1d87ebd79573b08b2cf20f08f1991fae46ecca3197812cca86');
expect(spy.callCount).to.equal(1);

spy.restore();
});

});

});

0 comments on commit 4aced40

Please sign in to comment.