import { Evaluator, Expression, Scope } from '../dist/index.js'; const e = new Evaluator(); e.import({ w: 123 }); const s = new Scope({ sin: 12 }, false); describe('Analyze', () => { it('simple', () => { expect(e.analyze(Expression(' '), s)).toEqual([]); expect(e.analyze(Expression('a + b + @c'), s)).toEqual([['a'], ['b'], ['@c']]); }); it('bad', () => { expect(e.analyze(Expression('a + '), s)).toEqual([]); expect(e.analyze(Expression('a.b.'), s)).toEqual([]); expect(() => e.analyze(Expression('a.b.'))).toThrow(); }); it('local', () => { expect(e.analyze(Expression('let a = 12; a + nil'), s)).toEqual([]); expect(e.analyze(Expression('let a = 12; a + nil'), s)).toEqual([]); expect(e.analyze(Expression('let a = 12; a + b'), s)).toEqual([['b']]); }); it('repeat', () => { expect(e.analyze(Expression('a + b + a + a.b + b.c + a * a !. b'), s)).toEqual([ ['a'], ['b'], ['a', 'b'], ['b', 'c'], ]); }); it('prefixed', () => { expect(e.analyze(Expression('@@a + $b + c. $$ + $'), s)).toEqual([['@@a'], ['$b'], ['c', '$$'], ['$']]); }); it('unicode', () => { expect(e.analyze(Expression('变量.属性 + 变量2[索引] + 函数()'), s)).toEqual([ ['变量', '属性'], ['变量2'], ['索引'], ['函数'], ]); }); it('access', () => { expect(e.analyze(Expression('a .b [1]+b'), s)).toEqual([['a', 'b'], ['b']]); expect(e.analyze(Expression('a. b["x"]+b'), s)).toEqual([['a', 'b'], ['b']]); expect(e.analyze(Expression('a.b[x] + b + c.12.3'), s)).toEqual([['a', 'b'], ['x'], ['b'], ['c', 12, 3]]); }); it('with lib', () => { const e0 = new Evaluator(); const exp = Expression('sin(x) + y::z.t()::cos() + w.123'); expect(e.analyze(exp, s)).toEqual([['sin'], ['x'], ['z', 't'], ['y']]); expect(e0.analyze(exp, s)).toEqual([['sin'], ['x'], ['z', 't'], ['y'], ['w', 123]]); expect(e.analyze(exp)).toEqual([['x'], ['z', 't'], ['y']]); expect(e0.analyze(exp)).toEqual([['x'], ['z', 't'], ['y'], ['w', 123]]); }); });