openlayers
Version: 
Build tools and sources for developing OpenLayers based mapping applications
306 lines (237 loc) • 7.23 kB
JavaScript
goog.provide('ol.test.source.RasterSource');
goog.require('ol.Map');
goog.require('ol.View');
goog.require('ol.layer.Image');
goog.require('ol.proj.Projection');
goog.require('ol.source.ImageStatic');
goog.require('ol.source.Raster');
goog.require('ol.source.Source');
goog.require('ol.source.Tile');
var red = 'data:image/gif;base64,R0lGODlhAQABAPAAAP8AAP///yH5BAAAAAAALAAAAAA' +
    'BAAEAAAICRAEAOw==';
var green = 'data:image/gif;base64,R0lGODlhAQABAPAAAAD/AP///yH5BAAAAAAALAAAA' +
    'AABAAEAAAICRAEAOw==';
var blue = 'data:image/gif;base64,R0lGODlhAQABAPAAAAAA/////yH5BAAAAAAALAAAAA' +
    'ABAAEAAAICRAEAOw==';
where('Uint8ClampedArray').describe('ol.source.Raster', function() {
  var target, map, redSource, greenSource, blueSource, raster;
  beforeEach(function() {
    target = document.createElement('div');
    var style = target.style;
    style.position = 'absolute';
    style.left = '-1000px';
    style.top = '-1000px';
    style.width = '2px';
    style.height = '2px';
    document.body.appendChild(target);
    var extent = [-1, -1, 1, 1];
    redSource = new ol.source.ImageStatic({
      url: red,
      imageExtent: extent
    });
    greenSource = new ol.source.ImageStatic({
      url: green,
      imageExtent: extent
    });
    blueSource = new ol.source.ImageStatic({
      url: blue,
      imageExtent: extent
    });
    raster = new ol.source.Raster({
      threads: 0,
      sources: [redSource, greenSource, blueSource],
      operation: function(inputs) {
        return inputs[0];
      }
    });
    map = new ol.Map({
      target: target,
      view: new ol.View({
        resolutions: [1],
        projection: new ol.proj.Projection({
          code: 'image',
          units: 'pixels',
          extent: extent
        })
      }),
      layers: [
        new ol.layer.Image({
          source: raster
        })
      ]
    });
  });
  afterEach(function() {
    map.setTarget(null);
    map.dispose();
    raster.dispose();
    greenSource.dispose();
    redSource.dispose();
    blueSource.dispose();
    document.body.removeChild(target);
  });
  describe('constructor', function() {
    it('returns a tile source', function() {
      var source = new ol.source.Raster({
        threads: 0,
        sources: [new ol.source.Tile({})]
      });
      expect(source).to.be.a(ol.source.Source);
      expect(source).to.be.a(ol.source.Raster);
    });
    it('defaults to "pixel" operation', function(done) {
      var log = [];
      var source = new ol.source.Raster({
        threads: 0,
        sources: [redSource, greenSource, blueSource],
        operation: function(inputs) {
          log.push(inputs);
          return inputs[0];
        }
      });
      source.once('afteroperations', function() {
        expect(log.length).to.equal(4);
        var inputs = log[0];
        var pixel = inputs[0];
        expect(pixel).to.be.an('array');
        done();
      });
      map.getLayers().item(0).setSource(source);
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
    });
    it('allows operation type to be set to "image"', function(done) {
      var log = [];
      var source = new ol.source.Raster({
        operationType: 'image',
        threads: 0,
        sources: [redSource, greenSource, blueSource],
        operation: function(inputs) {
          log.push(inputs);
          return inputs[0];
        }
      });
      source.once('afteroperations', function() {
        expect(log.length).to.equal(1);
        var inputs = log[0];
        var imageData = inputs[0];
        expect(imageData.data).to.be.a(Uint8ClampedArray);
        expect(imageData.width).to.be(2);
        expect(imageData.height).to.be(2);
        done();
      });
      map.getLayers().item(0).setSource(source);
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
    });
  });
  describe('#setOperation()', function() {
    it('allows operation to be set', function(done) {
      var count = 0;
      raster.setOperation(function(pixels) {
        ++count;
        var redPixel = pixels[0];
        var greenPixel = pixels[1];
        var bluePixel = pixels[2];
        expect(redPixel).to.eql([255, 0, 0, 255]);
        expect(greenPixel).to.eql([0, 255, 0, 255]);
        expect(bluePixel).to.eql([0, 0, 255, 255]);
        return pixels[0];
      });
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
      raster.once('afteroperations', function(event) {
        expect(count).to.equal(4);
        done();
      });
    });
    it('updates and re-runs the operation', function(done) {
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
      var count = 0;
      raster.on('afteroperations', function(event) {
        ++count;
        if (count === 1) {
          raster.setOperation(function(inputs) {
            return inputs[0];
          });
        } else {
          done();
        }
      });
    });
  });
  describe('beforeoperations', function() {
    it('gets called before operations are run', function(done) {
      var count = 0;
      raster.setOperation(function(inputs) {
        ++count;
        return inputs[0];
      });
      raster.once('beforeoperations', function(event) {
        expect(count).to.equal(0);
        expect(!!event).to.be(true);
        expect(event.extent).to.be.an('array');
        expect(event.resolution).to.be.a('number');
        expect(event.data).to.be.an('object');
        done();
      });
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
    });
    it('allows data to be set for the operation', function(done) {
      raster.setOperation(function(inputs, data) {
        ++data.count;
        return inputs[0];
      });
      raster.on('beforeoperations', function(event) {
        event.data.count = 0;
      });
      raster.once('afteroperations', function(event) {
        expect(event.data.count).to.equal(4);
        done();
      });
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
    });
  });
  describe('afteroperations', function() {
    it('gets called after operations are run', function(done) {
      var count = 0;
      raster.setOperation(function(inputs) {
        ++count;
        return inputs[0];
      });
      raster.once('afteroperations', function(event) {
        expect(count).to.equal(4);
        expect(!!event).to.be(true);
        expect(event.extent).to.be.an('array');
        expect(event.resolution).to.be.a('number');
        expect(event.data).to.be.an('object');
        done();
      });
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
    });
    it('receives data set by the operation', function(done) {
      raster.setOperation(function(inputs, data) {
        data.message = 'hello world';
        return inputs[0];
      });
      raster.once('afteroperations', function(event) {
        expect(event.data.message).to.equal('hello world');
        done();
      });
      var view = map.getView();
      view.setCenter([0, 0]);
      view.setZoom(0);
    });
  });
});