| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- // 语法兼容层的测试。这个转换是"悄悄改错也看不出来"的那类东西,
- // 所以边界情况都钉在测试里。
- 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(''), '');
- expect(toSymjaSyntax(')'), ')'); // 多余的右括号原样留着,让 Symja 去报错
- expect(toSymjaSyntax('sin('), 'Sin[');
- });
- });
- }
|