From cb9725bdfb01dd49137000e86f0ecc9f03cec6c5 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Mon, 10 Jun 2013 17:31:06 -0600 Subject: [PATCH] Provide static method to check for valid operators --- src/ol/expression/expression.js | 48 ++++++++++++++++++++++ src/ol/expression/parser.js | 6 +-- test/spec/ol/expression/expression.test.js | 48 ++++++++++++++++++++++ 3 files changed, 99 insertions(+), 3 deletions(-) diff --git a/src/ol/expression/expression.js b/src/ol/expression/expression.js index 0215fc60ee..5ed75c7556 100644 --- a/src/ol/expression/expression.js +++ b/src/ol/expression/expression.js @@ -136,6 +136,22 @@ ol.expression.Comparison = function(operator, left, right) { goog.inherits(ol.expression.Comparison, ol.expression.Expression); +/** + * Determine if a given string is a valid comparison operator. + * @param {string} candidate Operator to test. + * @return {boolean} The operator is valid. + */ +ol.expression.Comparison.isValidOp = (function() { + var valid = {}; + for (var key in ol.expression.ComparisonOp) { + valid[ol.expression.ComparisonOp[key]] = true; + } + return function isValidOp(candidate) { + return !!valid[candidate]; + }; +}()); + + /** * @inheritDoc */ @@ -276,6 +292,22 @@ ol.expression.Logical = function(operator, left, right) { goog.inherits(ol.expression.Logical, ol.expression.Expression); +/** + * Determine if a given string is a valid logical operator. + * @param {string} candidate Operator to test. + * @return {boolean} The operator is valid. + */ +ol.expression.Logical.isValidOp = (function() { + var valid = {}; + for (var key in ol.expression.LogicalOp) { + valid[ol.expression.LogicalOp[key]] = true; + } + return function isValidOp(candidate) { + return !!valid[candidate]; + }; +}()); + + /** * @inheritDoc */ @@ -341,6 +373,22 @@ ol.expression.Math = function(operator, left, right) { goog.inherits(ol.expression.Math, ol.expression.Expression); +/** + * Determine if a given string is a valid math operator. + * @param {string} candidate Operator to test. + * @return {boolean} The operator is valid. + */ +ol.expression.Math.isValidOp = (function() { + var valid = {}; + for (var key in ol.expression.MathOp) { + valid[ol.expression.MathOp[key]] = true; + } + return function isValidOp(candidate) { + return !!valid[candidate]; + }; +}()); + + /** * @inheritDoc */ diff --git a/src/ol/expression/parser.js b/src/ol/expression/parser.js index 7c81b52536..02b58bed5a 100644 --- a/src/ol/expression/parser.js +++ b/src/ol/expression/parser.js @@ -126,15 +126,15 @@ ol.expression.Parser.prototype.binaryPrecedence_ = function(token) { ol.expression.Parser.prototype.createBinaryExpression_ = function(operator, left, right) { var expr; - if (ol.expression.ComparisonOp.hasOwnProperty(operator)) { + if (ol.expression.Comparison.isValidOp(operator)) { expr = new ol.expression.Comparison( /** @type {ol.expression.ComparisonOp.} */ (operator), left, right); - } else if (ol.expression.LogicalOp.hasOwnProperty(operator)) { + } else if (ol.expression.Logical.isValidOp(operator)) { expr = new ol.expression.Logical( /** @type {ol.expression.LogicalOp.} */ (operator), left, right); - } else if (ol.expression.MathOp.hasOwnProperty(operator)) { + } else if (ol.expression.Math.isValidOp(operator)) { expr = new ol.expression.Math( /** @type {ol.expression.MathOp.} */ (operator), left, right); diff --git a/test/spec/ol/expression/expression.test.js b/test/spec/ol/expression/expression.test.js index e0d21b3349..0484895525 100644 --- a/test/spec/ol/expression/expression.test.js +++ b/test/spec/ol/expression/expression.test.js @@ -177,6 +177,24 @@ describe('ol.expression.Comparison', function() { }); }); + describe('#isValidOp()', function() { + it('determines if a string is a valid operator', function() { + expect(ol.expression.Comparison.isValidOp('<')).to.be(true); + expect(ol.expression.Comparison.isValidOp('<')).to.be(true); + expect(ol.expression.Comparison.isValidOp('<=')).to.be(true); + expect(ol.expression.Comparison.isValidOp('<=')).to.be(true); + expect(ol.expression.Comparison.isValidOp('==')).to.be(true); + expect(ol.expression.Comparison.isValidOp('!=')).to.be(true); + expect(ol.expression.Comparison.isValidOp('===')).to.be(true); + expect(ol.expression.Comparison.isValidOp('!==')).to.be(true); + + expect(ol.expression.Comparison.isValidOp('')).to.be(false); + expect(ol.expression.Comparison.isValidOp('+')).to.be(false); + expect(ol.expression.Comparison.isValidOp('-')).to.be(false); + expect(ol.expression.Comparison.isValidOp('&&')).to.be(false); + }); + }); + }); describe('ol.expression.Identifier', function() { @@ -292,6 +310,18 @@ describe('ol.expression.Logical', function() { }); }); + describe('#isValidOp()', function() { + it('determines if a string is a valid operator', function() { + expect(ol.expression.Logical.isValidOp('||')).to.be(true); + expect(ol.expression.Logical.isValidOp('&&')).to.be(true); + + expect(ol.expression.Logical.isValidOp('')).to.be(false); + expect(ol.expression.Logical.isValidOp('+')).to.be(false); + expect(ol.expression.Logical.isValidOp('<')).to.be(false); + expect(ol.expression.Logical.isValidOp('|')).to.be(false); + }); + }); + }); describe('ol.expression.Math', function() { @@ -390,6 +420,24 @@ describe('ol.expression.Math', function() { }); }); + describe('#isValidOp()', function() { + it('determines if a string is a valid operator', function() { + expect(ol.expression.Math.isValidOp('+')).to.be(true); + expect(ol.expression.Math.isValidOp('-')).to.be(true); + expect(ol.expression.Math.isValidOp('*')).to.be(true); + expect(ol.expression.Math.isValidOp('/')).to.be(true); + expect(ol.expression.Math.isValidOp('%')).to.be(true); + + expect(ol.expression.Math.isValidOp('')).to.be(false); + expect(ol.expression.Math.isValidOp('|')).to.be(false); + expect(ol.expression.Math.isValidOp('&')).to.be(false); + expect(ol.expression.Math.isValidOp('<')).to.be(false); + expect(ol.expression.Math.isValidOp('||')).to.be(false); + expect(ol.expression.Math.isValidOp('.')).to.be(false); + }); + }); + + }); describe('ol.expression.Member', function() {