|
|
@@ -237,6 +237,47 @@ void main() {
|
|
|
expect(await lastExpr(tester), 'x*2+');
|
|
|
});
|
|
|
|
|
|
+ testWidgets('i 键:编辑框显示小写 i,送进引擎的是大写 I', (tester) async {
|
|
|
+ await pumpApp(tester);
|
|
|
+ await press(tester, 'i');
|
|
|
+
|
|
|
+ // 小写 i 在 Symja 里只是"叫 i 的未定义符号",虚数单位必须是大写 I
|
|
|
+ expect(await lastExpr(tester), 'I');
|
|
|
+ expect(
|
|
|
+ find.descendant(of: find.byType(ExprEditor), matching: find.text('i')),
|
|
|
+ findsOneWidget,
|
|
|
+ );
|
|
|
+ });
|
|
|
+
|
|
|
+ testWidgets('窄字形的点击区不会只剩字形那么宽(回归:i 点不中)', (tester) async {
|
|
|
+ await pumpApp(tester);
|
|
|
+ await press(tester, '2');
|
|
|
+ await press(tester, 'i');
|
|
|
+ expect(await lastExpr(tester), '2I');
|
|
|
+
|
|
|
+ final iRect = tester.getRect(
|
|
|
+ find.descendant(of: find.byType(ExprEditor), matching: find.text('i')),
|
|
|
+ );
|
|
|
+ // 以前就只有字形宽(5~6px),手指点不中;现在至少 12
|
|
|
+ expect(iRect.width, greaterThanOrEqualTo(12));
|
|
|
+
|
|
|
+ // 点左半边 → 光标落到 i 前面,接着打的 x 插在 2 和 i 之间
|
|
|
+ await tester.tapAt(Offset(iRect.left + 1, iRect.center.dy));
|
|
|
+ await tester.pumpAndSettle();
|
|
|
+ await press(tester, 'x');
|
|
|
+ expect(await lastExpr(tester), '2x*I');
|
|
|
+ });
|
|
|
+
|
|
|
+ testWidgets('/.→ 一个键给出代入骨架(原来 /. 和 -> 是两个键)', (tester) async {
|
|
|
+ await pumpApp(tester);
|
|
|
+ await press(tester, 'x');
|
|
|
+ await press(tester, '/.→');
|
|
|
+ await press(tester, '3');
|
|
|
+
|
|
|
+ // 骨架自带变量 x 和箭头,用户只要接着打要代进去的值
|
|
|
+ expect(await lastExpr(tester), 'x/. x -> 3');
|
|
|
+ });
|
|
|
+
|
|
|
testWidgets('用新加的运算符键敲出一个可解的方程', (tester) async {
|
|
|
await pumpApp(tester);
|
|
|
await press(tester, 'solve'); // Solve[□, x],光标在第一个参数
|