toolkit/javascript/d3/test/scale/log-test.js
changeset 47 c0b4a8b5a012
equal deleted inserted replaced
46:efd9c589177a 47:c0b4a8b5a012
       
     1 require("../env");
       
     2 require("../../d3");
       
     3 
       
     4 var vows = require("vows"),
       
     5     assert = require("assert");
       
     6 
       
     7 var suite = vows.describe("d3.scale.log");
       
     8 
       
     9 suite.addBatch({
       
    10   "log": {
       
    11     topic: function() {
       
    12       return d3.scale.log;
       
    13     },
       
    14 
       
    15     "domain": {
       
    16       "defaults to [1, 10]": function(log) {
       
    17         var x = log();
       
    18         assert.deepEqual(x.domain(), [1, 10]);
       
    19         assert.inDelta(x(5), 0.69897, 1e-6);
       
    20       },
       
    21       "coerces domain values to numbers": function(log) {
       
    22         var x = log().domain([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
       
    23         assert.equal(typeof x.domain()[0], "number");
       
    24         assert.equal(typeof x.domain()[1], "number");
       
    25         assert.inDelta(x(new Date(1989, 09, 20)), -.2, 1e-2);
       
    26         assert.inDelta(x(new Date(1990, 00, 01)), 0, 1e-2);
       
    27         assert.inDelta(x(new Date(1990, 02, 15)), .2, 1e-2);
       
    28         assert.inDelta(x(new Date(1990, 04, 27)), .4, 1e-2);
       
    29         assert.inDelta(x(new Date(1991, 00, 01)), 1, 1e-2);
       
    30         assert.inDelta(x(new Date(1991, 02, 15)), 1.2, 1e-2);
       
    31         var x = log().domain(["1", "10"]);
       
    32         assert.equal(typeof x.domain()[0], "number");
       
    33         assert.equal(typeof x.domain()[1], "number");
       
    34         assert.inDelta(x(5), 0.69897, 1e-6);
       
    35         var x = log().domain([new Number(1), new Number(10)]);
       
    36         assert.equal(typeof x.domain()[0], "number");
       
    37         assert.equal(typeof x.domain()[1], "number");
       
    38         assert.inDelta(x(5), 0.69897, 1e-6);
       
    39       },
       
    40       "can specify negative domain values": function(log) {
       
    41         var x = log().domain([-100, -1]);
       
    42         assert.deepEqual(x.ticks().map(x.tickFormat()), [
       
    43           "−1e+2",
       
    44           "−9e+1", "−8e+1", "−7e+1", "−6e+1", "−5e+1", "−4e+1", "−3e+1", "−2e+1", "−1e+1",
       
    45           "−9e+0", "−8e+0", "−7e+0", "−6e+0", "−5e+0", "−4e+0", "−3e+0", "−2e+0", "−1e+0"
       
    46         ]);
       
    47         assert.inDelta(x(-50), 0.150515, 1e-6);
       
    48       },
       
    49       "can specify a polylog domain and range": function(log) {
       
    50         var x = log().domain([.1, 1, 100]).range(["red", "white", "green"]);
       
    51         assert.equal(x(.5), "#ffb2b2");
       
    52         assert.equal(x(50), "#269326");
       
    53         assert.equal(x(75), "#108810");
       
    54       }
       
    55     },
       
    56 
       
    57     "range": {
       
    58       "defaults to [0, 1]": function(log) {
       
    59         var x = log();
       
    60         assert.deepEqual(x.range(), [0, 1]);
       
    61         assert.inDelta(x.invert(.5), 3.162278, 1e-6);
       
    62       },
       
    63       "does not coerce range to numbers": function(log) {
       
    64         var x = log().range(["0", "2"]);
       
    65         assert.equal(typeof x.range()[0], "string");
       
    66         assert.equal(typeof x.range()[1], "string");
       
    67       },
       
    68       "can specify range values as colors": function(log) {
       
    69         var x = log().range(["red", "blue"]);
       
    70         assert.equal(x(5), "#4d00b2");
       
    71         var x = log().range(["#ff0000", "#0000ff"]);
       
    72         assert.equal(x(5), "#4d00b2");
       
    73         var x = log().range(["#f00", "#00f"]);
       
    74         assert.equal(x(5), "#4d00b2");
       
    75         var x = log().range([d3.rgb(255,0,0), d3.hsl(240,1,.5)]);
       
    76         assert.equal(x(5), "#4d00b2");
       
    77         var x = log().range(["hsl(0,100%,50%)", "hsl(240,100%,50%)"]);
       
    78         assert.equal(x(5), "#4d00b2");
       
    79       },
       
    80       "can specify range values as arrays or objects": function(log) {
       
    81         var x = log().range([{color: "red"}, {color: "blue"}]);
       
    82         assert.deepEqual(x(5), {color: "#4d00b2"});
       
    83         var x = log().range([["red"], ["blue"]]);
       
    84         assert.deepEqual(x(5), ["#4d00b2"]);
       
    85       }
       
    86     },
       
    87 
       
    88     "interpolate": {
       
    89       "defaults to d3.interpolate": function(log) {
       
    90         var x = log().range(["red", "blue"]);
       
    91         assert.equal(x.interpolate(), d3.interpolate);
       
    92         assert.equal(x(5), "#4d00b2");
       
    93       },
       
    94       "can specify a custom interpolator": function(log) {
       
    95         var x = log().range(["red", "blue"]).interpolate(d3.interpolateHsl);
       
    96         assert.equal(x(5), "#00ffcb");
       
    97       }
       
    98     },
       
    99 
       
   100     "clamp": {
       
   101       "defaults to false": function(log) {
       
   102         var x = log();
       
   103         assert.isFalse(x.clamp());
       
   104         assert.inDelta(x(.5), -0.3010299, 1e-6);
       
   105         assert.inDelta(x(15), 1.1760913, 1e-6);
       
   106       },
       
   107       "can clamp to the domain": function(log) {
       
   108         var x = log().clamp(true);
       
   109         assert.inDelta(x(.5), 0, 1e-6);
       
   110         assert.inDelta(x(5), 0.69897, 1e-6);
       
   111         assert.inDelta(x(15), 1, 1e-6);
       
   112         var x = log().domain([10, 1]).clamp(true);
       
   113         assert.inDelta(x(.5), 1, 1e-6);
       
   114         assert.inDelta(x(5), 0.30103, 1e-6);
       
   115         assert.inDelta(x(15), 0, 1e-6);
       
   116       }
       
   117     },
       
   118 
       
   119     "maps a number to a number": function(log) {
       
   120       var x = log().domain([1, 2]);
       
   121       assert.inDelta(x(.5), -1, 1e-6);
       
   122       assert.inDelta(x(1), 0, 1e-6);
       
   123       assert.inDelta(x(1.5), 0.5849625, 1e-6);
       
   124       assert.inDelta(x(2), 1, 1e-6);
       
   125       assert.inDelta(x(2.5), 1.3219281, 1e-6);
       
   126     },
       
   127 
       
   128     "invert": {
       
   129       "maps a number to a number": function(log) {
       
   130         var x = log().domain([1, 2]);
       
   131         assert.inDelta(x.invert(-1), .5, 1e-6);
       
   132         assert.inDelta(x.invert(0), 1, 1e-6);
       
   133         assert.inDelta(x.invert(0.5849625), 1.5, 1e-6);
       
   134         assert.inDelta(x.invert(1), 2, 1e-6);
       
   135         assert.inDelta(x.invert(1.3219281), 2.5, 1e-6);
       
   136       },
       
   137       "coerces range value to number on invert": function(log) {
       
   138         var x = log().range(["0", "2"]);
       
   139         assert.inDelta(x.invert("1"), 3.1622777, 1e-6);
       
   140         var x = log().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
       
   141         assert.inDelta(x.invert(new Date(1990, 6, 2, 13)), 3.1622777, 1e-6);
       
   142         var x = log().range(["#000", "#fff"]);
       
   143         assert.isNaN(x.invert("#999"));
       
   144       }
       
   145     },
       
   146 
       
   147     "ticks": {
       
   148       "can generate ticks": function(log) {
       
   149         var x = log();
       
   150         assert.deepEqual(x.ticks().map(x.tickFormat()), [
       
   151           "1e+0", "2e+0", "3e+0", "4e+0", "5e+0", "6e+0", "7e+0", "8e+0", "9e+0",
       
   152           "1e+1"
       
   153         ]);
       
   154         var x = log().domain([100, 1]);
       
   155         assert.deepEqual(x.ticks().map(x.tickFormat()), [
       
   156           "1e+0", "2e+0", "3e+0", "4e+0", "5e+0", "6e+0", "7e+0", "8e+0", "9e+0",
       
   157           "1e+1", "2e+1", "3e+1", "4e+1", "5e+1", "6e+1", "7e+1", "8e+1", "9e+1",
       
   158           "1e+2"
       
   159         ]);
       
   160       },
       
   161       "can generate fewer ticks, if desired": function(log) {
       
   162         var x = log();
       
   163         assert.deepEqual(x.ticks().map(x.tickFormat(5)), [
       
   164           "1e+0", "2e+0", "3e+0", "4e+0", "", "", "", "", "",
       
   165           "1e+1"
       
   166         ]);
       
   167         var x = log().domain([100, 1]);
       
   168         assert.deepEqual(x.ticks().map(x.tickFormat(10)), [
       
   169           "1e+0", "2e+0", "3e+0", "4e+0", "5e+0", "", "", "", "",
       
   170           "1e+1", "2e+1", "3e+1", "4e+1", "5e+1", "", "", "", "",
       
   171           "1e+2"
       
   172         ]);
       
   173       },
       
   174       "can override the tick format": function(log) {
       
   175         var x = log().domain([1000, 1]);
       
   176         assert.deepEqual(x.ticks().map(x.tickFormat(10, d3.format("+,d"))), [
       
   177           "+1", "+2", "+3", "", "", "", "", "", "",
       
   178           "+10", "+20", "+30", "", "", "", "", "", "",
       
   179           "+100", "+200", "+300", "", "", "", "", "", "",
       
   180           "+1,000"
       
   181         ]);
       
   182       }
       
   183     },
       
   184 
       
   185     "nice": {
       
   186       "can nice the domain, extending it to powers of ten": function(log) {
       
   187         var x = log().domain([1.1, 10.9]).nice();
       
   188         assert.deepEqual(x.domain(), [1, 100]);
       
   189         var x = log().domain([10.9, 1.1]).nice();
       
   190         assert.deepEqual(x.domain(), [100, 1]);
       
   191         var x = log().domain([.7, 11.001]).nice();
       
   192         assert.deepEqual(x.domain(), [.1, 100]);
       
   193         var x = log().domain([123.1, 6.7]).nice();
       
   194         assert.deepEqual(x.domain(), [1000, 1]);
       
   195         var x = log().domain([.01, .49]).nice();
       
   196         assert.deepEqual(x.domain(), [.01, 1]);
       
   197         var x = log().domain([0, 0]).nice();
       
   198         assert.deepEqual(x.domain(), [0, 0]);
       
   199         var x = log().domain([.5, .5]).nice();
       
   200         assert.inDelta(x.domain(), [.5, .5], 1e-6);
       
   201       },
       
   202       "nicing a polylog domain only affects the extent": function(log) {
       
   203         var x = log().domain([1.1, 1.5, 10.9]).nice();
       
   204         assert.deepEqual(x.domain(), [1, 1.5, 100]);
       
   205         var x = log().domain([-123.1, -1.5, -.5]).nice();
       
   206         assert.deepEqual(x.domain(), [-1000, -1.5, -.1]);
       
   207       }
       
   208     },
       
   209 
       
   210     "copy": {
       
   211       "changes to the domain are isolated": function(log) {
       
   212         var x = log(), y = x.copy();
       
   213         x.domain([10, 100]);
       
   214         assert.deepEqual(y.domain(), [1, 10]);
       
   215         assert.equal(x(10), 0);
       
   216         assert.equal(y(1), 0);
       
   217         y.domain([100, 1000]);
       
   218         assert.equal(x(100), 1);
       
   219         assert.equal(y(100), 0);
       
   220         assert.deepEqual(x.domain(), [10, 100]);
       
   221         assert.deepEqual(y.domain().map(Math.round), [100, 1000]);
       
   222       },
       
   223       "changes to the range are isolated": function(log) {
       
   224         var x = log(), y = x.copy();
       
   225         x.range([1, 2]);
       
   226         assert.equal(x.invert(1), 1);
       
   227         assert.equal(y.invert(1), 10);
       
   228         assert.deepEqual(y.range(), [0, 1]);
       
   229         y.range([2, 3]);
       
   230         assert.equal(x.invert(2), 10);
       
   231         assert.equal(y.invert(2), 1);
       
   232         assert.deepEqual(x.range(), [1, 2]);
       
   233         assert.deepEqual(y.range(), [2, 3]);
       
   234       },
       
   235       "changes to the interpolator are isolated": function(log) {
       
   236         var x = log().range(["red", "blue"]), y = x.copy();
       
   237         x.interpolate(d3.interpolateHsl);
       
   238         assert.equal(x(5), "#00ffcb");
       
   239         assert.equal(y(5), "#4d00b2");
       
   240         assert.equal(y.interpolate(), d3.interpolate);
       
   241       },
       
   242       "changes to clamping are isolated": function(log) {
       
   243         var x = log().clamp(true), y = x.copy();
       
   244         x.clamp(false);
       
   245         assert.inDelta(x(.5), -0.30103, 1e-6);
       
   246         assert.equal(y(.5), 0);
       
   247         assert.isTrue(y.clamp());
       
   248         y.clamp(false);
       
   249         assert.inDelta(x(20), 1.30103, 1e-6);
       
   250         assert.inDelta(y(20), 1.30103, 1e-6);
       
   251         assert.isFalse(x.clamp());
       
   252       }
       
   253     }
       
   254   }
       
   255 });
       
   256 
       
   257 suite.export(module);