From 75fffd1f47a7ff87362dd3f523cabedb07a557ef Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sat, 14 Sep 2013 12:54:31 -0600 Subject: [PATCH 1/7] Making use of the closure-util package This provides some initial development utilities for people using Node. Instructions for installing: npm install After pulling down the dependencies, you can start a developement server that provides the libraries (ol and Closure Library) in debug mode (not minified/compiled). Run the dev server with the following: npm start Currently, the example index page needs to be built with `build.py`. After building that, you should be able to browse all static files, view the examples and run the tests. --- .gitignore | 1 + package.json | 19 +++++++++++++++++++ tasks/serve.js | 46 +++++++++++++++++++++++++++++++++++++++++++++ test/index.html | 50 +++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 package.json create mode 100644 tasks/serve.js create mode 100644 test/index.html diff --git a/.gitignore b/.gitignore index f77b675c7e..a39ab0b3e4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /examples/*.html.png /examples/example-list.js /examples/example-list.xml +/node_modules/ diff --git a/package.json b/package.json new file mode 100644 index 0000000000..48ab5d8f12 --- /dev/null +++ b/package.json @@ -0,0 +1,19 @@ +{ + "name": "openlayers", + "version": "3.0.0-beta", + "description": "Mapping library", + "scripts": { + "start": "node tasks/serve.js" + }, + "repository": { + "type": "git", + "url": "git://github.com/openlayers/ol3.git" + }, + "license": "BSD", + "bugs": { + "url": "https://github.com/openlayers/ol3/issues" + }, + "devDependencies": { + "closure-util": "*" + } +} diff --git a/tasks/serve.js b/tasks/serve.js new file mode 100644 index 0000000000..e868aa6ebc --- /dev/null +++ b/tasks/serve.js @@ -0,0 +1,46 @@ +/** + * This task starts a dev server that provides a script loader for OpenLayers + * and Closure Library. In addition, a static server hosts all files in the + * repository. + */ + +var path = require('path'); +var url = require('url'); + +var closure = require('closure-util'); +var log = closure.log; + +log.info('ol', 'Parsing dependencies ...'); +var manager = new closure.Manager({ + closure: true, // use the bundled Closure Library + lib: [ + 'src/**/*.js', + 'test/spec/**/*.test.js' + ], + main: 'examples/*.js' +}); +manager.on('error', function(e) { + log.error('ol', e.message); +}); +manager.on('ready', function() { + var server = new closure.Server({ + manager: manager, + loader: /^\/\w+\/loader.js/, + getMain: function(req) { + var main; + var query = url.parse(req.url, true).query; + if (query.id) { + var referer = req.headers.referer; + if (referer) { + var from = path.join(process.cwd(), + path.dirname(url.parse(referer).pathname)); + main = path.resolve(from, query.id + '.js'); + } + } + return main; + } + }); + server.listen(3000, function() { + log.info('ol', 'Listening on http://localhost:3000/ (Ctrl+C to stop)'); + }); +}); diff --git a/test/index.html b/test/index.html new file mode 100644 index 0000000000..83de1522a9 --- /dev/null +++ b/test/index.html @@ -0,0 +1,50 @@ + + + + OL Spec Runner + + + + + +
+ + + + + + + + + + + + + + + + + From 377da9349e57c7b3efb4b1fad70d3bcac341d475 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sat, 14 Sep 2013 13:00:55 -0600 Subject: [PATCH 2/7] Don't use private `date_` property (see #1026) It looks like at some point the Closure Library exposed a public `date` property for this same purpose. The version of the Closure Library that comes with the closure-util package uses this property. At some point later, I'll demonstrate how we can control which version of the library we depend on. --- src/ol/parser/kmlparser.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/ol/parser/kmlparser.js b/src/ol/parser/kmlparser.js index b726f9b5fc..8a27805038 100644 --- a/src/ol/parser/kmlparser.js +++ b/src/ol/parser/kmlparser.js @@ -318,7 +318,16 @@ ol.parser.KML = function(opt_options) { value += ':00'; } } - container.whens.push(goog.date.fromIsoString(value).date_); + var date = goog.date.fromIsoString(value); + if (!goog.isNull(date)) { + /** + * Older Closure Library did not provide a date property on + * goog.date.DateTime. When we get rid of Plovr, this can be + * simplified to use the date property. + */ + date = new Date(date.getTime()); + } + container.whens.push(date); }, '_trackPointAttribute': function(node, container) { var name = node.nodeName.split(':').pop(); From 3dc2b69615f6457a0f7757b80048a3dadbbdeeab Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sat, 14 Sep 2013 13:07:59 -0600 Subject: [PATCH 3/7] Test conventions * use `be` or `equal` for strict equality tests * use `be.a` for `instanceof` checks * use dot instead of bracket notation --- test/spec/ol/parser/kml.test.js | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/test/spec/ol/parser/kml.test.js b/test/spec/ol/parser/kml.test.js index 98535a6fc8..e9b53bea89 100644 --- a/test/spec/ol/parser/kml.test.js +++ b/test/spec/ol/parser/kml.test.js @@ -134,24 +134,24 @@ describe('ol.parser.KML', function() { var p = new ol.parser.KML({extractStyles: true, trackAttributes: ['speed', 'num']}); var obj = p.read(xml); - expect(obj.features.length).to.eql(170); + expect(obj.features.length).to.be(170); var attr = obj.features[4].getAttributes(); // standard track point attributes - expect(attr['when'] instanceof Date).to.be.ok(); - expect(attr['when'].getTime()).to.eql(1272736815000); - expect(attr['altitude']).to.eql(1006); - expect(attr['heading']).to.eql(230); - expect(attr['tilt']).to.eql(0); - expect(attr['roll']).to.eql(0); - expect(attr['name']).to.eql('B752'); - expect(attr['adflag']).to.eql('A'); - expect(attr['flightid']).to.eql('DAL2973'); - expect(attr['speed']).to.eql('166'); - expect(attr['num']).to.eql('50'); + expect(attr.when).to.be.a(Date); + expect(attr.when.getTime()).to.be(1272736815000); + expect(attr.altitude).to.be(1006); + expect(attr.heading).to.be(230); + expect(attr.tilt).to.be(0); + expect(attr.roll).to.be(0); + expect(attr.name).to.be('B752'); + expect(attr.adflag).to.be('A'); + expect(attr.flightid).to.be('DAL2973'); + expect(attr.speed).to.be('166'); + expect(attr.num).to.be('50'); var geom = obj.features[4].getGeometry(); - expect(geom.get(0)).to.eql(-93.0753620391713); - expect(geom.get(1)).to.eql(44.9879724110872); - expect(geom.get(2)).to.eql(1006); + expect(geom.get(0)).to.be(-93.0753620391713); + expect(geom.get(1)).to.be(44.9879724110872); + expect(geom.get(2)).to.be(1006); done(); }); }); From ecd82297a0b33e9b7d6f2acf41974ed5a0c823c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sun, 15 Sep 2013 14:46:49 +0200 Subject: [PATCH 4/7] Better setup/teardown for ol.proj tests --- test/spec/ol/proj/epsg3857projection.test.js | 9 +++++++++ test/spec/ol/proj/proj.test.js | 17 +++-------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/test/spec/ol/proj/epsg3857projection.test.js b/test/spec/ol/proj/epsg3857projection.test.js index baabe31de1..a832168740 100644 --- a/test/spec/ol/proj/epsg3857projection.test.js +++ b/test/spec/ol/proj/epsg3857projection.test.js @@ -3,6 +3,14 @@ goog.provide('ol.test.proj.EPSG3857'); describe('ol.proj.EPSG3857', function() { + beforeEach(function() { + ol.proj.common.add(); + }); + + afterEach(function() { + ol.proj.clearAllProjections(); + }); + describe('getPointResolution', function() { it('returns the correct point scale at the equator', function() { @@ -44,4 +52,5 @@ describe('ol.proj.EPSG3857', function() { goog.require('ol.proj'); +goog.require('ol.proj.common'); goog.require('ol.proj.EPSG3857'); diff --git a/test/spec/ol/proj/proj.test.js b/test/spec/ol/proj/proj.test.js index 4c80a78ec5..c78956690e 100644 --- a/test/spec/ol/proj/proj.test.js +++ b/test/spec/ol/proj/proj.test.js @@ -3,24 +3,13 @@ goog.provide('ol.test.proj'); describe('ol.proj', function() { beforeEach(function() { + ol.proj.common.add(); sinon.spy(ol.proj, 'addTransform'); }); afterEach(function() { - var argsForCall = ol.proj.addTransform.args; - for (var i = 0, ii = argsForCall.length; i < ii; ++i) { - try { - ol.proj.removeTransform.apply(ol.proj, argsForCall[i].splice(0, 2)); - } catch (error) { - if (error instanceof goog.asserts.AssertionError) { - // The removeTransform function may have been called explicitly by the - // tests, so we pass. - } else { - throw error; - } - } - } ol.proj.addTransform.restore(); + ol.proj.clearAllProjections(); }); describe('projection equivalence', function() { @@ -364,7 +353,7 @@ describe('ol.proj', function() { goog.require('goog.array'); -goog.require('goog.asserts.AssertionError'); goog.require('ol.Projection'); goog.require('ol.ProjectionUnits'); goog.require('ol.proj'); +goog.require('ol.proj.common'); From 009172951c1d5ce99527e55268f57b38665b83d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89ric=20Lemoine?= Date: Sun, 15 Sep 2013 14:55:18 +0200 Subject: [PATCH 5/7] WebGL image layer tests require the common proj --- test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js b/test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js index c5f7ef1ba9..318bbb9472 100644 --- a/test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js +++ b/test/spec/ol/renderer/webgl/webglimagelayerrenderer.test.js @@ -12,6 +12,8 @@ describe('ol.renderer.webgl.ImageLayer', function() { var imageExtent; beforeEach(function() { + ol.proj.common.add(); + map = new ol.Map({ target: document.createElement('div') }); @@ -80,6 +82,7 @@ goog.require('goog.dispose'); goog.require('goog.vec.Mat4'); goog.require('goog.vec.Vec4'); goog.require('ol.Map'); +goog.require('ol.proj.common'); goog.require('ol.layer.Image'); goog.require('ol.source.Image'); goog.require('ol.renderer.webgl.ImageLayer'); From 13b55b04a866496570801c02dc052a89f163fc16 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 15 Sep 2013 10:41:44 -0600 Subject: [PATCH 6/7] Unnecessary spy --- test/spec/ol/proj/proj.test.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/spec/ol/proj/proj.test.js b/test/spec/ol/proj/proj.test.js index c78956690e..d2efe9d88f 100644 --- a/test/spec/ol/proj/proj.test.js +++ b/test/spec/ol/proj/proj.test.js @@ -4,11 +4,9 @@ describe('ol.proj', function() { beforeEach(function() { ol.proj.common.add(); - sinon.spy(ol.proj, 'addTransform'); }); afterEach(function() { - ol.proj.addTransform.restore(); ol.proj.clearAllProjections(); }); From f1f319d6ada50d13774e24b7492a812fb7a727ac Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 15 Sep 2013 14:22:41 -0600 Subject: [PATCH 7/7] Preemptively set global properties As mentioned in the comments, calling goog.getUid and goog.events.listen on the global object (as done in map.js and deviceorientation.js) set global properties. To let Mocha check for other leaks, we preemptively set these properties. --- test/index.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/test/index.html b/test/index.html index 83de1522a9..57d7f9eb76 100644 --- a/test/index.html +++ b/test/index.html @@ -33,8 +33,16 @@ * by setting goog.UID_PROPERTY_ on the monitored window. In order to test * that we don't have other global leaks, we preemptively set the property * so Mocha can compare the global before and after our tests. + * + * In addition, calling goog.events.listen on the global object (as done + * in deviceorientation.js) creates a second leak by setting + * goog.events.LISTENER_MAP_PROP_ on the global object. + * + * We preemptively set both of these properties so Mocha can compare the + * global before and after tests. The call to goog.events.listen also + * calls goog.getUid. */ - goog.getUid(this); + goog.events.listen(this, 'test', function() {}); if (window.mochaPhantomJS) { mochaPhantomJS.run();