| var vows = require("vows"), | |
| load = require("../load"), | |
| assert = require("../assert"); | |
| var suite = vows.describe("d3.scale.quantile"); | |
| suite.addBatch({ | |
| "quantile": { | |
| topic: load("scale/quantile").expression("d3.scale.quantile"), | |
| "has the empty domain by default": function(quantile) { | |
| assert.isEmpty(quantile().domain()); | |
| }, | |
| "has the empty range by default": function(quantile) { | |
| assert.isEmpty(quantile().range()); | |
| }, | |
| "uses the R-7 algorithm to compute quantiles": function(quantile) { | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]); | |
| assert.deepEqual([3, 6, 6.9, 7, 7.1].map(x), [0, 0, 0, 0, 0]); | |
| assert.deepEqual([8, 8.9].map(x), [1, 1]); | |
| assert.deepEqual([9, 9.1, 10, 13].map(x), [2, 2, 2, 2]); | |
| assert.deepEqual([14.9, 15, 15.1, 16, 20].map(x), [3, 3, 3, 3, 3]); | |
| var x = quantile().domain([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]); | |
| assert.deepEqual([3, 6, 6.9, 7, 7.1].map(x), [0, 0, 0, 0, 0]); | |
| assert.deepEqual([8, 8.9].map(x), [1, 1]); | |
| assert.deepEqual([9, 9.1, 10, 13].map(x), [2, 2, 2, 2]); | |
| assert.deepEqual([14.9, 15, 15.1, 16, 20].map(x), [3, 3, 3, 3, 3]); | |
| }, | |
| "domain values are sorted in ascending order": function(quantile) { | |
| var x = quantile().domain([6, 3, 7, 8, 8, 13, 20, 15, 16, 10]); | |
| assert.deepEqual(x.domain(), [3, 6, 7, 8, 8, 10, 13, 15, 16, 20]); | |
| }, | |
| "non-numeric domain values are ignored": function(quantile) { | |
| var x = quantile().domain([6, 3, NaN, undefined, 7, 8, 8, 13, 20, 15, 16, 10, NaN]); | |
| assert.deepEqual(x.domain(), [3, 6, 7, 8, 8, 10, 13, 15, 16, 20]); | |
| }, | |
| "quantiles returns the inner thresholds": function(quantile) { | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]); | |
| assert.deepEqual(x.quantiles(), [7.25, 9, 14.5]); | |
| var x = quantile().domain([3, 6, 7, 8, 8, 9, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]); | |
| assert.deepEqual(x.quantiles(), [7.5, 9, 14]); | |
| }, | |
| "range cardinality determines the number of quantiles": function(quantile) { | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]); | |
| assert.deepEqual(x.range([0, 1, 2, 3]).quantiles(), [7.25, 9, 14.5]); | |
| assert.deepEqual(x.range([0, 1]).quantiles(), [9]); | |
| assert.deepEqual(x.range([,,,,,]).quantiles(), [6.8, 8, 11.2, 15.2]); | |
| assert.deepEqual(x.range([,,,,,,]).quantiles(), [6.5, 8, 9, 13, 15.5]); | |
| }, | |
| "range values are arbitrary": function(quantile) { | |
| var a = new Object(), b = new Object(), c = new Object(); | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([a, b, c, a]); | |
| assert.deepEqual([3, 6, 6.9, 7, 7.1].map(x), [a, a, a, a, a]); | |
| assert.deepEqual([8, 8.9].map(x), [b, b]); | |
| assert.deepEqual([9, 9.1, 10, 13].map(x), [c, c, c, c]); | |
| assert.deepEqual([14.9, 15, 15.1, 16, 20].map(x), [a, a, a, a, a]); | |
| }, | |
| "returns undefined if the input value is NaN": function(quantile) { | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]); | |
| assert.isUndefined(x(NaN)); | |
| }, | |
| "invertExtent": { | |
| "maps a value in the range to a domain extent": function(quantile) { | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([0, 1, 2, 3]); | |
| assert.deepEqual(x.invertExtent(0), [3, 7.25]); | |
| assert.deepEqual(x.invertExtent(1), [7.25, 9]); | |
| assert.deepEqual(x.invertExtent(2), [9, 14.5]); | |
| assert.deepEqual(x.invertExtent(3), [14.5, 20]); | |
| }, | |
| "allows arbitrary range values": function(quantile) { | |
| var a = {}, b = {}, x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([a, b]); | |
| assert.deepEqual(x.invertExtent(a), [3, 9]); | |
| assert.deepEqual(x.invertExtent(b), [9, 20]); | |
| }, | |
| "returns [NaN, NaN] when the given value is not in the range": function(quantile) { | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]); | |
| assert.ok(x.invertExtent(-1).every(isNaN)); | |
| assert.ok(x.invertExtent(.5).every(isNaN)); | |
| assert.ok(x.invertExtent(2).every(isNaN)); | |
| assert.ok(x.invertExtent('a').every(isNaN)); | |
| }, | |
| "returns the first match if duplicate values exist in the range": function(quantile) { | |
| var x = quantile().domain([3, 6, 7, 8, 8, 10, 13, 15, 16, 20]).range([0, 1, 2, 0]); | |
| assert.deepEqual(x.invertExtent(0), [3, 7.25]); | |
| assert.deepEqual(x.invertExtent(1), [7.25, 9]); | |
| assert.deepEqual(x.invertExtent(2), [9, 14.5]); | |
| } | |
| } | |
| } | |
| }); | |
| suite.export(module); |