|
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); |