'use strict';

var tap     = require('tap')
  , test    = tap.test
  , sinon   = require('sinon')
  , shimmer = require('../index.js')
  ;

test("shimmer initialization", function (t) {
  t.plan(4);

  t.doesNotThrow(function () { shimmer(); });

  var mock = sinon.expectation
                  .create('logger')
                  .withArgs("no original function undefined to wrap")
                  .once();

  t.doesNotThrow(function () {
    shimmer({logger : mock});
  }, "initializer doesn't throw");

  t.doesNotThrow(function () {
    shimmer.wrap();
  }, "invoking the wrap method with no params doesn't throw");

  t.doesNotThrow(function () {
    mock.verify();
  }, "logger method was called with the expected message");
});

test("shimmer initialized with non-function logger", function (t) {
  t.plan(2);

  var mock = sinon.expectation
                  .create('logger')
                  .withArgs("new logger isn't a function, not replacing")
                  .once();

  shimmer({logger : mock});

  t.doesNotThrow(function () {
    shimmer({logger : {ham : 'chunx'}});
  }, "even bad initialization doesn't throw");

  t.doesNotThrow(function () {
    mock.verify();
  }, "logger initialization failed in the expected way");
});
