From c81057780ae49e21c2c63d7ec23346b43d37c7b9 Mon Sep 17 00:00:00 2001 From: Tim Schaub Date: Sun, 23 Jun 2013 17:11:57 -0600 Subject: [PATCH] More tests for binary operators --- src/ol/expr/parser.js | 9 ++--- test/spec/ol/expr/expression.test.js | 52 ++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/src/ol/expr/parser.js b/src/ol/expr/parser.js index 042a5fc82f..f11cdd5603 100644 --- a/src/ol/expr/parser.js +++ b/src/ol/expr/parser.js @@ -310,8 +310,7 @@ ol.expr.Parser.prototype.parseBinaryExpression_ = function(lexer) { var right = this.parseUnaryExpression_(lexer); var stack = [left, operator, right]; - operator = lexer.peek(); - precedence = this.binaryPrecedence_(operator); + precedence = this.binaryPrecedence_(lexer.peek()); while (precedence > 0) { // TODO: cache operator precedence in stack while (stack.length > 2 && @@ -321,11 +320,9 @@ ol.expr.Parser.prototype.parseBinaryExpression_ = function(lexer) { left = stack.pop(); stack.push(this.createBinaryExpression_(operator.value, left, right)); } - lexer.skip(); - operator = lexer.peek(); - precedence = this.binaryPrecedence_(operator); - stack.push(operator); + stack.push(lexer.next()); stack.push(this.parseUnaryExpression_(lexer)); + precedence = this.binaryPrecedence_(lexer.peek()); } var i = stack.length - 1; diff --git a/test/spec/ol/expr/expression.test.js b/test/spec/ol/expr/expression.test.js index 2fe1b11723..3746bd9e55 100644 --- a/test/spec/ol/expr/expression.test.js +++ b/test/spec/ol/expr/expression.test.js @@ -225,6 +225,32 @@ describe('ol.expr.parse()', function() { expect(expr.evaluate({bar: 3})).to.be(1); }); + it('parses * in call argument', function() { + var lib = { + foo: function(arg) { + return arg; + } + }; + var expr = ol.expr.parse('foo(2 * bar)'); + expect(expr).to.be.a(ol.expr.Call); + expect(expr.evaluate({bar: 3}, lib)).to.be(6); + expect(expr.evaluate({bar: 4}, lib)).to.be(8); + }); + + it('parses * in left side of comparison expression', function() { + var expr = ol.expr.parse('foo * 2 >bar'); + expect(expr).to.be.a(ol.expr.Comparison); + expect(expr.evaluate({foo: 4, bar: 7})).to.be(true); + expect(expr.evaluate({foo: 4, bar: 8})).to.be(false); + }); + + it('parses * in right side of comparison expression', function() { + var expr = ol.expr.parse('foo > 2 * bar'); + expect(expr).to.be.a(ol.expr.Comparison); + expect(expr.evaluate({foo: 4, bar: 1})).to.be(true); + expect(expr.evaluate({foo: 4, bar: 2})).to.be(false); + }); + }); describe('11.6 - additive operators', function() { @@ -254,6 +280,32 @@ describe('ol.expr.parse()', function() { expect(expr.evaluate({foo: 15})).to.be(5); }); + it('parses + in call argument', function() { + var lib = { + foo: function(arg) { + return arg; + } + }; + var expr = ol.expr.parse('foo(2 + bar)'); + expect(expr).to.be.a(ol.expr.Call); + expect(expr.evaluate({bar: 3}, lib)).to.be(5); + expect(expr.evaluate({bar: 4}, lib)).to.be(6); + }); + + it('parses + in left side of comparison expression', function() { + var expr = ol.expr.parse('foo+2>bar'); + expect(expr).to.be.a(ol.expr.Comparison); + expect(expr.evaluate({foo: 4, bar: 5})).to.be(true); + expect(expr.evaluate({foo: 4, bar: 6})).to.be(false); + }); + + it('parses + in right side of comparison expression', function() { + var expr = ol.expr.parse('foo >2 +bar'); + expect(expr).to.be.a(ol.expr.Comparison); + expect(expr.evaluate({foo: 4, bar: 1})).to.be(true); + expect(expr.evaluate({foo: 4, bar: 2})).to.be(false); + }); + }); describe('11.7 - bitwise shift operators', function() {