import fs from 'node:fs' import { abstractSyntaxTree } from './abstractSyntaxTree' import { lexer } from './tokeniser' import { executor, ProgramMemory } from './executor' describe('test', () => { it('test assigning two variables, the second summing with the first', () => { const code = `const myVar = 5 const newVar = myVar + 1` const { root } = exe(code) expect(root.myVar).toBe(5) expect(root.newVar).toBe(6) }) it('test assigning a var with a string', () => { const code = `const myVar = "a str"` const { root } = exe(code) expect(root.myVar).toBe('a str') }) it('test assigning a var by cont concatenating two strings string', () => { const code = fs.readFileSync( './src/lang/testExamples/variableDeclaration.cado', 'utf-8' ) const { root } = exe(code) expect(root.myVar).toBe('a str another str') }) it('test with function call', () => { const code = ` const myVar = "hello" log(5, myVar)` const programMemoryOverride = { log: jest.fn(), } const { root } = executor(abstractSyntaxTree(lexer(code)), { root: programMemoryOverride, _sketch: [], }) expect(root.myVar).toBe('hello') expect(programMemoryOverride.log).toHaveBeenCalledWith(5, 'hello') }) it('fn funcN = () => {}', () => { const { root } = exe( [ 'fn funcN = (a, b) => {', ' return a + b', '}', 'const theVar = 60', 'const magicNum = funcN(9, theVar)', ].join('\n') ) expect(root.theVar).toBe(60) expect(root.magicNum).toBe(69) }) it('sketch declaration', () => { let code = `sketch mySketch { path myPath = lineTo(0,1) lineTo(1,1) path rightPath = lineTo(1,0) close() } show(mySketch) ` const { root, return: _return } = exe(code) expect( root.mySketch.map(({ previousPath, geo, ...rest }: any) => rest) ).toEqual([ { type: 'base', from: [0, 0] }, { type: 'toPoint', to: [0, 1], sourceRange: [25, 45], name: 'myPath' }, { type: 'toPoint', to: [1, 1], sourceRange: [48, 59] }, { type: 'toPoint', to: [1, 0], sourceRange: [67, 90], name: 'rightPath' }, { type: 'close', firstPath: { type: 'base', from: [0, 0] }, sourceRange: [93, 100], }, ]) expect(root.mySketch[0]).toEqual(root.mySketch[4].firstPath) // hmm not sure what handle the "show" function expect(_return).toEqual([ { type: 'Identifier', start: 108, end: 116, name: 'mySketch', }, ]) }) }) // helpers function exe( code: string, programMemory: ProgramMemory = { root: {}, _sketch: [] } ) { const tokens = lexer(code) const ast = abstractSyntaxTree(tokens) return executor(ast, programMemory) }