text: var assert = require('assert')
    , Sender = require('../lib/Sender.hixie');
  require('should');
  require('./hybi-common');
  
  describe('Sender', function() {
    describe('#send', function() {
      it('frames and sends a text message', function(done) {
        var message = 'Hello world';
        var received;
        var socket = {
          write: function(data, encoding, cb) {
            received = data;
            process.nextTick(cb);
          }
        };
        var sender = new Sender(socket, {});
        sender.send(message, {}, function() {
          received.toString('utf8').should.eql('\u0000' + message + '\ufffd');
          done();
        });
      });
  
      it('frames and sends an empty message', function(done) {
        var socket = {
          write: function(data, encoding, cb) {
            done();
          }
        };
        var sender = new Sender(socket, {});
        sender.send('', {}, function() {});
      });
  
      it('frames and sends a buffer', function(done) {
        var received;
        var socket = {
          write: function(data, encoding, cb) {
            received = data;
            process.nextTick(cb);
          }
        };
        var sender = new Sender(socket, {});
        sender.send(new Buffer('foobar'), {}, function() {
          received.toString('utf8').should.eql('\u0000foobar\ufffd');
          done();
        });
      });
  
      it('throws an exception for binary data', function(done) {
        var socket = {
          write: function(data, encoding, cb) {
            process.nextTick(cb);
          }
        };
        var sender = new Sender(socket, {});
        sender.on('error', function() {
          done();
        });
        sender.send(new Buffer(100), {binary: true}, function() {});
      });
  
      it('can fauxe stream data', function(done) {
        var received = [];
        var socket = {
          write: function(data, encoding, cb) {
            received.push(data);
            process.nextTick(cb);
          }
        };
        var sender = new Sender(socket, {});
        sender.send(new Buffer('foobar'), { fin: false }, function() {});
        sender.send('bazbar', { fin: false }, function() {});
        sender.send(new Buffer('end'), { fin: true }, function() {
          received[0].toString('utf8').should.eql('\u0000foobar');
          received[1].toString('utf8').should.eql('bazbar');
          received[2].toString('utf8').should.eql('end\ufffd');
          done();
        });
      });
    });
  
    describe('#close', function() {
      it('sends a hixie close frame', function(done) {
        var received;
        var socket = {
          write: function(data, encoding, cb) {
            received = data;
            process.nextTick(cb);
          }
        };
        var sender = new Sender(socket, {});
        sender.close(null, null, null, function() {
          received.toString('utf8').should.eql('\ufffd\u0000');
          done();
        });
      });
  
      it('sends a message end marker if fauxe streaming has started, before hixie close frame', function(done) {
        var received = [];
        var socket = {
          write: function(data, encoding, cb) {
            received.push(data);
            if (cb) process.nextTick(cb);
          }
        };
        var sender = new Sender(socket, {});
        sender.send(new Buffer('foobar'), { fin: false }, function() {});
        sender.close(null, null, null, function() {
          received[0].toString('utf8').should.eql('\u0000foobar');
          received[1].toString('utf8').should.eql('\ufffd');
          received[2].toString('utf8').should.eql('\ufffd\u0000');
          done();
        });
      });
    });
  });
  