about summary refs log tree commit diff stats
path: root/js/baba-yaga/tests/arrow_functions.test.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/baba-yaga/tests/arrow_functions.test.js')
-rw-r--r--js/baba-yaga/tests/arrow_functions.test.js99
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