diff --git a/src/ol/expression/parser.js b/src/ol/expression/parser.js index 6762dc2f02..7edee85e1d 100644 --- a/src/ol/expression/parser.js +++ b/src/ol/expression/parser.js @@ -404,10 +404,14 @@ ol.expression.Parser.prototype.parsePrimaryExpression_ = function(lexer) { if (type === ol.expression.TokenType.IDENTIFIER) { expr = this.createIdentifier_(/** @type {string} */ (token.value)); } else if (type === ol.expression.TokenType.STRING_LITERAL || - type === ol.expression.TokenType.NUMERIC_LITERAL || - type === ol.expression.TokenType.BOOLEAN_LITERAL || - type === ol.expression.TokenType.NULL_LITERAL) { + type === ol.expression.TokenType.NUMERIC_LITERAL) { + // numeric and string literals are already the correct type expr = this.createLiteral_(token.value); + } else if (type === ol.expression.TokenType.BOOLEAN_LITERAL) { + // because booleans are valid member properties, tokens are still string + expr = this.createLiteral_(token.value === 'true'); + } else if (type === ol.expression.TokenType.NULL_LITERAL) { + expr = this.createLiteral_(null); } else { throw new Error('Unexpected token: ' + token.value); } diff --git a/test/spec/ol/expression/parser.test.js b/test/spec/ol/expression/parser.test.js index d423d1b75c..4d7e478b5e 100644 --- a/test/spec/ol/expression/parser.test.js +++ b/test/spec/ol/expression/parser.test.js @@ -1,4 +1,4 @@ -goog.provide('ol.test.expression'); +goog.provide('ol.test.expression.Parser'); describe('ol.expression.Parser', function() { @@ -19,13 +19,47 @@ describe('ol.expression.Parser', function() { it('parses grouped expressions', function() { var expr = parse('(3 * (foo + 2))'); - expect(expr).to.be.a(ol.expression.Expression); expect(expr).to.be.a(ol.expression.Math); expect(expr.evaluate({foo: 3})).to.be(15); }); }); + describe('#parsePrimaryExpression_()', function() { + + function parse(source) { + var lexer = new ol.expression.Lexer(source); + var parser = new ol.expression.Parser(); + return parser.parsePrimaryExpression_(lexer); + } + + it('parses string literal', function() { + var expr = parse('"foo"'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be('foo'); + }); + + it('parses numeric literal', function() { + var expr = parse('.42e2'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be(42); + }); + + it('parses boolean literal', function() { + var expr = parse('.42e2'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be(42); + }); + + it('parses null literal', function() { + var expr = parse('null'); + expect(expr).to.be.a(ol.expression.Literal); + expect(expr.evaluate({})).to.be(null); + }); + + }); + + });