goog.provide('ol.test.format.KML'); describe('ol.format.KML', function() { var format; beforeEach(function() { format = new ol.format.KML(); }); describe('#readFeatures', function() { describe('id', function() { it('can read a Feature\'s id', function() { var text = '' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.getId()).to.be('foo'); }); it('treats a missing id as undefined', function() { var text = '' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.getId()).to.be(undefined); }); }); describe('geometry', function() { it('treats a missing geometry as null', function() { var text = '' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be(null); }); it('can read Point geometries', function() { var text = '' + ' ' + ' ' + ' 1,2,3' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.Point); expect(g.getCoordinates()).to.eql([1, 2, 3]); }); it('can read LineString geometries', function() { var text = '' + ' ' + ' ' + ' 1,2,3 4,5,6' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.LineString); expect(g.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]); }); it('can read LinearRing geometries', function() { var text = '' + ' ' + ' ' + ' 1,2,3 4,5,6 7,8,9' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.Polygon); expect(g.getCoordinates()).to.eql([[[1, 2, 3], [4, 5, 6], [7, 8, 9]]]); }); it('can read Polygon geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' 0,0,1 0,5,1 5,5,2 5,0,3' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.Polygon); expect(g.getCoordinates()).to.eql( [[[0, 0, 1], [0, 5, 1], [5, 5, 2], [5, 0, 3]]]); }); it('can read complex Polygon geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' 1,1,0 1,2,0 2,2,0 2,1,0' + ' ' + ' ' + ' ' + ' ' + ' 3,3,0 3,4,0 4,4,0 4,3,0' + ' ' + ' ' + ' ' + ' ' + ' 0,0,1 0,5,1 5,5,2 5,0,3' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.Polygon); expect(g.getCoordinates()).to.eql( [[[0, 0, 1], [0, 5, 1], [5, 5, 2], [5, 0, 3]], [[1, 1, 0], [1, 2, 0], [2, 2, 0], [2, 1, 0]], [[3, 3, 0], [3, 4, 0], [4, 4, 0], [4, 3, 0]]]); }); it('can read MultiPoint geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' 1,2,3' + ' ' + ' ' + ' 4,5,6' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.MultiPoint); expect(g.getCoordinates()).to.eql([[1, 2, 3], [4, 5, 6]]); }); it('can read MultiLineString geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' 1,2,3 4,5,6' + ' ' + ' ' + ' 7,8,9 10,11,12' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.MultiLineString); expect(g.getCoordinates()).to.eql( [[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]); }); it('can read MultiPolygon geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' 0,0,0 0,1,0 1,1,0 1,0,0' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' 3,0,0 3,1,0 4,1,0 4,0,0' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.MultiPolygon); expect(g.getCoordinates()).to.eql( [[[[0, 0, 0], [0, 1, 0], [1, 1, 0], [1, 0, 0]]], [[[3, 0, 0], [3, 1, 0], [4, 1, 0], [4, 0, 0]]]]); }); it('can read empty GeometryCollection geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.GeometryCollection); expect(g.getGeometries()).to.be.empty(); }); it('can read heterogenous GeometryCollection geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' 1,2,3' + ' ' + ' ' + ' 1,2,3 4,5,6' + ' ' + ' ' + ' 1,2,3 4,5,6 7,8,9' + ' ' + ' ' + ' ' + ' ' + ' 0,0,0 0,1,0 1,1,0 1,0,0' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.GeometryCollection); var gs = g.getGeometries(); expect(gs).to.have.length(4); expect(gs[0]).to.be.an(ol.geom.Point); expect(gs[1]).to.be.an(ol.geom.LineString); expect(gs[2]).to.be.an(ol.geom.Polygon); expect(gs[3]).to.be.an(ol.geom.Polygon); }); it('can read nested GeometryCollection geometries', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.GeometryCollection); var gs = g.getGeometries(); expect(gs).to.have.length(1); expect(gs[0]).to.be.an(ol.geom.GeometryCollection); }); it('can read gx:Track', function() { var text = '' + ' ' + ' ' + ' 2014-01-06T19:38:55Z' + ' 2014-01-06T19:39:03Z' + ' 2014-01-06T19:39:10Z' + ' 8.1 46.1 1909.9' + ' 8.2 46.2 1925.2' + ' 8.3 46.3 1926.2' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.LineString); }); it('can read gx:MultiTrack', function() { var text = '' + ' ' + ' ' + ' ' + ' 2014-01-06T19:38:55Z' + ' 8.1 46.1 1909.9' + ' ' + ' ' + ' 2014-01-06T19:38:55Z' + ' 2014-01-06T19:39:10Z' + ' 8.1 46.1 1909.9' + ' 8.2 46.2 1925.2' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.MultiLineString); var gs = g.getLineStrings(); expect(gs).to.have.length(2); expect(gs[0]).to.be.an(ol.geom.LineString); }); }); describe('attributes', function() { it('can read boolean attributes', function() { var text = '' + ' ' + ' 1' + ' 0' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('open')).to.be(true); expect(f.get('visibility')).to.be(false); }); it('can read string attributes', function() { var text = '' + ' ' + '
My address
' + ' My description' + ' My name' + ' My phone number' + '
' + '
'; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('address')).to.be('My address'); expect(f.get('description')).to.be('My description'); expect(f.get('name')).to.be('My name'); expect(f.get('phoneNumber')).to.be('My phone number'); }); it('strips leading and trailing whitespace in strings', function() { var text = '' + ' ' + ' \n\nMy description\n\n' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('description')).to.be('My description'); }); it('can read CDATA sections in strings', function() { var text = '' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('name')).to.be('My name in CDATA'); }); it('strips leading and trailing whitespace around CDATA', function() { var text = '' + ' ' + ' \n\n\n\n' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('name')).to.be('My name in CDATA'); }); }); describe('extended data', function() { it('can read ExtendedData', function() { var text = '' + ' ' + ' ' + ' ' + ' bar' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('foo')).to.be('bar'); }); it('can read SchemaData', function() { var text = '' + ' ' + ' ' + ' ' + ' London' + ' 60000000' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('capital')).to.be('London'); expect(f.get('population')).to.be('60000000'); }); }); describe('styles', function() { it('applies the default style if no style is defined', function() { var text = '' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); expect(style.getFill()).to.be(ol.format.KML.DEFAULT_FILL_STYLE_); expect(style.getFill().getColor()).to.eql([255, 255, 255, 1]); expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_); // FIXME check image style expect(style.getStroke()).to.be(ol.format.KML.DEFAULT_STROKE_STYLE_); expect(style.getStroke().getColor()).to.eql([255, 255, 255, 1]); expect(style.getStroke().getWidth()).to.be(1); }); it('can read a feature\'s LineStyle', function() { var text = '' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); expect(style.getFill()).to.be(ol.format.KML.DEFAULT_FILL_STYLE_); expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_); var strokeStyle = style.getStroke(); expect(strokeStyle).to.be.an(ol.style.Stroke); expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); expect(strokeStyle.getWidth()).to.be(9); expect(style.getText()).to.be(null); expect(style.getZIndex()).to.be(undefined); }); it('can read a feature\'s PolyStyle', function() { var text = '' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); var fillStyle = style.getFill(); expect(fillStyle).to.be.an(ol.style.Fill); expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_); expect(style.getStroke()).to.be(ol.format.KML.DEFAULT_STROKE_STYLE_); expect(style.getText()).to.be(null); expect(style.getZIndex()).to.be(undefined); }); it('can read a feature\'s LineStyle and PolyStyle', function() { var text = '' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); var fillStyle = style.getFill(); expect(fillStyle).to.be.an(ol.style.Fill); expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_); var strokeStyle = style.getStroke(); expect(strokeStyle).to.be.an(ol.style.Stroke); expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); expect(strokeStyle.getWidth()).to.be(9); expect(style.getText()).to.be(null); expect(style.getZIndex()).to.be(undefined); }); it('disables the fill when fill is \'0\'', function() { var text = '' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); expect(style.getFill()).to.be(null); expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_); var strokeStyle = style.getStroke(); expect(strokeStyle).to.be.an(ol.style.Stroke); expect(strokeStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); expect(strokeStyle.getWidth()).to.be(9); expect(style.getText()).to.be(null); expect(style.getZIndex()).to.be(undefined); }); it('disables the stroke when outline is \'0\'', function() { var text = '' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); var fillStyle = style.getFill(); expect(fillStyle).to.be.an(ol.style.Fill); expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_); expect(style.getStroke()).to.be(null); expect(style.getText()).to.be(null); expect(style.getZIndex()).to.be(undefined); }); it('disables both fill and stroke when fill and outline are \'0\'', function() { var text = '' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); expect(style.getFill()).to.be(null); expect(style.getImage()).to.be(ol.format.KML.DEFAULT_IMAGE_STYLE_); expect(style.getStroke()).to.be(null); expect(style.getText()).to.be(null); expect(style.getZIndex()).to.be(undefined); }); }); describe('style maps', function() { it('can read a normal style', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' normal' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var s = styleArray[0]; expect(s).to.be.an(ol.style.Style); expect(s.getFill()).not.to.be(null); expect(s.getFill().getColor()).to.eql([0, 0, 0, 0]); }); it('ignores highlight styles', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' highlighted' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var s = styleArray[0]; expect(s).to.be.an(ol.style.Style); expect(s).to.be(ol.format.KML.DEFAULT_STYLE_); }); it('uses normal styles instead of highlight styles', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' normal' + ' ' + ' ' + ' ' + ' highlighted' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var s = styleArray[0]; expect(s).to.be.an(ol.style.Style); expect(s.getFill()).not.to.be(null); expect(s.getFill().getColor()).to.eql([0, 0, 0, 0]); }); it('can read a normal styleUrls', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' normal' + ' #foo' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var s = styleArray[0]; expect(s).to.be.an(ol.style.Style); expect(s.getFill()).not.to.be(null); expect(s.getFill().getColor()).to.eql([0, 0, 0, 0]); }); it('ignores highlighted styleUrls', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' highlighted' + ' #foo' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var s = styleArray[0]; expect(s).to.be.an(ol.style.Style); expect(s).to.be(ol.format.KML.DEFAULT_STYLE_); }); }); describe('shared styles', function() { it('can apply a shared style to a feature', function() { var text = '' + ' ' + ' ' + ' ' + ' #foo' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); var fillStyle = style.getFill(); expect(fillStyle).to.be.an(ol.style.Fill); expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); }); it('can read a shared style from a Folder', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' #foo' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var styleFunction = f.getStyleFunction(); expect(styleFunction).not.to.be(undefined); var styleArray = styleFunction.call(f, 0); expect(styleArray).to.be.an(Array); expect(styleArray).to.have.length(1); var style = styleArray[0]; expect(style).to.be.an(ol.style.Style); var fillStyle = style.getFill(); expect(fillStyle).to.be.an(ol.style.Fill); expect(fillStyle.getColor()).to.eql([0x78, 0x56, 0x34, 0x12 / 255]); }); it('can apply a shared style to multiple features', function() { var text = '' + ' ' + ' ' + ' ' + ' #foo' + ' ' + ' ' + ' #foo' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(2); var f1 = fs[0]; expect(f1).to.be.an(ol.Feature); var styleFunction1 = f1.getStyleFunction(); expect(styleFunction1).not.to.be(undefined); var styleArray1 = styleFunction1.call(f1, 0); expect(styleArray1).to.be.an(Array); var f2 = fs[1]; expect(f2).to.be.an(ol.Feature); var styleFunction2 = f2.getStyleFunction(); expect(styleFunction2).not.to.be(undefined); var styleArray2 = styleFunction2.call(f2, 0); expect(styleArray2).to.be.an(Array); expect(styleArray1).to.be(styleArray2); }); }); describe('multiple features', function() { it('returns no features from an empty Document', function() { var text = '' + ''; var fs = format.readFeatures(text); expect(fs).to.be.empty(); }); it('can read a single feature from a Document', function() { var text = '' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); expect(fs[0]).to.be.an(ol.Feature); }); it('can read a multiple features from a Document', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(2); expect(fs[0]).to.be.an(ol.Feature); expect(fs[0].getId()).to.be('1'); expect(fs[1]).to.be.an(ol.Feature); expect(fs[1].getId()).to.be('2'); }); it('returns no features from an empty Folder', function() { var text = '' + ''; var fs = format.readFeatures(text); expect(fs).to.be.empty(); }); it('can read a single feature from a Folder', function() { var text = '' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); expect(fs[0]).to.be.an(ol.Feature); }); it('can read a multiple features from a Folder', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(2); expect(fs[0]).to.be.an(ol.Feature); expect(fs[0].getId()).to.be('1'); expect(fs[1]).to.be.an(ol.Feature); expect(fs[1].getId()).to.be('2'); }); it('can read features from Folders nested in Documents', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); expect(fs[0]).to.be.an(ol.Feature); }); it('can read features from Folders nested in Folders', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); expect(fs[0]).to.be.an(ol.Feature); }); it('can read a single feature', function() { var text = '' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(1); expect(fs[0]).to.be.an(ol.Feature); }); it('can read features at multiple levels', function() { var text = '' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(text); expect(fs).to.have.length(5); expect(fs[0]).to.be.an(ol.Feature); expect(fs[0].getId()).to.be('a'); expect(fs[1]).to.be.an(ol.Feature); expect(fs[1].getId()).to.be('b'); expect(fs[2]).to.be.an(ol.Feature); expect(fs[2].getId()).to.be('c'); expect(fs[3]).to.be.an(ol.Feature); expect(fs[3].getId()).to.be('d'); expect(fs[4]).to.be.an(ol.Feature); expect(fs[4].getId()).to.be('e'); }); it('supports common namespaces', function() { expect(format.readFeatures( '' + ' ' + '')).to.have.length(1); expect(format.readFeatures( '' + ' ' + '')).to.have.length(1); expect(format.readFeatures( '' + ' ' + '')).to.have.length(1); }); it('ignores unknown namespaces', function() { expect(format.readFeatures( '' + ' ' + '')).to.be.empty(); }); }); describe('error handling', function() { it('should ignore invalid coordinates', function() { var doc = goog.dom.xml.loadXml('INVALID'); var node = doc.firstChild; expect(ol.format.KML.readFlatCoordinates_(node)).to.be(undefined); }); it('should ignore Points with invalid coordinates', function() { var kml = '' + ' ' + ' ' + ' INVALID COORDINATES' + ' ' + ' ' + ''; var fs = format.readFeatures(kml); expect(fs).to.be.an(Array); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.getGeometry()).to.be(null); }); it('should ignore LineStrings with invalid coordinates', function() { var kml = '' + ' ' + ' ' + ' INVALID COORDINATES' + ' ' + ' ' + ''; var fs = format.readFeatures(kml); expect(fs).to.be.an(Array); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.getGeometry()).to.be(null); }); it('should ignore Polygons with no rings', function() { var kml = '' + ' ' + ' ' + ' INVALID COORDINATES' + ' ' + ' ' + ''; var fs = format.readFeatures(kml); expect(fs).to.be.an(Array); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.getGeometry()).to.be(null); }); it('should ignore Polygons with no outer ring', function() { var kml = '' + ' ' + ' ' + ' ' + ' ' + ' 1,2,3 4,5,6 7,8,9' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(kml); expect(fs).to.be.an(Array); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.getGeometry()).to.be(null); }); it('should ignore geometries with invalid coordinates', function() { var kml = '' + ' ' + ' ' + ' ' + ' INVALID COORDINATES' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(kml); expect(fs).to.be.an(Array); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); var g = f.getGeometry(); expect(g).to.be.an(ol.geom.GeometryCollection); expect(g.getGeometries()).to.be.empty(); }); it('should ignore invalid booleans', function() { var kml = '' + ' ' + ' foo' + ' ' + ''; var fs = format.readFeatures(kml); expect(fs).to.be.an(Array); expect(fs).to.have.length(1); var f = fs[0]; expect(f).to.be.an(ol.Feature); expect(f.get('visibility')).to.be(undefined); }); it('parse all valid features in a Folder, without error', function() { var kml = '' + ' ' + ' ' + ' ' + ' ' + ' foo' + ' ' + ' ' + ' ' + ' ' + ''; var fs = format.readFeatures(kml); expect(fs).to.be.an(Array); expect(fs).to.have.length(5); expect(fs[0]).to.be.an(ol.Feature); expect(fs[0].getId()).to.be('a'); expect(fs[1]).to.be.an(ol.Feature); expect(fs[1].getId()).to.be('b'); expect(fs[2]).to.be.an(ol.Feature); expect(fs[2].getId()).to.be('c'); expect(fs[3]).to.be.an(ol.Feature); expect(fs[3].getId()).to.be('d'); expect(fs[4]).to.be.an(ol.Feature); expect(fs[4].getId()).to.be('e'); }); }); }); describe('when parsing states.kml', function() { var features; before(function(done) { afterLoadXml('spec/ol/format/kml/states.kml', function(xml) { try { features = format.readFeatures(xml); } catch (e) { done(e); } done(); }); }); it('creates 50 features', function() { expect(features).to.have.length(50); }); it('creates features with heterogenous geometry collections', function() { // FIXME decide if we should instead create features with multiple geoms var feature = features[0]; expect(feature).to.be.an(ol.Feature); var geometry = feature.getGeometry(); expect(geometry).to.be.an(ol.geom.GeometryCollection); }); it('creates a Point and a MultiPolygon for Alaska', function() { var alaska = goog.array.find(features, function(feature) { return feature.get('name') === 'Alaska'; }); expect(alaska).to.be.an(ol.Feature); var geometry = alaska.getGeometry(); expect(geometry).to.be.an(ol.geom.GeometryCollection); var components = geometry.getGeometries(); expect(components).to.have.length(2); expect(components[0]).to.be.an(ol.geom.Point); expect(components[1]).to.be.an(ol.geom.MultiPolygon); }); }); describe('#readName', function() { it('returns undefined if there is no name', function() { var kml = '' + ' ' + ' ' + ' ' + ' ' + ' ' + ''; expect(format.readName(kml)).to.be(undefined); }); it('returns the name of the first Document', function() { var kml = '' + ' ' + ' Document name' + ' ' + ''; expect(format.readName(kml)).to.be('Document name'); }); it('returns the name of the first Folder', function() { var kml = '' + ' ' + ' Folder name' + ' ' + ''; expect(format.readName(kml)).to.be('Folder name'); }); it('returns the name of the first Placemark', function() { var kml = '' + ' ' + ' Placemark name' + ' ' + ''; expect(format.readName(kml)).to.be('Placemark name'); }); it('searches breadth-first', function() { var kml = '' + ' ' + ' ' + ' Placemark name' + ' ' + ' Document name' + ' ' + ''; expect(format.readName(kml)).to.be('Document name'); }); }); }); goog.require('goog.array'); goog.require('goog.dom.xml'); goog.require('ol.Feature'); goog.require('ol.format.KML'); goog.require('ol.geom.GeometryCollection'); goog.require('ol.geom.LineString'); goog.require('ol.geom.MultiLineString'); goog.require('ol.geom.MultiPoint'); goog.require('ol.geom.MultiPolygon'); goog.require('ol.geom.Point'); goog.require('ol.geom.Polygon'); goog.require('ol.style.Fill'); goog.require('ol.style.Stroke'); goog.require('ol.style.Style');