'use strict';
var common = require('../common');
var inherits = require('inherits');
var stream = require('../../');

module.exports = function (t) {
  t.test('big packet', function (t) {
    t.plan(3);
    var passed = false;

    function PassThrough() {
      stream.Transform.call(this);
    };
    inherits(PassThrough, stream.Transform);
    PassThrough.prototype._transform = function(chunk, encoding, done) {
      this.push(chunk);
      done();
    };

    function TestStream() {
      stream.Transform.call(this);
    };
    inherits(TestStream, stream.Transform);
    TestStream.prototype._transform = function(chunk, encoding, done) {
      if (!passed) {
        // Char 'a' only exists in the last write
        passed = indexOf(chunk.toString(), 'a') >= 0;
      }
      if (passed) {
        t.ok(passed);
      }
      done();
    };

    var s1 = new PassThrough();
    var s2 = new PassThrough();
    var s3 = new TestStream();
    s1.pipe(s3);
    // Don't let s2 auto close which may close s3
    s2.pipe(s3, {end: false});

    // We must write a buffer larger than highWaterMark
    var big = Buffer.alloc(s1._writableState.highWaterMark + 1);
    big.fill('x');

    // Since big is larger than highWaterMark, it will be buffered internally.
    t.ok(!s1.write(big));
    // 'tiny' is small enough to pass through internal buffer.
    t.ok(s2.write('tiny'));

    // Write some small data in next IO loop, which will never be written to s3
    // Because 'drain' event is not emitted from s1 and s1 is still paused
    setImmediate(s1.write.bind(s1), 'later');

    function indexOf (xs, x) {
      for (var i = 0, l = xs.length; i < l; i++) {
        if (xs[i] === x) return i;
      }
      return -1;
    }
  });
}
