toolkit/javascript/d3/test/time/scale-test.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 require("../env");
       
     2 require("../../d3");
       
     3 require("../../d3.time");
       
     4 
       
     5 var vows = require("vows"),
       
     6     assert = require("assert");
       
     7 
       
     8 var suite = vows.describe("d3.time.scale");
       
     9 
       
    10 suite.addBatch({
       
    11   "scale": {
       
    12     topic: function() {
       
    13       return d3.time.scale;
       
    14     },
       
    15 
       
    16     "copy": {
       
    17       "changes to the domain are isolated": function(scale) {
       
    18         var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]), y = x.copy();
       
    19         x.domain([local(2010, 0, 1), local(2011, 0, 1)]);
       
    20         assert.deepEqual(y.domain(), [local(2009, 0, 1), local(2010, 0, 1)]);
       
    21         assert.equal(x(local(2010, 0, 1)), 0);
       
    22         assert.equal(y(local(2010, 0, 1)), 1);
       
    23         y.domain([local(2011, 0, 1), local(2012, 0, 1)]);
       
    24         assert.equal(x(local(2011, 0, 1)), 1);
       
    25         assert.equal(y(local(2011, 0, 1)), 0);
       
    26         assert.deepEqual(x.domain(), [local(2010, 0, 1), local(2011, 0, 1)]);
       
    27         assert.deepEqual(y.domain(), [local(2011, 0, 1), local(2012, 0, 1)]);
       
    28       },
       
    29       "changes to the range are isolated": function(scale) {
       
    30         var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]), y = x.copy();
       
    31         x.range([1, 2]);
       
    32         assert.deepEqual(x.invert(1), local(2009, 0, 1));
       
    33         assert.deepEqual(y.invert(1), local(2010, 0, 1));
       
    34         assert.deepEqual(y.range(), [0, 1]);
       
    35         y.range([2, 3]);
       
    36         assert.deepEqual(x.invert(2), local(2010, 0, 1));
       
    37         assert.deepEqual(y.invert(2), local(2009, 0, 1));
       
    38         assert.deepEqual(x.range(), [1, 2]);
       
    39         assert.deepEqual(y.range(), [2, 3]);
       
    40       },
       
    41       "changes to the interpolator are isolated": function(scale) {
       
    42         var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]).range(["red", "blue"]), y = x.copy();
       
    43         x.interpolate(d3.interpolateHsl);
       
    44         assert.equal(x(local(2009, 6, 1)), "#04ff00");
       
    45         assert.equal(y(local(2009, 6, 1)), "#81007e");
       
    46         assert.equal(y.interpolate(), d3.interpolate);
       
    47       },
       
    48       "changes to clamping are isolated": function(scale) {
       
    49         var x = scale().domain([local(2009, 0, 1), local(2010, 0, 1)]).clamp(true), y = x.copy();
       
    50         x.clamp(false);
       
    51         assert.equal(x(local(2011, 0, 1)), 2);
       
    52         assert.equal(y(local(2011, 0, 1)), 1);
       
    53         assert.isTrue(y.clamp());
       
    54         y.clamp(false);
       
    55         assert.equal(x(local(2011, 0, 1)), 2);
       
    56         assert.equal(y(local(2011, 0, 1)), 2);
       
    57         assert.isFalse(x.clamp());
       
    58       }
       
    59     },
       
    60 
       
    61     "ticks": {
       
    62       "observes explicit tick interval": function(scale) {
       
    63         var x = scale().domain([local(2011, 0, 1, 12, 1, 0), local(2011, 0, 1, 12, 4, 4)]);
       
    64         assert.deepEqual(x.ticks(d3.time.minutes), [
       
    65           local(2011, 0, 1, 12, 1),
       
    66           local(2011, 0, 1, 12, 2),
       
    67           local(2011, 0, 1, 12, 3),
       
    68           local(2011, 0, 1, 12, 4)
       
    69         ]);
       
    70       },
       
    71       "observes explicit tick interval and step": function(scale) {
       
    72         var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 33, 4)]);
       
    73         assert.deepEqual(x.ticks(d3.time.minutes, 10), [
       
    74           local(2011, 0, 1, 12, 0),
       
    75           local(2011, 0, 1, 12, 10),
       
    76           local(2011, 0, 1, 12, 20),
       
    77           local(2011, 0, 1, 12, 30)
       
    78         ]);
       
    79       },
       
    80       "generates 1-second ticks": function(scale) {
       
    81         var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 0, 4)]);
       
    82         assert.deepEqual(x.ticks(4), [
       
    83           local(2011, 0, 1, 12, 0, 0),
       
    84           local(2011, 0, 1, 12, 0, 1),
       
    85           local(2011, 0, 1, 12, 0, 2),
       
    86           local(2011, 0, 1, 12, 0, 3)
       
    87         ]);
       
    88       },
       
    89       "generates 5-second ticks": function(scale) {
       
    90         var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 0, 20)]);
       
    91         assert.deepEqual(x.ticks(4), [
       
    92           local(2011, 0, 1, 12, 0, 0),
       
    93           local(2011, 0, 1, 12, 0, 5),
       
    94           local(2011, 0, 1, 12, 0, 10),
       
    95           local(2011, 0, 1, 12, 0, 15)
       
    96         ]);
       
    97       },
       
    98       "generates 15-second ticks": function(scale) {
       
    99         var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 0, 50)]);
       
   100         assert.deepEqual(x.ticks(4), [
       
   101           local(2011, 0, 1, 12, 0, 0),
       
   102           local(2011, 0, 1, 12, 0, 15),
       
   103           local(2011, 0, 1, 12, 0, 30),
       
   104           local(2011, 0, 1, 12, 0, 45)
       
   105         ]);
       
   106       },
       
   107       "generates 30-second ticks": function(scale) {
       
   108         var x = scale().domain([local(2011, 0, 1, 12, 0, 0), local(2011, 0, 1, 12, 1, 50)]);
       
   109         assert.deepEqual(x.ticks(4), [
       
   110           local(2011, 0, 1, 12, 0, 0),
       
   111           local(2011, 0, 1, 12, 0, 30),
       
   112           local(2011, 0, 1, 12, 1, 0),
       
   113           local(2011, 0, 1, 12, 1, 30)
       
   114         ]);
       
   115       },
       
   116       "generates 1-minute ticks": function(scale) {
       
   117         var x = scale().domain([local(2011, 0, 1, 12, 0, 27), local(2011, 0, 1, 12, 4, 12)]);
       
   118         assert.deepEqual(x.ticks(4), [
       
   119           local(2011, 0, 1, 12, 1),
       
   120           local(2011, 0, 1, 12, 2),
       
   121           local(2011, 0, 1, 12, 3),
       
   122           local(2011, 0, 1, 12, 4)
       
   123         ]);
       
   124       },
       
   125       "generates 5-minute ticks": function(scale) {
       
   126         var x = scale().domain([local(2011, 0, 1, 12, 3, 27), local(2011, 0, 1, 12, 21, 12)]);
       
   127         assert.deepEqual(x.ticks(4), [
       
   128           local(2011, 0, 1, 12, 5),
       
   129           local(2011, 0, 1, 12, 10),
       
   130           local(2011, 0, 1, 12, 15),
       
   131           local(2011, 0, 1, 12, 20)
       
   132         ]);
       
   133       },
       
   134       "generates 15-minute ticks": function(scale) {
       
   135         var x = scale().domain([local(2011, 0, 1, 12, 8, 27), local(2011, 0, 1, 13, 4, 12)]);
       
   136         assert.deepEqual(x.ticks(4), [
       
   137           local(2011, 0, 1, 12, 15),
       
   138           local(2011, 0, 1, 12, 30),
       
   139           local(2011, 0, 1, 12, 45),
       
   140           local(2011, 0, 1, 13, 0)
       
   141         ]);
       
   142       },
       
   143       "generates 30-minute ticks": function(scale) {
       
   144         var x = scale().domain([local(2011, 0, 1, 12, 28, 27), local(2011, 0, 1, 14, 4, 12)]);
       
   145         assert.deepEqual(x.ticks(4), [
       
   146           local(2011, 0, 1, 12, 30),
       
   147           local(2011, 0, 1, 13, 0),
       
   148           local(2011, 0, 1, 13, 30),
       
   149           local(2011, 0, 1, 14, 0)
       
   150         ]);
       
   151       },
       
   152       "generates 1-hour ticks": function(scale) {
       
   153         var x = scale().domain([local(2011, 0, 1, 12, 28, 27), local(2011, 0, 1, 16, 34, 12)]);
       
   154         assert.deepEqual(x.ticks(4), [
       
   155           local(2011, 0, 1, 13, 0),
       
   156           local(2011, 0, 1, 14, 0),
       
   157           local(2011, 0, 1, 15, 0),
       
   158           local(2011, 0, 1, 16, 0)
       
   159         ]);
       
   160       },
       
   161       "generates 3-hour ticks": function(scale) {
       
   162         var x = scale().domain([local(2011, 0, 1, 14, 28, 27), local(2011, 0, 2, 1, 34, 12)]);
       
   163         assert.deepEqual(x.ticks(4), [
       
   164           local(2011, 0, 1, 15, 0),
       
   165           local(2011, 0, 1, 18, 0),
       
   166           local(2011, 0, 1, 21, 0),
       
   167           local(2011, 0, 2, 0, 0)
       
   168         ]);
       
   169       },
       
   170       "generates 6-hour ticks": function(scale) {
       
   171         var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 2, 14, 34, 12)]);
       
   172         assert.deepEqual(x.ticks(4), [
       
   173           local(2011, 0, 1, 18, 0),
       
   174           local(2011, 0, 2, 0, 0),
       
   175           local(2011, 0, 2, 6, 0),
       
   176           local(2011, 0, 2, 12, 0)
       
   177         ]);
       
   178       },
       
   179       "generates 12-hour ticks": function(scale) {
       
   180         var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 3, 21, 34, 12)]);
       
   181         assert.deepEqual(x.ticks(4), [
       
   182           local(2011, 0, 2, 0, 0),
       
   183           local(2011, 0, 2, 12, 0),
       
   184           local(2011, 0, 3, 0, 0),
       
   185           local(2011, 0, 3, 12, 0)
       
   186         ]);
       
   187       },
       
   188       "generates 1-day ticks": function(scale) {
       
   189         var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 5, 21, 34, 12)]);
       
   190         assert.deepEqual(x.ticks(4), [
       
   191           local(2011, 0, 2, 0, 0),
       
   192           local(2011, 0, 3, 0, 0),
       
   193           local(2011, 0, 4, 0, 0),
       
   194           local(2011, 0, 5, 0, 0)
       
   195         ]);
       
   196       },
       
   197       "generates 2-day ticks": function(scale) {
       
   198         var x = scale().domain([local(2011, 0, 2, 16, 28, 27), local(2011, 0, 9, 21, 34, 12)]);
       
   199         assert.deepEqual(x.ticks(4), [
       
   200           local(2011, 0, 3, 0, 0),
       
   201           local(2011, 0, 5, 0, 0),
       
   202           local(2011, 0, 7, 0, 0),
       
   203           local(2011, 0, 9, 0, 0)
       
   204         ]);
       
   205       },
       
   206       "generates 1-week ticks": function(scale) {
       
   207         var x = scale().domain([local(2011, 0, 1, 16, 28, 27), local(2011, 0, 23, 21, 34, 12)]);
       
   208         assert.deepEqual(x.ticks(4), [
       
   209           local(2011, 0, 2, 0, 0),
       
   210           local(2011, 0, 9, 0, 0),
       
   211           local(2011, 0, 16, 0, 0),
       
   212           local(2011, 0, 23, 0, 0)
       
   213         ]);
       
   214       },
       
   215       "generates 1-month ticks": function(scale) {
       
   216         var x = scale().domain([local(2011, 0, 18), local(2011, 4, 2)]);
       
   217         assert.deepEqual(x.ticks(4), [
       
   218           local(2011, 1, 1, 0, 0),
       
   219           local(2011, 2, 1, 0, 0),
       
   220           local(2011, 3, 1, 0, 0),
       
   221           local(2011, 4, 1, 0, 0)
       
   222         ]);
       
   223       },
       
   224       "generates 3-month ticks": function(scale) {
       
   225         var x = scale().domain([local(2010, 11, 18), local(2011, 10, 2)]);
       
   226         assert.deepEqual(x.ticks(4), [
       
   227           local(2011, 0, 1, 0, 0),
       
   228           local(2011, 3, 1, 0, 0),
       
   229           local(2011, 6, 1, 0, 0),
       
   230           local(2011, 9, 1, 0, 0)
       
   231         ]);
       
   232       },
       
   233       "generates 1-year ticks": function(scale) {
       
   234         var x = scale().domain([local(2010, 11, 18), local(2014, 2, 2)]);
       
   235         assert.deepEqual(x.ticks(4), [
       
   236           local(2011, 0, 1, 0, 0),
       
   237           local(2012, 0, 1, 0, 0),
       
   238           local(2013, 0, 1, 0, 0),
       
   239           local(2014, 0, 1, 0, 0)
       
   240         ]);
       
   241       }
       
   242     },
       
   243 
       
   244     "tickFormat": {
       
   245       topic: function(scale) {
       
   246         return scale().tickFormat();
       
   247       },
       
   248       "formats year on New Year's": function(format) {
       
   249         assert.equal(format(local(2011, 0, 1)), "2011");
       
   250         assert.equal(format(local(2012, 0, 1)), "2012");
       
   251         assert.equal(format(local(2013, 0, 1)), "2013");
       
   252       },
       
   253       "formats month on the 1st of each month": function(format) {
       
   254         assert.equal(format(local(2011, 1, 1)), "February");
       
   255         assert.equal(format(local(2011, 2, 1)), "March");
       
   256         assert.equal(format(local(2011, 3, 1)), "April");
       
   257       },
       
   258       "formats week on Sunday midnight": function(format) {
       
   259         assert.equal(format(local(2011, 1, 6)), "Feb 06");
       
   260         assert.equal(format(local(2011, 1, 13)), "Feb 13");
       
   261         assert.equal(format(local(2011, 1, 20)), "Feb 20");
       
   262       },
       
   263       "formats date on midnight": function(format) {
       
   264         assert.equal(format(local(2011, 1, 2)), "Wed 02");
       
   265         assert.equal(format(local(2011, 1, 3)), "Thu 03");
       
   266         assert.equal(format(local(2011, 1, 4)), "Fri 04");
       
   267       },
       
   268       "formats hour on minute zero": function(format) {
       
   269         assert.equal(format(local(2011, 1, 2, 11)), "11 AM");
       
   270         assert.equal(format(local(2011, 1, 2, 12)), "12 PM");
       
   271         assert.equal(format(local(2011, 1, 2, 13)), "01 PM");
       
   272       },
       
   273       "formats minute on second zero": function(format) {
       
   274         assert.equal(format(local(2011, 1, 2, 11, 59)), "11:59");
       
   275         assert.equal(format(local(2011, 1, 2, 12, 01)), "12:01");
       
   276         assert.equal(format(local(2011, 1, 2, 12, 02)), "12:02");
       
   277       },
       
   278       "otherwise, formats second": function(format) {
       
   279         assert.equal(format(local(2011, 1, 2, 12, 01, 09)), ":09");
       
   280         assert.equal(format(local(2011, 1, 2, 12, 01, 10)), ":10");
       
   281         assert.equal(format(local(2011, 1, 2, 12, 01, 11)), ":11");
       
   282       }
       
   283     },
       
   284 
       
   285     "UTC": {
       
   286       topic: function(scale) {
       
   287         return scale.utc;
       
   288       },
       
   289 
       
   290       "ticks": {
       
   291         "observes explicit tick interval": function(scale) {
       
   292           var x = scale().domain([utc(2011, 0, 1, 12, 1, 0), utc(2011, 0, 1, 12, 4, 4)]);
       
   293           assert.deepEqual(x.ticks(d3.time.minutes), [
       
   294             utc(2011, 0, 1, 12, 1),
       
   295             utc(2011, 0, 1, 12, 2),
       
   296             utc(2011, 0, 1, 12, 3),
       
   297             utc(2011, 0, 1, 12, 4)
       
   298           ]);
       
   299         },
       
   300         "observes explicit tick interval and step": function(scale) {
       
   301           var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 33, 4)]);
       
   302           assert.deepEqual(x.ticks(d3.time.minutes, 10), [
       
   303             utc(2011, 0, 1, 12, 0),
       
   304             utc(2011, 0, 1, 12, 10),
       
   305             utc(2011, 0, 1, 12, 20),
       
   306             utc(2011, 0, 1, 12, 30)
       
   307           ]);
       
   308         },
       
   309         "generates 1-second ticks": function(scale) {
       
   310           var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 0, 4)]);
       
   311           assert.deepEqual(x.ticks(4), [
       
   312             utc(2011, 0, 1, 12, 0, 0),
       
   313             utc(2011, 0, 1, 12, 0, 1),
       
   314             utc(2011, 0, 1, 12, 0, 2),
       
   315             utc(2011, 0, 1, 12, 0, 3)
       
   316           ]);
       
   317         },
       
   318         "generates 5-second ticks": function(scale) {
       
   319           var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 0, 20)]);
       
   320           assert.deepEqual(x.ticks(4), [
       
   321             utc(2011, 0, 1, 12, 0, 0),
       
   322             utc(2011, 0, 1, 12, 0, 5),
       
   323             utc(2011, 0, 1, 12, 0, 10),
       
   324             utc(2011, 0, 1, 12, 0, 15)
       
   325           ]);
       
   326         },
       
   327         "generates 15-second ticks": function(scale) {
       
   328           var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 0, 50)]);
       
   329           assert.deepEqual(x.ticks(4), [
       
   330             utc(2011, 0, 1, 12, 0, 0),
       
   331             utc(2011, 0, 1, 12, 0, 15),
       
   332             utc(2011, 0, 1, 12, 0, 30),
       
   333             utc(2011, 0, 1, 12, 0, 45)
       
   334           ]);
       
   335         },
       
   336         "generates 30-second ticks": function(scale) {
       
   337           var x = scale().domain([utc(2011, 0, 1, 12, 0, 0), utc(2011, 0, 1, 12, 1, 50)]);
       
   338           assert.deepEqual(x.ticks(4), [
       
   339             utc(2011, 0, 1, 12, 0, 0),
       
   340             utc(2011, 0, 1, 12, 0, 30),
       
   341             utc(2011, 0, 1, 12, 1, 0),
       
   342             utc(2011, 0, 1, 12, 1, 30)
       
   343           ]);
       
   344         },
       
   345         "generates 1-minute ticks": function(scale) {
       
   346           var x = scale().domain([utc(2011, 0, 1, 12, 0, 27), utc(2011, 0, 1, 12, 4, 12)]);
       
   347           assert.deepEqual(x.ticks(4), [
       
   348             utc(2011, 0, 1, 12, 1),
       
   349             utc(2011, 0, 1, 12, 2),
       
   350             utc(2011, 0, 1, 12, 3),
       
   351             utc(2011, 0, 1, 12, 4)
       
   352           ]);
       
   353         },
       
   354         "generates 5-minute ticks": function(scale) {
       
   355           var x = scale().domain([utc(2011, 0, 1, 12, 3, 27), utc(2011, 0, 1, 12, 21, 12)]);
       
   356           assert.deepEqual(x.ticks(4), [
       
   357             utc(2011, 0, 1, 12, 5),
       
   358             utc(2011, 0, 1, 12, 10),
       
   359             utc(2011, 0, 1, 12, 15),
       
   360             utc(2011, 0, 1, 12, 20)
       
   361           ]);
       
   362         },
       
   363         "generates 15-minute ticks": function(scale) {
       
   364           var x = scale().domain([utc(2011, 0, 1, 12, 8, 27), utc(2011, 0, 1, 13, 4, 12)]);
       
   365           assert.deepEqual(x.ticks(4), [
       
   366             utc(2011, 0, 1, 12, 15),
       
   367             utc(2011, 0, 1, 12, 30),
       
   368             utc(2011, 0, 1, 12, 45),
       
   369             utc(2011, 0, 1, 13, 0)
       
   370           ]);
       
   371         },
       
   372         "generates 30-minute ticks": function(scale) {
       
   373           var x = scale().domain([utc(2011, 0, 1, 12, 28, 27), utc(2011, 0, 1, 14, 4, 12)]);
       
   374           assert.deepEqual(x.ticks(4), [
       
   375             utc(2011, 0, 1, 12, 30),
       
   376             utc(2011, 0, 1, 13, 0),
       
   377             utc(2011, 0, 1, 13, 30),
       
   378             utc(2011, 0, 1, 14, 0)
       
   379           ]);
       
   380         },
       
   381         "generates 1-hour ticks": function(scale) {
       
   382           var x = scale().domain([utc(2011, 0, 1, 12, 28, 27), utc(2011, 0, 1, 16, 34, 12)]);
       
   383           assert.deepEqual(x.ticks(4), [
       
   384             utc(2011, 0, 1, 13, 0),
       
   385             utc(2011, 0, 1, 14, 0),
       
   386             utc(2011, 0, 1, 15, 0),
       
   387             utc(2011, 0, 1, 16, 0)
       
   388           ]);
       
   389         },
       
   390         "generates 3-hour ticks": function(scale) {
       
   391           var x = scale().domain([utc(2011, 0, 1, 14, 28, 27), utc(2011, 0, 2, 1, 34, 12)]);
       
   392           assert.deepEqual(x.ticks(4), [
       
   393             utc(2011, 0, 1, 15, 0),
       
   394             utc(2011, 0, 1, 18, 0),
       
   395             utc(2011, 0, 1, 21, 0),
       
   396             utc(2011, 0, 2, 0, 0)
       
   397           ]);
       
   398         },
       
   399         "generates 6-hour ticks": function(scale) {
       
   400           var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 2, 14, 34, 12)]);
       
   401           assert.deepEqual(x.ticks(4), [
       
   402             utc(2011, 0, 1, 18, 0),
       
   403             utc(2011, 0, 2, 0, 0),
       
   404             utc(2011, 0, 2, 6, 0),
       
   405             utc(2011, 0, 2, 12, 0)
       
   406           ]);
       
   407         },
       
   408         "generates 12-hour ticks": function(scale) {
       
   409           var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 3, 21, 34, 12)]);
       
   410           assert.deepEqual(x.ticks(4), [
       
   411             utc(2011, 0, 2, 0, 0),
       
   412             utc(2011, 0, 2, 12, 0),
       
   413             utc(2011, 0, 3, 0, 0),
       
   414             utc(2011, 0, 3, 12, 0)
       
   415           ]);
       
   416         },
       
   417         "generates 1-day ticks": function(scale) {
       
   418           var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 5, 21, 34, 12)]);
       
   419           assert.deepEqual(x.ticks(4), [
       
   420             utc(2011, 0, 2, 0, 0),
       
   421             utc(2011, 0, 3, 0, 0),
       
   422             utc(2011, 0, 4, 0, 0),
       
   423             utc(2011, 0, 5, 0, 0)
       
   424           ]);
       
   425         },
       
   426         "generates 2-day ticks": function(scale) {
       
   427           var x = scale().domain([utc(2011, 0, 2, 16, 28, 27), utc(2011, 0, 9, 21, 34, 12)]);
       
   428           assert.deepEqual(x.ticks(4), [
       
   429             utc(2011, 0, 3, 0, 0),
       
   430             utc(2011, 0, 5, 0, 0),
       
   431             utc(2011, 0, 7, 0, 0),
       
   432             utc(2011, 0, 9, 0, 0)
       
   433           ]);
       
   434         },
       
   435         "generates 1-week ticks": function(scale) {
       
   436           var x = scale().domain([utc(2011, 0, 1, 16, 28, 27), utc(2011, 0, 23, 21, 34, 12)]);
       
   437           assert.deepEqual(x.ticks(4), [
       
   438             utc(2011, 0, 2, 0, 0),
       
   439             utc(2011, 0, 9, 0, 0),
       
   440             utc(2011, 0, 16, 0, 0),
       
   441             utc(2011, 0, 23, 0, 0)
       
   442           ]);
       
   443         },
       
   444         "generates 1-month ticks": function(scale) {
       
   445           var x = scale().domain([utc(2011, 0, 18), utc(2011, 4, 2)]);
       
   446           assert.deepEqual(x.ticks(4), [
       
   447             utc(2011, 1, 1, 0, 0),
       
   448             utc(2011, 2, 1, 0, 0),
       
   449             utc(2011, 3, 1, 0, 0),
       
   450             utc(2011, 4, 1, 0, 0)
       
   451           ]);
       
   452         },
       
   453         "generates 3-month ticks": function(scale) {
       
   454           var x = scale().domain([utc(2010, 11, 18), utc(2011, 10, 2)]);
       
   455           assert.deepEqual(x.ticks(4), [
       
   456             utc(2011, 0, 1, 0, 0),
       
   457             utc(2011, 3, 1, 0, 0),
       
   458             utc(2011, 6, 1, 0, 0),
       
   459             utc(2011, 9, 1, 0, 0)
       
   460           ]);
       
   461         },
       
   462         "generates 1-year ticks": function(scale) {
       
   463           var x = scale().domain([utc(2010, 11, 18), utc(2014, 2, 2)]);
       
   464           assert.deepEqual(x.ticks(4), [
       
   465             utc(2011, 0, 1, 0, 0),
       
   466             utc(2012, 0, 1, 0, 0),
       
   467             utc(2013, 0, 1, 0, 0),
       
   468             utc(2014, 0, 1, 0, 0)
       
   469           ]);
       
   470         }
       
   471       },
       
   472 
       
   473       "tickFormat": {
       
   474         topic: function(scale) {
       
   475           return scale().tickFormat();
       
   476         },
       
   477         "formats year on New Year's": function(format) {
       
   478           assert.equal(format(utc(2011, 0, 1)), "2011");
       
   479           assert.equal(format(utc(2012, 0, 1)), "2012");
       
   480           assert.equal(format(utc(2013, 0, 1)), "2013");
       
   481         },
       
   482         "formats month on the 1st of each month": function(format) {
       
   483           assert.equal(format(utc(2011, 1, 1)), "February");
       
   484           assert.equal(format(utc(2011, 2, 1)), "March");
       
   485           assert.equal(format(utc(2011, 3, 1)), "April");
       
   486         },
       
   487         "formats week on Sunday midnight": function(format) {
       
   488           assert.equal(format(utc(2011, 1, 6)), "Feb 06");
       
   489           assert.equal(format(utc(2011, 1, 13)), "Feb 13");
       
   490           assert.equal(format(utc(2011, 1, 20)), "Feb 20");
       
   491         },
       
   492         "formats date on midnight": function(format) {
       
   493           assert.equal(format(utc(2011, 1, 2)), "Wed 02");
       
   494           assert.equal(format(utc(2011, 1, 3)), "Thu 03");
       
   495           assert.equal(format(utc(2011, 1, 4)), "Fri 04");
       
   496         },
       
   497         "formats hour on minute zero": function(format) {
       
   498           assert.equal(format(utc(2011, 1, 2, 11)), "11 AM");
       
   499           assert.equal(format(utc(2011, 1, 2, 12)), "12 PM");
       
   500           assert.equal(format(utc(2011, 1, 2, 13)), "01 PM");
       
   501         },
       
   502         "formats minute on second zero": function(format) {
       
   503           assert.equal(format(utc(2011, 1, 2, 11, 59)), "11:59");
       
   504           assert.equal(format(utc(2011, 1, 2, 12, 01)), "12:01");
       
   505           assert.equal(format(utc(2011, 1, 2, 12, 02)), "12:02");
       
   506         },
       
   507         "otherwise, formats second": function(format) {
       
   508           assert.equal(format(utc(2011, 1, 2, 12, 01, 09)), ":09");
       
   509           assert.equal(format(utc(2011, 1, 2, 12, 01, 10)), ":10");
       
   510           assert.equal(format(utc(2011, 1, 2, 12, 01, 11)), ":11");
       
   511         }
       
   512       }
       
   513     }
       
   514   }
       
   515 });
       
   516 
       
   517 function local(year, month, day, hours, minutes, seconds) {
       
   518   return new Date(year, month, day, hours || 0, minutes || 0, seconds || 0);
       
   519 }
       
   520 
       
   521 function utc(year, month, day, hours, minutes, seconds) {
       
   522   return new Date(Date.UTC(year, month, day, hours || 0, minutes || 0, seconds || 0));
       
   523 }
       
   524 
       
   525 suite.export(module);