var assert = require('assert');

var _ = require('underscore');

var dateFormat = require('../lib/dateformat');

var expects = {
  'default':               'Wed Nov 26 2014 13:19:44',
  'shortDate':             '11/26/14',
  'mediumDate':            'Nov 26, 2014',
  'longDate':              'November 26, 2014',
  'fullDate':              'Wednesday, November 26, 2014',
  'shortTime':             '1:19 PM',
  'mediumTime':            '1:19:44 PM',
  'longTime':              '1:19:44 PM %TZ_PREFIX%%TZ_OFFSET%',
  'isoDate':               '2014-11-26',
  'isoTime':               '13:19:44',
  'isoDateTime':           '2014-11-26T13:19:44%TZ_OFFSET%',
  'isoUtcDateTime':        '',
  'expiresHeaderFormat':   'Wed, 26 Nov 2014 13:19:44 %TZ_PREFIX%%TZ_OFFSET%'
};

function pad(num, size) {
    var s = num + '';
    while (s.length < size) {
      s = '0' + s;
    }
    return s;
}

function parseOffset(date) {
  var offset = date.getTimezoneOffset();
  var hours = Math.floor(-1 * offset / 60);
  var minutes = (-1 * offset) - (hours * 60);
  var sign = offset > 0 ? '-' : '+';
  return {
    offset: offset,
    hours: hours,
    minutes: minutes,
    sign: sign,
  };
}

function timezoneOffset(date) {
  var offset = parseOffset(date);
  return offset.sign + pad(offset.hours, 2) + pad(offset.minutes, 2);
}

describe('dateformat([now], [mask])', function() {
  _.each(dateFormat.masks, function(value, key) {
    it('should format `' + key + '` mask', function(done) {
      var now = new Date(2014, 10, 26, 13, 19, 44);
      var tzOffset = timezoneOffset(now);
      var expected = expects[key].replace(/%TZ_PREFIX%/, 'GMT')
                                 .replace(/%TZ_OFFSET%/g, tzOffset)
                                 .replace(/GMT\+0000/g, 'UTC');
      if (key === 'isoUtcDateTime') {
        var offset = parseOffset(now);
        now.setHours(now.getHours() - offset.hours,
                     now.getMinutes() - offset.minutes);
        var expected = now.toISOString().replace(/\.000/g, '');
      }
      var actual = dateFormat(now, key);
      assert.strictEqual(actual, expected);
      done();
    });
  });
  it('should use `default` mask, when `mask` is empty', function(done) {
    var now = new Date(2014, 10, 26, 13, 19, 44);
    var expected = expects['default'];
    var actual = dateFormat(now);

    assert.strictEqual(actual, expected);
    done();
  });
});

var assert = require("assert");

var _ = require("underscore");

var dateFormat = require("../lib/dateformat");

var expects = {
  default: "Wed Nov 26 2014 13:19:44",
  shortDate: "11/26/14",
  mediumDate: "Nov 26, 2014",
  longDate: "November 26, 2014",
  fullDate: "Wednesday, November 26, 2014",
  shortTime: "1:19 PM",
  mediumTime: "1:19:44 PM",
  longTime: "1:19:44 PM %TZ_PREFIX%%TZ_OFFSET%",
  isoDate: "2014-11-26",
  isoTime: "13:19:44",
  isoDateTime: "2014-11-26T13:19:44%TZ_OFFSET%",
  isoUtcDateTime: "",
  expiresHeaderFormat: "Wed, 26 Nov 2014 13:19:44 %TZ_PREFIX%%TZ_OFFSET%",
};

function pad(num, size) {
  var s = num + "";
  while (s.length < size) {
    s = "0" + s;
  }
  return s;
}

function parseOffset(date) {
  var offset = date.getTimezoneOffset();
  var hours = Math.floor((-1 * offset) / 60);
  var minutes = -1 * offset - hours * 60;
  var sign = offset > 0 ? "-" : "+";
  return {
    offset: offset,
    hours: hours,
    minutes: minutes,
    sign: sign,
  };
}

function timezoneOffset(date) {
  var offset = parseOffset(date);
  return offset.sign + pad(offset.hours, 2) + pad(offset.minutes, 2);
}

describe("dateformat([now], [mask])", function () {
  _.each(dateFormat.masks, function (value, key) {
    it("should format `" + key + "` mask", function (done) {
      var now = new Date(2014, 10, 26, 13, 19, 44);
      var tzOffset = timezoneOffset(now);
      var expected = expects[key]
        .replace(/%TZ_PREFIX%/, "GMT")
        .replace(/%TZ_OFFSET%/g, tzOffset)
        .replace(/GMT\+0000/g, "UTC");
      if (key === "isoUtcDateTime") {
        var offset = parseOffset(now);
        now.setHours(
          now.getHours() - offset.hours,
          now.getMinutes() - offset.minutes
        );
        var expected = now.toISOString().replace(/\.000/g, "");
      }
      var actual = dateFormat(now, key);
      assert.strictEqual(actual, expected);
      done();
    });
  });
  it("should use `default` mask, when `mask` is empty", function (done) {
    var now = new Date(2014, 10, 26, 13, 19, 44);
    var expected = expects["default"];
    var actual = dateFormat(now);

    assert.strictEqual(actual, expected);
    done();
  });
});

Format Test Format