diff options
Diffstat (limited to 'js/baba-yaga/tests/arrow_functions.test.js')
-rw-r--r-- | js/baba-yaga/tests/arrow_functions.test.js | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/js/baba-yaga/tests/arrow_functions.test.js b/js/baba-yaga/tests/arrow_functions.test.js new file mode 100644 index 0000000..d6a8aee --- /dev/null +++ b/js/baba-yaga/tests/arrow_functions.test.js @@ -0,0 +1,99 @@ +const assert = require('assert'); +const { createLexer } = require('../src/core/lexer'); +const { createParser } = require('../src/core/parser'); +const { createInterpreter } = require('../src/core/interpreter'); + +describe('Arrow Functions in Table Literals', () => { + function interpret(code) { + const lexer = createLexer(code); + const tokens = lexer.allTokens(); + const parser = createParser(tokens); + const ast = parser.parse(); + const interpreter = createInterpreter(ast); + return interpreter.interpret(); + } + + it('should correctly parse and execute single arrow function in table', () => { + const code = `calculator : { + add: x y -> x + y; +}; +result : calculator.add 5 3; +result`; + + const result = interpret(code); + assert.strictEqual(result.value, 8); + assert.strictEqual(result.isFloat, false); + }); + + it('should correctly handle arrow function with single parameter', () => { + const code = `calculator : { + double: x -> x * 2; +}; +result : calculator.double 5; +result`; + + const result = interpret(code); + assert.strictEqual(result.value, 10); + assert.strictEqual(result.isFloat, false); + }); + + it('should correctly handle arrow function with complex body', () => { + const code = `calculator : { + complex: x y -> (x + y) * (x - y); +}; +result : calculator.complex 5 3; +result`; + + const result = interpret(code); + assert.strictEqual(result.value, 16); + assert.strictEqual(result.isFloat, false); + }); + + it('should correctly handle arrow function with parentheses for precedence', () => { + const code = `calculator : { + multiply: x y -> x * (y + 1); +}; +result : calculator.multiply 3 2; +result`; + + const result = interpret(code); + assert.strictEqual(result.value, 9); + assert.strictEqual(result.isFloat, false); + }); + + it('should correctly handle multiple arrow functions in table', () => { + const code = `calculator : { + add: x y -> x + y; + subtract: x y -> x - y; + multiply: x y -> x * (y + 1); + complex: x y -> (x + y) * (x - y); +}; +result1 : calculator.add 5 3; +result2 : calculator.subtract 10 4; +result3 : calculator.multiply 3 2; +result4 : calculator.complex 5 3; +result1`; + + const result = interpret(code); + assert.strictEqual(result.value, 8); + assert.strictEqual(result.isFloat, false); + }); + + it('should correctly handle arrow functions with different parameter counts', () => { + const code = `calculator : { + add: x y -> x + y; + double: x -> x * 2; + identity: x -> x; + constant: -> 42; +}; +result1 : calculator.add 5 3; +result2 : calculator.double 7; +result3 : calculator.identity 99; +result4 : calculator.constant; +result1`; + + const result = interpret(code); + assert.strictEqual(result.value, 8); + assert.strictEqual(result.isFloat, false); + }); +}); \ No newline at end of file |