diff --git a/test/spec/ol/interaction/translate.test.js b/test/spec/ol/interaction/translate.test.js index 2d6e3971de..e167f3afd5 100644 --- a/test/spec/ol/interaction/translate.test.js +++ b/test/spec/ol/interaction/translate.test.js @@ -77,29 +77,85 @@ describe('ol.interaction.Translate', function() { map.handleMapBrowserEvent(event); } + /** + * Tracks events triggered by the interaction as well as feature + * modifications. Helper function to + * @param {ol.Feature} feature Translated feature. + * @param {ol.interaction.Translate} interaction The interaction. + * @return {Array} events + */ + function trackEvents(feature, interaction) { + var events = []; + feature.on('change', function(event) { + events.push('change'); + }); + interaction.on('translatestart', function(event) { + events.push(event); + }); + interaction.on('translateend', function(event) { + events.push(event); + }); + return events; + } + + /** + * Validates the event array to verify proper event sequence. Checks + * that first and last event are correct TranslateEvents and that feature + * modifications event are in between. + * @param {Array} events The events. + * @param {Array} features The features. + */ + function validateEvents(events, features) { + + var startevent = events[0]; + var endevent = events[events.length - 1]; + + // first event should be translatestart + expect(startevent).to.be.an(ol.interaction.Translate.Event); + expect(startevent.type).to.eql('translatestart'); + + // last event should be translateend + expect(endevent).to.be.an(ol.interaction.Translate.Event); + expect(endevent.type).to.eql('translateend'); + + // make sure we get change events to events array + expect(events.length > 2).to.be(true); + // middle events should be feature modification events + for (var i = 1; i < events.length - 1; i++) { + expect(events[i]).to.equal('change'); + } + + // TranslateEvents should include the expected features + expect(startevent.features.getArray()).to.eql(features); + expect(endevent.features.getArray()).to.eql(features); + } + + describe('constructor', function() { it('creates a new interaction', function() { - var draw = new ol.interaction.Translate({ + var translate = new ol.interaction.Translate({ features: features }); - expect(draw).to.be.a(ol.interaction.Translate); - expect(draw).to.be.a(ol.interaction.Interaction); + expect(translate).to.be.a(ol.interaction.Translate); + expect(translate).to.be.a(ol.interaction.Interaction); }); }); - describe('moving features', function() { - var draw; + describe('moving features, with features option', function() { + var translate; beforeEach(function() { - draw = new ol.interaction.Translate({ + translate = new ol.interaction.Translate({ features: new ol.Collection([features[0]]) }); - map.addInteraction(draw); + map.addInteraction(translate); }); it('moves a selected feature', function() { + var events = trackEvents(features[0], translate); + simulateEvent('pointermove', 10, 20); simulateEvent('pointerdown', 10, 20); simulateEvent('pointerdrag', 50, -40); @@ -107,9 +163,13 @@ describe('ol.interaction.Translate', function() { var geometry = features[0].getGeometry(); expect(geometry).to.be.a(ol.geom.Point); expect(geometry.getCoordinates()).to.eql([50, 40]); + + validateEvents(events, [features[0]]); }); it('does not move an unselected feature', function() { + var events = trackEvents(features[0], translate); + simulateEvent('pointermove', 20, 30); simulateEvent('pointerdown', 20, 30); simulateEvent('pointerdrag', 50, -40); @@ -117,6 +177,30 @@ describe('ol.interaction.Translate', function() { var geometry = features[1].getGeometry(); expect(geometry).to.be.a(ol.geom.Point); expect(geometry.getCoordinates()).to.eql([20, -30]); + + expect(events).to.be.empty(); + }); + }); + + describe('moving features, without features option', function() { + var translate; + + beforeEach(function() { + translate = new ol.interaction.Translate(); + map.addInteraction(translate); + }); + + it('moves only targeted feature', function() { + var events = trackEvents(features[0], translate); + + simulateEvent('pointermove', 10, 20); + simulateEvent('pointerdown', 10, 20); + simulateEvent('pointerdrag', 50, -40); + simulateEvent('pointerup', 50, -40); + expect(features[0].getGeometry().getCoordinates()).to.eql([50, 40]); + expect(features[1].getGeometry().getCoordinates()).to.eql([20, -30]); + + validateEvents(events, [features[0]]); }); }); });