// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

var test = require('prova');
var vlog = require('../../src/lib/vlog').logger;
var Vlog = require('../../src/lib/vlog').Vlog;
var levels = require('../../src/lib/vlog').levels;
var methods = [
  'debug',
  'info',
  'warn',
  'error'
];

test('var vlog = require("vanadium/lib/src/vlog")', function(assert) {
  assert.ok(vlog instanceof Vlog);
  assert.end();
});

test('var log = VLog()', function(assert) {
  assert.ok(Vlog() instanceof Vlog, 'should not require "new"'); // jshint ignore:line
  assert.end();
});

test('var log = new VLog({ level: NOLOG })', function(assert) {
  var mc = new MockConsole();
  var log = new Vlog({
    level: levels.NOLOG,
    console: mc
  });

  methods.forEach(function(method) {
    log[method]('foo');
  });

  assert.equal(mc.calls('info'), 0);
  assert.equal(mc.calls('log'), 0);
  assert.equal(mc.calls('warn'), 0);
  assert.equal(mc.calls('error'), 0);

  assert.end();
});

test('var log = new VLog({ level: ERROR })', function(assert) {
  var mc = new MockConsole();
  var log = new Vlog({
    level: levels.ERROR,
    console: mc
  });

  methods.forEach(function(method) {
    log[method]('foo');
  });

  assert.equal(mc.calls('info'), 0);
  assert.equal(mc.calls('log'), 0);
  assert.equal(mc.calls('warn'), 0);
  assert.equal(mc.calls('error'), 1);

  assert.end();
});

test('var log = new VLog({ level: WARN })', function(assert) {
  var mc = new MockConsole();
  var log = new Vlog({
    level: levels.WARN,
    console: mc
  });

  methods.forEach(function(method) {
    log[method]('foo');
  });

  assert.equal(mc.calls('info'), 0);
  assert.equal(mc.calls('log'), 0);
  assert.equal(mc.calls('warn'), 1);
  assert.equal(mc.calls('error'), 1);

  assert.end();
});

test('var log = new VLog({ level: DEBUG })', function(assert) {
  var mc = new MockConsole();
  var log = new Vlog({
    level: levels.DEBUG,
    console: mc
  });

  methods.forEach(function(method) {
    log[method]('foo');
  });

  assert.equal(mc.calls('info'), 0);
  assert.equal(mc.calls('log'), 1);
  assert.equal(mc.calls('warn'), 1);
  assert.equal(mc.calls('error'), 1);

  assert.end();
});

test('var log = new VLog({ level: INFO })', function(assert) {
  var mc = new MockConsole();
  var log = new Vlog({
    level: levels.INFO,
    console: mc
  });

  methods.forEach(function(method) {
    log[method]('foo');
  });

  assert.equal(mc.calls('info'), 1);
  assert.equal(mc.calls('log'), 1);
  assert.equal(mc.calls('warn'), 1);
  assert.equal(mc.calls('error'), 1);

  assert.end();
});

test('vlog[method]() - proxies arguments to vlog.console', function(assert) {
  var mc = new MockConsole();
  var log = new Vlog({
    level: levels.INFO,
    console: mc
  });

  log.debug('foo %s', 'bar', { baz: 'qux' });

  var args = mc._calls.log[0];

  assert.equal(mc.calls('log'), 1);
  assert.equal(args[0], 'foo %s');
  assert.equal(args[1], 'bar');
  assert.deepEqual(args[2], { baz: 'qux' });
  assert.end();
});

function MockConsole() {
  this._calls = {
    info: [],
    log: [],
    warn: [],
    error: []
  };
}

MockConsole.prototype.calls = function(key) {
  return this._calls[key].length;
};

// Stub out console methods
[
  'info',
  'log',
  'warn',
  'error'
].forEach(function(m) {
  MockConsole.prototype[m] = function() {
    this._calls[m].push(arguments);
  };
});
