var assert = require('assert') var duplex = require('..') function test(message, func) { console.log('#', message) func(duplex()) } test("write(data) -> emit('_data', data)", function (d) { var a = null d.on('_data', function (d) { a = d }) var e = Math.random() d.write(e) assert.equal(a, e) }) test("emit('pause') -> write(data) === false", function (d) { var a = null assert.equal(d.write(1), true) d.emit('pause') assert.equal(d.write(2), false) d.emit('drain') assert.equal(d.write(3), true) }) test("_data(data) -> emit('data', data)", function (d) { var a = null, e d.on('data', function (d) { a = d }) d.pause() assert.equal(a, null) d._data(e = Math.random()) assert.equal(a, null) d.resume() assert.equal(a, e) }) test("_end(data) -> emit('end', data)", function (d) { var a = false d.on('end', function (d) { a = true }) d.pause() d._end() assert.equal(a, false, 'pause should buffer end') d.resume() assert.equal(a, true, 'resume should drain end') assert.equal(d.readable, false, 'emitting end should set readable = false') }) test('end() -> emit(\'_end\')', function (d) { var a = false d.on('_end', function (d) { a = true }) assert.equal(d.writable, true,'writable should start true') d.end() assert.equal(d.writable, false,'emitEnd should set writable=false') d.resume() assert.equal(a, true) }) test('end() & emit(\'end\') -> emit(\'close\')', function(d){ var a = false d.on('close', function () { a = true }) assert.equal(a, false) d._end() d.end() d.resume() process.nextTick(function () { assert(a, true, 'destroy is called after both ends finish') }) }) test('start in nextTick', function () { var a = null, e = null process.nextTick(function () { assert.equal(a, null) }) //use this d, so I have a chance to set an earlier nextTick. d = duplex() d.on('data', function (data) { a = data }) d._data(e = Math.random()) process.nextTick(function () { assert.equal(a, e) }) })