toolkit/javascript/d3/test/scale/pow-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.pow");
       
     8 
       
     9 suite.addBatch({
       
    10   "pow": {
       
    11     topic: function() {
       
    12       return d3.scale.pow;
       
    13     },
       
    14 
       
    15     "domain": {
       
    16       "defaults to [0, 1]": function(pow) {
       
    17         var x = pow();
       
    18         assert.deepEqual(x.domain(), [0, 1]);
       
    19         assert.inDelta(x(.5), .5, 1e-6);
       
    20       },
       
    21       "coerces domain to numbers": function(pow) {
       
    22         var x = pow().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 = pow().domain(["0", "1"]);
       
    32         assert.equal(typeof x.domain()[0], "number");
       
    33         assert.equal(typeof x.domain()[1], "number");
       
    34         assert.inDelta(x(.5), .5, 1e-6);
       
    35         var x = pow().domain([new Number(0), new Number(1)]);
       
    36         assert.equal(typeof x.domain()[0], "number");
       
    37         assert.equal(typeof x.domain()[1], "number");
       
    38         assert.inDelta(x(.5), .5, 1e-6);
       
    39       },
       
    40       "can specify a polypower domain and range": function(pow) {
       
    41         var x = pow().domain([-10, 0, 100]).range(["red", "white", "green"]);
       
    42         assert.equal(x(-5), "#ff8080");
       
    43         assert.equal(x(50), "#80c080");
       
    44         assert.equal(x(75), "#40a040");
       
    45       }
       
    46     },
       
    47 
       
    48     "range": {
       
    49       "defaults to [0, 1]": function(pow) {
       
    50         var x = pow();
       
    51         assert.deepEqual(x.range(), [0, 1]);
       
    52         assert.inDelta(x.invert(.5), .5, 1e-6);
       
    53       },
       
    54       "does not coerce range values to numbers": function(pow) {
       
    55         var x = pow().range(["0", "2"]);
       
    56         assert.equal(typeof x.range()[0], "string");
       
    57         assert.equal(typeof x.range()[1], "string");
       
    58       },
       
    59       "coerces range values to number on invert": function(pow) {
       
    60         var x = pow().range(["0", "2"]);
       
    61         assert.inDelta(x.invert("1"), .5, 1e-6);
       
    62         var x = pow().range([new Date(1990, 0, 1), new Date(1991, 0, 1)]);
       
    63         assert.inDelta(x.invert(new Date(1990, 6, 2, 13)), .5, 1e-6);
       
    64         var x = pow().range(["#000", "#fff"]);
       
    65         assert.isNaN(x.invert("#999"));
       
    66       },
       
    67       "can specify range values as colors": function(pow) {
       
    68         var x = pow().range(["red", "blue"]);
       
    69         assert.equal(x(.5), "#800080");
       
    70         var x = pow().range(["#ff0000", "#0000ff"]);
       
    71         assert.equal(x(.5), "#800080");
       
    72         var x = pow().range(["#f00", "#00f"]);
       
    73         assert.equal(x(.5), "#800080");
       
    74         var x = pow().range([d3.rgb(255,0,0), d3.hsl(240,1,.5)]);
       
    75         assert.equal(x(.5), "#800080");
       
    76         var x = pow().range(["hsl(0,100%,50%)", "hsl(240,100%,50%)"]);
       
    77         assert.equal(x(.5), "#800080");
       
    78       },
       
    79       "can specify range values as arrays or objects": function(pow) {
       
    80         var x = pow().range([{color: "red"}, {color: "blue"}]);
       
    81         assert.deepEqual(x(.5), {color: "#800080"});
       
    82         var x = pow().range([["red"], ["blue"]]);
       
    83         assert.deepEqual(x(.5), ["#800080"]);
       
    84       }
       
    85     },
       
    86 
       
    87     "exponent": {
       
    88       "defaults to one": function(pow) {
       
    89         var x = pow();
       
    90         assert.equal(x.exponent(), 1);
       
    91       },
       
    92       "observes the specified exponent": function(pow) {
       
    93         var x = pow().exponent(.5).domain([1, 2]);
       
    94         assert.inDelta(x(1), 0, 1e-6);
       
    95         assert.inDelta(x(1.5), 0.5425821, 1e-6);
       
    96         assert.inDelta(x(2), 1, 1e-6);
       
    97         assert.equal(x.exponent(), .5);
       
    98         var x = pow().exponent(2).domain([1, 2]);
       
    99         assert.inDelta(x(1), 0, 1e-6);
       
   100         assert.inDelta(x(1.5), .41666667, 1e-6);
       
   101         assert.inDelta(x(2), 1, 1e-6);
       
   102         assert.equal(x.exponent(), 2);
       
   103         var x = pow().exponent(-1).domain([1, 2]);
       
   104         assert.inDelta(x(1), 0, 1e-6);
       
   105         assert.inDelta(x(1.5), .6666667, 1e-6);
       
   106         assert.inDelta(x(2), 1, 1e-6);
       
   107         assert.equal(x.exponent(), -1);
       
   108       },
       
   109       "changing the exponent does not change the domain or range": function(pow) {
       
   110         var x = pow().domain([1, 2]).range([3, 4]), f = d3.format(".6f");
       
   111         x.exponent(.5);
       
   112         assert.deepEqual(x.domain().map(f), [1, 2]);
       
   113         assert.deepEqual(x.range(), [3, 4]);
       
   114         x.exponent(2);
       
   115         assert.deepEqual(x.domain().map(f), [1, 2]);
       
   116         assert.deepEqual(x.range(), [3, 4]);
       
   117         x.exponent(-1);
       
   118         assert.deepEqual(x.domain().map(f), [1, 2]);
       
   119         assert.deepEqual(x.range(), [3, 4]);
       
   120       }
       
   121     },
       
   122 
       
   123     "interpolate": {
       
   124       "defaults to d3.interpolate": function(pow) {
       
   125         var x = pow().range(["red", "blue"]);
       
   126         assert.equal(x.interpolate(), d3.interpolate);
       
   127         assert.equal(x(.5), "#800080");
       
   128       },
       
   129       "can specify a custom interpolator": function(pow) {
       
   130         var x = pow().range(["red", "blue"]).interpolate(d3.interpolateHsl);
       
   131         assert.equal(x(.5), "#00ff00");
       
   132       }
       
   133     },
       
   134 
       
   135     "clamp": {
       
   136       "does not clamp by default": function(pow) {
       
   137         var x = pow();
       
   138         assert.isFalse(x.clamp());
       
   139         assert.inDelta(x(-.5), -.5, 1e-6);
       
   140         assert.inDelta(x(1.5), 1.5, 1e-6);
       
   141       },
       
   142       "can clamp to the domain": function(pow) {
       
   143         var x = pow().clamp(true);
       
   144         assert.inDelta(x(-.5), 0, 1e-6);
       
   145         assert.inDelta(x(.5), .5, 1e-6);
       
   146         assert.inDelta(x(1.5), 1, 1e-6);
       
   147         var x = pow().domain([1, 0]).clamp(true);
       
   148         assert.inDelta(x(-.5), 1, 1e-6);
       
   149         assert.inDelta(x(.5), .5, 1e-6);
       
   150         assert.inDelta(x(1.5), 0, 1e-6);
       
   151       }
       
   152     },
       
   153 
       
   154     "maps a number to a number": function(pow) {
       
   155       var x = pow().domain([1, 2]);
       
   156       assert.inDelta(x(.5), -.5, 1e-6);
       
   157       assert.inDelta(x(1), 0, 1e-6);
       
   158       assert.inDelta(x(1.5), .5, 1e-6);
       
   159       assert.inDelta(x(2), 1, 1e-6);
       
   160       assert.inDelta(x(2.5), 1.5, 1e-6);
       
   161     },
       
   162 
       
   163     "ticks": {
       
   164       "can generate ticks of varying degree": function(pow) {
       
   165         var x = pow();
       
   166         assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
       
   167         assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
       
   168         assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
       
   169         assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
       
   170         var x = pow().domain([1, 0]);
       
   171         assert.deepEqual(x.ticks(1).map(x.tickFormat(1)), [0, 1]);
       
   172         assert.deepEqual(x.ticks(2).map(x.tickFormat(2)), [0, .5, 1]);
       
   173         assert.deepEqual(x.ticks(5).map(x.tickFormat(5)), [0, .2, .4, .6, .8, 1]);
       
   174         assert.deepEqual(x.ticks(10).map(x.tickFormat(10)), [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]);
       
   175       }
       
   176     },
       
   177 
       
   178     "nice": {
       
   179       "can nice the domain, extending it to round numbers": function(pow) {
       
   180         var x = pow().domain([1.1, 10.9]).nice();
       
   181         assert.deepEqual(x.domain(), [1, 11]);
       
   182         var x = pow().domain([10.9, 1.1]).nice();
       
   183         assert.deepEqual(x.domain(), [11, 1]);
       
   184         var x = pow().domain([.7, 11.001]).nice();
       
   185         assert.deepEqual(x.domain(), [0, 12]);
       
   186         var x = pow().domain([123.1, 6.7]).nice();
       
   187         assert.deepEqual(x.domain(), [130, 0]);
       
   188         var x = pow().domain([0, .49]).nice();
       
   189         assert.deepEqual(x.domain(), [0, .5]);
       
   190         var x = pow().domain([0, 0]).nice();
       
   191         assert.deepEqual(x.domain(), [0, 0]);
       
   192         var x = pow().domain([.5, .5]).nice();
       
   193         assert.deepEqual(x.domain(), [.5, .5]);
       
   194       },
       
   195       "nicing a polypower domain only affects the extent": function(pow) {
       
   196         var x = pow().domain([1.1, 1, 2, 3, 10.9]).nice();
       
   197         assert.deepEqual(x.domain(), [1, 1, 2, 3, 11]);
       
   198         var x = pow().domain([123.1, 1, 2, 3, -.9]).nice();
       
   199         assert.deepEqual(x.domain(), [130, 1, 2, 3, -10]);
       
   200       }
       
   201     },
       
   202 
       
   203     "copy": {
       
   204       "changes to the domain are isolated": function(pow) {
       
   205         var x = pow(), y = x.copy();
       
   206         x.domain([1, 2]);
       
   207         assert.deepEqual(y.domain(), [0, 1]);
       
   208         assert.equal(x(1), 0);
       
   209         assert.equal(y(1), 1);
       
   210         y.domain([2, 3]);
       
   211         assert.equal(x(2), 1);
       
   212         assert.equal(y(2), 0);
       
   213         assert.deepEqual(x.domain(), [1, 2]);
       
   214         assert.deepEqual(y.domain(), [2, 3]);
       
   215       },
       
   216       "changes to the range are isolated": function(pow) {
       
   217         var x = pow(), y = x.copy();
       
   218         x.range([1, 2]);
       
   219         assert.equal(x.invert(1), 0);
       
   220         assert.equal(y.invert(1), 1);
       
   221         assert.deepEqual(y.range(), [0, 1]);
       
   222         y.range([2, 3]);
       
   223         assert.equal(x.invert(2), 1);
       
   224         assert.equal(y.invert(2), 0);
       
   225         assert.deepEqual(x.range(), [1, 2]);
       
   226         assert.deepEqual(y.range(), [2, 3]);
       
   227       },
       
   228       "changes to the exponent are isolated": function(pow) {
       
   229         var x = pow().exponent(2), y = x.copy();
       
   230         x.exponent(.5);
       
   231         assert.inDelta(x(.5), Math.SQRT1_2, 1e-6);
       
   232         assert.inDelta(y(.5), 0.25, 1e-6);
       
   233         assert.equal(x.exponent(), .5);
       
   234         assert.equal(y.exponent(), 2);
       
   235         y.exponent(3);
       
   236         assert.inDelta(x(.5), Math.SQRT1_2, 1e-6);
       
   237         assert.inDelta(y(.5), 0.125, 1e-6);
       
   238         assert.equal(x.exponent(), .5);
       
   239         assert.equal(y.exponent(), 3);
       
   240       },
       
   241       "changes to the interpolator are isolated": function(pow) {
       
   242         var x = pow().range(["red", "blue"]), y = x.copy();
       
   243         x.interpolate(d3.interpolateHsl);
       
   244         assert.equal(x(0.5), "#00ff00");
       
   245         assert.equal(y(0.5), "#800080");
       
   246         assert.equal(y.interpolate(), d3.interpolate);
       
   247       },
       
   248       "changes to clamping are isolated": function(pow) {
       
   249         var x = pow().clamp(true), y = x.copy();
       
   250         x.clamp(false);
       
   251         assert.equal(x(2), 2);
       
   252         assert.equal(y(2), 1);
       
   253         assert.isTrue(y.clamp());
       
   254         y.clamp(false);
       
   255         assert.equal(x(2), 2);
       
   256         assert.equal(y(2), 2);
       
   257         assert.isFalse(x.clamp());
       
   258       }
       
   259     }
       
   260   }
       
   261 });
       
   262 
       
   263 suite.export(module);