/* eslint-disable no-console, func-names */
'use strict';

var EventEmitter = require('events').EventEmitter;
var test = require('tape');
var bubbleError = require('./');

test('it should return the arguments as an array', function(t) {
  var emitter1 = new EventEmitter();
  var emitter2 = new EventEmitter();
  var emitter3 = new EventEmitter();
  var streams = [emitter1, emitter2, emitter3];

  t.deepEqual(streams, bubbleError.apply(null, streams));

  t.end();
});

test('it should bubble up the error to the last stream', function(t) {
  var emitter1 = new EventEmitter();
  var emitter2 = new EventEmitter();
  var emitter3 = new EventEmitter();
  var streams = [emitter1, emitter2, emitter3];
  var err = new Error('test');

  bubbleError.apply(null, streams);

  emitter3.on('error', function(e) {
    t.equal(e, err);
    t.end();
  });

  emitter1.emit('error', err);
});

test('it should only emit an error event once', function(t) {
  var emitter1 = new EventEmitter();
  var emitter2 = new EventEmitter();
  var emitter3 = new EventEmitter();
  var streams = [emitter1, emitter2, emitter3];
  var err = new Error('test');

  bubbleError.apply(null, streams);

  emitter3.on('error', function(e) {
    t.equal(e, err);
    t.end();
  });

  emitter1.emit('error', err);
  emitter2.emit('error', err);
});

test('it should not bubble up other events', function(t) {
  var emitter1 = new EventEmitter();
  var emitter2 = new EventEmitter();
  var emitter3 = new EventEmitter();
  var streams = [emitter1, emitter2, emitter3];

  bubbleError.apply(null, streams);

  emitter2.on('data', function(d) {
    t.equal(d, 'test');
  });
  emitter3.on('data', function() {
    throw new Error('Unexpected data event');
  });

  emitter2.emit('data', 'test');

  t.end();
});