diff --git a/old/src/ol/parser/ogc/filterparser_v1.js b/old/src/ol/parser/ogc/filterparser_v1.js index b141c98279..6a5822ee4f 100644 --- a/old/src/ol/parser/ogc/filterparser_v1.js +++ b/old/src/ol/parser/ogc/filterparser_v1.js @@ -596,6 +596,9 @@ ol.parser.ogc.Filter_v1.prototype.getGmlParser = function() { */ ol.parser.ogc.Filter_v1.prototype.setGmlParser = function(gml) { this.gmlParser_ = gml; + if (this.featureNS) { + gml.setFeatureNS(this.featureNS); + } for (var uri in this.gmlParser_.readers) { for (var key in this.gmlParser_.readers[uri]) { if (!goog.isDef(this.readers[uri])) { @@ -615,3 +618,36 @@ ol.parser.ogc.Filter_v1.prototype.setGmlParser = function(gml) { } } }; + + +/** + * @param {string} featureNS Feature namespace. + */ +ol.parser.ogc.Filter_v1.prototype.setFeatureNS = function(featureNS) { + this.featureNS = featureNS; + if (goog.isDefAndNotNull(this.gmlParser_)) { + this.setGmlParser(this.gmlParser_); + } +}; + + +/** + * @param {string} featureType Feature type. + */ +ol.parser.ogc.Filter_v1.prototype.setFeatureType = function(featureType) { + this.featureType = featureType; + if (goog.isDefAndNotNull(this.gmlParser_)) { + this.gmlParser_.featureType = featureType; + } +}; + + +/** + * @param {string} srsName SRS name. + */ +ol.parser.ogc.Filter_v1.prototype.setSrsName = function(srsName) { + this.srsName = srsName; + if (goog.isDefAndNotNull(this.gmlParser_)) { + this.gmlParser_.srsName = this.srsName; + } +}; diff --git a/old/src/ol/parser/ogc/filterparser_v1_0_0.js b/old/src/ol/parser/ogc/filterparser_v1_0_0.js index eecebe2504..dcd75f34c0 100644 --- a/old/src/ol/parser/ogc/filterparser_v1_0_0.js +++ b/old/src/ol/parser/ogc/filterparser_v1_0_0.js @@ -114,7 +114,7 @@ ol.parser.ogc.Filter_v1_0_0 = function() { return node; } }); - this.setGmlParser(new ol.parser.ogc.GML_v2({featureNS: 'http://foo'})); + this.setGmlParser(new ol.parser.ogc.GML_v2()); }; goog.inherits(ol.parser.ogc.Filter_v1_0_0, ol.parser.ogc.Filter_v1); @@ -168,8 +168,7 @@ ol.parser.ogc.Filter_v1_0_0.prototype.writeSpatial_ = function(filter, name) { } else { var child; if (geom !== null) { - child = this.writeNode('_geometry', {value: geom}, - this.gmlParser_.featureNS).firstChild; + child = this.gmlParser_.writeGeometry(geom); } else if (bbox.length === 4) { child = this.writeNode('Box', bbox, 'http://www.opengis.net/gml'); diff --git a/old/src/ol/parser/ogc/gmlparser.js b/old/src/ol/parser/ogc/gmlparser.js index 6431298975..894bfe17ec 100644 --- a/old/src/ol/parser/ogc/gmlparser.js +++ b/old/src/ol/parser/ogc/gmlparser.js @@ -414,7 +414,7 @@ ol.parser.ogc.GML = function(opt_options) { } } }; - this.featureNSWiters_ = { + this.featureNSWriters_ = { '_typeName': function(feature) { var node = this.createElementNS('feature:' + this.featureType, this.featureNS); @@ -472,13 +472,23 @@ ol.parser.ogc.GML = function(opt_options) { } }; if (goog.isDef(this.featureNS)) { - this.writers[this.featureNS] = this.featureNSWiters_; + this.writers[this.featureNS] = this.featureNSWriters_; } goog.base(this); }; goog.inherits(ol.parser.ogc.GML, ol.parser.XML); +/** + * @param {ol.geom.Geometry} geometry Geometry. + * @return {Element} XML node representing the geometry. + */ +ol.parser.ogc.GML.prototype.writeGeometry = function(geometry) { + return this.featureNSWriters_['_geometry'].call(this, {value: geometry}) + .firstChild; +}; + + /** * @param {string|Document|Element|Object} data Data to read. * @param {ol.parser.GMLReadOptions=} opt_options Read options. @@ -541,7 +551,7 @@ ol.parser.ogc.GML.prototype.readNode = function(node, obj, opt_first) { (/^(.*:)?featureMembers?$/).test(node.parentNode.nodeName))) { this.featureType = node.nodeName.split(':').pop(); this.readers[node.namespaceURI] = this.featureNSReaders_; - this.writers[node.namespaceURI] = this.featureNSWiters_; + this.writers[node.namespaceURI] = this.featureNSWriters_; this.featureNS = node.namespaceURI; this.autoConfig = true; } @@ -645,3 +655,13 @@ ol.parser.ogc.GML.prototype.applyWriteOptions = function(obj, opt_options) { this.axisOrientation = ol.proj.get(this.srsName).getAxisOrientation(); } }; + + +/** + * @param {string} featureNS Feature namespace. + */ +ol.parser.ogc.GML.prototype.setFeatureNS = function(featureNS) { + this.featureNS = featureNS; + this.readers[featureNS] = this.featureNSReaders_; + this.writers[featureNS] = this.featureNSWriters_; +}; diff --git a/old/src/ol/parser/ogc/gmlparser_v3.js b/old/src/ol/parser/ogc/gmlparser_v3.js index d32ef5b78f..7c30f85713 100644 --- a/old/src/ol/parser/ogc/gmlparser_v3.js +++ b/old/src/ol/parser/ogc/gmlparser_v3.js @@ -22,7 +22,7 @@ ol.parser.ogc.GML_v3 = function(opt_options) { 'http://schemas.opengis.net/gml/3.1.1/profiles/gmlsfProfile/' + '1.0.0/gmlsf.xsd'; goog.base(this, opt_options); - this.featureNSWiters_['_geometry'] = function(obj) { + this.featureNSWriters_['_geometry'] = function(obj) { var node = this.createElementNS('feature:' + obj.name, this.featureNS); var geometry = obj.value; diff --git a/old/src/ol/parser/ogc/wfsparser_v1.js b/old/src/ol/parser/ogc/wfsparser_v1.js index 892e7a851f..2fb5f685fa 100644 --- a/old/src/ol/parser/ogc/wfsparser_v1.js +++ b/old/src/ol/parser/ogc/wfsparser_v1.js @@ -122,8 +122,12 @@ ol.parser.ogc.WFS_v1.prototype.getFilterParser = function() { */ ol.parser.ogc.WFS_v1.prototype.setFilterParser = function(filter) { this.filter_ = filter; - for (var uri in this.filter_.readers) { - for (var key in this.filter_.readers[uri]) { + if (goog.isDefAndNotNull(this.featureNS)) { + filter.setFeatureNS(this.featureNS); + } + var uri, key; + for (uri in this.filter_.readers) { + for (key in this.filter_.readers[uri]) { if (!goog.isDef(this.readers[uri])) { this.readers[uri] = {}; } @@ -149,6 +153,39 @@ ol.parser.ogc.WFS_v1.prototype.setFilterParser = function(filter) { }; +/** + * @param {string} featureType Feature type. + */ +ol.parser.ogc.WFS_v1.prototype.setFeatureType = function(featureType) { + this.featureType = featureType; + if (goog.isDefAndNotNull(this.filter_)) { + this.filter_.setFeatureType(featureType); + } +}; + + +/** + * @param {string} featureNS Feature namespace. + */ +ol.parser.ogc.WFS_v1.prototype.setFeatureNS = function(featureNS) { + this.featureNS = featureNS; + if (goog.isDefAndNotNull(this.filter_)) { + this.setFilterParser(this.filter_); + } +}; + + +/** + * @param {string} srsName SRS name. + */ +ol.parser.ogc.WFS_v1.prototype.setSrsName = function(srsName) { + this.srsName = srsName; + if (goog.isDefAndNotNull(this.filter_)) { + this.filter_.setSrsName(this.srsName); + } +}; + + /** * @param {string|Document|Element} data Data to read. * @return {Object} An object representing the document. diff --git a/old/src/ol/parser/ogc/wfsparser_v1_0_0.js b/old/src/ol/parser/ogc/wfsparser_v1_0_0.js index 28e64c98b8..630db7579a 100644 --- a/old/src/ol/parser/ogc/wfsparser_v1_0_0.js +++ b/old/src/ol/parser/ogc/wfsparser_v1_0_0.js @@ -72,7 +72,6 @@ ol.parser.ogc.WFS_v1_0_0 = function() { } }); var filter = new ol.parser.ogc.Filter_v1_0_0(); - delete filter.getGmlParser().featureNS; this.setFilterParser(filter); }; goog.inherits(ol.parser.ogc.WFS_v1_0_0, diff --git a/old/test/spec/ol/parser/ogc/gml_v2.test.js b/old/test/spec/ol/parser/ogc/gml_v2.test.js index e482df3d19..f102f50cdb 100644 --- a/old/test/spec/ol/parser/ogc/gml_v2.test.js +++ b/old/test/spec/ol/parser/ogc/gml_v2.test.js @@ -20,7 +20,7 @@ describe('ol.parser.gml_v2', function() { var obj = parser.read(xml); parser.applyWriteOptions(obj); var geom = parser.createGeometry({geometry: obj.geometry}); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -49,7 +49,7 @@ describe('ol.parser.gml_v2', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -79,7 +79,7 @@ describe('ol.parser.gml_v2', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -108,7 +108,7 @@ describe('ol.parser.gml_v2', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -143,7 +143,7 @@ describe('ol.parser.gml_v2', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -168,7 +168,7 @@ describe('ol.parser.gml_v2', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -187,7 +187,7 @@ describe('ol.parser.gml_v2', function() { var obj = p.read(xml); var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); - var node = p.featureNSWiters_['_geometry'].apply(p, + var node = p.featureNSWriters_['_geometry'].apply(p, [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; @@ -232,7 +232,7 @@ describe('ol.parser.gml_v2', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; diff --git a/old/test/spec/ol/parser/ogc/gml_v3.test.js b/old/test/spec/ol/parser/ogc/gml_v3.test.js index e99089d047..88da336d8e 100644 --- a/old/test/spec/ol/parser/ogc/gml_v3.test.js +++ b/old/test/spec/ol/parser/ogc/gml_v3.test.js @@ -19,7 +19,7 @@ describe('ol.parser.gml_v3', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -36,7 +36,7 @@ describe('ol.parser.gml_v3', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -63,7 +63,7 @@ describe('ol.parser.gml_v3', function() { var obj = p.read(xml); var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); - var node = p.featureNSWiters_['_geometry'].apply(p, + var node = p.featureNSWriters_['_geometry'].apply(p, [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; @@ -91,7 +91,7 @@ describe('ol.parser.gml_v3', function() { var obj = p.read(xml); var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); - var node = p.featureNSWiters_['_geometry'].apply(p, + var node = p.featureNSWriters_['_geometry'].apply(p, [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; @@ -108,7 +108,7 @@ describe('ol.parser.gml_v3', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -127,7 +127,7 @@ describe('ol.parser.gml_v3', function() { var obj = p.read(xml); var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); - var node = p.featureNSWiters_['_geometry'].apply(p, + var node = p.featureNSWriters_['_geometry'].apply(p, [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; @@ -156,7 +156,7 @@ describe('ol.parser.gml_v3', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -185,7 +185,7 @@ describe('ol.parser.gml_v3', function() { var obj = p.read(xml); var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); - var node = p.featureNSWiters_['_geometry'].apply(p, + var node = p.featureNSWriters_['_geometry'].apply(p, [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; @@ -212,7 +212,7 @@ describe('ol.parser.gml_v3', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -230,7 +230,7 @@ describe('ol.parser.gml_v3', function() { var obj = p.read(xml); var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj); - var node = p.featureNSWiters_['_geometry'].apply(p, + var node = p.featureNSWriters_['_geometry'].apply(p, [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; @@ -247,7 +247,7 @@ describe('ol.parser.gml_v3', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -263,7 +263,7 @@ describe('ol.parser.gml_v3', function() { var obj = parser.read(xml); var geom = parser.createGeometry({geometry: obj.geometry}); parser.applyWriteOptions(obj); - var node = parser.featureNSWiters_['_geometry'].apply(parser, + var node = parser.featureNSWriters_['_geometry'].apply(parser, [{value: geom}]).firstChild; delete parser.srsName; delete parser.axisOrientation; @@ -279,7 +279,7 @@ describe('ol.parser.gml_v3', function() { var obj = p.read(xml); var geom = p.createGeometry({geometry: obj.geometry}); p.applyWriteOptions(obj, {srsName: 'foo'}); - var node = p.featureNSWiters_['_geometry'].apply(p, + var node = p.featureNSWriters_['_geometry'].apply(p, [{value: geom}]).firstChild; delete p.srsName; delete p.axisOrientation; diff --git a/src/ol/object.exports b/src/ol/object.exports index c824a78609..89426170a5 100644 --- a/src/ol/object.exports +++ b/src/ol/object.exports @@ -3,11 +3,7 @@ @exportProperty ol.Object.prototype.get @exportProperty ol.Object.prototype.getProperties @exportProperty ol.Object.prototype.notify -@exportProperty ol.Object.prototype.on -@exportProperty ol.Object.prototype.once @exportProperty ol.Object.prototype.set @exportProperty ol.Object.prototype.setValues -@exportProperty ol.Object.prototype.un -@exportProperty ol.Object.prototype.unByKey @exportProperty ol.Object.prototype.unbind @exportProperty ol.Object.prototype.unbindAll diff --git a/src/ol/object.js b/src/ol/object.js index 1a14e785af..4bca4e75ca 100644 --- a/src/ol/object.js +++ b/src/ol/object.js @@ -10,9 +10,9 @@ goog.provide('ol.ObjectEventType'); goog.require('goog.array'); goog.require('goog.events'); -goog.require('goog.events.EventTarget'); goog.require('goog.functions'); goog.require('goog.object'); +goog.require('ol.Observable'); /** @@ -81,7 +81,7 @@ ol.ObjectProperty = { /** * Base class implementing KVO (Key Value Observing). * @constructor - * @extends {goog.events.EventTarget} + * @extends {ol.Observable} * @param {Object.=} opt_values Values. * @todo stability experimental */ @@ -98,7 +98,7 @@ ol.Object = function(opt_values) { this.setValues(opt_values); } }; -goog.inherits(ol.Object, goog.events.EventTarget); +goog.inherits(ol.Object, ol.Observable); /** @@ -335,34 +335,6 @@ ol.Object.prototype.notifyInternal_ = function(key) { }; -/** - * Listen for a certain type of event. - * @param {string|Array.} type The event type or array of event types. - * @param {function(?): ?} listener The listener function. - * @param {Object=} opt_scope Object is whose scope to call - * the listener. - * @return {goog.events.Key} Unique key for the listener. - * @todo stability experimental - */ -ol.Object.prototype.on = function(type, listener, opt_scope) { - return goog.events.listen(this, type, listener, false, opt_scope); -}; - - -/** - * Listen once for a certain type of event. - * @param {string|Array.} type The event type or array of event types. - * @param {function(?): ?} listener The listener function. - * @param {Object=} opt_scope Object is whose scope to call - * the listener. - * @return {goog.events.Key} Unique key for the listener. - * @todo stability experimental - */ -ol.Object.prototype.once = function(type, listener, opt_scope) { - return goog.events.listenOnce(this, type, listener, false, opt_scope); -}; - - /** * Sets a value. * @param {string} key Key name. @@ -428,30 +400,6 @@ ol.Object.prototype.unbind = function(key) { }; -/** - * Unlisten for a certain type of event. - * @param {string|Array.} type The event type or array of event types. - * @param {function(?): ?} listener The listener function. - * @param {Object=} opt_scope Object is whose scope to call - * the listener. - * @todo stability experimental - */ -ol.Object.prototype.un = function(type, listener, opt_scope) { - goog.events.unlisten(this, type, listener, false, opt_scope); -}; - - -/** - * Removes an event listener which was added with `listen()` by the key returned - * by `on()` or `once()`. - * @param {goog.events.Key} key Key. - * @todo stability experimental - */ -ol.Object.prototype.unByKey = function(key) { - goog.events.unlistenByKey(key); -}; - - /** * Removes all bindings. * @todo stability experimental diff --git a/src/ol/observable.exports b/src/ol/observable.exports new file mode 100644 index 0000000000..1d6e1ffcdf --- /dev/null +++ b/src/ol/observable.exports @@ -0,0 +1,4 @@ +@exportProperty ol.Observable.prototype.on +@exportProperty ol.Observable.prototype.once +@exportProperty ol.Observable.prototype.un +@exportProperty ol.Observable.prototype.unByKey diff --git a/src/ol/observable.js b/src/ol/observable.js new file mode 100644 index 0000000000..6becf17b47 --- /dev/null +++ b/src/ol/observable.js @@ -0,0 +1,70 @@ +goog.provide('ol.Observable'); + +goog.require('goog.events'); +goog.require('goog.events.EventTarget'); + + + +/** + * An event target providing convenient methods for listener registration + * and unregistration. + * @constructor + * @extends {goog.events.EventTarget} + * @todo stability experimental + */ +ol.Observable = function() { + goog.base(this); + +}; +goog.inherits(ol.Observable, goog.events.EventTarget); + + +/** + * Listen for a certain type of event. + * @param {string|Array.} type The event type or array of event types. + * @param {function(?): ?} listener The listener function. + * @param {Object=} opt_scope Object is whose scope to call + * the listener. + * @return {goog.events.Key} Unique key for the listener. + * @todo stability experimental + */ +ol.Observable.prototype.on = function(type, listener, opt_scope) { + return goog.events.listen(this, type, listener, false, opt_scope); +}; + + +/** + * Listen once for a certain type of event. + * @param {string|Array.} type The event type or array of event types. + * @param {function(?): ?} listener The listener function. + * @param {Object=} opt_scope Object is whose scope to call + * the listener. + * @return {goog.events.Key} Unique key for the listener. + * @todo stability experimental + */ +ol.Observable.prototype.once = function(type, listener, opt_scope) { + return goog.events.listenOnce(this, type, listener, false, opt_scope); +}; + + +/** + * Unlisten for a certain type of event. + * @param {string|Array.} type The event type or array of event types. + * @param {function(?): ?} listener The listener function. + * @param {Object=} opt_scope Object is whose scope to call + * the listener. + * @todo stability experimental + */ +ol.Observable.prototype.un = function(type, listener, opt_scope) { + goog.events.unlisten(this, type, listener, false, opt_scope); +}; + + +/** + * Removes an event listener using the key returned by `on()` or `once()`. + * @param {goog.events.Key} key Key. + * @todo stability experimental + */ +ol.Observable.prototype.unByKey = function(key) { + goog.events.unlistenByKey(key); +}; diff --git a/test/spec/ol/observable.test.js b/test/spec/ol/observable.test.js new file mode 100644 index 0000000000..7d7e93cbc9 --- /dev/null +++ b/test/spec/ol/observable.test.js @@ -0,0 +1,172 @@ +goog.provide('ol.test.Observable'); + +describe('ol.Observable', function() { + + describe('constructor', function() { + + it('creates a new observable', function() { + var observable = new ol.Observable(); + expect(observable).to.be.a(ol.Observable); + expect(observable).to.be.a(goog.events.EventTarget); + }); + + }); + + describe('#on()', function() { + var observable, listener; + beforeEach(function() { + observable = new ol.Observable(); + listener = sinon.spy(); + }); + + it('registers a listener for events of the given type', function() { + observable.on('foo', listener); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + + observable.dispatchEvent('foo'); + expect(listener.callCount).to.be(2); + }); + + it('accepts an array of event types', function() { + observable.on(['foo', 'bar'], listener); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + + observable.dispatchEvent('bar'); + expect(listener.callCount).to.be(2); + }); + + it('accepts an optional `this` arg for the listener', function() { + var thisArg = {}; + observable.on('foo', listener, thisArg); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + expect(listener.calledOn(thisArg)).to.be(true); + }); + + it('returns a listener key', function() { + var key = observable.on('foo', listener); + + expect(key).to.be.a(goog.events.Listener); + }); + + }); + + describe('#once()', function() { + var observable, listener; + beforeEach(function() { + observable = new ol.Observable(); + listener = sinon.spy(); + }); + + it('registers a listener that is only called once', function() { + observable.once('foo', listener); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + + observable.dispatchEvent('foo'); + expect(listener.callCount).to.be(1); + }); + + it('accepts an array of event types (called once for each)', function() { + observable.once(['foo', 'bar'], listener); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + + observable.dispatchEvent('foo'); + expect(listener.callCount).to.be(1); + + observable.dispatchEvent('bar'); + expect(listener.callCount).to.be(2); + + observable.dispatchEvent('bar'); + expect(listener.callCount).to.be(2); + }); + + it('accepts an optional `this` arg for the listener', function() { + var thisArg = {}; + observable.once('foo', listener, thisArg); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + expect(listener.calledOn(thisArg)).to.be(true); + }); + + it('returns a listener key', function() { + var key = observable.once('foo', listener); + + expect(key).to.be.a(goog.events.Listener); + }); + + }); + + describe('#un()', function() { + var observable, listener; + beforeEach(function() { + observable = new ol.Observable(); + listener = sinon.spy(); + }); + + it('unregisters a previously registered listener', function() { + observable.on('foo', listener); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + + observable.un('foo', listener); + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + }); + + it('accepts a `this` arg', function() { + var thisArg = {}; + observable.on('foo', listener, thisArg); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + + // will not unregister without the same thisArg + observable.un('foo', listener); + observable.dispatchEvent('foo'); + expect(listener.callCount).to.be(2); + + // properly unregister by providing the same thisArg + observable.un('foo', listener, thisArg); + observable.dispatchEvent('foo'); + expect(listener.callCount).to.be(2); + }); + + }); + + describe('#unByKey()', function() { + var observable, listener; + beforeEach(function() { + observable = new ol.Observable(); + listener = sinon.spy(); + }); + + it('unregisters a listener given the key returned by `on`', function() { + var key = observable.on('foo', listener); + + observable.dispatchEvent('foo'); + expect(listener.calledOnce).to.be(true); + + observable.unByKey(key); + observable.dispatchEvent('foo'); + expect(listener.callCount).to.be(1); + }); + + }); + +}); + + +goog.require('goog.events.EventTarget'); +goog.require('goog.events.Listener'); +goog.require('ol.Observable');