// 语法兼容层的测试。这个转换是"悄悄改错也看不出来"的那类东西, // 所以边界情况都钉在测试里。 import 'package:flutter_test/flutter_test.dart'; import 'package:cal/expr_syntax.dart'; void main() { group('函数调用', () { test('小写括号写法转成 Symja 方括号', () { expect(toSymjaSyntax('sin(x)'), 'Sin[x]'); expect(toSymjaSyntax('ln(x)'), 'Log[x]'); expect(toSymjaSyntax('sqrt(x)'), 'Sqrt[x]'); expect(toSymjaSyntax('abs(x)'), 'Abs[x]'); }); test('函数名大小写不敏感', () { expect(toSymjaSyntax('SIN(x)'), 'Sin[x]'); expect(toSymjaSyntax('Sin(x)'), 'Sin[x]'); }); test('嵌套调用', () { expect(toSymjaSyntax('sin(cos(x))'), 'Sin[Cos[x]]'); expect(toSymjaSyntax('sqrt(1+x^2)'), 'Sqrt[1+x^2]'); }); test('多参数', () { expect(toSymjaSyntax('max(x, y)'), 'Max[x, y]'); }); test('已经是对的 Symja 写法原样保留', () { expect(toSymjaSyntax('Sin[x]'), 'Sin[x]'); expect(toSymjaSyntax('x^2 + 1'), 'x^2 + 1'); }); }); group('常量', () { test('pi', () { expect(toSymjaSyntax('pi'), 'Pi'); expect(toSymjaSyntax('2*pi'), '2*Pi'); }); test('e 独立成词才转,且不与数字相邻', () { expect(toSymjaSyntax('e^x'), 'E^x'); expect(toSymjaSyntax('e'), 'E'); // 科学计数法不能被拆掉 expect(toSymjaSyntax('1e-3'), '1e-3'); expect(toSymjaSyntax('2.5e10'), '2.5e10'); }); }); group('普通括号不能被当成函数调用', () { test('分组括号保持原样', () { expect(toSymjaSyntax('(x+1)*2'), '(x+1)*2'); expect(toSymjaSyntax('((x))'), '((x))'); }); test('未知名字后面跟括号也不动', () { // 不是我们认识的函数名,就当它是用户自己的变量/函数,原样留着 expect(toSymjaSyntax('f(x)'), 'f(x)'); expect(toSymjaSyntax('myfunc(x+1)'), 'myfunc(x+1)'); }); test('函数与分组混在一起', () { expect(toSymjaSyntax('sin(x)*(x+1)'), 'Sin[x]*(x+1)'); expect(toSymjaSyntax('sin(x)^2 + cos(x)^2'), 'Sin[x]^2 + Cos[x]^2'); }); }); group('隐式乘法', () { test('数字紧跟字母补乘号', () { expect(toSymjaSyntax('2x'), '2*x'); expect(toSymjaSyntax('3sin(x)'), '3*Sin[x]'); }); test('单独的系数不动', () { expect(toSymjaSyntax('2*x'), '2*x'); expect(toSymjaSyntax('2'), '2'); }); }); group('symjaRewriteOf 只在真的改了才返回', () { test('改了', () { expect(symjaRewriteOf('sin(x)'), 'Sin[x]'); }); test('没改', () { expect(symjaRewriteOf('Sin[x]'), isNull); expect(symjaRewriteOf('x^2'), isNull); }); }); group('根号(法向量工具用的老写法)', () { test('√ 后跟数字', () { expect(toSymjaSyntax('√3'), 'Sqrt[3]'); expect(toSymjaSyntax('√2'), 'Sqrt[2]'); }); test('系数与根号之间补乘号', () { expect(toSymjaSyntax('2√3'), '2*Sqrt[3]'); expect(toSymjaSyntax('3√2/2'), '3*Sqrt[2]/2'); }); test('√ 后跟配平的括号', () { expect(toSymjaSyntax('√(x+1)'), 'Sqrt[(x+1)]'); expect(toSymjaSyntax('√(2+3)*4'), 'Sqrt[(2+3)]*4'); }); test('√ 后跟字母变量', () { expect(toSymjaSyntax('√x'), 'Sqrt[x]'); }); test('负数与分数系数', () { expect(toSymjaSyntax('-√3'), '-Sqrt[3]'); expect(toSymjaSyntax('1/2√3'), '1/2*Sqrt[3]'); }); test('√ 后面什么都没有也不崩', () { expect(toSymjaSyntax('√'), 'Sqrt[Null]'); }); }); group('不该崩', () { test('空串与怪输入', () { expect(toSymjaSyntax(''), ''); expect(toSymjaSyntax(')'), ')'); // 多余的右括号原样留着,让 Symja 去报错 expect(toSymjaSyntax('sin('), 'Sin['); }); }); }