jiodate.tests.js 9.62 KB
Newer Older
Romain Courteaud's avatar
Romain Courteaud committed
1 2 3
/*jslint nomen: true, newcap: true */
/*global jiodate, moment, console*/
(function (QUnit, jiodate, moment) {
Marco Mariani's avatar
Marco Mariani committed
4
  "use strict";
Romain Courteaud's avatar
Romain Courteaud committed
5 6 7 8 9 10 11
  var test = QUnit.test,
    ok = QUnit.ok,
    strictEqual = QUnit.strictEqual,
    equal = QUnit.equal,
    module = QUnit.module,
    JIODate = jiodate.JIODate,
    throws = QUnit.throws;
Marco Mariani's avatar
Marco Mariani committed
12 13 14 15 16 17 18 19 20 21 22 23

  module('JIODate');


  test("A JIODate can be instantiated without parameters (=now)", function () {
    ok((new JIODate()) instanceof JIODate);
    ok(JIODate() instanceof JIODate);
  });


  test("Parsing from ISO string and exposing Moment/Date objects", function () {
    var d = JIODate('2012-03-04T08:52:13.746Z');
24 25 26
    // Because the above JIODate is created in ISO string, which uses UTC time,
    // it's necessary to set the moment to use the UTC mode. Otherwise different
    // timezones may have different results for the getters below, as they will
27
    // try to convert it to local time.
28 29 30
    //
    d.mom.utc();

Marco Mariani's avatar
Marco Mariani committed
31 32 33 34 35 36 37 38 39 40 41
    ok(moment.isMoment(d.mom));
    strictEqual(d.mom.toISOString(), '2012-03-04T08:52:13.746Z');
    strictEqual(d.mom.year(), 2012);
    strictEqual(d.mom.month(), 2);
    strictEqual(d.mom.date(), 4);
    // and so on..
    strictEqual(d.mom.isoWeekday(), 7);
    strictEqual(d.mom.dayOfYear(), 64);
    strictEqual(d.mom.week(), 10);
    strictEqual(d.mom.isoWeek(), 9);
    strictEqual(d.mom.day(), 0);
42
    strictEqual(d.mom.hours(), 8);
Marco Mariani's avatar
Marco Mariani committed
43 44 45 46 47 48 49 50
    strictEqual(d.mom.minutes(), 52);
    strictEqual(d.mom.seconds(), 13);
    strictEqual(d.mom.milliseconds(), 746);
    // careful: changing the Date object changes the moment as well
    ok(d.mom.toDate() instanceof Date);
  });


Romain Courteaud's avatar
Romain Courteaud committed
51 52 53
  test("By default, maximum precision is kept, " +
       "but it can be changed later", function () {
      var d = new JIODate();
Marco Mariani's avatar
Marco Mariani committed
54

Romain Courteaud's avatar
Romain Courteaud committed
55 56 57 58 59 60 61 62
      equal(d.getPrecision(), jiodate.MSEC);
      d.setPrecision(jiodate.SEC);
      equal(d.getPrecision(), jiodate.SEC);
      d.setPrecision(jiodate.DAY);
      equal(d.getPrecision(), jiodate.DAY);
      d.setPrecision(jiodate.MONTH);
      equal(d.getPrecision(), jiodate.MONTH);
    });
Marco Mariani's avatar
Marco Mariani committed
63 64 65 66


  test("Passing a JIODate object to the constructor clones it", function () {
    var d = JIODate('2012-05-06');
67
    strictEqual(d.cmp(JIODate(d)), 0);
Marco Mariani's avatar
Marco Mariani committed
68 69 70
  });


71
  test("Comparison with .cmp() - any precision", function () {
Marco Mariani's avatar
Marco Mariani committed
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138
    var data = [
      [
        jiodate.MSEC,
        '2012-03-04T08:52:13.746Z',
        '2012-03-04T08:52:13.746Z',
        '2012-03-04T08:52:13.747Z'
      ], [
        jiodate.SEC,
        '2012-03-04T08:52:13.746Z',
        '2012-03-04T08:52:13.999Z',
        '2012-03-04T08:52:14.746Z'
      ], [
        jiodate.MIN,
        '2012-03-04T08:52:13.746Z',
        '2012-03-04T08:52:59.999Z',
        '2012-03-04T08:53:13.746Z'
      ], [
        jiodate.HOUR,
        '2012-03-04T08:52:13.746Z',
        '2012-03-04T08:59:59.999Z',
        '2012-03-04T09:52:13.746Z'
      ], [
        jiodate.DAY,
        '2012-03-04T08:52:13.746Z',
        '2012-03-04T20:59:59.999Z',
        '2012-03-05T08:52:13.746Z'
      ], [
        jiodate.MONTH,
        '2012-03-04T08:52:13.746Z',
        '2012-03-31T20:59:59.999Z',
        '2012-04-04T08:53:13.746Z'
      ], [
        jiodate.YEAR,
        '2012-03-04T08:52:13.746Z',
        '2012-12-31T20:59:59.999Z',
        '2013-03-04T08:53:13.746Z'
      ]
    ], i = 0, precision, d1, d2, d3, s1, s2, s3, mp;

    for (i = 0; i < data.length; i += 1) {
      precision = data[i][0];
      d1 = JIODate(data[i][1]);
      d2 = JIODate(data[i][2]);
      d3 = JIODate(data[i][3]);

      d1.setPrecision(precision);
      d2.setPrecision(precision);
      d3.setPrecision(precision);

      s1 = d1.mom.format();
      s2 = d2.mom.format();
      s3 = d3.mom.format();

      mp = ' - ' + precision;

      strictEqual(d1.cmp(d2), 0, s1 + ' cmp ' + s2 + mp);
      strictEqual(d1.cmp(d3), -1, s1 + ' cmp ' + s3 + mp);
      strictEqual(d2.cmp(d1), 0, s2 + ' cmp ' + s1 + mp);
      strictEqual(d2.cmp(d3), -1, s2 + ' cmp ' + s3 + mp);
      strictEqual(d3.cmp(d1), 1, s3 + ' cmp ' + s1 + mp);
      strictEqual(d3.cmp(d2), 1, s1 + ' cmp ' + s2 + mp);
    }

  });


  test("Display timestamp value trucated to precision", function () {
139
    var d = JIODate('2012-03-04T08:52:13.746');
Marco Mariani's avatar
Marco Mariani committed
140

141 142 143 144
    strictEqual(d.toPrecisionString(jiodate.MSEC), '2012-03-04 08:52:13.746');
    strictEqual(d.toPrecisionString(jiodate.SEC), '2012-03-04 08:52:13');
    strictEqual(d.toPrecisionString(jiodate.MIN), '2012-03-04 08:52');
    strictEqual(d.toPrecisionString(jiodate.HOUR), '2012-03-04 08');
Marco Mariani's avatar
Marco Mariani committed
145 146 147 148 149 150 151 152 153 154 155 156 157
    strictEqual(d.toPrecisionString(jiodate.DAY), '2012-03-04');
    strictEqual(d.toPrecisionString(jiodate.MONTH), '2012-03');
    strictEqual(d.toPrecisionString(jiodate.YEAR), '2012');

    throws(
      function () {
        d.toPrecisionString('something');
      },
      /Unsupported precision value 'something'/,
      "Precision parameter must be a valid value"
    );

    d.setPrecision(jiodate.HOUR);
158
    strictEqual(d.toPrecisionString(), '2012-03-04 08');
Marco Mariani's avatar
Marco Mariani committed
159 160 161 162 163 164 165 166 167 168 169 170 171 172
  });


  test("Parsing of invalid input", function () {
    throws(
      function () {
        JIODate('foobar');
      },
      /Cannot parse: foobar/,
      "Invalid strings raise exceptions"
    );
  });


173 174 175 176 177 178 179 180 181 182 183 184
  test("The toString() method should retain the precision", function () {
    var d;

    d = JIODate('2012-05-08');
    strictEqual(d.toString(), '2012-05-08');
    d = JIODate('2012-05');
    strictEqual(d.toString(), '2012-05');
    d = JIODate('2012');
    strictEqual(d.toString(), '2012');
  });


Marco Mariani's avatar
Marco Mariani committed
185 186 187 188 189 190
  test("Parsing of partial timestamp values with any precision", function () {
    var d;

    d = JIODate('2012-05-02 06:07:08.989');
    strictEqual(d.getPrecision(), 'millisecond');
    strictEqual(d.toPrecisionString(), '2012-05-02 06:07:08.989');
191 192
    strictEqual(
      d.mom.toDate().valueOf(),
193 194 195 196 197 198
      // This Date constructor needs to be used because of older Firefox
      // versions that do not parse some date strings formats correctly. It
      // uses months from 0 to 11. So if we want to create  a date in May, we
      // need to use 4 instead of 5.
      //
      new Date(2012, 4, 2, 6, 7, 8, 989).valueOf()
199
    );
Marco Mariani's avatar
Marco Mariani committed
200 201 202 203

    d = JIODate('2012-05-02 06:07:08');
    strictEqual(d.getPrecision(), 'second');
    strictEqual(d.toPrecisionString(), '2012-05-02 06:07:08');
204 205
    strictEqual(
      d.mom.toDate().valueOf(),
206
      new Date(2012, 4, 2, 6, 7, 8, 0).valueOf()
207
    );
Marco Mariani's avatar
Marco Mariani committed
208 209 210 211

    d = JIODate('2012-05-02 06:07');
    strictEqual(d.getPrecision(), 'minute');
    strictEqual(d.toPrecisionString(), '2012-05-02 06:07');
212 213
    strictEqual(
      d.mom.toDate().valueOf(),
214
      new Date(2012, 4, 2, 6, 7, 0, 0).valueOf()
215
    );
Marco Mariani's avatar
Marco Mariani committed
216 217 218 219

    d = JIODate('2012-05-02 06');
    strictEqual(d.getPrecision(), 'hour');
    strictEqual(d.toPrecisionString(), '2012-05-02 06');
220 221
    strictEqual(
      d.mom.toDate().valueOf(),
222
      new Date(2012, 4, 2, 6, 0, 0, 0).valueOf()
223
    );
Marco Mariani's avatar
Marco Mariani committed
224 225 226 227

    d = JIODate('2012-05-02');
    strictEqual(d.getPrecision(), 'day');
    strictEqual(d.toPrecisionString(), '2012-05-02');
228 229
    strictEqual(
      d.mom.toDate().valueOf(),
230
      new Date(2012, 4, 2, 0, 0, 0, 0).valueOf()
231
    );
Marco Mariani's avatar
Marco Mariani committed
232 233 234 235

    d = JIODate('2012-05');
    strictEqual(d.getPrecision(), 'month');
    strictEqual(d.toPrecisionString(), '2012-05');
236 237
    strictEqual(
      d.mom.toDate().valueOf(),
238
      new Date(2012, 4, 1, 0, 0, 0, 0).valueOf()
239
    );
Marco Mariani's avatar
Marco Mariani committed
240 241 242 243

    d = JIODate('2012');
    strictEqual(d.getPrecision(), 'year');
    strictEqual(d.toPrecisionString(), '2012');
244 245
    strictEqual(
      d.mom.toDate().valueOf(),
246
      new Date(2012, 0, 1, 0, 0, 0, 0).valueOf()
247
    );
Marco Mariani's avatar
Marco Mariani committed
248 249 250
  });


Romain Courteaud's avatar
Romain Courteaud committed
251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315
  test("Comparison between heterogeneous values is done with " +
       "the lesser precision", function () {
      var dmsec = JIODate('2012-05-02 06:07:08.989'),
        dsec = JIODate('2012-05-02 06:07:08'),
        dmin = JIODate('2012-05-02 06:07'),
        dhour = JIODate('2012-05-02 06'),
        dday = JIODate('2012-05-02'),
        dmonth = JIODate('2012-05'),
        dyear = JIODate('2012');

      strictEqual(dmsec.cmp(dsec), 0);
      strictEqual(dmsec.cmp(dmin), 0);
      strictEqual(dmsec.cmp(dhour), 0);
      strictEqual(dmsec.cmp(dday), 0);
      strictEqual(dmsec.cmp(dmonth), 0);
      strictEqual(dmsec.cmp(dyear), 0);

      strictEqual(dsec.cmp(dmsec), 0);
      strictEqual(dsec.cmp(dmin), 0);
      strictEqual(dsec.cmp(dhour), 0);
      strictEqual(dsec.cmp(dday), 0);
      strictEqual(dsec.cmp(dmonth), 0);
      strictEqual(dsec.cmp(dyear), 0);

      strictEqual(dmin.cmp(dmsec), 0);
      strictEqual(dmin.cmp(dsec), 0);
      strictEqual(dmin.cmp(dhour), 0);
      strictEqual(dmin.cmp(dday), 0);
      strictEqual(dmin.cmp(dmonth), 0);
      strictEqual(dmin.cmp(dyear), 0);

      strictEqual(dhour.cmp(dmsec), 0);
      strictEqual(dhour.cmp(dsec), 0);
      strictEqual(dhour.cmp(dmin), 0);
      strictEqual(dhour.cmp(dday), 0);
      strictEqual(dhour.cmp(dmonth), 0);
      strictEqual(dhour.cmp(dyear), 0);

      strictEqual(dday.cmp(dmsec), 0);
      strictEqual(dday.cmp(dsec), 0);
      strictEqual(dday.cmp(dmin), 0);
      strictEqual(dday.cmp(dhour), 0);
      strictEqual(dday.cmp(dmonth), 0);
      strictEqual(dday.cmp(dyear), 0);

      strictEqual(dmonth.cmp(dmsec), 0);
      strictEqual(dmonth.cmp(dsec), 0);
      strictEqual(dmonth.cmp(dmin), 0);
      strictEqual(dmonth.cmp(dhour), 0);
      strictEqual(dmonth.cmp(dday), 0);
      strictEqual(dmonth.cmp(dyear), 0);

      strictEqual(dyear.cmp(dmsec), 0);
      strictEqual(dyear.cmp(dsec), 0);
      strictEqual(dyear.cmp(dmin), 0);
      strictEqual(dyear.cmp(dhour), 0);
      strictEqual(dyear.cmp(dday), 0);
      strictEqual(dyear.cmp(dmonth), 0);

      strictEqual(dmsec.cmp(JIODate('2012-05-02 06:07:07')), +1);
      strictEqual(dmsec.cmp(JIODate('2012-05-02 06:07:08')), 0);
      strictEqual(dmsec.cmp(JIODate('2012-05-02 06:07:09')), -1);
    });

}(QUnit, jiodate, moment));