toolkit/javascript/d3/test/core/selection-data-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("selection.data");
       
     8 
       
     9 suite.addBatch({
       
    10   "select(body)": {
       
    11     topic: function() {
       
    12       return d3.select("body").html("");
       
    13     },
       
    14     "assigns data as an array": function(body) {
       
    15       var data = new Object();
       
    16       body.data([data]);
       
    17       assert.strictEqual(document.body.__data__, data);
       
    18     },
       
    19     "assigns data as a function": function(body) {
       
    20       var data = new Object();
       
    21       body.data(function() { return [data]; });
       
    22       assert.strictEqual(document.body.__data__, data);
       
    23     },
       
    24     "stores data in the DOM": function(body) {
       
    25       var expected = new Object(), actual;
       
    26       document.body.__data__ = expected;
       
    27       body.each(function(d) { actual = d; });
       
    28       assert.strictEqual(actual, expected);
       
    29     },
       
    30     "returns a new selection": function(body) {
       
    31       assert.isFalse(body.data([1]) === body);
       
    32     }
       
    33   }
       
    34 });
       
    35 
       
    36 suite.addBatch({
       
    37   "selectAll(div)": {
       
    38     topic: function() {
       
    39       return d3.select("body").html("").selectAll("div").data(d3.range(2)).enter().append("div");
       
    40     },
       
    41     "assigns data as an array": function(div) {
       
    42       var a = new Object(), b = new Object();
       
    43       div.data([a, b]);
       
    44       assert.strictEqual(div[0][0].__data__, a);
       
    45       assert.strictEqual(div[0][1].__data__, b);
       
    46     },
       
    47     "assigns data as a function": function(div) {
       
    48       var a = new Object(), b = new Object();
       
    49       div.data(function() { return [a, b]; });
       
    50       assert.strictEqual(div[0][0].__data__, a);
       
    51       assert.strictEqual(div[0][1].__data__, b);
       
    52     },
       
    53     "stores data in the DOM": function(div) {
       
    54       var a = new Object(), b = new Object(), actual = [];
       
    55       div[0][0].__data__ = a;
       
    56       div[0][1].__data__ = b;
       
    57       div.each(function(d) { actual.push(d); });
       
    58       assert.deepEqual(actual, [a, b]);
       
    59     },
       
    60     "returns a new selection": function(div) {
       
    61       assert.isFalse(div.data([0, 1]) === div);
       
    62     }
       
    63   }
       
    64 });
       
    65 
       
    66 suite.addBatch({
       
    67   "selectAll(div).selectAll(span)": {
       
    68     topic: function() {
       
    69       return d3.select("body").html("").selectAll("div")
       
    70           .data(d3.range(2))
       
    71         .enter().append("div").selectAll("span")
       
    72           .data(d3.range(2))
       
    73         .enter().append("span");
       
    74     },
       
    75     "assigns data as an array": function(span) {
       
    76       var a = new Object(), b = new Object();
       
    77       span.data([a, b]);
       
    78       assert.strictEqual(span[0][0].__data__, a);
       
    79       assert.strictEqual(span[0][1].__data__, b);
       
    80       assert.strictEqual(span[1][0].__data__, a);
       
    81       assert.strictEqual(span[1][1].__data__, b);
       
    82     },
       
    83     "assigns data as a function": function(span) {
       
    84       var a = new Object(), b = new Object(), c = new Object(), d = new Object();
       
    85       span.data(function(z, i) { return i ? [c, d] : [a, b]; });
       
    86       assert.strictEqual(span[0][0].__data__, a);
       
    87       assert.strictEqual(span[0][1].__data__, b);
       
    88       assert.strictEqual(span[1][0].__data__, c);
       
    89       assert.strictEqual(span[1][1].__data__, d);
       
    90     },
       
    91     "evaluates the function once per group": function(span) {
       
    92       var count = 0;
       
    93       span.data(function() { ++count; return [0, 1]; });
       
    94       assert.equal(count, 2);
       
    95     },
       
    96     "defines an update selection for updating data": function(span) {
       
    97       var update = span.data(d3.range(4));
       
    98       assert.equal(update.length, 2);
       
    99       assert.equal(update[0].length, 4);
       
   100       assert.equal(update[1].length, 4);
       
   101       assert.domEqual(update[0][0], span[0][0]);
       
   102       assert.domEqual(update[0][1], span[0][1]);
       
   103       assert.domNull(update[0][2]);
       
   104       assert.domNull(update[0][3]);
       
   105       assert.domEqual(update[1][0], span[1][0]);
       
   106       assert.domEqual(update[1][1], span[1][1]);
       
   107       assert.domNull(update[1][2]);
       
   108       assert.domNull(update[1][3]);
       
   109     },
       
   110     "defines an enter selection for entering data": function(span) {
       
   111       var enter = span.data(d3.range(4)).enter();
       
   112       assert.isFalse(enter.empty());
       
   113       assert.equal(enter.length, 2);
       
   114       assert.equal(enter[0].length, 4);
       
   115       assert.equal(enter[1].length, 4);
       
   116       assert.domNull(enter[0][0]);
       
   117       assert.domNull(enter[0][1]);
       
   118       assert.deepEqual(enter[0][2], {__data__: 2});
       
   119       assert.deepEqual(enter[0][3], {__data__: 3});
       
   120       assert.domNull(enter[1][0]);
       
   121       assert.domNull(enter[1][1]);
       
   122       assert.deepEqual(enter[1][2], {__data__: 2});
       
   123       assert.deepEqual(enter[1][3], {__data__: 3});
       
   124     },
       
   125     "defines an exit selection for exiting data": function(span) {
       
   126       var exit = span.data(d3.range(1)).exit();
       
   127       assert.isFalse(exit.empty());
       
   128       assert.equal(exit.length, 2);
       
   129       assert.equal(exit[0].length, 2);
       
   130       assert.equal(exit[1].length, 2);
       
   131       assert.domNull(exit[0][0]);
       
   132       assert.domEqual(exit[0][1], span[0][1]);
       
   133       assert.domNull(exit[1][0]);
       
   134       assert.domEqual(exit[1][1], span[1][1]);
       
   135     },
       
   136     "observes the specified key function": function(span) {
       
   137       var update = span.data([1, 2], Number);
       
   138       assert.isFalse(update.empty());
       
   139       assert.equal(update.length, 2);
       
   140       assert.equal(update[0].length, 2);
       
   141       assert.equal(update[1].length, 2);
       
   142       assert.domEqual(update[0][0], span[0][1]);
       
   143       assert.domNull(update[0][1]);
       
   144       assert.domEqual(update[1][0], span[1][1]);
       
   145       assert.domNull(update[1][1]);
       
   146 
       
   147       var enter = update.enter();
       
   148       assert.equal(enter.length, 2);
       
   149       assert.equal(enter[0].length, 2);
       
   150       assert.equal(enter[1].length, 2);
       
   151       assert.domNull(enter[0][0]);
       
   152       assert.deepEqual(enter[0][1], {__data__: 2});
       
   153       assert.domNull(enter[1][0]);
       
   154       assert.deepEqual(enter[1][1], {__data__: 2});
       
   155 
       
   156       var exit = update.exit();
       
   157       assert.equal(exit.length, 2);
       
   158       assert.equal(exit[0].length, 2);
       
   159       assert.equal(exit[1].length, 2);
       
   160       assert.domEqual(exit[0][0], span[0][0]);
       
   161       assert.domNull(exit[0][1]);
       
   162       assert.domEqual(exit[1][0], span[1][0]);
       
   163       assert.domNull(exit[1][1]);
       
   164     }
       
   165   }
       
   166 });
       
   167 
       
   168 suite.export(module);