var expression = require('../../src/app/expression'); var parser = expression.parser; describe("expression parser", function() { var shouldParse = ['0x2>>1', '1 2 3', '0x1 1 2 3 5', '0x1>>0x2', '1|2', '-9', '-1|-2', '~3']; it("should be able to parse", function() { shouldParse.forEach(function(expr) { expect(parser.canParse(expr)).toBe(true, 'expr: ' + expr); }) }); var expressionCases = { "0x2>>1": { operand1: 2, operand2:1, "sign":">>", string:"0x2>>1" }, "123|111": { operand1: 123, operand2:111, "sign":"|", string: "123|111" }, "23^0x1": { operand1: 23, operand2:1, "sign":"^", string: "23^0x1" }, "0xf>>0xa": { operand1: 15, operand2:10, "sign":">>", string:"0xf>>0xa" }, "0x10&0x11": { operand1: 0x10, operand2:0x11, "sign":"&", string:"0x10&0x11" }, "0x1a^11": { operand1: 0x1a, operand2:11, "sign":"^", string:"0x1a^11" }, "0x1a>>>11": { operand1: 0x1a, operand2:11, "sign":">>>", string:"0x1a>>>11" }, '~3': { operand1: 3, operand2: null, "sign":"~", string:"~3" }, '~0xa': { operand1: 0xa, operand2: null, "sign":"~", string:"~0xa" }, '~-0xa': { operand1: -0xa, operand2: null, "sign":"~", string:"~-0xa" } }; // TODO: update to support multiple expressions xit("should parse expressions", function() { for(input in expressionCases) { console.log('case: ' + input); var actual = parser.parse(input); var expected = expressionCases[input]; expect(actual).toBeDefined(); expect(actual).not.toBe(null); expect(actual.sign).toBe(expected.sign); expect(actual.operand1.value).toBe(expected.operand1); if(expected.operand2 != null) { expect(actual.operand2.value).toBe(expected.operand2); } else { expect(actual.operand2).not.toBeDefined(); } expect(actual.expressionString).toBe(expected.string); console.log(actual.toString()); } }); var listCases = { '-0xa -9' : [-10, -9], '1 2 3': [1, 2, 3], '0x1 2 0xa6b': [0x1, 2, 0xa6b], '0x11a': [0x11a] }; it("should parse hexadecimal expressions", function() { var input, i; for(input in listCases) { var actual = parser.parse(input); var expected = listCases[input]; for(i =0; i