From 13d0b8b084a53f4174ec855b6152475ed8dff532 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Tue, 11 Jun 2013 11:09:23 -0600 Subject: [PATCH] Provide ol.expression.parse method This is the only method needed in the API. --- src/ol/expression/expression.js | 15 +++++ src/ol/expression/parser.js | 12 ---- test/spec/ol/expression/expression.test.js | 70 ++++++++++++++++++++++ 3 files changed, 85 insertions(+), 12 deletions(-) create mode 100644 src/ol/expression/expression.js create mode 100644 test/spec/ol/expression/expression.test.js diff --git a/src/ol/expression/expression.js b/src/ol/expression/expression.js new file mode 100644 index 0000000000..dd2cc27e2b --- /dev/null +++ b/src/ol/expression/expression.js @@ -0,0 +1,15 @@ +goog.provide('ol.expression'); + +goog.require('ol.expression.Parser'); + + +/** + * Parse an expression + * @param {string} source The expression source (e.g. `'foo + 2'`). + * @return {ol.expression.Expression} An expression instance that can be + * evaluated within some scope to provide a value. + */ +ol.expression.parse = function(source) { + var parser = new ol.expression.Parser(); + return parser.parse(source); +}; diff --git a/src/ol/expression/parser.js b/src/ol/expression/parser.js index 7edee85e1d..0ec2808797 100644 --- a/src/ol/expression/parser.js +++ b/src/ol/expression/parser.js @@ -453,15 +453,3 @@ ol.expression.Parser.prototype.parseUnaryExpression_ = function(lexer) { ol.expression.Parser.prototype.parseExpression_ = function(lexer) { return this.parseBinaryExpression_(lexer); }; - - -/** - * Parse an expression - * @param {string} source The expression source (e.g. `'foo + 2'`). - * @return {ol.expression.Expression} An expression instance that can be - * evaluated within some scope to provide a value. - */ -ol.expression.parse = function(source) { - var parser = new ol.expression.Parser(); - return parser.parse(source); -}; diff --git a/test/spec/ol/expression/expression.test.js b/test/spec/ol/expression/expression.test.js new file mode 100644 index 0000000000..8f5f5cc212 --- /dev/null +++ b/test/spec/ol/expression/expression.test.js @@ -0,0 +1,70 @@ +goog.provide('ol.test.expression'); + + +describe('ol.expression.parse', function() { + + it('parses a string and returns an expression', function() { + var expr = ol.expression.parse('foo'); + expect(expr).to.be.a(ol.expression.Expression); + }); + + describe('primary expressions', function() { + // http://www.ecma-international.org/ecma-262/5.1/#sec-11.1 + + it('parses identifier expressions', function() { + var expr = ol.expression.parse('foo'); + expect(expr).to.be.a(ol.expression.Identifier); + expect(expr.evaluate({foo: 'bar'})).to.be('bar'); + }); + + it('throws on invalid identifier expressions', function() { + expect(function() { + ol.expression.parse('3foo'); + }).throwException(); + }); + + it('parses string literal expressions', function() { + var expr = ol.expression.parse('"foo"'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be('foo'); + }); + + it('throws on unterminated string', function() { + expect(function() { + ol.expression.parse('"foo'); + }).throwException(); + }); + + it('parses numeric literal expressions', function() { + var expr = ol.expression.parse('.42e+2'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be(42); + }); + + it('throws on invalid number', function() { + expect(function() { + ol.expression.parse('.42eX'); + }).throwException(); + }); + + it('parses boolean literal expressions', function() { + var expr = ol.expression.parse('false'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be(false); + }); + + it('parses null literal expressions', function() { + var expr = ol.expression.parse('null'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be(null); + }); + + }); + +}); + + +goog.require('ol.expression'); +goog.require('ol.expression.Expression'); +goog.require('ol.expression.Identifier'); +goog.require('ol.expression.Literal');