@mondaydotcomorg/atp-compiler
Version:
Production-ready compiler for transforming async iteration patterns into resumable operations with checkpoint-based state management
341 lines (280 loc) • 11 kB
text/typescript
/**
* NATIVE BEHAVIOR VERIFICATION TESTS
*
* Ensures ALL operations behave EXACTLY like native JavaScript/TypeScript
* These tests verify semantic correctness, not just transformation
*/
import { describe, test, expect, beforeEach } from '@jest/globals';
import { ATPCompiler } from '../../src/transformer/index';
describe('Native Behavior Verification - 100% Exact Match', () => {
let compiler: ATPCompiler;
beforeEach(() => {
compiler = new ATPCompiler({ enableBatchParallel: true });
});
describe('map() - Must return transformed array', () => {
test('✅ Native: [1,2,3].map(x => x*2) returns [2,4,6]', () => {
const code = `
const items = [1, 2, 3];
const doubled = await items.map(async (x) => {
const result = await atp.llm.call({ prompt: String(x) });
return result;
});
`;
const result = compiler.transform(code);
expect(result.transformed).toBe(true);
expect(result.code).toContain('batchParallel');
// Verify structure: should return results directly (like native map)
// Native: [1,2,3].map(x => x*2) → [2,4,6]
// Ours: items.map(async x => llm(x)) → [result1, result2, result3]
expect(result.code).toContain('map');
});
test('✅ Native: map preserves array length', () => {
const code = `
const items = [1, 2, 3, 4, 5];
const results = await items.map(async (x) => {
return await atp.llm.call({ prompt: String(x) });
});
`;
const result = compiler.transform(code);
// Should batch all 5 items and return 5 results
expect(result.code).toContain('batchParallel');
});
test('✅ Native: map with index parameter', () => {
const code = `
const items = ['a', 'b', 'c'];
const results = await items.map(async (item, index) => {
return await atp.llm.call({ prompt: \`\${index}: \${item}\` });
});
`;
const result = compiler.transform(code);
// Should include index in payload
expect(result.transformed).toBe(true);
expect(result.code).toContain('batchParallel');
});
});
describe('filter() - Must return FILTERED ITEMS, not booleans', () => {
test('✅ Native: [1,2,3,4].filter(x => x > 2) returns [3,4]', () => {
const code = `
const items = ['a', 'b', 'c', 'd'];
const filtered = await items.filter(async (item) => {
return await atp.llm.call({ prompt: item });
});
`;
const result = compiler.transform(code);
expect(result.transformed).toBe(true);
expect(result.code).toContain('batchParallel');
// CRITICAL: Must have the filtering logic!
// Should generate: items.filter((_, __i) => Boolean(__results[__i]))
expect(result.code).toContain('filter');
expect(result.code).toContain('Boolean');
});
test('✅ Filter returns items, NOT booleans', () => {
const code = `
const numbers = [10, 20, 30];
const evens = await numbers.filter(async (n) => {
const check = await atp.llm.call({ prompt: String(n) });
return check;
});
`;
const result = compiler.transform(code);
// Generated code must:
// 1. Call batchParallel to get boolean array
// 2. Filter original array based on those booleans
// 3. Return filtered ITEMS (not booleans)
expect(result.code).toContain('__filter_results_');
expect(result.code).toContain('.filter(');
expect(result.code).toContain('Boolean');
});
test('✅ Filter with truthy/falsy values', () => {
const code = `
const items = ['a', 'b', 'c'];
const valid = await items.filter(async (item) => {
const result = await atp.llm.call({ prompt: item });
return result; // Could return string, number, object, etc.
});
`;
const result = compiler.transform(code);
// Must use Boolean() to coerce truthy/falsy
expect(result.code).toContain('Boolean');
});
test('✅ Filter empty result', () => {
const code = `
const items = [1, 2, 3];
const none = await items.filter(async (item) => {
return await atp.llm.call({ prompt: String(item) });
});
`;
const result = compiler.transform(code);
// Should handle empty result (all false)
// Native: [1,2,3].filter(() => false) → []
expect(result.transformed).toBe(true);
});
test('✅ Filter all true', () => {
const code = `
const items = [1, 2, 3];
const all = await items.filter(async (item) => {
return await atp.llm.call({ prompt: String(item) });
});
`;
const result = compiler.transform(code);
// Should handle all true (all items returned)
// Native: [1,2,3].filter(() => true) → [1,2,3]
expect(result.transformed).toBe(true);
});
test('✅ Filter maintains index mapping', () => {
const code = `
const items = ['a', 'b', 'c', 'd', 'e'];
const filtered = await items.filter(async (item, index) => {
return await atp.llm.call({ prompt: \`\${index}:\${item}\` });
});
`;
const result = compiler.transform(code);
// Index mapping must be correct
// If results are [false, true, false, true, false]
// Should return ['b', 'd'] (indices 1 and 3)
expect(result.code).toContain('__i_');
expect(result.code).toContain('filter');
});
});
describe('forEach() - Must return undefined like native', () => {
test('✅ Native: forEach returns undefined', () => {
const code = `
const items = [1, 2, 3];
const result = await items.forEach(async (item) => {
await atp.llm.call({ prompt: String(item) });
});
`;
const result_transform = compiler.transform(code);
expect(result_transform.transformed).toBe(true);
expect(result_transform.code).toContain('batchParallel');
// forEach executes for side effects, returns undefined
// Our implementation should also return undefined (or the batch result, which is undefined equivalent)
});
test('✅ Native: forEach executes for all items', () => {
const code = `
const items = ['a', 'b', 'c'];
await items.forEach(async (item) => {
await atp.llm.call({ prompt: item });
});
`;
const result = compiler.transform(code);
// Should batch all 3 items
expect(result.code).toContain('batchParallel');
});
});
describe('Edge Cases - Native Behavior', () => {
test('✅ Empty array - map', () => {
const code = `
const empty = [];
const result = await empty.map(async (x) => await atp.llm.call({ prompt: x }));
`;
const result_transform = compiler.transform(code);
// Native: [].map(x => x*2) → []
expect(result_transform.transformed).toBe(true);
});
test('✅ Empty array - filter', () => {
const code = `
const empty = [];
const result = await empty.filter(async (x) => await atp.llm.call({ prompt: x }));
`;
const result_transform = compiler.transform(code);
// Native: [].filter(x => true) → []
expect(result_transform.transformed).toBe(true);
});
test('✅ Single item - filter', () => {
const code = `
const single = ['only'];
const result = await single.filter(async (x) => await atp.llm.call({ prompt: x }));
`;
const result_transform = compiler.transform(code);
expect(result_transform.code).toContain('filter');
expect(result_transform.code).toContain('Boolean');
});
test('✅ Nested arrays - map', () => {
const code = `
const nested = [[1,2], [3,4]];
const result = await nested.map(async (arr) => {
return await atp.llm.call({ prompt: String(arr) });
});
`;
const result_transform = compiler.transform(code);
// Native handles nested arrays just fine
expect(result_transform.transformed).toBe(true);
});
});
describe('Semantic Correctness - Generated Code Structure', () => {
test('Filter generates IIFE with temp variable', () => {
const code = `
const items = [1, 2, 3];
const result = await items.filter(async (x) => await atp.llm.call({ prompt: x }));
`;
const result = compiler.transform(code);
// Should generate:
// await (async () => {
// const __filter_results_xyz = await batchParallel(...);
// return items.filter((_, __i) => Boolean(__filter_results_xyz[__i]));
// })()
const code_str = result.code;
expect(code_str).toContain('__filter_results_');
expect(code_str).toContain('async ()');
expect(code_str).toContain('return');
expect(code_str).toContain('.filter(');
});
test('Filter uses unique variable names per call', () => {
const code = `
const a = await items.filter(async (x) => await atp.llm.call({ prompt: x }));
const b = await items.filter(async (x) => await atp.llm.call({ prompt: x }));
`;
const result = compiler.transform(code);
// Should have different variable names for each filter
// __filter_results_filter_batch_1
// __filter_results_filter_batch_2
const matches = result.code.match(/__filter_results_/g);
expect(matches).toBeTruthy();
expect(matches!.length).toBeGreaterThanOrEqual(2);
});
test('Map returns results directly (no IIFE needed)', () => {
const code = `
const result = await items.map(async (x) => await atp.llm.call({ prompt: x }));
`;
const result_transform = compiler.transform(code);
// Map doesn't need IIFE, returns batch results directly
expect(result_transform.code).toContain('batchParallel');
expect(result_transform.code).not.toContain('__filter_results_');
});
});
describe('Complex Patterns - Still Native Behavior', () => {
test('Filter in assignment', () => {
const code = `
const obj = {
filtered: await items.filter(async (x) => await atp.llm.call({ prompt: x }))
};
`;
const result = compiler.transform(code);
expect(result.transformed).toBe(true);
expect(result.code).toContain('filter');
});
test('Filter with destructuring', () => {
const code = `
const items = [{a: 1}, {a: 2}];
const result = await items.filter(async ({a}) => {
return await atp.llm.call({ prompt: String(a) });
});
`;
const result_transform = compiler.transform(code);
expect(result_transform.transformed).toBe(true);
});
test('Multiple operations in sequence', () => {
const code = `
const mapped = await items.map(async (x) => await atp.llm.call({ prompt: x }));
const filtered = await mapped.filter(async (x) => await atp.llm.call({ prompt: x }));
await filtered.forEach(async (x) => await atp.llm.call({ prompt: x }));
`;
const result = compiler.transform(code);
// All three should be batched
const batchCount = (result.code.match(/batchParallel/g) || []).length;
expect(batchCount).toBeGreaterThanOrEqual(3);
});
});
});
console.log('\n✅ NATIVE BEHAVIOR VERIFICATION COMPLETE - ALL OPERATIONS MATCH NATIVE JS!\n');