var vows = require("vows"), _ = require("../../"), load = require("../load"), assert = require("../assert"); var suite = vows.describe("d3.geo.graticule"); var ε = 1e-6; suite.addBatch({ "graticule": { topic: load("geo/graticule").expression("d3.geo.graticule"), "extent": { "sets minorExtent and majorExtent": function(graticule) { var g = graticule().extent([[-90, -45], [90, 45]]); assert.deepEqual(g.minorExtent(), [[-90, -45], [90, 45]]); assert.deepEqual(g.majorExtent(), [[-90, -45], [90, 45]]); }, "gets minorExtent": function(graticule) { var g = graticule().minorExtent([[-90, -45], [90, 45]]); assert.deepEqual(g.extent(), [[-90, -45], [90, 45]]); } }, "majorExtent": { "default longitude ranges from 180°W (inclusive) to 180°E (exclusive)": function(graticule) { var extent = graticule().majorExtent(); assert.equal(extent[0][0], -180); assert.equal(extent[1][0], +180); }, "default latitude ranges from 90°S (exclusive) to 90°N (exclusive)": function(graticule) { var extent = graticule().majorExtent(); assert.equal(extent[0][1], -90 + ε); assert.equal(extent[1][1], +90 - ε); }, "coerces input values to numbers": function(graticule) { var g = graticule().majorExtent([["-90", "-45"], ["+90", "+45"]]), extent = g.majorExtent(); assert.strictEqual(extent[0][0], -90); assert.strictEqual(extent[0][1], -45); assert.strictEqual(extent[1][0], +90); assert.strictEqual(extent[1][1], +45); } }, "minorExtent": { "default longitude ranges from 180°W (inclusive) to 180°E (exclusive)": function(graticule) { var extent = graticule().minorExtent(); assert.equal(extent[0][0], -180); assert.equal(extent[1][0], +180); }, "default latitude ranges from 80°S (inclusive) to 80°N (inclusive)": function(graticule) { var extent = graticule().minorExtent(); assert.equal(extent[0][1], -80 - ε); assert.equal(extent[1][1], +80 + ε); }, "coerces input values to numbers": function(graticule) { var g = graticule().minorExtent([["-90", "-45"], ["+90", "+45"]]), extent = g.minorExtent(); assert.strictEqual(extent[0][0], -90); assert.strictEqual(extent[0][1], -45); assert.strictEqual(extent[1][0], +90); assert.strictEqual(extent[1][1], +45); } }, "step": { "sets minorStep and majorStep": function(graticule) { var g = graticule().step([22.5, 22.5]); assert.deepEqual(g.minorStep(), [22.5, 22.5]); assert.deepEqual(g.majorStep(), [22.5, 22.5]); }, "gets minorStep": function(graticule) { var g = graticule().minorStep([22.5, 22.5]); assert.deepEqual(g.step(), [22.5, 22.5]); } }, "minorStep": { "defaults to 10°, 10°": function(graticule) { assert.deepEqual(graticule().minorStep(), [10, 10]); }, "coerces input values to numbers": function(graticule) { var g = graticule().minorStep(["45", "11.25"]), step = g.minorStep(); assert.strictEqual(step[0], 45); assert.strictEqual(step[1], 11.25); } }, "majorStep": { "defaults to 90°, 360°": function(graticule) { assert.deepEqual(graticule().majorStep(), [90, 360]); }, "coerces input values to numbers": function(graticule) { var g = graticule().majorStep(["45", "11.25"]), step = g.majorStep(); assert.strictEqual(step[0], 45); assert.strictEqual(step[1], 11.25); } }, "lines": { "default longitude ranges from 180°W (inclusive) to 180°E (exclusive)": function(graticule) { var lines = graticule().lines() .filter(function(line) { return line.coordinates[0][0] === line.coordinates[1][0]; }) .sort(function(a, b) { return a.coordinates[0][0] - b.coordinates[0][0]; }); assert.equal(lines[0].coordinates[0][0], -180); assert.equal(lines[lines.length - 1].coordinates[0][0], +170); }, "default latitude ranges from 90°S (exclusive) to 90°N (exclusive)": function(graticule) { var lines = graticule().lines() .filter(function(line) { return line.coordinates[0][1] === line.coordinates[1][1]; }) .sort(function(a, b) { return a.coordinates[0][1] - b.coordinates[0][1]; }); assert.equal(lines[0].coordinates[0][1], -80); assert.equal(lines[lines.length - 1].coordinates[0][1], +80); }, "default minor longitude lines extend from 80°S to 80°N": function(graticule) { var lines = graticule().lines() .filter(function(line) { return line.coordinates[0][0] === line.coordinates[1][0]; }) .filter(function(line) { return Math.abs(line.coordinates[0][0] % 90) > ε; }); lines.forEach(function(line) { assert.deepEqual(_.extent(line.coordinates, function(p) { return p[1]; }), [-80 - ε, +80 + ε]); }); }, "default major longitude lines extend from 90°S to 90°N": function(graticule) { var lines = graticule().lines() .filter(function(line) { return line.coordinates[0][0] === line.coordinates[1][0]; }) .filter(function(line) { return Math.abs(line.coordinates[0][0] % 90) < ε; }); lines.forEach(function(line) { assert.deepEqual(_.extent(line.coordinates, function(p) { return p[1]; }), [-90 + ε, +90 - ε]); }); }, "default latitude lines extend from 180°W to 180°E": function(graticule) { var lines = graticule().lines() .filter(function(line) { return line.coordinates[0][1] === line.coordinates[1][1]; }); lines.forEach(function(line) { assert.deepEqual(_.extent(line.coordinates, function(p) { return p[0]; }), [-180, +180]); }); }, "returns an array of LineStrings": function(graticule) { assert.deepEqual(graticule() .extent([[-90, -45], [90, 45]]) .step([45, 45]) .precision(3) .lines(), [ {type: "LineString", coordinates: [[-90,-45],[-90,45]]}, // meridian {type: "LineString", coordinates: [[-45,-45],[-45,45]]}, // meridian {type: "LineString", coordinates: [[0,-45],[0,45]]}, // meridian {type: "LineString", coordinates: [[45,-45],[45,45]]}, // meridian {type: "LineString", coordinates: [[-90,-45],[-87,-45],[-84,-45],[-81,-45],[-78,-45],[-75,-45],[-72,-45],[-69,-45],[-66,-45],[-63,-45],[-60,-45],[-57,-45],[-54,-45],[-51,-45],[-48,-45],[-45,-45],[-42,-45],[-39,-45],[-36,-45],[-33,-45],[-30,-45],[-27,-45],[-24,-45],[-21,-45],[-18,-45],[-15,-45],[-12,-45],[-9,-45],[-6,-45],[-3,-45],[0,-45],[3,-45],[6,-45],[9,-45],[12,-45],[15,-45],[18,-45],[21,-45],[24,-45],[27,-45],[30,-45],[33,-45],[36,-45],[39,-45],[42,-45],[45,-45],[48,-45],[51,-45],[54,-45],[57,-45],[60,-45],[63,-45],[66,-45],[69,-45],[72,-45],[75,-45],[78,-45],[81,-45],[84,-45],[87,-45],[90,-45]]}, {type: "LineString", coordinates: [[-90,0],[-87,0],[-84,0],[-81,0],[-78,0],[-75,0],[-72,0],[-69,0],[-66,0],[-63,0],[-60,0],[-57,0],[-54,0],[-51,0],[-48,0],[-45,0],[-42,0],[-39,0],[-36,0],[-33,0],[-30,0],[-27,0],[-24,0],[-21,0],[-18,0],[-15,0],[-12,0],[-9,0],[-6,0],[-3,0],[0,0],[3,0],[6,0],[9,0],[12,0],[15,0],[18,0],[21,0],[24,0],[27,0],[30,0],[33,0],[36,0],[39,0],[42,0],[45,0],[48,0],[51,0],[54,0],[57,0],[60,0],[63,0],[66,0],[69,0],[72,0],[75,0],[78,0],[81,0],[84,0],[87,0],[90,0]]} ]); } }, "returns a MultiLineString of all lines": function(graticule) { var g = graticule() .extent([[-90, -45], [90, 45]]) .step([45, 45]) .precision(3); assert.deepEqual(g(), { type: "MultiLineString", coordinates: g.lines().map(function(line) { return line.coordinates; }) }); }, "outline": { "returns a Polygon encompassing the major extent": function(graticule) { assert.deepEqual(graticule() .majorExtent([[-90, -45], [90, 45]]) .precision(3) .outline(), { type: "Polygon", coordinates: [[ [-90,-45],[-90,45], // meridian [-87,45],[-84,45],[-81,45],[-78,45],[-75,45],[-72,45],[-69,45],[-66,45],[-63,45],[-60,45],[-57,45],[-54,45],[-51,45],[-48,45],[-45,45],[-42,45],[-39,45],[-36,45],[-33,45],[-30,45],[-27,45],[-24,45],[-21,45],[-18,45],[-15,45],[-12,45],[-9,45],[-6,45],[-3,45],[0,45],[3,45],[6,45],[9,45],[12,45],[15,45],[18,45],[21,45],[24,45],[27,45],[30,45],[33,45],[36,45],[39,45],[42,45],[45,45],[48,45],[51,45],[54,45],[57,45],[60,45],[63,45],[66,45],[69,45],[72,45],[75,45],[78,45],[81,45],[84,45],[87,45], [90,45],[90,-45], // meridian [87,-45],[84,-45],[81,-45],[78,-45],[75,-45],[72,-45],[69,-45],[66,-45],[63,-45],[60,-45],[57,-45],[54,-45],[51,-45],[48,-45],[45,-45],[42,-45],[39,-45],[36,-45],[33,-45],[30,-45],[27,-45],[24,-45],[21,-45],[18,-45],[15,-45],[12,-45],[9,-45],[6,-45],[3,-45],[0,-45],[-3,-45],[-6,-45],[-9,-45],[-12,-45],[-15,-45],[-18,-45],[-21,-45],[-24,-45],[-27,-45],[-30,-45],[-33,-45],[-36,-45],[-39,-45],[-42,-45],[-45,-45],[-48,-45],[-51,-45],[-54,-45],[-57,-45],[-60,-45],[-63,-45],[-66,-45],[-69,-45],[-72,-45],[-75,-45],[-78,-45],[-81,-45],[-84,-45],[-87,-45],[-90,-45] ]] }); } } } }); suite.export(module);