var assert = require('assert')
  , expect = require('expect.js')
  , Receiver = require('../lib/Receiver.hixie');
require('./hybi-common');

describe('Receiver', function() {
  it('can parse text message', function() {
    var p = new Receiver();
    var packet = '00 48 65 6c 6c 6f ff';

    var gotData = false;
    p.ontext = function(data) {
      gotData = true;
      assert.equal('Hello', data);
    };

    p.add(getBufferFromHexString(packet));
    expect(gotData).to.equal(true);
  });

  it('can parse multiple text messages', function() {
    var p = new Receiver();
    var packet = '00 48 65 6c 6c 6f ff 00 48 65 6c 6c 6f ff';

    var gotData = false;
    var messages = [];
    p.ontext = function(data) {
      gotData = true;
      messages.push(data);
    };

    p.add(getBufferFromHexString(packet));
    expect(gotData).to.equal(true);
    for (var i = 0; i < 2; ++i) {
      expect(messages[i]).to.equal('Hello');
    }
  });

  it('can parse empty message', function() {
    var p = new Receiver();
    var packet = '00 ff';

    var gotData = false;
    p.ontext = function(data) {
      gotData = true;
      assert.equal('', data);
    };

    p.add(getBufferFromHexString(packet));
    expect(gotData).to.equal(true);
  });

  it('can parse text messages delivered over multiple frames', function() {
    var p = new Receiver();
    var packets = [
      '00 48',
      '65 6c 6c',
      '6f ff 00 48',
      '65',
      '6c 6c 6f',
      'ff'
    ];

    var gotData = false;
    var messages = [];
    p.ontext = function(data) {
      gotData = true;
      messages.push(data);
    };

    for (var i = 0; i < packets.length; ++i) {
      p.add(getBufferFromHexString(packets[i]));
    }
    expect(gotData).to.equal(true);
    for (var i = 0; i < 2; ++i) {
      expect(messages[i]).to.equal('Hello');
    }
  });

  it('emits an error if a payload doesnt start with 0x00', function() {
    var p = new Receiver();
    var packets = [
      '00 6c ff',
      '00 6c ff ff',
      'ff 00 6c ff 00 6c ff',
      '00',
      '6c 6c 6f',
      'ff'
    ];

    var gotData = false;
    var gotError = false;
    var messages = [];
    p.ontext = function(data) {
      gotData = true;
      messages.push(data);
    };
    p.onerror = function(reason, code) {
      gotError = code == true;
    };

    for (var i = 0; i < packets.length && !gotError; ++i) {
      p.add(getBufferFromHexString(packets[i]));
    }
    expect(gotError).to.equal(true);
    expect(messages[0]).to.equal('l');
    expect(messages[1]).to.equal('l');
    expect(messages.length).to.equal(2);
  });

  it('can parse close messages', function() {
    var p = new Receiver();
    var packets = [
      'ff 00'
    ];

    var gotClose = false;
    var gotError = false;
    p.onclose = function() {
      gotClose = true;
    };
    p.onerror = function(reason, code) {
      gotError = code == true;
    };

    for (var i = 0; i < packets.length && !gotError; ++i) {
      p.add(getBufferFromHexString(packets[i]));
    }
    expect(gotClose).to.equal(true);
    expect(gotError).to.equal(false);
  });

  it('can parse binary messages delivered over multiple frames', function() {
    var p = new Receiver();
    var packets = [
      '80 05 48',
      '65 6c 6c',
      '6f 80 80 05 48',
      '65',
      '6c 6c 6f'
    ];

    var gotData = false;
    var messages = [];
    p.ontext = function(data) {
      gotData = true;
      messages.push(data);
    };

    for (var i = 0; i < packets.length; ++i) {
      p.add(getBufferFromHexString(packets[i]));
    }
    expect(gotData).to.equal(true);
    for (var i = 0; i < 2; ++i) {
      expect(messages[i]).to.equal('Hello');
    }
  });
});
