···11// Test 1: Basic arrow function with two parameters and expression body
22let add = (a, b) => a + b;
33let result1 = add(5, 3);
44-Ant.println("Test 1 - add(5, 3):", result1); // Should be 8
44+console.log("Test 1 - add(5, 3):", result1); // Should be 8
5566// Test 2: Arrow function with single parameter (no parentheses)
77let double = x => x * 2;
88let result2 = double(7);
99-Ant.println("Test 2 - double(7):", result2); // Should be 14
99+console.log("Test 2 - double(7):", result2); // Should be 14
10101111// Test 3: Arrow function with block body
1212let multiply = (a, b) => {
···1414 return result;
1515};
1616let result3 = multiply(4, 6);
1717-Ant.println("Test 3 - multiply(4, 6):", result3); // Should be 24
1717+console.log("Test 3 - multiply(4, 6):", result3); // Should be 24
18181919// Test 4: Arrow function with no parameters
2020let getFortyTwo = () => 42;
2121let result4 = getFortyTwo();
2222-Ant.println("Test 4 - getFortyTwo():", result4); // Should be 42
2222+console.log("Test 4 - getFortyTwo():", result4); // Should be 42
23232424// Test 5: Arrow function with single expression
2525let square = x => x * x;
2626let result5 = square(5);
2727-Ant.println("Test 5 - square(5):", result5); // Should be 25
2727+console.log("Test 5 - square(5):", result5); // Should be 25
28282929// Test 6: Nested arrow functions (currying)
3030let makeAdder = x => y => x + y;
3131let add5 = makeAdder(5);
3232let result6 = add5(3);
3333-Ant.println("Test 6 - makeAdder(5)(3):", result6); // Should be 8
3333+console.log("Test 6 - makeAdder(5)(3):", result6); // Should be 8
34343535// Test 7: Arrow function with multiple statements in block
3636let complexCalc = (a, b) => {
···4040 return result;
4141};
4242let result7 = complexCalc(3, 4);
4343-Ant.println("Test 7 - complexCalc(3, 4):", result7); // Should be 19 (7 + 12)
4343+console.log("Test 7 - complexCalc(3, 4):", result7); // Should be 19 (7 + 12)
44444545// Test 8: Arrow function with conditional
4646let max = (a, b) => {
···5151 }
5252};
5353let result8 = max(10, 15);
5454-Ant.println("Test 8 - max(10, 15):", result8); // Should be 15
5454+console.log("Test 8 - max(10, 15):", result8); // Should be 15
55555656// Test 9: Arrow function with string concatenation
5757let greet = name => "Hello, " + name;
5858let result9 = greet("World");
5959-Ant.println("Test 9 - greet('World'):", result9); // Should be "Hello, World"
5959+console.log("Test 9 - greet('World'):", result9); // Should be "Hello, World"
60606161// Test 10: Arrow function with comparison
6262let isPositive = x => x > 0;
6363let result10a = isPositive(5);
6464-Ant.println("Test 10a - isPositive(5):", result10a); // Should be true
6464+console.log("Test 10a - isPositive(5):", result10a); // Should be true
6565let result10b = isPositive(-3);
6666-Ant.println("Test 10b - isPositive(-3):", result10b); // Should be false
6666+console.log("Test 10b - isPositive(-3):", result10b); // Should be false
67676868// Test 11: Arrow function in array
6969let funcs = [];
7070funcs[0] = x => x + 1;
7171funcs[1] = x => x * 2;
7272let result11a = funcs[0](10);
7373-Ant.println("Test 11a - funcs[0](10):", result11a); // Should be 11
7373+console.log("Test 11a - funcs[0](10):", result11a); // Should be 11
7474let result11b = funcs[1](10);
7575-Ant.println("Test 11b - funcs[1](10):", result11b); // Should be 20
7575+console.log("Test 11b - funcs[1](10):", result11b); // Should be 20
76767777// Test 12: Arrow function with three parameters
7878let sum3 = (a, b, c) => a + b + c;
7979let result12 = sum3(1, 2, 3);
8080-Ant.println("Test 12 - sum3(1, 2, 3):", result12); // Should be 6
8080+console.log("Test 12 - sum3(1, 2, 3):", result12); // Should be 6
81818282// Test 13: Arrow function assigned to object property
8383let calculator = {};
8484calculator.add = (a, b) => a + b;
8585calculator.subtract = (a, b) => a - b;
8686let result13a = calculator.add(10, 5);
8787-Ant.println("Test 13a - calculator.add(10, 5):", result13a); // Should be 15
8787+console.log("Test 13a - calculator.add(10, 5):", result13a); // Should be 15
8888let result13b = calculator.subtract(10, 5);
8989-Ant.println("Test 13b - calculator.subtract(10, 5):", result13b); // Should be 5
8989+console.log("Test 13b - calculator.subtract(10, 5):", result13b); // Should be 5
90909191// Test 14: Arrow function returning early
9292let checkValue = x => {
···9999 return "positive";
100100};
101101let result14a = checkValue(-5);
102102-Ant.println("Test 14a - checkValue(-5):", result14a); // Should be "negative"
102102+console.log("Test 14a - checkValue(-5):", result14a); // Should be "negative"
103103let result14b = checkValue(0);
104104-Ant.println("Test 14b - checkValue(0):", result14b); // Should be "zero"
104104+console.log("Test 14b - checkValue(0):", result14b); // Should be "zero"
105105let result14c = checkValue(5);
106106-Ant.println("Test 14c - checkValue(5):", result14c); // Should be "positive"
106106+console.log("Test 14c - checkValue(5):", result14c); // Should be "positive"
107107108108// Test 15: Arrow function with implicit undefined return
109109let noReturn = x => {
110110 let temp = x + 1;
111111};
112112let result15 = noReturn(5);
113113-Ant.println("Test 15 - noReturn(5):", result15); // Should be undefined
113113+console.log("Test 15 - noReturn(5):", result15); // Should be undefined
114114115115-Ant.println("\nAll arrow function tests completed!");
115115+console.log("\nAll arrow function tests completed!");
+29-29
tests/class.cjs
···11// Test class keyword
2233-Ant.println("=== Testing class keyword ===");
33+console.log("=== Testing class keyword ===");
4455// Test 1: Simple class with constructor
66class Person {
···1111}
12121313let person1 = new Person("Alice", 30);
1414-Ant.println(person1.name); // "Alice"
1515-Ant.println(person1.age); // 30
1414+console.log(person1.name); // "Alice"
1515+console.log(person1.age); // 30
16161717// Test 2: Class with methods
1818class Calculator {
···3636}
37373838let calc = new Calculator(10);
3939-Ant.println(calc.value); // 10
4040-Ant.println(calc.add(5)); // 15
4141-Ant.println(calc.subtract(3)); // 12
4242-Ant.println(calc.getValue()); // 12
3939+console.log(calc.value); // 10
4040+console.log(calc.add(5)); // 15
4141+console.log(calc.subtract(3)); // 12
4242+console.log(calc.getValue()); // 12
43434444// Test 3: Class without explicit constructor
4545class Point {
···55555656let p = new Point();
5757p.setCoords(3, 4);
5858-Ant.println(p.x); // 3
5959-Ant.println(p.y); // 4
6060-Ant.println(p.getDistance()); // 25
5858+console.log(p.x); // 3
5959+console.log(p.y); // 4
6060+console.log(p.getDistance()); // 25
61616262// Test 4: Multiple instances
6363class Counter {
···73737474let counter1 = new Counter(0);
7575let counter2 = new Counter(10);
7676-Ant.println(counter1.increment()); // 1
7777-Ant.println(counter1.increment()); // 2
7878-Ant.println(counter2.increment()); // 11
7979-Ant.println(counter2.increment()); // 12
7676+console.log(counter1.increment()); // 1
7777+console.log(counter1.increment()); // 2
7878+console.log(counter2.increment()); // 11
7979+console.log(counter2.increment()); // 12
80808181// Test 5: Class instances are objects
8282let person2 = new Person("Bob", 25);
8383-Ant.println(typeof person2); // object
8484-Ant.println(person2 instanceof Object); // true
8383+console.log(typeof person2); // object
8484+console.log(person2 instanceof Object); // true
85858686// Test 6: Modify instance properties
8787class Rectangle {
···9696}
97979898let rect = new Rectangle(5, 10);
9999-Ant.println(rect.area()); // 50
9999+console.log(rect.area()); // 50
100100rect.width = 8;
101101-Ant.println(rect.area()); // 80
101101+console.log(rect.area()); // 80
102102103103// Test 7: Delete class instance properties
104104let person3 = new Person("Charlie", 35);
105105-Ant.println(person3.name); // "Charlie"
105105+console.log(person3.name); // "Charlie"
106106delete person3.name;
107107-Ant.println(person3.name); // undefined
108108-Ant.println(person3.age); // 35
107107+console.log(person3.name); // undefined
108108+console.log(person3.age); // 35
109109110110// Test 8: Class with property management
111111class Store {
···128128}
129129130130let store = new Store();
131131-Ant.println(store.getItemCount()); // 0
131131+console.log(store.getItemCount()); // 0
132132store.addItem("apple", 5);
133133store.addItem("banana", 3);
134134-Ant.println(store.getItemCount()); // 2
134134+console.log(store.getItemCount()); // 2
135135store.removeItem("apple");
136136-Ant.println(store.getItemCount()); // 1
136136+console.log(store.getItemCount()); // 1
137137138138// Test 9: Method chaining
139139class ChainableCounter {
···158158159159let chain = new ChainableCounter(5);
160160let result = chain.add(3).multiply(2).get();
161161-Ant.println(result); // 16
161161+console.log(result); // 16
162162163163// Test 10: Class with boolean properties
164164class Feature {
···181181}
182182183183let feature = new Feature("DarkMode");
184184-Ant.println(feature.isEnabled()); // false
184184+console.log(feature.isEnabled()); // false
185185feature.enable();
186186-Ant.println(feature.isEnabled()); // true
186186+console.log(feature.isEnabled()); // true
187187feature.disable();
188188-Ant.println(feature.isEnabled()); // false
188188+console.log(feature.isEnabled()); // false
189189190190-Ant.println("=== Class tests completed ===");
190190+console.log("=== Class tests completed ===");
···11// Test for loop functionality
2233-Ant.println("=== For Loop Tests ===\n");
33+console.log("=== For Loop Tests ===\n");
4455// Test 1: Basic for loop
66-Ant.println("Test 1: Basic for loop");
66+console.log("Test 1: Basic for loop");
77let sum1 = 0;
88for (let i = 0; i < 5; i = i + 1) {
99 sum1 = sum1 + i;
1010}
1111-Ant.println(" Sum of 0-4:", sum1);
1111+console.log(" Sum of 0-4:", sum1);
12121313// Test 2: For loop with const inside
1414-Ant.println("\nTest 2: For loop with const declaration");
1414+console.log("\nTest 2: For loop with const declaration");
1515let sum2 = 0;
1616for (let i = 0; i < 3; i = i + 1) {
1717 const doubled = i * 2;
1818 sum2 = sum2 + doubled;
1919- Ant.println(" i:", i, "doubled:", doubled);
1919+ console.log(" i:", i, "doubled:", doubled);
2020}
2121-Ant.println(" Total sum:", sum2);
2121+console.log(" Total sum:", sum2);
22222323// Test 3: Nested for loops
2424-Ant.println("\nTest 3: Nested for loops");
2424+console.log("\nTest 3: Nested for loops");
2525let product = 1;
2626for (let i = 1; i <= 3; i = i + 1) {
2727 for (let j = 1; j <= 2; j = j + 1) {
2828 product = product * (i + j);
2929- Ant.println(" i:", i, "j:", j, "product:", product);
2929+ console.log(" i:", i, "j:", j, "product:", product);
3030 }
3131}
3232-Ant.println(" Final product:", product);
3232+console.log(" Final product:", product);
33333434// Test 4: Return from for loop in function
3535-Ant.println("\nTest 4: Return from for loop");
3535+console.log("\nTest 4: Return from for loop");
3636function findFirst(arr, target) {
3737 for (let i = 0; i < arr.length; i = i + 1) {
3838 if (arr[i] === target) {
···4343}
44444545const numbers = [10, 20, 30, 40, 50];
4646-Ant.println(" Array:", numbers);
4747-Ant.println(" Index of 30:", findFirst(numbers, 30));
4848-Ant.println(" Index of 99:", findFirst(numbers, 99));
4646+console.log(" Array:", numbers);
4747+console.log(" Index of 30:", findFirst(numbers, 30));
4848+console.log(" Index of 99:", findFirst(numbers, 99));
49495050// Test 5: Break in for loop
5151-Ant.println("\nTest 5: Break in for loop");
5151+console.log("\nTest 5: Break in for loop");
5252let breakSum = 0;
5353for (let i = 0; i < 10; i = i + 1) {
5454 if (i === 5) {
5555- Ant.println(" Breaking at i =", i);
5555+ console.log(" Breaking at i =", i);
5656 break;
5757 }
5858 breakSum = breakSum + i;
5959}
6060-Ant.println(" Sum before break:", breakSum);
6060+console.log(" Sum before break:", breakSum);
61616262// Test 6: Continue in for loop
6363-Ant.println("\nTest 6: Continue in for loop");
6363+console.log("\nTest 6: Continue in for loop");
6464let evenSum = 0;
6565for (let i = 0; i < 10; i = i + 1) {
6666 if (i % 2 === 1) {
···6868 }
6969 evenSum = evenSum + i;
7070}
7171-Ant.println(" Sum of even numbers 0-9:", evenSum);
7171+console.log(" Sum of even numbers 0-9:", evenSum);
72727373// Test 7: For loop with empty initialization
7474-Ant.println("\nTest 7: For loop with external initialization");
7474+console.log("\nTest 7: For loop with external initialization");
7575let k = 0;
7676let count = 0;
7777for (; k < 5; k = k + 1) {
7878 count = count + 1;
7979}
8080-Ant.println(" Count:", count, "k:", k);
8080+console.log(" Count:", count, "k:", k);
81818282// Test 8: For loop with empty condition (infinite loop with break)
8383-Ant.println("\nTest 8: For loop with break condition");
8383+console.log("\nTest 8: For loop with break condition");
8484let limit = 0;
8585for (let i = 0; ; i = i + 1) {
8686 limit = i;
···8888 break;
8989 }
9090}
9191-Ant.println(" Stopped at:", limit);
9191+console.log(" Stopped at:", limit);
92929393// Test 9: For loop with empty increment
9494-Ant.println("\nTest 9: For loop with manual increment");
9494+console.log("\nTest 9: For loop with manual increment");
9595let manual = 0;
9696for (let i = 0; i < 5; ) {
9797 manual = manual + i;
9898 i = i + 2;
9999}
100100-Ant.println(" Manual increment sum:", manual);
100100+console.log(" Manual increment sum:", manual);
101101102102// Test 10: For loop with multiple variables
103103-Ant.println("\nTest 10: For loop counting down");
103103+console.log("\nTest 10: For loop counting down");
104104let countdown = 0;
105105for (let i = 5; i > 0; i = i - 1) {
106106 countdown = countdown + i;
107107}
108108-Ant.println(" Countdown sum:", countdown);
108108+console.log(" Countdown sum:", countdown);
109109110110// Test 11: For loop modifying array
111111-Ant.println("\nTest 11: For loop modifying array");
111111+console.log("\nTest 11: For loop modifying array");
112112const arr = [1, 2, 3, 4, 5];
113113for (let i = 0; i < arr.length; i = i + 1) {
114114 arr[i] = arr[i] * 2;
115115}
116116-Ant.println(" Doubled array:", arr);
116116+console.log(" Doubled array:", arr);
117117118118// Test 12: For loop with object properties
119119-Ant.println("\nTest 12: For loop with object");
119119+console.log("\nTest 12: For loop with object");
120120const obj = { a: 1, b: 2, c: 3 };
121121const keys = Object.keys(obj);
122122let objSum = 0;
123123for (let i = 0; i < keys.length; i = i + 1) {
124124 const key = keys[i];
125125 objSum = objSum + obj[key];
126126- Ant.println(" key:", key, "value:", obj[key]);
126126+ console.log(" key:", key, "value:", obj[key]);
127127}
128128-Ant.println(" Object sum:", objSum);
128128+console.log(" Object sum:", objSum);
129129130130// Test 13: For loop with string iteration
131131-Ant.println("\nTest 13: For loop iterating string");
131131+console.log("\nTest 13: For loop iterating string");
132132const str = "hello";
133133let chars = "";
134134for (let i = 0; i < str.length; i = i + 1) {
135135 chars = chars + str[i] + " ";
136136}
137137-Ant.println(" Characters:", chars);
137137+console.log(" Characters:", chars);
138138139139// Test 14: For loop with early return in nested function
140140-Ant.println("\nTest 14: Early return in nested loops");
140140+console.log("\nTest 14: Early return in nested loops");
141141function findPair(arr, target) {
142142 for (let i = 0; i < arr.length; i = i + 1) {
143143 for (let j = i + 1; j < arr.length; j = j + 1) {
···152152const testArr = [1, 2, 3, 4, 5];
153153const result = findPair(testArr, 7);
154154if (result) {
155155- Ant.println(" Found pair at indices", result.i, "and", result.j);
156156- Ant.println(" Values:", testArr[result.i], "+", testArr[result.j], "=", result.sum);
155155+ console.log(" Found pair at indices", result.i, "and", result.j);
156156+ console.log(" Values:", testArr[result.i], "+", testArr[result.j], "=", result.sum);
157157}
158158159159// Test 15: For loop scope isolation
160160-Ant.println("\nTest 15: For loop scope isolation");
160160+console.log("\nTest 15: For loop scope isolation");
161161const results = [];
162162for (let i = 0; i < 3; i = i + 1) {
163163 const value = i * 10;
164164 results.push(value);
165165}
166166-Ant.println(" Results array:", results);
166166+console.log(" Results array:", results);
167167168168// Test 16: Complex condition in for loop
169169-Ant.println("\nTest 16: Complex condition");
169169+console.log("\nTest 16: Complex condition");
170170let complexSum = 0;
171171for (let i = 0; i < 20 && complexSum < 50; i = i + 1) {
172172 complexSum = complexSum + i;
173173}
174174-Ant.println(" Sum stopped at:", complexSum);
174174+console.log(" Sum stopped at:", complexSum);
175175176176// Test 17: For loop with function calls
177177-Ant.println("\nTest 17: For loop with function calls");
177177+console.log("\nTest 17: For loop with function calls");
178178function square(n) {
179179 return n * n;
180180}
···183183for (let i = 1; i <= 4; i = i + 1) {
184184 squareSum = squareSum + square(i);
185185}
186186-Ant.println(" Sum of squares 1-4:", squareSum);
186186+console.log(" Sum of squares 1-4:", squareSum);
187187188188// Test 18: Return object from loop
189189-Ant.println("\nTest 18: Return object from loop");
189189+console.log("\nTest 18: Return object from loop");
190190function findObject(arr, id) {
191191 for (let i = 0; i < arr.length; i = i + 1) {
192192 if (arr[i].id === id) {
···203203];
204204205205const found = findObject(items, 2);
206206-Ant.println(" Found item:", found ? found.name : "null");
206206+console.log(" Found item:", found ? found.name : "null");
207207208208// Test 19: For loop with undefined check
209209-Ant.println("\nTest 19: For loop with undefined check");
209209+console.log("\nTest 19: For loop with undefined check");
210210const sparse = [1, 2, undefined, 4, 5];
211211let definedCount = 0;
212212for (let i = 0; i < sparse.length; i = i + 1) {
···214214 definedCount = definedCount + 1;
215215 }
216216}
217217-Ant.println(" Defined elements:", definedCount);
217217+console.log(" Defined elements:", definedCount);
218218219219// Test 20: Performance test
220220-Ant.println("\nTest 20: Large loop");
220220+console.log("\nTest 20: Large loop");
221221let largeSum = 0;
222222for (let i = 0; i < 1000; i = i + 1) {
223223 largeSum = largeSum + i;
224224}
225225-Ant.println(" Sum of 0-999:", largeSum);
225225+console.log(" Sum of 0-999:", largeSum);
226226227227-Ant.println("\n=== All tests completed ===");
227227+console.log("\n=== All tests completed ===");
+5-5
tests/function_name_demo.cjs
···88 return x + y;
99}
10101111-Ant.println("Function names:");
1212-Ant.println("myFunction.name = " + myFunction.name);
1313-Ant.println("anotherFunction.name = " + anotherFunction.name);
1111+console.log("Function names:");
1212+console.log("myFunction.name = " + myFunction.name);
1313+console.log("anotherFunction.name = " + anotherFunction.name);
14141515// Anonymous function has empty name
1616let anon = function() { return 42; };
1717-Ant.println("anon.name = '" + anon.name + "' (empty for anonymous functions)");
1717+console.log("anon.name = '" + anon.name + "' (empty for anonymous functions)");
18181919// Named function expression
2020let named = function namedFunc() { return 100; };
2121-Ant.println("named.name = " + named.name);
2121+console.log("named.name = " + named.name);
+23-23
tests/function_objects.cjs
···1010greet.description = "A greeting function";
11111212// Accessing function properties
1313-Ant.println("Function name: " + greet.name);
1414-Ant.println("Description: " + greet.description);
1313+console.log("Function name: " + greet.name);
1414+console.log("Description: " + greet.description);
15151616// The __code property contains the function's bytecode/implementation
1717-Ant.println("\n--- Function __code property ---");
1818-Ant.println("greet.__code: " + greet.__code);
1919-Ant.println("Type of __code: " + typeof greet.__code);
1717+console.log("\n--- Function __code property ---");
1818+console.log("greet.__code: " + greet.__code);
1919+console.log("Type of __code: " + typeof greet.__code);
20202121// We can call the function normally
2222let result = greet("World");
2323-Ant.println("\nCalling greet('World'): " + result);
2323+console.log("\nCalling greet('World'): " + result);
24242525// Demonstrate with a more complex function
2626function fibonacci(n) {
···3333fibonacci.purpose = "Calculate Fibonacci numbers";
3434fibonacci.complexity = "O(2^n) - exponential";
35353636-Ant.println("\n--- Another function example ---");
3737-Ant.println("Function: " + fibonacci.name);
3838-Ant.println("Purpose: " + fibonacci.purpose);
3939-Ant.println("Complexity: " + fibonacci.complexity);
4040-Ant.println("fibonacci.__code: " + fibonacci.__code);
3636+console.log("\n--- Another function example ---");
3737+console.log("Function: " + fibonacci.name);
3838+console.log("Purpose: " + fibonacci.purpose);
3939+console.log("Complexity: " + fibonacci.complexity);
4040+console.log("fibonacci.__code: " + fibonacci.__code);
41414242// Call it
4343-Ant.println("fibonacci(7) = " + fibonacci(7));
4343+console.log("fibonacci(7) = " + fibonacci(7));
44444545// Functions can be stored in objects
4646let mathOps = {
···4848 multiply: function(a, b) { return a * b; }
4949};
50505151-Ant.println("\n--- Functions as object properties ---");
5252-Ant.println("mathOps.add: " + mathOps.add);
5353-Ant.println("mathOps.add.__code: " + mathOps.add.__code);
5454-Ant.println("mathOps.add(5, 3) = " + mathOps.add(5, 3));
5151+console.log("\n--- Functions as object properties ---");
5252+console.log("mathOps.add: " + mathOps.add);
5353+console.log("mathOps.add.__code: " + mathOps.add.__code);
5454+console.log("mathOps.add(5, 3) = " + mathOps.add(5, 3));
55555656// Functions can be assigned to variables
5757let myFunc = greet;
5858myFunc.newProperty = "Added to the reference";
59596060-Ant.println("\n--- Function assignment ---");
6161-Ant.println("myFunc === greet: " + (myFunc === greet));
6262-Ant.println("myFunc.__code: " + myFunc.__code);
6363-Ant.println("myFunc('Alice'): " + myFunc('Alice'));
6060+console.log("\n--- Function assignment ---");
6161+console.log("myFunc === greet: " + (myFunc === greet));
6262+console.log("myFunc.__code: " + myFunc.__code);
6363+console.log("myFunc('Alice'): " + myFunc('Alice'));
64646565// Anonymous function
6666let anon = function(x) { return x * 2; };
6767-Ant.println("\n--- Anonymous function ---");
6868-Ant.println("anon.__code: " + anon.__code);
6969-Ant.println("anon(21) = " + anon(21));
6767+console.log("\n--- Anonymous function ---");
6868+console.log("anon.__code: " + anon.__code);
6969+console.log("anon(21) = " + anon(21));
+12-12
tests/iife.cjs
···2233// Basic IIFE with no parameters
44let result1 = (() => 43)();
55-Ant.println("Basic IIFE:", result1); // Should be 43
55+console.log("Basic IIFE:", result1); // Should be 43
6677// IIFE with expression body
88let result2 = (() => 10 + 5)();
99-Ant.println("Expression IIFE:", result2); // Should be 15
99+console.log("Expression IIFE:", result2); // Should be 15
10101111// IIFE with block body
1212let result3 = (() => { return 99; })();
1313-Ant.println("Block IIFE:", result3); // Should be 99
1313+console.log("Block IIFE:", result3); // Should be 99
14141515// IIFE with parameters
1616let result4 = ((x) => x * 2)(21);
1717-Ant.println("IIFE with param:", result4); // Should be 42
1717+console.log("IIFE with param:", result4); // Should be 42
18181919// IIFE with multiple parameters
2020let result5 = ((a, b) => a + b)(30, 12);
2121-Ant.println("IIFE with multiple params:", result5); // Should be 42
2121+console.log("IIFE with multiple params:", result5); // Should be 42
22222323// Nested IIFE
2424let result6 = (() => (() => 7)())();
2525-Ant.println("Nested IIFE:", result6); // Should be 7
2525+console.log("Nested IIFE:", result6); // Should be 7
26262727// IIFE returning object (like module pattern)
2828let counter = (() => {
···3333 };
3434})();
35353636-Ant.println("Counter initial:", counter.get()); // Should be 0
3737-Ant.println("Counter after increment:", counter.increment()); // Should be 1
3838-Ant.println("Counter after increment:", counter.increment()); // Should be 2
3939-Ant.println("Counter value:", counter.get()); // Should be 2
3636+console.log("Counter initial:", counter.get()); // Should be 0
3737+console.log("Counter after increment:", counter.increment()); // Should be 1
3838+console.log("Counter after increment:", counter.increment()); // Should be 2
3939+console.log("Counter value:", counter.get()); // Should be 2
40404141// Complex expression in IIFE
4242let result7 = ((x, y) => x * 2 + y * 3)(5, 10);
4343-Ant.println("Complex expression:", result7); // Should be 40
4343+console.log("Complex expression:", result7); // Should be 40
44444545-Ant.println("\nAll arrow function IIFE tests completed!");
4545+console.log("\nAll arrow function IIFE tests completed!");
···1414 };
1515}
16161717-Ant.println("Starting multiple HTTP servers...");
1717+console.log("Starting multiple HTTP servers...");
18181919// Note: Currently Ant.serve() is blocking, so you can only run one server
2020// In the future, we could make it non-blocking to support truly concurrent servers
2121-Ant.println("Starting server on port 8000...");
2121+console.log("Starting server on port 8000...");
2222Ant.serve(8000, handler8000);
···4646});
47474848router.printTree();
4949-Ant.println('');
4949+console.log('');
50505151async function handleRequest(req, res) {
5252- Ant.println('request:', req.method, req.uri);
5252+ console.log('request:', req.method, req.uri);
5353 const result = router.lookup(req.uri);
54545555 if (result?.handler) {
···6060 res.body('not found: ' + req.uri, 404);
6161}
62626363-Ant.println('started on http://localhost:8000');
6363+console.log('started on http://localhost:8000');
6464Ant.serve(8000, handleRequest);
+2-2
tests/server_example.cjs
···2233// Define a request handler
44function handleRequest(req, res) {
55- Ant.println("Received request:", req.method, req.uri);
55+ console.log("Received request:", req.method, req.uri);
6677 // Return a response object
88 return {
···1212}
13131414// Start the server on port 8000
1515-Ant.println("Starting HTTP server...");
1515+console.log("Starting HTTP server...");
1616Ant.serve(8000, handleRequest);
+2-2
tests/server_routes.cjs
···11// Example HTTP server with basic routing
2233function handleRequest(req, res) {
44- Ant.println("Request:", req.method, req.uri);
44+ console.log("Request:", req.method, req.uri);
5566 // Simple routing based on URI
77 if (req.uri === "/") {
···3939 };
4040}
41414242-Ant.println("Starting HTTP server on port 8000...");
4242+console.log("Starting HTTP server on port 8000...");
4343Ant.serve(8000, handleRequest);
···11// Test await functionality
22-Ant.println('=== Await Tests ===');
22+console.log('=== Await Tests ===');
3344// Test 1: Basic await with resolved promise
55-Ant.println('\nTest 1: Basic await with resolved promise');
55+console.log('\nTest 1: Basic await with resolved promise');
66async function test1() {
77 const result = await Promise.resolve(42);
88- Ant.println('Awaited resolved promise: ' + result);
88+ console.log('Awaited resolved promise: ' + result);
99 return result;
1010}
1111-test1().then(v => Ant.println('Test 1 returned: ' + v));
1111+test1().then(v => console.log('Test 1 returned: ' + v));
12121313// Test 2: Await with Promise.resolve string
1414-Ant.println('\nTest 2: Await with string promise');
1414+console.log('\nTest 2: Await with string promise');
1515async function test2() {
1616 const msg = await Promise.resolve('hello world');
1717- Ant.println('Awaited string: ' + msg);
1717+ console.log('Awaited string: ' + msg);
1818 return msg;
1919}
2020-test2().then(v => Ant.println('Test 2 returned: ' + v));
2020+test2().then(v => console.log('Test 2 returned: ' + v));
21212222// Test 3: Await non-promise value (should return value directly)
2323-Ant.println('\nTest 3: Await non-promise value');
2323+console.log('\nTest 3: Await non-promise value');
2424async function test3() {
2525 const value = await 100;
2626- Ant.println('Awaited non-promise: ' + value);
2626+ console.log('Awaited non-promise: ' + value);
2727 return value;
2828}
2929-test3().then(v => Ant.println('Test 3 returned: ' + v));
2929+test3().then(v => console.log('Test 3 returned: ' + v));
30303131// Test 4: Multiple awaits in sequence
3232-Ant.println('\nTest 4: Multiple sequential awaits');
3232+console.log('\nTest 4: Multiple sequential awaits');
3333async function test4() {
3434 const a = await Promise.resolve(10);
3535 const b = await Promise.resolve(20);
3636 const c = await Promise.resolve(30);
3737 const sum = a + b + c;
3838- Ant.println('Sum of awaited values: ' + sum);
3838+ console.log('Sum of awaited values: ' + sum);
3939 return sum;
4040}
4141-test4().then(v => Ant.println('Test 4 returned: ' + v));
4141+test4().then(v => console.log('Test 4 returned: ' + v));
42424343// Test 5: Await in expression
4444-Ant.println('\nTest 5: Await in expression');
4444+console.log('\nTest 5: Await in expression');
4545async function test5() {
4646 const result = (await Promise.resolve(5)) * 2;
4747- Ant.println('Awaited and multiplied: ' + result);
4747+ console.log('Awaited and multiplied: ' + result);
4848 return result;
4949}
5050-test5().then(v => Ant.println('Test 5 returned: ' + v));
5050+test5().then(v => console.log('Test 5 returned: ' + v));
51515252// Test 6: Await with conditional
5353-Ant.println('\nTest 6: Await with conditional');
5353+console.log('\nTest 6: Await with conditional');
5454async function test6(flag) {
5555 if (flag) {
5656 const v = await Promise.resolve('true branch');
···6060 return v;
6161 }
6262}
6363-test6(true).then(v => Ant.println('Test 6 (true): ' + v));
6464-test6(false).then(v => Ant.println('Test 6 (false): ' + v));
6363+test6(true).then(v => console.log('Test 6 (true): ' + v));
6464+test6(false).then(v => console.log('Test 6 (false): ' + v));
65656666// Test 7: Async arrow function with await
6767-Ant.println('\nTest 7: Async arrow function with await');
6767+console.log('\nTest 7: Async arrow function with await');
6868const test7 = async () => {
6969 const x = await Promise.resolve(7);
7070 return x * 7;
7171};
7272-test7().then(v => Ant.println('Test 7 returned: ' + v));
7272+test7().then(v => console.log('Test 7 returned: ' + v));
73737474// Test 8: Async arrow with parameter and await
7575-Ant.println('\nTest 8: Async arrow with parameter');
7575+console.log('\nTest 8: Async arrow with parameter');
7676const test8 = async (n) => {
7777 const result = await Promise.resolve(n);
7878 return result + 10;
7979};
8080-test8(5).then(v => Ant.println('Test 8 returned: ' + v));
8080+test8(5).then(v => console.log('Test 8 returned: ' + v));
81818282// Test 9: Await with object property
8383-Ant.println('\nTest 9: Await with object');
8383+console.log('\nTest 9: Await with object');
8484async function test9() {
8585 const obj = await Promise.resolve({ x: 100, y: 200 });
8686- Ant.println('Awaited object.x: ' + obj.x);
8686+ console.log('Awaited object.x: ' + obj.x);
8787 return obj.y;
8888}
8989-test9().then(v => Ant.println('Test 9 returned: ' + v));
8989+test9().then(v => console.log('Test 9 returned: ' + v));
90909191// Test 10: Await with array
9292-Ant.println('\nTest 10: Await with array');
9292+console.log('\nTest 10: Await with array');
9393async function test10() {
9494 const arr = await Promise.resolve([1, 2, 3]);
9595- Ant.println('Awaited array[0]: ' + arr[0]);
9595+ console.log('Awaited array[0]: ' + arr[0]);
9696 return arr[1];
9797}
9898-test10().then(v => Ant.println('Test 10 returned: ' + v));
9898+test10().then(v => console.log('Test 10 returned: ' + v));
9999100100// Test 11: Nested async functions with await
101101-Ant.println('\nTest 11: Nested async functions');
101101+console.log('\nTest 11: Nested async functions');
102102async function inner11() {
103103 return await Promise.resolve('inner result');
104104}
···106106 const result = await inner11();
107107 return 'outer got: ' + result;
108108}
109109-outer11().then(v => Ant.println('Test 11 returned: ' + v));
109109+outer11().then(v => console.log('Test 11 returned: ' + v));
110110111111// Test 12: Await in async method
112112-Ant.println('\nTest 12: Await in async method');
112112+console.log('\nTest 12: Await in async method');
113113const obj12 = {
114114 value: 50,
115115 asyncMethod: async function() {
···117117 return this.value * multiplier;
118118 }
119119};
120120-obj12.asyncMethod().then(v => Ant.println('Test 12 returned: ' + v));
120120+obj12.asyncMethod().then(v => console.log('Test 12 returned: ' + v));
121121122122// Test 13: Await with string concatenation
123123-Ant.println('\nTest 13: Await with string operations');
123123+console.log('\nTest 13: Await with string operations');
124124async function test13() {
125125 const first = await Promise.resolve('Hello');
126126 const second = await Promise.resolve('World');
127127 return first + ' ' + second;
128128}
129129-test13().then(v => Ant.println('Test 13 returned: ' + v));
129129+test13().then(v => console.log('Test 13 returned: ' + v));
130130131131// Test 14: Await with nested promise chains
132132-Ant.println('\nTest 14: Await with chained values');
132132+console.log('\nTest 14: Await with chained values');
133133async function test14() {
134134 const a = await Promise.resolve(1);
135135 const b = await Promise.resolve(a + 1);
136136 const c = await Promise.resolve(b + 1);
137137 return c;
138138}
139139-test14().then(v => Ant.println('Test 14 returned: ' + v));
139139+test14().then(v => console.log('Test 14 returned: ' + v));
140140141141// Test 15: Return await
142142-Ant.println('\nTest 15: Return await');
142142+console.log('\nTest 15: Return await');
143143async function test15() {
144144 return await Promise.resolve('returned from await');
145145}
146146-test15().then(v => Ant.println('Test 15 returned: ' + v));
146146+test15().then(v => console.log('Test 15 returned: ' + v));
147147148148// Test 16: Await boolean value
149149-Ant.println('\nTest 16: Await boolean');
149149+console.log('\nTest 16: Await boolean');
150150async function test16() {
151151 const result = await Promise.resolve(true);
152152 if (result) {
···154154 }
155155 return 'boolean was false';
156156}
157157-test16().then(v => Ant.println('Test 16 returned: ' + v));
157157+test16().then(v => console.log('Test 16 returned: ' + v));
158158159159// Test 17: Await null
160160-Ant.println('\nTest 17: Await null');
160160+console.log('\nTest 17: Await null');
161161async function test17() {
162162 const result = await Promise.resolve(null);
163163 return result;
164164}
165165-test17().then(v => Ant.println('Test 17 returned (null): ' + v));
165165+test17().then(v => console.log('Test 17 returned (null): ' + v));
166166167167// Test 18: Await undefined
168168-Ant.println('\nTest 18: Await undefined');
168168+console.log('\nTest 18: Await undefined');
169169async function test18() {
170170 const result = await Promise.resolve(undefined);
171171 return result;
172172}
173173-test18().then(v => Ant.println('Test 18 returned (undefined): ' + v));
173173+test18().then(v => console.log('Test 18 returned (undefined): ' + v));
174174175175// Test 19: Async function expression with await
176176-Ant.println('\nTest 19: Async function expression');
176176+console.log('\nTest 19: Async function expression');
177177const test19 = async function() {
178178 const x = await Promise.resolve(19);
179179 return x;
180180};
181181-test19().then(v => Ant.println('Test 19 returned: ' + v));
181181+test19().then(v => console.log('Test 19 returned: ' + v));
182182183183// Test 20: Await with arithmetic operations
184184-Ant.println('\nTest 20: Await with arithmetic');
184184+console.log('\nTest 20: Await with arithmetic');
185185async function test20() {
186186 const a = await Promise.resolve(10);
187187 const b = await Promise.resolve(5);
188188 return a + b * 2;
189189}
190190-test20().then(v => Ant.println('Test 20 returned: ' + v));
190190+test20().then(v => console.log('Test 20 returned: ' + v));
191191192192-Ant.println('\n=== Synchronous code finished ===');
192192+console.log('\n=== Synchronous code finished ===');
+1-1
tests/test_block_closure.cjs
···99 };
1010 }
1111}
1212-Ant.println(result()); // Should print 15
1212+console.log(result()); // Should print 15
+2-2
tests/test_class_closure.cjs
···1616}
17171818let obj = new MyClass();
1919-Ant.println(obj.getX()); // Should print 100
2020-Ant.println(obj.getSum()); // Should print 110
1919+console.log(obj.getX()); // Should print 100
2020+console.log(obj.getSum()); // Should print 110
+50
tests/test_date.cjs
···11+// Test Date builtin functionality
22+33+// Test 1: Date.now() returns a number
44+console.log('Test 1: Date.now() returns a number');
55+const now1 = Date.now();
66+console.log('Date.now() =', now1);
77+console.log('typeof Date.now() =', typeof now1);
88+99+// Test 2: Date.now() returns milliseconds since epoch
1010+console.log('\nTest 2: Date.now() returns reasonable timestamp');
1111+const now2 = Date.now();
1212+// Should be a large number (milliseconds since 1970)
1313+console.log('Date.now() > 1000000000000 ?', now2 > 1000000000000);
1414+1515+// Test 3: new Date() creates an object
1616+console.log('\nTest 3: new Date() creates an object');
1717+const d1 = new Date();
1818+console.log('typeof new Date() =', typeof d1);
1919+console.log('new Date() =', d1);
2020+2121+// Test 4: new Date(timestamp) works
2222+console.log('\nTest 4: new Date(timestamp)');
2323+const d2 = new Date(1234567890000);
2424+console.log('new Date(1234567890000) =', d2);
2525+2626+// Test 5: Date.now() is monotonic (or at least consistent)
2727+console.log('\nTest 5: Date.now() consistency');
2828+const t1 = Date.now();
2929+const t2 = Date.now();
3030+console.log('t1 =', t1);
3131+console.log('t2 =', t2);
3232+console.log('t2 >= t1 ?', t2 >= t1);
3333+3434+// Test 6: Multiple calls to Date.now() return numbers
3535+console.log('\nTest 6: Multiple Date.now() calls');
3636+const times = [];
3737+for (let i = 0; i < 3; i++) {
3838+ times.push(Date.now());
3939+}
4040+console.log('Times:', times);
4141+console.log('All are numbers?', times.every(t => typeof t === 'number'));
4242+4343+// Test 7: Date constructor with no args vs Date.now()
4444+console.log('\nTest 7: Compare new Date() and Date.now()');
4545+const dateObj = new Date();
4646+const nowTime = Date.now();
4747+console.log('new Date() created:', dateObj);
4848+console.log('Date.now() =', nowTime);
4949+5050+console.log('\nAll Date tests completed!');
+8-8
tests/test_deep_this.cjs
···77 }
8899 method1(func) {
1010- Ant.println('method1: this.name = ' + this.name + ', depth = ' + this.depth);
1010+ console.log('method1: this.name = ' + this.name + ', depth = ' + this.depth);
1111 this.depth++;
1212 const result = func();
1313 this.depth--;
···1515 }
16161717 method2(func) {
1818- Ant.println('method2: this.name = ' + this.name + ', depth = ' + this.depth);
1818+ console.log('method2: this.name = ' + this.name + ', depth = ' + this.depth);
1919 this.depth++;
2020 const result = func();
2121 this.depth--;
···2323 }
24242525 method3(func) {
2626- Ant.println('method3: this.name = ' + this.name + ', depth = ' + this.depth);
2626+ console.log('method3: this.name = ' + this.name + ', depth = ' + this.depth);
2727 this.depth++;
2828 const result = func();
2929 this.depth--;
···3131 }
32323333 leaf() {
3434- Ant.println('leaf: this.name = ' + this.name + ', depth = ' + this.depth);
3434+ console.log('leaf: this.name = ' + this.name + ', depth = ' + this.depth);
3535 return 'done';
3636 }
3737}
···4747const obj1 = new DeepClass('obj1');
4848const obj2 = new DeepClass('obj2');
49495050-Ant.println('=== Test 1: Deeply nested calls on same object ===');
5050+console.log('=== Test 1: Deeply nested calls on same object ===');
5151obj1.method1(() => {
5252 return obj1.method2(() => {
5353 return obj1.method3(() => {
···5656 });
5757});
58585959-Ant.println('\n=== Test 2: Interleaved calls on different objects ===');
5959+console.log('\n=== Test 2: Interleaved calls on different objects ===');
6060obj1.method1(() => {
6161 obj2.method1(() => {
6262 return obj2.leaf();
···6666 });
6767});
68686969-Ant.println('\n=== Test 3: With helper function calls in arguments ===');
6969+console.log('\n=== Test 3: With helper function calls in arguments ===');
7070obj1.method1(() => helper1());
7171obj2.method2(() => helper2());
72727373-Ant.println('\n=== All deep nesting tests passed ===');
7373+console.log('\n=== All deep nesting tests passed ===');
···11// Test Promise display with various value types
22-Ant.println('=== Promise Display Test ===');
22+console.log('=== Promise Display Test ===');
3344// Test 1: Number
55-Ant.println('\nTest 1: Promise with number');
55+console.log('\nTest 1: Promise with number');
66const p1 = Promise.resolve(42);
77-Ant.println('Promise.resolve(42): ' + p1);
77+console.log('Promise.resolve(42): ' + p1);
8899// Test 2: String
1010-Ant.println('\nTest 2: Promise with string');
1010+console.log('\nTest 2: Promise with string');
1111const p2 = Promise.resolve('hello');
1212-Ant.println('Promise.resolve("hello"): ' + p2);
1212+console.log('Promise.resolve("hello"): ' + p2);
13131414// Test 3: Boolean (true)
1515-Ant.println('\nTest 3: Promise with boolean');
1515+console.log('\nTest 3: Promise with boolean');
1616const p3 = Promise.resolve(true);
1717-Ant.println('Promise.resolve(true): ' + p3);
1717+console.log('Promise.resolve(true): ' + p3);
18181919// Test 4: Boolean (false)
2020const p4 = Promise.resolve(false);
2121-Ant.println('Promise.resolve(false): ' + p4);
2121+console.log('Promise.resolve(false): ' + p4);
22222323// Test 5: Null
2424-Ant.println('\nTest 5: Promise with null');
2424+console.log('\nTest 5: Promise with null');
2525const p5 = Promise.resolve(null);
2626-Ant.println('Promise.resolve(null): ' + p5);
2626+console.log('Promise.resolve(null): ' + p5);
27272828// Test 6: Undefined
2929-Ant.println('\nTest 6: Promise with undefined');
2929+console.log('\nTest 6: Promise with undefined');
3030const p6 = Promise.resolve(undefined);
3131-Ant.println('Promise.resolve(undefined): ' + p6);
3131+console.log('Promise.resolve(undefined): ' + p6);
32323333// Test 7: Object
3434-Ant.println('\nTest 7: Promise with object');
3434+console.log('\nTest 7: Promise with object');
3535const p7 = Promise.resolve({ x: 1, y: 2 });
3636-Ant.println('Promise.resolve({x:1,y:2}): ' + p7);
3636+console.log('Promise.resolve({x:1,y:2}): ' + p7);
37373838// Test 8: Array
3939-Ant.println('\nTest 8: Promise with array');
3939+console.log('\nTest 8: Promise with array');
4040const p8 = Promise.resolve([1, 2, 3]);
4141-Ant.println('Promise.resolve([1,2,3]): ' + p8);
4141+console.log('Promise.resolve([1,2,3]): ' + p8);
42424343// Test 9: Rejected promise
4444-Ant.println('\nTest 9: Rejected promise');
4444+console.log('\nTest 9: Rejected promise');
4545const p9 = Promise.reject('error message');
4646-Ant.println('Promise.reject("error message"): ' + p9);
4646+console.log('Promise.reject("error message"): ' + p9);
47474848// Test 10: Pending promise
4949-Ant.println('\nTest 10: Pending promise');
4949+console.log('\nTest 10: Pending promise');
5050const p10 = new Promise((resolve) => {
5151 Ant.setTimeout(() => {
5252 resolve(100);
5353- Ant.println('After timeout, promise is: ' + p10);
5353+ console.log('After timeout, promise is: ' + p10);
5454 }, 100);
5555});
5656-Ant.println('Before timeout, promise is: ' + p10);
5656+console.log('Before timeout, promise is: ' + p10);
57575858// Test 11: Async function result
5959-Ant.println('\nTest 11: Async function result');
5959+console.log('\nTest 11: Async function result');
6060async function getValue() {
6161 return 999;
6262}
6363const p11 = getValue();
6464-Ant.println('Async function returned: ' + p11);
6464+console.log('Async function returned: ' + p11);
65656666// Test 12: Async function with object
6767-Ant.println('\nTest 12: Async function with object');
6767+console.log('\nTest 12: Async function with object');
6868async function getObject() {
6969 return { value: 42, name: 'test' };
7070}
7171const p12 = getObject();
7272-Ant.println('Async object function: ' + p12);
7272+console.log('Async object function: ' + p12);
73737474// Test 13: Async function with array
7575-Ant.println('\nTest 13: Async function with array');
7575+console.log('\nTest 13: Async function with array');
7676async function getArray() {
7777 return [10, 20, 30];
7878}
7979const p13 = getArray();
8080-Ant.println('Async array function: ' + p13);
8080+console.log('Async array function: ' + p13);
81818282// Test 14: Promise chaining visibility
8383-Ant.println('\nTest 14: Promise in then handler');
8383+console.log('\nTest 14: Promise in then handler');
8484Promise.resolve(5).then(v => {
8585 const inner = Promise.resolve(v * 2);
8686- Ant.println('Inner promise: ' + inner);
8686+ console.log('Inner promise: ' + inner);
8787 return inner;
8888});
89899090-Ant.println('\n=== Synchronous code finished ===');
9090+console.log('\n=== Synchronous code finished ===');
+9-9
tests/test_regexp_basic.cjs
···11// Test basic RegExp constructor
22const re1 = new RegExp('hello');
33-Ant.println('RegExp created:', re1.source);
44-Ant.println('Flags:', re1.flags);
55-Ant.println('Global:', re1.global);
33+console.log('RegExp created:', re1.source);
44+console.log('Flags:', re1.flags);
55+console.log('Global:', re1.global);
6677// Test with flags
88const re2 = new RegExp('test', 'g');
99-Ant.println('Global flag set:', re2.global);
1010-Ant.println('Flags:', re2.flags);
99+console.log('Global flag set:', re2.global);
1010+console.log('Flags:', re2.flags);
11111212// Test multiple flags
1313const re3 = new RegExp('pattern', 'gi');
1414-Ant.println('Multiple flags:', re3.flags);
1515-Ant.println('Global:', re3.global);
1616-Ant.println('IgnoreCase:', re3.ignoreCase);
1414+console.log('Multiple flags:', re3.flags);
1515+console.log('Global:', re3.global);
1616+console.log('IgnoreCase:', re3.ignoreCase);
17171818-Ant.println('All basic RegExp tests passed!');
1818+console.log('All basic RegExp tests passed!');
+8-8
tests/test_regexp_edge_cases.cjs
···2233// Empty pattern
44const re1 = new RegExp('');
55-Ant.println('Empty pattern source:', re1.source);
55+console.log('Empty pattern source:', re1.source);
6677// Empty string replacement
88const str1 = 'hello';
99const result1 = str1.replace(new RegExp('l', 'g'), '');
1010-Ant.println('Remove chars:', result1);
1010+console.log('Remove chars:', result1);
11111212// No match
1313const str2 = 'hello world';
1414const result2 = str2.replace(new RegExp('xyz'), 'foo');
1515-Ant.println('No match:', result2);
1515+console.log('No match:', result2);
16161717// Special characters that need escaping
1818const str3 = 'Price: $10.99';
1919const re3 = new RegExp('[0-9.]+');
2020const result3 = str3.replace(re3, '20.00');
2121-Ant.println('Price replace:', result3);
2121+console.log('Price replace:', result3);
22222323// Whitespace replacement
2424const str4 = 'hello world';
2525const re4 = new RegExp(' +', 'g');
2626const result4 = str4.replace(re4, ' ');
2727-Ant.println('Normalize spaces:', result4);
2727+console.log('Normalize spaces:', result4);
28282929// Replace at start
3030const str5 = 'hello world';
3131const re5 = new RegExp('^hello');
3232const result5 = str5.replace(re5, 'hi');
3333-Ant.println('Replace at start:', result5);
3333+console.log('Replace at start:', result5);
34343535// Replace at end
3636const str6 = 'hello world';
3737const re6 = new RegExp('world$');
3838const result6 = str6.replace(re6, 'there');
3939-Ant.println('Replace at end:', result6);
3939+console.log('Replace at end:', result6);
40404141-Ant.println('All edge case tests passed!');
4141+console.log('All edge case tests passed!');
+8-8
tests/test_regexp_patterns.cjs
···44const str1 = 'The quick brown fox';
55const re1 = new RegExp('quick', 'g');
66const result1 = str1.replace(re1, 'slow');
77-Ant.println('Word replace:', result1);
77+console.log('Word replace:', result1);
8899// Test character classes
1010const str2 = 'a1b2c3';
1111const re2 = new RegExp('[0-9]', 'g');
1212const result2 = str2.replace(re2, 'X');
1313-Ant.println('Digit replace:', result2);
1313+console.log('Digit replace:', result2);
14141515// Test alternation
1616const str3 = 'I like cats and dogs';
1717const re3 = new RegExp('cats', 'g');
1818const result3 = str3.replace(re3, 'birds');
1919-Ant.println('Alternation:', result3);
1919+console.log('Alternation:', result3);
20202121// Test start of line
2222const str4 = 'hello world\nhello there';
2323const re4 = new RegExp('hello', 'g');
2424const result4 = str4.replace(re4, 'hi');
2525-Ant.println('Multiple hello:', result4);
2525+console.log('Multiple hello:', result4);
26262727// Test any character
2828const str5 = 'abc def ghi';
2929const re5 = new RegExp('d.f');
3030const result5 = str5.replace(re5, 'XXX');
3131-Ant.println('Any char:', result5);
3131+console.log('Any char:', result5);
32323333// Test quantifiers
3434const str6 = 'aaaa bb c';
3535const re6 = new RegExp('a+', 'g');
3636const result6 = str6.replace(re6, 'X');
3737-Ant.println('Quantifier +:', result6);
3737+console.log('Quantifier +:', result6);
38383939const str7 = 'aaaa bb c';
4040const re7 = new RegExp('a*', 'g');
4141const result7 = str7.replace(re7, 'X');
4242-Ant.println('Quantifier *:', result7);
4242+console.log('Quantifier *:', result7);
43434444-Ant.println('All pattern tests passed!');
4444+console.log('All pattern tests passed!');
+15-15
tests/test_rest_params.cjs
···99 return total;
1010}
11111212-Ant.println("Test 1 - Basic rest params:");
1313-Ant.println(sum(1, 2, 3, 4, 5)); // Should print 15
1212+console.log("Test 1 - Basic rest params:");
1313+console.log(sum(1, 2, 3, 4, 5)); // Should print 15
14141515// Test 2: Rest parameter with regular parameters
1616function greet(greeting, ...names) {
···2121 return result;
2222}
23232424-Ant.println("\nTest 2 - Rest params with regular params:");
2525-Ant.println(greet("Hello", "Alice", "Bob", "Charlie")); // Should print "Hello Alice Bob Charlie"
2424+console.log("\nTest 2 - Rest params with regular params:");
2525+console.log(greet("Hello", "Alice", "Bob", "Charlie")); // Should print "Hello Alice Bob Charlie"
26262727// Test 3: Rest parameter with no arguments passed
2828function noArgs(...args) {
2929 return args.length;
3030}
31313232-Ant.println("\nTest 3 - Rest params with no args:");
3333-Ant.println(noArgs()); // Should print 0
3232+console.log("\nTest 3 - Rest params with no args:");
3333+console.log(noArgs()); // Should print 0
34343535// Test 4: Rest parameter with single argument
3636function singleArg(...args) {
3737 return args[0];
3838}
39394040-Ant.println("\nTest 4 - Rest params with single arg:");
4141-Ant.println(singleArg(42)); // Should print 42
4040+console.log("\nTest 4 - Rest params with single arg:");
4141+console.log(singleArg(42)); // Should print 42
42424343// Test 5: Arrow function with rest parameters
4444const multiply = (...factors) => {
···4949 return result;
5050};
51515252-Ant.println("\nTest 5 - Arrow function with rest params:");
5353-Ant.println(multiply(2, 3, 4)); // Should print 24
5252+console.log("\nTest 5 - Arrow function with rest params:");
5353+console.log(multiply(2, 3, 4)); // Should print 24
54545555// Test 6: Multiple regular params with rest
5656function compute(operation, initial, ...values) {
···6868 return result;
6969}
70707171-Ant.println("\nTest 6 - Multiple params with rest:");
7272-Ant.println(compute("add", 10, 5, 3, 2)); // Should print 20
7373-Ant.println(compute("multiply", 2, 3, 4)); // Should print 24
7171+console.log("\nTest 6 - Multiple params with rest:");
7272+console.log(compute("add", 10, 5, 3, 2)); // Should print 20
7373+console.log(compute("multiply", 2, 3, 4)); // Should print 24
74747575// Test 7: Rest parameter is an actual array
7676function checkArray(...items) {
7777 return items.length;
7878}
79798080-Ant.println("\nTest 7 - Rest param is array:");
8181-Ant.println(checkArray("a", "b", "c", "d")); // Should print 4
8080+console.log("\nTest 7 - Rest param is array:");
8181+console.log(checkArray("a", "b", "c", "d")); // Should print 4
+12-12
tests/test_return.cjs
···2233class Test {
44 method1(x) {
55- Ant.println("Method1: x =", x);
55+ console.log("Method1: x =", x);
66 if (x > 5) {
77- Ant.println("Returning early");
77+ console.log("Returning early");
88 return;
99 }
1010- Ant.println("After if block");
1010+ console.log("After if block");
1111 }
12121313 method2(x) {
1414- Ant.println("Method2: x =", x);
1414+ console.log("Method2: x =", x);
1515 if (x > 5) {
1616- Ant.println("Returning early with value");
1616+ console.log("Returning early with value");
1717 return "early";
1818 }
1919- Ant.println("After if block");
1919+ console.log("After if block");
2020 return "normal";
2121 }
2222}
23232424let t = new Test();
25252626-Ant.println("Test 1:");
2626+console.log("Test 1:");
2727t.method1(3);
28282929-Ant.println("\nTest 2:");
2929+console.log("\nTest 2:");
3030t.method1(7);
31313232-Ant.println("\nTest 3:");
3232+console.log("\nTest 3:");
3333let r1 = t.method2(3);
3434-Ant.println("Returned:", r1);
3434+console.log("Returned:", r1);
35353636-Ant.println("\nTest 4:");
3636+console.log("\nTest 4:");
3737let r2 = t.method2(7);
3838-Ant.println("Returned:", r2);
3838+console.log("Returned:", r2);
+11-11
tests/test_shadowing.cjs
···22let x = "outer";
33{
44 let x = "inner";
55- Ant.println(x); // Should print "inner"
55+ console.log(x); // Should print "inner"
66}
77-Ant.println(x); // Should print "outer"
77+console.log(x); // Should print "outer"
8899// Test 2: Closure capturing outer scope
1010let y = 10;
···1616 };
1717}
1818let counter = makeCounter();
1919-Ant.println(counter()); // Should print 11
2020-Ant.println(counter()); // Should print 12
1919+console.log(counter()); // Should print 11
2020+console.log(counter()); // Should print 12
21212222// Test 3: Variable shadowing in function
2323let z = "global";
···2525 let z = "local";
2626 return z;
2727}
2828-Ant.println(testShadow()); // Should print "local"
2929-Ant.println(z); // Should print "global"
2828+console.log(testShadow()); // Should print "local"
2929+console.log(z); // Should print "global"
30303131// Test 4: Nested function closures
3232function outer() {
···4141 }
4242 return middle();
4343}
4444-Ant.println(outer()); // Should print 6
4444+console.log(outer()); // Should print 6
45454646// Test 5: Multiple closures sharing same outer scope
4747function makeCounters() {
···5353 };
5454}
5555let counters = makeCounters();
5656-Ant.println(counters.inc()); // Should print 1
5757-Ant.println(counters.inc()); // Should print 2
5858-Ant.println(counters.dec()); // Should print 1
5959-Ant.println(counters.get()); // Should print 1
5656+console.log(counters.inc()); // Should print 1
5757+console.log(counters.inc()); // Should print 2
5858+console.log(counters.dec()); // Should print 1
5959+console.log(counters.get()); // Should print 1
+10-10
tests/test_stack_depth.cjs
···7788 // Regular method that calls another with function arg
99 methodA(getArg) {
1010- Ant.println('methodA: this.name = ' + this.name);
1010+ console.log('methodA: this.name = ' + this.name);
1111 return this.methodB(getArg());
1212 }
13131414 methodB(arg) {
1515- Ant.println('methodB: this.name = ' + this.name + ', arg = ' + arg);
1515+ console.log('methodB: this.name = ' + this.name + ', arg = ' + arg);
1616 return this.name + ':' + arg;
1717 }
18181919 // Method that returns a promise
2020 asyncMethod() {
2121- Ant.println('asyncMethod: this.name = ' + this.name);
2121+ console.log('asyncMethod: this.name = ' + this.name);
2222 return Promise.resolve(this.name);
2323 }
2424}
···3030const obj1 = new StackTest('obj1');
3131const obj2 = new StackTest('obj2');
32323333-Ant.println('=== Test 1: Synchronous nested calls ===');
3333+console.log('=== Test 1: Synchronous nested calls ===');
3434const result1 = obj1.methodA(() => helperFunc());
3535-Ant.println('Result: ' + result1);
3535+console.log('Result: ' + result1);
36363737-Ant.println('\n=== Test 2: Async then sync ===');
3737+console.log('\n=== Test 2: Async then sync ===');
3838obj1.asyncMethod().then((val) => {
3939- Ant.println('In .then(), val = ' + val);
3939+ console.log('In .then(), val = ' + val);
4040 // Now do a sync call with function arg
4141 const result = obj2.methodA(() => 'fromPromise');
4242- Ant.println('After sync call: ' + result);
4242+ console.log('After sync call: ' + result);
4343});
44444545-Ant.println('\n=== Test 3: Multiple objects interleaved ===');
4545+console.log('\n=== Test 3: Multiple objects interleaved ===');
4646obj1.methodA(() => {
4747 obj2.methodB('nested');
4848 return 'test';
4949});
50505151-Ant.println('\n=== All tests done ===');
5151+console.log('\n=== All tests done ===');
+7-7
tests/test_string_replace_regex.cjs
···44const str1 = 'hello world';
55const re1 = new RegExp('world');
66const result1 = str1.replace(re1, 'universe');
77-Ant.println('Basic replace:', result1);
77+console.log('Basic replace:', result1);
8899// Test with global flag
1010const str2 = 'foo bar foo baz';
1111const re2 = new RegExp('foo', 'g');
1212const result2 = str2.replace(re2, 'qux');
1313-Ant.println('Global replace:', result2);
1313+console.log('Global replace:', result2);
14141515// Test without global flag (should replace only first)
1616const str3 = 'foo bar foo baz';
1717const re3 = new RegExp('foo');
1818const result3 = str3.replace(re3, 'qux');
1919-Ant.println('Non-global replace:', result3);
1919+console.log('Non-global replace:', result3);
20202121// Test with regex pattern (digits)
2222const str4 = 'I have 2 apples and 3 oranges';
2323const re4 = new RegExp('[0-9]+', 'g');
2424const result4 = str4.replace(re4, 'X');
2525-Ant.println('Replace digits:', result4);
2525+console.log('Replace digits:', result4);
26262727// Test with dot pattern
2828const str5 = 'abc123def';
2929const re5 = new RegExp('...', 'g');
3030const result5 = str5.replace(re5, 'X');
3131-Ant.println('Replace with dot:', result5);
3131+console.log('Replace with dot:', result5);
32323333// Test string replace (without regex) - should still work
3434const str6 = 'hello world';
3535const result6 = str6.replace('world', 'there');
3636-Ant.println('String replace:', result6);
3636+console.log('String replace:', result6);
37373838-Ant.println('All replace tests passed!');
3838+console.log('All replace tests passed!');
+6-6
tests/test_throw_stack.cjs
···11// Test throw statement with stack traces
22-Ant.println('=== Throw with Stack Trace Test ===');
22+console.log('=== Throw with Stack Trace Test ===');
3344function level3() {
55- Ant.println('In level3');
55+ console.log('In level3');
66 throw "error from level3";
77}
8899function level2() {
1010- Ant.println('In level2');
1010+ console.log('In level2');
1111 level3();
1212}
13131414function level1() {
1515- Ant.println('In level1');
1515+ console.log('In level1');
1616 level2();
1717}
18181919-Ant.println('Starting test...');
1919+console.log('Starting test...');
2020level1();
2121-Ant.println('This should not print');
2121+console.log('This should not print');
+10-10
tests/test_timers.cjs
···11// Test setTimeout
22-Ant.println('Starting timer tests...');
22+console.log('Starting timer tests...');
3344Ant.setTimeout(() => {
55- Ant.println('setTimeout executed after 1000ms');
55+ console.log('setTimeout executed after 1000ms');
66}, 1000);
7788Ant.setTimeout(() => {
99- Ant.println('setTimeout executed after 500ms');
99+ console.log('setTimeout executed after 500ms');
1010}, 500);
11111212// Test queueMicrotask
1313Ant.queueMicrotask(() => {
1414- Ant.println('Microtask 1 executed');
1414+ console.log('Microtask 1 executed');
1515});
16161717Ant.queueMicrotask(() => {
1818- Ant.println('Microtask 2 executed');
1818+ console.log('Microtask 2 executed');
1919});
20202121-Ant.println('Synchronous code finished');
2121+console.log('Synchronous code finished');
22222323// Test setInterval
2424let count = 0;
2525const intervalId = Ant.setInterval(() => {
2626 count++;
2727- Ant.println('Interval execution #' + count);
2727+ console.log('Interval execution #' + count);
28282929 if (count >= 3) {
3030 Ant.clearInterval(intervalId);
3131- Ant.println('Interval cleared after 3 executions');
3131+ console.log('Interval cleared after 3 executions');
3232 }
3333}, 200);
34343535// Test clearTimeout
3636const timeoutId = Ant.setTimeout(() => {
3737- Ant.println('This should NOT be printed');
3737+ console.log('This should NOT be printed');
3838}, 300);
39394040Ant.clearTimeout(timeoutId);
4141-Ant.println('Timeout cleared before execution');
4141+console.log('Timeout cleared before execution');
+25-25
tests/test_var.cjs
···11// Test var keyword (should work like let but show warnings)
22-Ant.println('=== Var Keyword Tests ===');
22+console.log('=== Var Keyword Tests ===');
3344// Test 1: Basic var declaration
55-Ant.println('\nTest 1: Basic var declaration');
55+console.log('\nTest 1: Basic var declaration');
66var x = 10;
77-Ant.println('var x = 10: ' + x);
77+console.log('var x = 10: ' + x);
8899// Test 2: Var reassignment
1010-Ant.println('\nTest 2: Var reassignment');
1010+console.log('\nTest 2: Var reassignment');
1111var y = 5;
1212y = y + 10;
1313-Ant.println('var y reassigned: ' + y);
1313+console.log('var y reassigned: ' + y);
14141515// Test 3: Var in for loop
1616-Ant.println('\nTest 3: Var in for loop');
1616+console.log('\nTest 3: Var in for loop');
1717var sum = 0;
1818for (var i = 0; i < 5; i = i + 1) {
1919 sum = sum + i;
2020}
2121-Ant.println('Sum with var: ' + sum);
2121+console.log('Sum with var: ' + sum);
22222323// Test 4: Var in for-in loop
2424-Ant.println('\nTest 4: Var in for-in loop');
2424+console.log('\nTest 4: Var in for-in loop');
2525const obj = { a: 1, b: 2, c: 3 };
2626var keys = '';
2727for (var key in obj) {
2828 keys = keys + key + ',';
2929}
3030-Ant.println('Keys with var: ' + keys);
3030+console.log('Keys with var: ' + keys);
31313232// Test 5: Multiple var declarations
3333-Ant.println('\nTest 5: Multiple var declarations');
3333+console.log('\nTest 5: Multiple var declarations');
3434var a = 1, b = 2, c = 3;
3535-Ant.println('var a, b, c: ' + (a + b + c));
3535+console.log('var a, b, c: ' + (a + b + c));
36363737// Test 6: Var in while loop
3838-Ant.println('\nTest 6: Var in while loop');
3838+console.log('\nTest 6: Var in while loop');
3939var count = 0;
4040while (count < 3) {
4141 count = count + 1;
4242}
4343-Ant.println('While with var: ' + count);
4343+console.log('While with var: ' + count);
44444545// Test 7: Var with objects
4646-Ant.println('\nTest 7: Var with objects');
4646+console.log('\nTest 7: Var with objects');
4747var obj2 = { name: 'test', value: 42 };
4848-Ant.println('var object: ' + obj2.name + ' = ' + obj2.value);
4848+console.log('var object: ' + obj2.name + ' = ' + obj2.value);
49495050// Test 8: Var with arrays
5151-Ant.println('\nTest 8: Var with arrays');
5151+console.log('\nTest 8: Var with arrays');
5252var arr = [10, 20, 30];
5353-Ant.println('var array[1]: ' + arr[1]);
5353+console.log('var array[1]: ' + arr[1]);
54545555// Test 9: Var in nested scopes
5656-Ant.println('\nTest 9: Var in nested scopes');
5656+console.log('\nTest 9: Var in nested scopes');
5757var outer = 'outer';
5858if (true) {
5959 var inner = 'inner';
6060- Ant.println('Inner var: ' + inner);
6060+ console.log('Inner var: ' + inner);
6161}
6262-Ant.println('Outer var: ' + outer);
6262+console.log('Outer var: ' + outer);
63636464// Test 10: Var works like let
6565-Ant.println('\nTest 10: Var behavior like let');
6565+console.log('\nTest 10: Var behavior like let');
6666var testVar = 100;
6767if (testVar > 50) {
6868 var modified = testVar * 2;
6969- Ant.println('Modified: ' + modified);
6969+ console.log('Modified: ' + modified);
7070}
7171-Ant.println('Original: ' + testVar);
7171+console.log('Original: ' + testVar);
72727373-Ant.println('\n=== All var tests completed ===');
7474-Ant.println('Note: You should see deprecation warnings above');
7373+console.log('\n=== All var tests completed ===');
7474+console.log('Note: You should see deprecation warnings above');
+31-31
tests/test_void_operator.cjs
···11// Test void operator with promises and async functions
22-Ant.println('=== Void Operator Tests ===');
22+console.log('=== Void Operator Tests ===');
3344// Test 1: void with async function (fire and forget)
55-Ant.println('\nTest 1: void with async function');
55+console.log('\nTest 1: void with async function');
66async function asyncTask() {
77- Ant.println('Async task executing');
77+ console.log('Async task executing');
88 return 'task result';
99}
10101111// Using void indicates we don't care about the result/promise
1212void asyncTask();
1313-Ant.println('After void async call');
1313+console.log('After void async call');
14141515// Test 2: void with Promise.resolve
1616-Ant.println('\nTest 2: void with Promise.resolve');
1717-void Promise.resolve(42).then(v => Ant.println('Promise resolved with: ' + v));
1818-Ant.println('After void Promise.resolve');
1616+console.log('\nTest 2: void with Promise.resolve');
1717+void Promise.resolve(42).then(v => console.log('Promise resolved with: ' + v));
1818+console.log('After void Promise.resolve');
19192020// Test 3: void with regular function call
2121-Ant.println('\nTest 3: void with regular function');
2121+console.log('\nTest 3: void with regular function');
2222function regularFunc() {
2323- Ant.println('Regular function called');
2323+ console.log('Regular function called');
2424 return 'regular result';
2525}
2626const result = void regularFunc();
2727-Ant.println('Result of void is: ' + result);
2727+console.log('Result of void is: ' + result);
28282929// Test 4: void in expression
3030-Ant.println('\nTest 4: void in expression');
3030+console.log('\nTest 4: void in expression');
3131const x = 10;
3232const y = void x;
3333-Ant.println('void x where x=10 is: ' + y);
3333+console.log('void x where x=10 is: ' + y);
34343535// Test 5: void with multiple expressions
3636-Ant.println('\nTest 5: void prevents await');
3636+console.log('\nTest 5: void prevents await');
3737async function noAwait() {
3838 // void means we explicitly don't want to await this
3939 void Promise.resolve('not awaited');
4040- Ant.println('Continued without awaiting');
4040+ console.log('Continued without awaiting');
4141 return 'done';
4242}
4343-noAwait().then(v => Ant.println('noAwait returned: ' + v));
4343+noAwait().then(v => console.log('noAwait returned: ' + v));
44444545// Test 6: void vs await comparison
4646-Ant.println('\nTest 6: void vs await comparison');
4646+console.log('\nTest 6: void vs await comparison');
4747async function withAwait() {
4848 const result = await Promise.resolve('awaited value');
4949- Ant.println('With await: ' + result);
4949+ console.log('With await: ' + result);
5050 return result;
5151}
52525353async function withVoid() {
5454 void Promise.resolve('void value');
5555- Ant.println('With void: undefined (not waiting)');
5555+ console.log('With void: undefined (not waiting)');
5656 return 'immediate return';
5757}
58585959-withAwait().then(v => Ant.println('withAwait result: ' + v));
6060-withVoid().then(v => Ant.println('withVoid result: ' + v));
5959+withAwait().then(v => console.log('withAwait result: ' + v));
6060+withVoid().then(v => console.log('withVoid result: ' + v));
61616262// Test 7: void with chained promise (fire and forget)
6363-Ant.println('\nTest 7: void with promise chain');
6363+console.log('\nTest 7: void with promise chain');
6464void Promise.resolve(1)
6565 .then(v => v + 1)
6666 .then(v => v + 1)
6767- .then(v => Ant.println('Chained promise result: ' + v));
6868-Ant.println('Promise chain started but not awaited');
6767+ .then(v => console.log('Chained promise result: ' + v));
6868+console.log('Promise chain started but not awaited');
69697070// Test 8: void return value
7171-Ant.println('\nTest 8: void always returns undefined');
7171+console.log('\nTest 8: void always returns undefined');
7272function returnVoid() {
7373 return void 100;
7474}
7575const voidResult = returnVoid();
7676-Ant.println('Function returning void 100: ' + voidResult);
7676+console.log('Function returning void 100: ' + voidResult);
77777878// Test 9: void with function expression
7979-Ant.println('\nTest 9: void with function expression');
7979+console.log('\nTest 9: void with function expression');
8080void function() {
8181- Ant.println('IIFE with void executed');
8181+ console.log('IIFE with void executed');
8282}();
83838484// Test 10: void indicating intentional non-handling
8585-Ant.println('\nTest 10: void for intentional non-handling');
8585+console.log('\nTest 10: void for intentional non-handling');
8686async function backgroundTask() {
8787 return await Promise.resolve('background work done');
8888}
···9090async function mainTask() {
9191 // void explicitly shows we don't want to wait for backgroundTask
9292 void backgroundTask();
9393- Ant.println('Main task continues immediately');
9393+ console.log('Main task continues immediately');
9494 return 'main done';
9595}
96969797-mainTask().then(v => Ant.println('mainTask result: ' + v));
9797+mainTask().then(v => console.log('mainTask result: ' + v));
98989999-Ant.println('\n=== Synchronous code finished ===');
9999+console.log('\n=== Synchronous code finished ===');
+59-59
tests/this_demo.cjs
···11// Demonstration of 'this' keyword and 'new' operator
2233-Ant.println("=== Constructor Functions with 'new' and 'this' ===\n");
33+console.log("=== Constructor Functions with 'new' and 'this' ===\n");
4455// Basic constructor function
66function Person(name, age) {
···1212}
13131414// Create instances using 'new'
1515-Ant.println("Creating person1 with new Person('Alice', 30)");
1515+console.log("Creating person1 with new Person('Alice', 30)");
1616let person1 = new Person("Alice", 30);
1717-Ant.println("person1.name:", person1.name);
1818-Ant.println("person1.age:", person1.age);
1919-Ant.println("person1.greet():", person1.greet());
2020-Ant.println();
1717+console.log("person1.name:", person1.name);
1818+console.log("person1.age:", person1.age);
1919+console.log("person1.greet():", person1.greet());
2020+console.log();
21212222-Ant.println("Creating person2 with new Person('Bob', 25)");
2222+console.log("Creating person2 with new Person('Bob', 25)");
2323let person2 = new Person("Bob", 25);
2424-Ant.println("person2.name:", person2.name);
2525-Ant.println("person2.age:", person2.age);
2626-Ant.println("person2.greet():", person2.greet());
2727-Ant.println();
2424+console.log("person2.name:", person2.name);
2525+console.log("person2.age:", person2.age);
2626+console.log("person2.greet():", person2.greet());
2727+console.log();
28282929// Each instance has its own 'this' context
3030-Ant.println("=== Independent 'this' contexts ===");
3131-Ant.println("person1.name:", person1.name);
3232-Ant.println("person2.name:", person2.name);
3333-Ant.println("They are different instances with independent 'this' values");
3434-Ant.println();
3030+console.log("=== Independent 'this' contexts ===");
3131+console.log("person1.name:", person1.name);
3232+console.log("person2.name:", person2.name);
3333+console.log("They are different instances with independent 'this' values");
3434+console.log();
35353636// Constructor with methods that use 'this'
3737function Counter(start) {
···4949 };
5050}
51515252-Ant.println("=== Counter Example ===");
5252+console.log("=== Counter Example ===");
5353let counter = new Counter(10);
5454-Ant.println("Initial value:", counter.getValue());
5555-Ant.println("After increment:", counter.increment());
5656-Ant.println("After increment:", counter.increment());
5757-Ant.println("After decrement:", counter.decrement());
5858-Ant.println("Final value:", counter.getValue());
5959-Ant.println();
5454+console.log("Initial value:", counter.getValue());
5555+console.log("After increment:", counter.increment());
5656+console.log("After increment:", counter.increment());
5757+console.log("After decrement:", counter.decrement());
5858+console.log("Final value:", counter.getValue());
5959+console.log();
60606161// Multiple counters with independent state
6262-Ant.println("=== Multiple Independent Counters ===");
6262+console.log("=== Multiple Independent Counters ===");
6363let counter1 = new Counter(0);
6464let counter2 = new Counter(100);
65656666-Ant.println("counter1 initial:", counter1.getValue());
6767-Ant.println("counter2 initial:", counter2.getValue());
6666+console.log("counter1 initial:", counter1.getValue());
6767+console.log("counter2 initial:", counter2.getValue());
68686969counter1.increment();
7070counter1.increment();
7171counter2.decrement();
72727373-Ant.println("counter1 after 2 increments:", counter1.getValue());
7474-Ant.println("counter2 after 1 decrement:", counter2.getValue());
7575-Ant.println();
7373+console.log("counter1 after 2 increments:", counter1.getValue());
7474+console.log("counter2 after 1 decrement:", counter2.getValue());
7575+console.log();
76767777// Constructor with computed properties
7878function Rectangle(width, height) {
···8686 };
8787}
88888989-Ant.println("=== Rectangle Example ===");
8989+console.log("=== Rectangle Example ===");
9090let rect1 = new Rectangle(5, 10);
9191-Ant.println("Rectangle 5x10:");
9292-Ant.println(" Width:", rect1.width);
9393-Ant.println(" Height:", rect1.height);
9494-Ant.println(" Area:", rect1.area());
9595-Ant.println(" Perimeter:", rect1.perimeter());
9696-Ant.println();
9191+console.log("Rectangle 5x10:");
9292+console.log(" Width:", rect1.width);
9393+console.log(" Height:", rect1.height);
9494+console.log(" Area:", rect1.area());
9595+console.log(" Perimeter:", rect1.perimeter());
9696+console.log();
97979898let rect2 = new Rectangle(3, 7);
9999-Ant.println("Rectangle 3x7:");
100100-Ant.println(" Width:", rect2.width);
101101-Ant.println(" Height:", rect2.height);
102102-Ant.println(" Area:", rect2.area());
103103-Ant.println(" Perimeter:", rect2.perimeter());
104104-Ant.println();
9999+console.log("Rectangle 3x7:");
100100+console.log(" Width:", rect2.width);
101101+console.log(" Height:", rect2.height);
102102+console.log(" Area:", rect2.area());
103103+console.log(" Perimeter:", rect2.perimeter());
104104+console.log();
105105106106// 'this' refers to the object being constructed
107107function Car(make, model, year) {
···113113 };
114114}
115115116116-Ant.println("=== Car Example ===");
116116+console.log("=== Car Example ===");
117117let car1 = new Car("Toyota", "Camry", 2020);
118118let car2 = new Car("Honda", "Civic", 2021);
119119120120-Ant.println("car1:", car1.displayInfo());
121121-Ant.println("car2:", car2.displayInfo());
122122-Ant.println();
120120+console.log("car1:", car1.displayInfo());
121121+console.log("car2:", car2.displayInfo());
122122+console.log();
123123124124// 'this' in nested functions
125125function Account(owner, balance) {
···141141 };
142142}
143143144144-Ant.println("=== Bank Account Example ===");
144144+console.log("=== Bank Account Example ===");
145145let account1 = new Account("Alice", 1000);
146146-Ant.println("Initial:", account1.getInfo());
146146+console.log("Initial:", account1.getInfo());
147147148148account1.deposit(500);
149149-Ant.println("After deposit 500:", account1.getInfo());
149149+console.log("After deposit 500:", account1.getInfo());
150150151151account1.withdraw(200);
152152-Ant.println("After withdraw 200:", account1.getInfo());
153153-Ant.println();
152152+console.log("After withdraw 200:", account1.getInfo());
153153+console.log();
154154155155// Multiple accounts
156156let account2 = new Account("Bob", 2000);
157157-Ant.println("account1:", account1.getInfo());
158158-Ant.println("account2:", account2.getInfo());
159159-Ant.println();
157157+console.log("account1:", account1.getInfo());
158158+console.log("account2:", account2.getInfo());
159159+console.log();
160160161161-Ant.println("=== Summary ===");
162162-Ant.println("- 'new' creates a new object");
163163-Ant.println("- 'this' inside constructor refers to the new object");
164164-Ant.println("- Each instance has its own 'this' context");
165165-Ant.println("- Methods can access and modify 'this' properties");
161161+console.log("=== Summary ===");
162162+console.log("- 'new' creates a new object");
163163+console.log("- 'this' inside constructor refers to the new object");
164164+console.log("- Each instance has its own 'this' context");
165165+console.log("- Methods can access and modify 'this' properties");
+1-1
tests/throw.cjs
···1010}
11111212meow();
1313-Ant.println('This should not print');
1313+console.log('This should not print');