154 lines
5.0 KiB
JavaScript
154 lines
5.0 KiB
JavaScript
import * as render from '../../../../../../src/ol/render/canvas.js';
|
|
|
|
describe('ol.render.canvas', function () {
|
|
const font = document.createElement('link');
|
|
font.href =
|
|
'https://fonts.googleapis.com/css?family=Abel&text=wmytzilWMYTZIL%40%23%2F%26%3F%24%2510';
|
|
font.rel = 'stylesheet';
|
|
|
|
describe('ol.render.canvas.registerFont()', function () {
|
|
beforeEach(function () {
|
|
render.checkedFonts.values_ = {};
|
|
render.measureTextHeight('12px sans-serif');
|
|
});
|
|
|
|
const retries = 100;
|
|
|
|
it('does not trigger redraw and clear measurements for unavailable fonts', function (done) {
|
|
this.timeout(4000);
|
|
const spy = sinon.spy();
|
|
render.checkedFonts.addEventListener('propertychange', spy);
|
|
const interval = setInterval(function () {
|
|
if (
|
|
render.checkedFonts.get('normal\nnormal\nfoo') == retries &&
|
|
render.checkedFonts.get('normal\nnormal\nsans-serif') == retries
|
|
) {
|
|
clearInterval(interval);
|
|
render.checkedFonts.removeEventListener('propertychange', spy);
|
|
expect(spy.callCount).to.be(0);
|
|
expect(render.textHeights).to.not.eql({});
|
|
done();
|
|
}
|
|
}, 32);
|
|
render.registerFont('12px foo,sans-serif');
|
|
});
|
|
|
|
it('does not trigger redraw and clear measurements for available fonts', function (done) {
|
|
const spy = sinon.spy();
|
|
render.checkedFonts.addEventListener('propertychange', spy);
|
|
const interval = setInterval(function () {
|
|
if (render.checkedFonts.get('normal\nnormal\nsans-serif') == retries) {
|
|
clearInterval(interval);
|
|
render.checkedFonts.removeEventListener('propertychange', spy);
|
|
expect(spy.callCount).to.be(0);
|
|
expect(render.textHeights).to.not.eql({});
|
|
done();
|
|
}
|
|
}, 32);
|
|
render.registerFont('12px sans-serif');
|
|
});
|
|
|
|
it("does not trigger redraw and clear measurements for the 'monospace' font", function (done) {
|
|
const spy = sinon.spy();
|
|
render.checkedFonts.addEventListener('propertychange', spy);
|
|
const interval = setInterval(function () {
|
|
if (render.checkedFonts.get('normal\nnormal\nmonospace') == retries) {
|
|
clearInterval(interval);
|
|
render.checkedFonts.removeEventListener('propertychange', spy);
|
|
expect(spy.callCount).to.be(0);
|
|
expect(render.textHeights).to.not.eql({});
|
|
done();
|
|
}
|
|
}, 32);
|
|
render.registerFont('12px monospace');
|
|
});
|
|
|
|
it('triggers redraw and clear measurements for fonts that become available', function (done) {
|
|
document.head.appendChild(font);
|
|
render.checkedFonts.addEventListener(
|
|
'propertychange',
|
|
function onPropertyChange(e) {
|
|
render.checkedFonts.removeEventListener(
|
|
'propertychange',
|
|
onPropertyChange
|
|
);
|
|
expect(e.key).to.be('normal\nnormal\nAbel');
|
|
expect(render.textHeights).to.eql({});
|
|
|
|
document.head.removeChild(font);
|
|
done();
|
|
}
|
|
);
|
|
render.registerFont('12px Abel');
|
|
});
|
|
});
|
|
|
|
describe('measureTextHeight', function () {
|
|
it('respects line-height', function () {
|
|
const height = render.measureTextHeight('12px/1.2 sans-serif');
|
|
expect(render.measureTextHeight('12px/2.4 sans-serif')).to.be.greaterThan(
|
|
height
|
|
);
|
|
expect(render.measureTextHeight('12px/0.1 sans-serif')).to.be.lessThan(
|
|
height
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('rotateAtOffset', function () {
|
|
it('rotates a canvas at an offset point', function () {
|
|
const context = {
|
|
translate: sinon.spy(),
|
|
rotate: sinon.spy(),
|
|
};
|
|
render.rotateAtOffset(context, Math.PI, 10, 10);
|
|
expect(context.translate.callCount).to.be(2);
|
|
expect(context.translate.firstCall.args).to.eql([10, 10]);
|
|
expect(context.translate.secondCall.args).to.eql([-10, -10]);
|
|
expect(context.rotate.callCount).to.be(1);
|
|
expect(context.rotate.firstCall.args).to.eql([Math.PI]);
|
|
});
|
|
});
|
|
|
|
describe('drawImageOrLabel', function () {
|
|
it('draws the image with correct parameters', function () {
|
|
const layerContext = {
|
|
save: sinon.spy(),
|
|
setTransform: sinon.spy(),
|
|
drawImage: sinon.spy(),
|
|
restore: sinon.spy(),
|
|
globalAlpha: 1,
|
|
};
|
|
const transform = [1, 0, 0, 1, 0, 0];
|
|
const opacity = 0.5;
|
|
const image = {};
|
|
const x = 0;
|
|
const y = 0;
|
|
const w = 1;
|
|
const h = 1;
|
|
const scale = 1;
|
|
|
|
render.drawImageOrLabel(
|
|
layerContext,
|
|
transform.slice(),
|
|
opacity,
|
|
image,
|
|
x,
|
|
y,
|
|
w,
|
|
h,
|
|
x,
|
|
y,
|
|
scale
|
|
);
|
|
|
|
expect(layerContext.save.callCount).to.be(1);
|
|
expect(layerContext.setTransform.callCount).to.be(1);
|
|
expect(layerContext.setTransform.firstCall.args).to.eql(transform);
|
|
expect(layerContext.drawImage.callCount).to.be(1);
|
|
expect(layerContext.globalAlpha).to.be(0.5);
|
|
expect(layerContext.restore.callCount).to.be(1);
|
|
});
|
|
});
|
|
});
|