import { Evaluator, Expression, Scope } from '../dist/index.js'; import { compile } from '@mirascript/mirascript'; const e = new Evaluator({ logger: { warn: () => void 0, error: () => void 0, info: () => void 0, debug: () => void 0, }, }); const s = new Scope({}, false); describe('Evaluator.compile should work correctly', () => { it('should eval const', () => { const result = e.compile(Expression('12'), false); expect(result(s, e)).toBe(12); expect(e.evaluate(result, s)).toBe(12); }); it('should eval exp', () => { const result = e.compile(Expression('exp(2)'), false); expect(result(s, e)).toBe(Math.exp(2)); expect(e.evaluate(result, s)).toBe(Math.exp(2)); }); it('should eval error', () => { const result = e.compile(Expression('exp+++'), false); expect(result(s, e)).toBe(null); expect(e.evaluate(result, s)).toBe(null); }); }); describe('Evaluator.compile should convert result', () => { it('should eval const', () => { const result = e.compile(Expression('12', 'string'), false); expect(result(s, e)).toBe('12'); expect(e.evaluate(result, s)).toBe('12'); }); it('should eval exp', () => { const result = e.compile(Expression('exp(2)', 's'), false); expect(result(s, e)).toBe(Math.exp(2).toString()); expect(e.evaluate(result, s)).toBe(Math.exp(2).toString()); }); it('should not convert defaults', () => { { const result = e.compile(Expression('nil', 's'), false); expect(result(s, e)).toBe(null); expect(e.evaluate(result, s, 1)).toBe(1); } { // syntax error const result = e.compile(Expression('exp+++', 's'), false); expect(result(s, e)).toBe(null); expect(e.evaluate(result, s, 1)).toBe(1); } { // runtime error const result = e.compile(Expression('x() + 1', 's'), false); expect(result(s, e)).toBe(null); expect(e.evaluate(result, s, 1)).toBe(1); } }); }); describe('Evaluator.compile should accept compiled script', () => { it('should eval const', async () => { const expr = await compile('12'); const result = e.compile(expr, false); expect(result(s, e)).toBe(12); expect(e.evaluate(result, s)).toBe(12); }); it('should eval exp', async () => { const expr = await compile('exp(2)'); const result = e.compile(expr, false); expect(result(s, e)).toBe(Math.exp(2)); expect(e.evaluate(result, s)).toBe(Math.exp(2)); }); });