|
@@ -152,7 +152,7 @@ void main() {
|
|
|
|
|
|
|
|
test('根式把左边的节点收进被开方数', () {
|
|
test('根式把左边的节点收进被开方数', () {
|
|
|
final d = docWith([LitNode('2')]);
|
|
final d = docWith([LitNode('2')]);
|
|
|
- d.makeSqrt();
|
|
|
|
|
|
|
+ d.applyFunction('Sqrt');
|
|
|
expect(d.toSymja(), 'Sqrt[2]');
|
|
expect(d.toSymja(), 'Sqrt[2]');
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
@@ -245,6 +245,68 @@ void main() {
|
|
|
});
|
|
});
|
|
|
});
|
|
});
|
|
|
|
|
|
|
|
|
|
+ group('函数键:把整个槽包进去', () {
|
|
|
|
|
+ ExprDoc twoXPlusOne() {
|
|
|
|
|
+ final d = ExprDoc();
|
|
|
|
|
+ d.insertChar('2');
|
|
|
|
|
+ d.insert(LitNode('x'));
|
|
|
|
|
+ d.insert(LitNode('+'));
|
|
|
|
|
+ d.insertChar('1');
|
|
|
|
|
+ return d;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ test('打完 2x+1 按 ln → Log[2x+1](整槽,不是只包最后一个节点)', () {
|
|
|
|
|
+ final d = twoXPlusOne();
|
|
|
|
|
+ expect(d.toSymja(), '2x+1');
|
|
|
|
|
+ d.applyFunction('Log');
|
|
|
|
|
+ expect(d.toSymja(), 'Log[2x+1]');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('单参数函数包完只带一个参数(不能多塞空槽)', () {
|
|
|
|
|
+ final d = ExprDoc();
|
|
|
|
|
+ d.insertChar('2');
|
|
|
|
|
+ d.applyFunction('Sqrt');
|
|
|
|
|
+ expect(d.toSymja(), 'Sqrt[2]');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('带预置参数的:整槽当第一个参数,其余照旧', () {
|
|
|
|
|
+ final d = twoXPlusOne();
|
|
|
|
|
+ d.applyFunction('Integrate', prefill: ['', 'x']);
|
|
|
|
|
+ expect(d.toSymja(), 'Integrate[2x+1, x]');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('空槽时按 ln → 空模板,不是 Log[Null] 包 Null', () {
|
|
|
|
|
+ final d = ExprDoc();
|
|
|
|
|
+ d.applyFunction('Log');
|
|
|
|
|
+ expect(d.toSymja(), 'Log[Null]');
|
|
|
|
|
+ d.insertChar('x');
|
|
|
|
|
+ expect(d.toSymja(), 'Log[x]');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('槽尾是运算符时不包 —— 用户刚打完 1+ ,要的是 1+Log[...]', () {
|
|
|
|
|
+ final d = ExprDoc();
|
|
|
|
|
+ d.insertChar('1');
|
|
|
|
|
+ d.insert(LitNode('+'));
|
|
|
|
|
+ d.applyFunction('Log');
|
|
|
|
|
+ expect(d.toSymja(), '1+Log[Null]');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('光标停在中间时也插模板,不把整槽包走', () {
|
|
|
|
|
+ final d = twoXPlusOne();
|
|
|
|
|
+ d.cursor = const SlotPath(<SlotStep>[], 2); // 停在 x 之后、+ 之前
|
|
|
|
|
+ d.applyFunction('Log');
|
|
|
|
|
+ expect(d.toSymja(), '2xLog[Null]+1');
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ test('包完之后光标在函数外面(能继续往后打)', () {
|
|
|
|
|
+ final d = twoXPlusOne();
|
|
|
|
|
+ d.applyFunction('Log');
|
|
|
|
|
+ d.insert(LitNode('+'));
|
|
|
|
|
+ d.insertChar('3');
|
|
|
|
|
+ expect(d.toSymja(), 'Log[2x+1]+3');
|
|
|
|
|
+ });
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
group('光标槽判定', () {
|
|
group('光标槽判定', () {
|
|
|
test('槽内位置不同,仍算同一个槽(渲染光标靠这个)', () {
|
|
test('槽内位置不同,仍算同一个槽(渲染光标靠这个)', () {
|
|
|
const a = SlotPath(<SlotStep>[], 0);
|
|
const a = SlotPath(<SlotStep>[], 0);
|