feat(parser): change Parser to return null when one of the operands is null
This commit is contained in:
parent
a7fe25d93f
commit
c41f59c794
|
@ -86,19 +86,7 @@ export class Binary extends AST {
|
|||
var right = this.right.eval(context, formatters);
|
||||
|
||||
// Null check for the operations.
|
||||
if (left == null || right == null) {
|
||||
switch (this.operation) {
|
||||
case '+':
|
||||
if (left != null) return left;
|
||||
if (right != null) return right;
|
||||
return 0;
|
||||
case '-':
|
||||
if (left != null) return left;
|
||||
if (right != null) return 0 - right;
|
||||
return 0;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
if (left == null || right == null) return null;
|
||||
|
||||
switch (this.operation) {
|
||||
case '+' : return autoConvertAdd(left, right);
|
||||
|
|
|
@ -18,6 +18,10 @@ export function main() {
|
|||
var context = td();
|
||||
var formatters;
|
||||
|
||||
function createParser() {
|
||||
return new Parser(new Lexer(), new ClosureMap());
|
||||
}
|
||||
|
||||
function _eval(text) {
|
||||
return new Parser(new Lexer(), new ClosureMap()).parse(text)
|
||||
.eval(context, formatters);
|
||||
|
@ -36,7 +40,7 @@ export function main() {
|
|||
var parser;
|
||||
|
||||
beforeEach(() => {
|
||||
parser = new Parser(new Lexer(), new ClosureMap());
|
||||
parser = createParser();
|
||||
});
|
||||
|
||||
it("should parse field access",() => {
|
||||
|
@ -119,6 +123,22 @@ export function main() {
|
|||
expectEval("4 + 4 + ' str'").toEqual("8 str");
|
||||
expectEval("'str ' + 4 + 4").toEqual("str 44");
|
||||
});
|
||||
|
||||
it('should behave gracefully with a null scope', () => {
|
||||
var exp = createParser().parse("null");
|
||||
expect(exp.eval(null, null)).toEqual(null);
|
||||
});
|
||||
|
||||
it('should eval binary operators with null as null', () => {
|
||||
expectEval("null < 0").toBeNull();
|
||||
expectEval("null * 3").toBeNull();
|
||||
expectEval("null + 6").toBeNull();
|
||||
expectEval("5 + null").toBeNull();
|
||||
expectEval("null - 4").toBeNull();
|
||||
expectEval("3 - null").toBeNull();
|
||||
expectEval("null + null").toBeNull();
|
||||
expectEval("null - null").toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("error handling", () => {
|
||||
|
|
Loading…
Reference in New Issue