Skip to content

Commit

Permalink
Check in some initial code & tests
Browse files Browse the repository at this point in the history
This is gonna be nice!
  • Loading branch information
felixge committed May 22, 2011
1 parent c3f6e21 commit ddc5228
Show file tree
Hide file tree
Showing 5 changed files with 134 additions and 0 deletions.
52 changes: 52 additions & 0 deletions lib/delayed_stream.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
var Stream = require('stream').Stream;
var util = require('util');

module.exports = DelayedStream;
function DelayedStream() {
this.source = null;

this._released = false;
this._bufferedEvents = [];
}
util.inherits(DelayedStream, Stream);

DelayedStream.create = function(source) {
var delayedStream = new this();

delayedStream.source = source;

var realEmit = source.emit;
source.emit = function() {
delayedStream._handleEmit(arguments);
return realEmit.apply(source, arguments);
};

source.pause();

return delayedStream;
};

DelayedStream.prototype.__defineGetter__('readable', function() {
return this.source.readable;
});

DelayedStream.prototype.resume = function() {
if (!this._released) {
this._bufferedEvents.forEach(function(args) {
this.emit.apply(this, args);
}.bind(this));
this._bufferedEvents = [];

this._released = true;
}

this.source.resume();
};

DelayedStream.prototype.pause = function() {
this.source.pause();
};

DelayedStream.prototype._handleEmit = function(args) {
this._bufferedEvents.push(args);
};
5 changes: 5 additions & 0 deletions test/common.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
var common = module.exports;

common.DelayedStream = require('..');
common.assert = require('assert');
common.fake = require('fake');
16 changes: 16 additions & 0 deletions test/integration/test-delayed-stream-pause.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
var common = require('../common');
var assert = common.assert;
var fake = common.fake.create();
var DelayedStream = common.DelayedStream;
var Stream = require('stream').Stream;

(function testDelayEventsUntilResume() {
var source = new Stream();

fake.expect(source, 'pause');
var delayedStream = DelayedStream.create(source);

fake.expect(source, 'pause');
delayedStream.pause();
fake.verify();
})();
46 changes: 46 additions & 0 deletions test/integration/test-delayed-stream.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
var common = require('../common');
var assert = common.assert;
var fake = common.fake.create();
var DelayedStream = common.DelayedStream;
var Stream = require('stream').Stream;

(function testDelayEventsUntilResume() {
var source = new Stream();

// DelayedStream.create pauses underlaying source
fake.expect(source, 'pause');
var delayedStream = DelayedStream.create(source);
fake.verify();

// delayedStream must not emit until we resume
fake.expect(delayedStream, 'emit', 0);

// but our original source must emit
var params = [];
source.on('foo', function(param) {
params.push(param);
});

source.emit('foo', 1);
source.emit('foo', 2);

// Make sure delayedStream did not emit, and source did
assert.deepEqual(params, [1, 2]);
fake.verify();

// After resume, delayedStream must playback all events
fake
.expect(delayedStream, 'emit')
.withArg(1, 'newListener');
fake.expect(delayedStream, 'emit', ['foo', 1]);
fake.expect(delayedStream, 'emit', ['foo', 2]);
fake.expect(source, 'resume');

delayedStream.resume();
fake.verify();

// Calling resume again will delegate to source
fake.expect(source, 'resume');
delayedStream.resume();
fake.verify();
})();
15 changes: 15 additions & 0 deletions test/integration/test-proxy-readable.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
var common = require('../common');
var assert = common.assert;
var fake = common.fake.create();
var DelayedStream = common.DelayedStream;
var Stream = require('stream').Stream;

(function testProxyReadableProperty() {
var source = new Stream();

fake.expect(source, 'pause');
var delayedStream = DelayedStream.create(source);

source.readable = fake.value('source.readable');
assert.strictEqual(delayedStream.readable, source.readable);
})();

0 comments on commit ddc5228

Please sign in to comment.