openlayers
Version:
Build tools and sources for developing OpenLayers based mapping applications
352 lines (329 loc) • 10.8 kB
JavaScript
goog.provide('ol.test.control.ScaleLine');
goog.require('ol.Map');
goog.require('ol.View');
goog.require('ol.control.ScaleLine');
goog.require('ol.proj');
describe('ol.control.ScaleLine', function() {
var mapDiv;
var map;
beforeEach(function() {
mapDiv = document.createElement('div');
document.body.appendChild(mapDiv);
map = new ol.Map({
target: mapDiv
});
});
afterEach(function() {
map.dispose();
mapDiv.parentNode.removeChild(mapDiv);
mapDiv = null;
});
describe('constructor', function() {
it('can be constructed without arguments', function() {
var ctrl = new ol.control.ScaleLine();
expect(ctrl).to.be.an(ol.control.ScaleLine);
});
});
describe('configuration options', function() {
describe('className', function() {
it('defaults to "ol-scale-line"', function() {
var ctrl = new ol.control.ScaleLine();
ctrl.setMap(map);
var element = document.querySelector('.ol-scale-line', mapDiv);
expect(element).to.not.be(null);
expect(element).to.be.a(HTMLDivElement);
});
it('can be configured', function() {
var ctrl = new ol.control.ScaleLine({
className: 'humpty-dumpty'
});
ctrl.setMap(map);
// check that the default was not chosen
var element1 = document.querySelector('.ol-scale-line', mapDiv);
expect(element1).to.be(null);
// check if the configured classname was chosen
var element2 = document.querySelector('.humpty-dumpty', mapDiv);
expect(element2).to.not.be(null);
expect(element2).to.be.a(HTMLDivElement);
});
});
describe('minWidth', function() {
it('defaults to 64', function() {
var ctrl = new ol.control.ScaleLine();
expect(ctrl.minWidth_).to.be(64);
});
it('can be configured', function() {
var ctrl = new ol.control.ScaleLine({
minWidth: 4711
});
expect(ctrl.minWidth_).to.be(4711);
});
});
describe('render', function() {
it('defaults to `ol.control.ScaleLine.render`', function() {
var ctrl = new ol.control.ScaleLine();
expect(ctrl.render).to.be(ol.control.ScaleLine.render);
});
it('can be configured', function() {
var myRender = function() {
};
var ctrl = new ol.control.ScaleLine({
render: myRender
});
expect(ctrl.render).to.be(myRender);
});
});
});
describe('synchronisation with map view', function() {
it('calls `render` as soon as the map is rendered', function(done) {
var renderSpy = sinon.spy();
var ctrl = new ol.control.ScaleLine({
render: renderSpy
});
expect(renderSpy.called).to.be(false);
ctrl.setMap(map);
expect(renderSpy.called).to.be(false);
map.setView(new ol.View({
center: [0, 0],
zoom: 0
}));
expect(renderSpy.called).to.be(false);
map.once('postrender', function() {
expect(renderSpy.called).to.be(true);
expect(renderSpy.callCount).to.be(1);
done();
});
});
it('calls `render` as often as the map is rendered', function() {
var renderSpy = sinon.spy();
var ctrl = new ol.control.ScaleLine({
render: renderSpy
});
ctrl.setMap(map);
map.setView(new ol.View({
center: [0, 0],
zoom: 0
}));
map.renderSync();
expect(renderSpy.callCount).to.be(1);
map.renderSync();
expect(renderSpy.callCount).to.be(2);
map.renderSync();
expect(renderSpy.callCount).to.be(3);
});
it('calls `render` as when the view changes', function(done) {
var renderSpy = sinon.spy();
var ctrl = new ol.control.ScaleLine({
render: renderSpy
});
ctrl.setMap(map);
map.setView(new ol.View({
center: [0, 0],
zoom: 0
}));
map.renderSync();
map.once('postrender', function() {
expect(renderSpy.callCount).to.be(2);
done();
});
map.getView().setCenter([1,1]);
});
});
describe('static method `render`', function() {
it('calls `updateElement_` on render', function(done) {
var ctrl = new ol.control.ScaleLine();
var spy = sinon.spy(ctrl, 'updateElement_');
ctrl.setMap(map);
map.setView(new ol.View({
center: [0, 0],
zoom: 0
}));
map.once('postrender', function() {
expect(spy.called).to.be(true);
done();
});
});
});
describe('#getUnits', function() {
it('returns "metric" by default', function() {
var ctrl = new ol.control.ScaleLine();
expect(ctrl.getUnits()).to.be('metric');
});
it('returns what is configured via `units` property', function() {
var ctrl = new ol.control.ScaleLine({
units: 'nautical'
});
expect(ctrl.getUnits()).to.be('nautical');
});
it('returns what is configured `setUnits` method', function() {
var ctrl = new ol.control.ScaleLine();
ctrl.setUnits('nautical');
expect(ctrl.getUnits()).to.be('nautical');
});
});
describe('#setUnits', function() {
it('triggers rerendering', function() {
var ctrl = new ol.control.ScaleLine();
var spy = sinon.spy(ctrl, 'updateElement_');
ctrl.setUnits('nautical');
expect(spy.called).to.be(true);
});
});
describe('different units result in different contents', function() {
var ctrl;
var metricHtml;
var nauticalHtml;
var degreesHtml;
var imperialHtml;
var usHtml;
beforeEach(function(done) {
ctrl = new ol.control.ScaleLine();
ctrl.setMap(map);
map.setView(new ol.View({
center: [0, 0],
zoom: 0
}));
map.once('postrender', function() {
metricHtml = ctrl.element_.innerHTML;
done();
});
});
afterEach(function() {
map.setView(null);
map.removeControl(ctrl);
});
it('renders a scaleline for "metric"', function() {
expect(metricHtml).to.not.be(undefined);
});
it('renders a different scaleline for "nautical"', function() {
ctrl.setUnits('nautical');
nauticalHtml = ctrl.element_.innerHTML;
expect(nauticalHtml).to.not.be(metricHtml);
});
it('renders a different scaleline for "degrees"', function() {
ctrl.setUnits('degrees');
degreesHtml = ctrl.element_.innerHTML;
expect(degreesHtml).to.not.be(metricHtml);
expect(degreesHtml).to.not.be(nauticalHtml);
});
it('renders a different scaleline for "imperial"', function() {
ctrl.setUnits('imperial');
imperialHtml = ctrl.element_.innerHTML;
expect(imperialHtml).to.not.be(metricHtml);
expect(imperialHtml).to.not.be(nauticalHtml);
expect(imperialHtml).to.not.be(degreesHtml);
});
it('renders a different scaleline for "us"', function() {
ctrl.setUnits('us');
usHtml = ctrl.element_.innerHTML;
expect(usHtml).to.not.be(metricHtml);
expect(usHtml).to.not.be(nauticalHtml);
expect(usHtml).to.not.be(degreesHtml);
// it's hard to actually find a difference in rendering between
// usHtml and imperialHtml
});
});
describe('projections affect the scaleline', function() {
it('is rendered differently for different projections', function() {
var ctrl = new ol.control.ScaleLine();
ctrl.setMap(map);
map.setView(new ol.View({
center: ol.proj.fromLonLat([7, 52]),
zoom: 2,
projection: 'EPSG:3857'
}));
map.renderSync();
var innerHtml3857 = ctrl.element_.innerHTML;
map.setView(new ol.View({
center: [7, 52],
zoom: 2,
projection: 'EPSG:4326'
}));
map.renderSync();
var innerHtml4326 = ctrl.element_.innerHTML;
expect(innerHtml4326).to.not.be(innerHtml3857);
});
});
describe('zoom affects the scaleline', function() {
var currentZoom;
var ctrl;
var renderedHtmls;
var mapView;
beforeEach(function() {
currentZoom = 28;
renderedHtmls = {};
ctrl = new ol.control.ScaleLine();
ctrl.setMap(map);
map.setView(new ol.View({
center: [0, 0],
zoom: currentZoom
}));
mapView = map.getView();
map.renderSync();
});
afterEach(function() {
map.removeControl(ctrl);
map.setView(null);
});
it('metric: is rendered differently for different zoomlevels', function() {
ctrl.setUnits('metric');
map.renderSync();
renderedHtmls[ctrl.element_.innerHTML] = true;
while (--currentZoom >= 0) {
mapView.setZoom(currentZoom);
map.renderSync();
var currentHtml = ctrl.element_.innerHTML;
expect(currentHtml in renderedHtmls).to.be(false);
renderedHtmls[currentHtml] = true;
}
});
it('degrees: is rendered differently for different zoomlevels', function() {
ctrl.setUnits('degrees');
map.renderSync();
renderedHtmls[ctrl.element_.innerHTML] = true;
while (--currentZoom >= 0) {
mapView.setZoom(currentZoom);
map.renderSync();
var currentHtml = ctrl.element_.innerHTML;
expect(currentHtml in renderedHtmls).to.be(false);
renderedHtmls[currentHtml] = true;
}
});
it('imperial: is rendered differently for different zoomlevels', function() {
ctrl.setUnits('imperial');
map.renderSync();
renderedHtmls[ctrl.element_.innerHTML] = true;
while (--currentZoom >= 0) {
mapView.setZoom(currentZoom);
map.renderSync();
var currentHtml = ctrl.element_.innerHTML;
expect(currentHtml in renderedHtmls).to.be(false);
renderedHtmls[currentHtml] = true;
}
});
it('nautical: is rendered differently for different zoomlevels', function() {
ctrl.setUnits('nautical');
map.renderSync();
renderedHtmls[ctrl.element_.innerHTML] = true;
while (--currentZoom >= 0) {
mapView.setZoom(currentZoom);
map.renderSync();
var currentHtml = ctrl.element_.innerHTML;
expect(currentHtml in renderedHtmls).to.be(false);
renderedHtmls[currentHtml] = true;
}
});
it('us: is rendered differently for different zoomlevels', function() {
ctrl.setUnits('us');
map.renderSync();
renderedHtmls[ctrl.element_.innerHTML] = true;
while (--currentZoom >= 0) {
mapView.setZoom(currentZoom);
map.renderSync();
var currentHtml = ctrl.element_.innerHTML;
expect(currentHtml in renderedHtmls).to.be(false);
renderedHtmls[currentHtml] = true;
}
});
});
});