goog.provide('ol.test.render.webgl.LineStringReplay'); goog.require('ol.geom.LineString'); goog.require('ol.geom.MultiLineString'); goog.require('ol.render.webgl.LineStringReplay'); goog.require('ol.style.Stroke'); describe('ol.render.webgl.LineStringReplay', function() { var replay; var strokeStyle1 = new ol.style.Stroke({ color: [0, 255, 0, 0.4] }); var strokeStyle2 = new ol.style.Stroke({ color: [255, 0, 0, 1], lineCap: 'square', lineJoin: 'miter' }); beforeEach(function() { var tolerance = 0.1; var maxExtent = [-10000, -20000, 10000, 20000]; replay = new ol.render.webgl.LineStringReplay(tolerance, maxExtent); }); describe('#setFillStrokeStyle', function() { it('set expected states', function() { replay.setFillStrokeStyle(null, strokeStyle1); expect(replay.state_).not.be(null); expect(replay.state_.lineCap).to.be('round'); expect(replay.state_.lineJoin).to.be('round'); expect(replay.state_.strokeColor).to.eql([0, 1, 0, 0.4]); expect(replay.state_.lineWidth).to.be(1); expect(replay.state_.miterLimit).to.be(10); expect(replay.state_.changed).to.be(true); expect(replay.styles_).to.have.length(1); replay.setFillStrokeStyle(null, strokeStyle2); expect(replay.state_.lineCap).to.be('square'); expect(replay.state_.lineJoin).to.be('miter'); expect(replay.state_.strokeColor).to.eql([1, 0, 0, 1]); expect(replay.state_.lineWidth).to.be(1); expect(replay.state_.miterLimit).to.be(10); expect(replay.state_.changed).to.be(true); expect(replay.styles_).to.have.length(2); }); }); describe('#drawLineString', function() { it('sets the buffer data', function() { var linestring; linestring = new ol.geom.LineString( [[1000, 2000], [2000, 3000]]); replay.setFillStrokeStyle(null, strokeStyle1); replay.drawLineString(linestring, null); expect(replay.vertices).to.have.length(56); expect(replay.indices).to.have.length(18); expect(replay.state_.changed).to.be(false); expect(replay.startIndices).to.have.length(1); expect(replay.startIndicesFeature).to.have.length(1); linestring = new ol.geom.LineString( [[1000, 3000], [2000, 4000], [3000, 3000]]); replay.drawLineString(linestring, null); expect(replay.vertices).to.have.length(140); expect(replay.indices).to.have.length(48); expect(replay.state_.changed).to.be(false); expect(replay.startIndices).to.have.length(2); expect(replay.startIndicesFeature).to.have.length(2); }); }); describe('#drawMultiLineString', function() { it('sets the buffer data', function() { var multilinestring; multilinestring = new ol.geom.MultiLineString( [[[1000, 2000], [2000, 3000]], [[1000, 3000], [2000, 4000], [3000, 3000]]]); replay.setFillStrokeStyle(null, strokeStyle1); replay.drawMultiLineString(multilinestring, null); expect(replay.vertices).to.have.length(140); expect(replay.indices).to.have.length(48); expect(replay.state_.changed).to.be(false); expect(replay.startIndices).to.have.length(1); expect(replay.startIndicesFeature).to.have.length(1); }); }); describe('#drawCoordinates_', function() { it('triangulates linestrings', function() { var linestring; var stroke = new ol.style.Stroke({ color: [0, 255, 0, 1], lineCap: 'butt', lineJoin: 'bevel' }); linestring = new ol.geom.LineString( [[1000, 3000], [2000, 4000], [3000, 3000]]); var flatCoordinates = linestring.getFlatCoordinates(); replay.setFillStrokeStyle(null, stroke); replay.drawCoordinates_(flatCoordinates, 0, flatCoordinates.length, 2); expect(replay.indices).to.eql( [2, 0, 1, 4, 2, 1, 2, 4, 3, 5, 3, 4, 4, 6, 5]); }); it('optionally creates miters', function() { var linestring; var stroke = new ol.style.Stroke({ color: [0, 255, 0, 1], lineCap: 'butt' }); linestring = new ol.geom.LineString( [[1000, 3000], [2000, 4000], [3000, 3000]]); var flatCoordinates = linestring.getFlatCoordinates(); replay.setFillStrokeStyle(null, stroke); replay.drawCoordinates_(flatCoordinates, 0, flatCoordinates.length, 2); expect(replay.indices).to.eql( [2, 0, 1, 4, 2, 1, 2, 4, 3, 3, 5, 2, 6, 3, 4, 4, 7, 6]); }); it('optionally creates caps', function() { var linestring; var stroke = new ol.style.Stroke({ color: [0, 255, 0, 1] }); linestring = new ol.geom.LineString( [[1000, 3000], [2000, 4000], [3000, 3000]]); var flatCoordinates = linestring.getFlatCoordinates(); replay.setFillStrokeStyle(null, stroke); replay.drawCoordinates_(flatCoordinates, 0, flatCoordinates.length, 2); expect(replay.indices).to.eql( [2, 0, 1, 1, 3, 2, 4, 2, 3, 6, 4, 3, 4, 6, 5, 5, 7, 4, 8, 5, 6, 6, 9, 8, 10, 8, 9, 9, 11, 10]); }); it('respects segment orientation', function() { var linestring; var stroke = new ol.style.Stroke({ color: [0, 255, 0, 1], lineCap: 'butt', lineJoin: 'bevel' }); linestring = new ol.geom.LineString( [[1000, 3000], [2000, 2000], [3000, 3000]]); var flatCoordinates = linestring.getFlatCoordinates(); replay.setFillStrokeStyle(null, stroke); replay.drawCoordinates_(flatCoordinates, 0, flatCoordinates.length, 2); expect(replay.indices).to.eql( [2, 0, 1, 4, 2, 0, 2, 4, 3, 5, 3, 4, 4, 6, 5]); }); it('closes boundaries', function() { var linestring; var stroke = new ol.style.Stroke({ color: [0, 255, 0, 1], lineCap: 'butt', lineJoin: 'bevel' }); linestring = new ol.geom.LineString( [[1000, 3000], [2000, 4000], [3000, 3000], [1000, 3000]]); var flatCoordinates = linestring.getFlatCoordinates(); replay.setFillStrokeStyle(null, stroke); replay.drawCoordinates_(flatCoordinates, 0, flatCoordinates.length, 2); expect(replay.indices).to.eql( [0, 2, 1, 3, 1, 2, 5, 3, 2, 3, 5, 4, 6, 4, 5, 8, 6, 5, 6, 8, 7, 9, 7, 8, 10, 9, 8]); expect(replay.vertices.slice(0, 7)).to.eql( replay.vertices.slice(-14, -7)); expect(replay.vertices.slice(14, 21)).to.eql( replay.vertices.slice(-7)); }); }); });