From 66ca191ab2ba4e75da5e25d848ee4c404ceb68e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Konstantin=20Ka=CC=88fer?= Date: Wed, 4 Feb 2015 20:09:02 +0100 Subject: [PATCH] add first render test --- .gitignore | 1 + Makefile | 4 ++ package.json | 1 + src/node_map_render_worker.cpp | 8 +-- test/fixtures/tiles.tilejson | 13 ++++ test/fixtures/tiles/0-0-0.vector.pbf | Bin 0 -> 9660 bytes test/map.test.js | 103 ++++++++++++++++++++------- vendor/mbgl | 2 +- 8 files changed, 102 insertions(+), 30 deletions(-) create mode 100644 test/fixtures/tiles.tilejson create mode 100644 test/fixtures/tiles/0-0-0.vector.pbf diff --git a/.gitignore b/.gitignore index b8de80b58..c27d12d2f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ /build /lib /node_modules +/test/results \ No newline at end of file diff --git a/Makefile b/Makefile index d26f9f032..5d53a8b44 100644 --- a/Makefile +++ b/Makefile @@ -11,6 +11,10 @@ HOST ?= osx endif HOST ?= linux +# Explicitly disable the default FileSource implementation +ASSET = none +HTTP = none +CACHE = none include $(MBGL)/config/defaults.mk diff --git a/package.json b/package.json index c93a4cb8a..e55d38804 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,7 @@ "version": "0.0.1", "main": "lib/mbgl.node", "dependencies": { + "mkdirp": "^0.5.0", "mocha": "^2.1.0", "nan": "^1.4.1", "request": "^2.51.0" diff --git a/src/node_map_render_worker.cpp b/src/node_map_render_worker.cpp index d11b5a009..d117a6c9a 100644 --- a/src/node_map_render_worker.cpp +++ b/src/node_map_render_worker.cpp @@ -16,7 +16,6 @@ NodeMap::RenderWorker::~RenderWorker() { } void NodeMap::RenderWorker::Execute() { - fprintf(stderr, "executing render worker\n"); try { nodeMap->view.resize(options->width, options->height, options->ratio); nodeMap->map.setAccessToken(options->accessToken); @@ -28,12 +27,11 @@ void NodeMap::RenderWorker::Execute() { // Run the loop. It will terminate when we don't have any further listeners. nodeMap->map.run(); - fprintf(stderr, "run completed\n"); const unsigned int width = options->width * options->ratio; const unsigned int height = options->height * options->ratio; - image = mbgl::util::compress_png(width, height, nodeMap->view.readPixels().get()); - fprintf(stderr, "png compressed\n"); - } catch (const std::exception &ex) { + auto pixels = nodeMap->view.readPixels(); + image = mbgl::util::compress_png(width, height, pixels.get()); + } catch (mbgl::exception &ex) { SetErrorMessage(ex.what()); } } diff --git a/test/fixtures/tiles.tilejson b/test/fixtures/tiles.tilejson new file mode 100644 index 000000000..320c17500 --- /dev/null +++ b/test/fixtures/tiles.tilejson @@ -0,0 +1,13 @@ +{ + "bounds": [ -180, -85.0511, 180, 85.0511 ], + "center": [ 0, 0, 0 ], + "format": "pbf", + "id": "mapbox.mapbox-streets-v6-dev", + "maskLevel": 8, + "maxzoom": 15, + "minzoom": 0, + "name": "Mapbox Streets V6", + "scheme": "xyz", + "tilejson": "2.0.0", + "tiles": [ "./fixtures/tiles/{z}-{x}-{y}.vector.pbf" ] +} diff --git a/test/fixtures/tiles/0-0-0.vector.pbf b/test/fixtures/tiles/0-0-0.vector.pbf new file mode 100644 index 0000000000000000000000000000000000000000..87628e06cf9e686a28c9af98221e50a698e3b2a7 GIT binary patch literal 9660 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 HLE`@fxf*~; literal 0 HcmV?d00001 diff --git a/test/map.test.js b/test/map.test.js index e719e789e..dff28b003 100644 --- a/test/map.test.js +++ b/test/map.test.js @@ -4,6 +4,38 @@ var assert = require('assert'); var mbgl = require('..'); +var fs = require('fs'); +var path = require('path'); +var mkdirp = require('mkdirp'); + +mkdirp.sync('test/results'); + +var style = { + 'version': 7, + 'name': 'Empty', + 'sources': { + 'mapbox': { + 'type': 'vector', + 'url': './fixtures/tiles.tilejson', + 'maxzoom': 15 + } + }, + 'layers': [{ + 'id': 'background', + 'type': 'background', + 'paint': { + 'background-color': 'white' + } + }, { + 'id': 'water', + 'type': 'fill', + 'source': 'mapbox', + 'source-layer': 'water', + 'paint': { + 'fill-color': 'blue' + } + }] +}; describe('Map', function() { @@ -29,30 +61,30 @@ describe('Map', function() { }); it('should require the FileSource object to have request and cancel methods', function() { - var fs = new mbgl.FileSource(); + var fileSource = new mbgl.FileSource(); assert.throws(function() { - new mbgl.Map(fs); + new mbgl.Map(fileSource); }, /FileSource must have a request member function/); - fs.request = 'test'; + fileSource.request = 'test'; assert.throws(function() { - new mbgl.Map(fs); + new mbgl.Map(fileSource); }, /FileSource must have a request member function/); - fs.request = function() {}; + fileSource.request = function() {}; assert.throws(function() { - new mbgl.Map(fs); + new mbgl.Map(fileSource); }, /FileSource must have a cancel member function/); - fs.cancel = 'test'; + fileSource.cancel = 'test'; assert.throws(function() { - new mbgl.Map(fs); + new mbgl.Map(fileSource); }, /FileSource must have a cancel member function/); - fs.cancel = function() {}; + fileSource.cancel = function() {}; assert.doesNotThrow(function() { - new mbgl.Map(fs); + new mbgl.Map(fileSource); }); }); @@ -61,11 +93,12 @@ describe('Map', function() { describe('load styles', function() { var map; + var fileSource = new mbgl.FileSource(); + fileSource.request = function() {}; + fileSource.cancel = function() {}; + beforeEach(function() { - var fs = new mbgl.FileSource(); - fs.request = function() {}; - fs.cancel = function() {}; - map = new mbgl.Map(fs); + map = new mbgl.Map(fileSource); }); afterEach(function() { @@ -82,28 +115,40 @@ describe('Map', function() { }, /Expect either an object or array at root/); }); - it('accepts a stylesheet string', function() { + it('accepts an empty stylesheet string', function() { map.load('{}'); }); + it('accepts a JSON stylesheet', function() { + map.load(style); + }); + + it('accepts a stringified stylesheet', function() { + map.load(JSON.stringify(style)); + }); }); - - describe('render arguments', function() { + describe('render argument requirements', function() { var map; + var fileSource = new mbgl.FileSource(); + fileSource.request = function(req) { + fs.readFile(path.join('test', req.url), function(err, data) { + req.respond(err, { data: data }); + assert.ifError(err); + }); + }; + fileSource.cancel = function() {}; + beforeEach(function() { - var fs = new mbgl.FileSource(); - fs.request = function() {}; - fs.cancel = function() {}; - map = new mbgl.Map(fs); + map = new mbgl.Map(fileSource); }); afterEach(function() { map = null; }); - it('requires a string or object as the first parameter', function() { + it('requires an object as the first parameter', function() { assert.throws(function() { map.render(); }, /First argument must be an options object/); @@ -123,12 +168,22 @@ describe('Map', function() { }, /Second argument must be a callback function/); }); - it('requires a callback as the second parameter', function(done) { + it('requires a style to be set', function(done) { map.render({}, function(err) { - done(err); + assert.ok(err); + assert.equal(err.message, 'Style is not set'); + done(); }); }); + it('returns an image', function(done) { + map.load(style); + map.render({}, function(err, data) { + assert.ifError(err); + fs.writeFileSync('test/results/image.png', data); + done(); + }); + }); }); }); diff --git a/vendor/mbgl b/vendor/mbgl index da981e782..8422b8b8a 160000 --- a/vendor/mbgl +++ b/vendor/mbgl @@ -1 +1 @@ -Subproject commit da981e78253ab2b8715f4e10e175be4bea43c133 +Subproject commit 8422b8b8a84d10f9c69c9295d1070eeb22d46db8