import 'package:flutter/widgets.dart'; import 'package:test/test.dart'; import 'package:simple_math_calc/solver.dart'; void main() { group('求解器测试', () { final solver = SolverService(); test('简单表达式求值', () { final result = solver.solve('2 + 3 * 4'); expect(result.finalAnswer, contains('14')); }); test('简单方程求解', () { final result = solver.solve('2x + 3 = 7'); expect(result.finalAnswer, contains('x = 2')); }); test('二次方程求解', () { final result = solver.solve('x^2 - 5x + 6 = 0'); debugPrint(result.finalAnswer); expect( result.finalAnswer.contains('x_1 = 2') && result.finalAnswer.contains('x_2 = 3'), true, ); }); test('三角函数求值', () { final result = solver.solve('sin(30)'); debugPrint(result.finalAnswer); expect(result.finalAnswer.contains(r'\frac{1}{2}'), true); }); test('带括号的复杂表达式', () { final result = solver.solve('(2 + 3) * 4'); expect(result.finalAnswer, contains('20')); }); test('括号展开的二次方程', () { final result = solver.solve('(x+8)(x+1)=-12'); debugPrint('Result for (x+8)(x+1)=-12: ${result.finalAnswer}'); // 这个方程应该被识别为一元二次方程,正确解应该是 x = -4 或 x = -5 expect( result.steps.any((step) => step.title == '整理方程'), true, reason: '方程应被识别为一元二次方程并进行整理', ); expect( (result.finalAnswer.contains('-4') && result.finalAnswer.contains('-5')) || result.finalAnswer.contains('x = -4') || result.finalAnswer.contains('x = -5'), true, ); }); test('二次方程根的简化', () { final result = solver.solve('x^2 - 4x - 5 = 0'); debugPrint('Result for x^2 - 4x - 5 = 0: ${result.finalAnswer}'); // 这个方程的根应该是 x = (4 ± √(16 + 20))/2 = (4 ± √36)/2 = (4 ± 6)/2 // 所以 x1 = (4 + 6)/2 = 5, x2 = (4 - 6)/2 = -1 expect( (result.finalAnswer.contains('x_1 = 5') && result.finalAnswer.contains('x_2 = -1')) || (result.finalAnswer.contains('x_1 = -1') && result.finalAnswer.contains('x_2 = 5')), true, reason: '方程 x^2 - 4x - 5 = 0 的根应该被正确简化', ); }); test('二次方程精确度改进', () { final result = solver.solve('x^2 - 2x - 1 = 0'); debugPrint('Result for x^2 - 2x - 1 = 0: ${result.finalAnswer}'); // 这个方程的根应该是 x = (2 ± √(4 + 4))/2 = (2 ± √8)/2 = (2 ± 2√2)/2 = 1 ± √2 // 验证结果包含正确的根格式 expect( result.finalAnswer.contains('x_1') && result.finalAnswer.contains('x_2'), true, reason: '方程应该有两个根', ); expect( result.finalAnswer.contains('1 +') || result.finalAnswer.contains('1 -'), true, reason: '根应该以 1 ± √2 的形式出现', ); }); test('无实数解的二次方程', () { final result = solver.solve('x(55-3x+2)=300'); debugPrint('Result for x(55-3x+2)=300: ${result.finalAnswer}'); // 这个方程展开后为 -3x² + 57x - 300 = 0,判别式为负数,应该无实数解 expect( result.steps.any((step) => step.formula.contains('无实数解')), true, reason: '方程应该被识别为无实数解', ); expect( result.finalAnswer.contains('x_1') && result.finalAnswer.contains('x_2'), true, reason: '应该提供复数根', ); }); test('可绘制函数表达式检测', () { // 测试可绘制的函数表达式 expect(solver.isGraphableExpression('y=x^2'), true); expect(solver.isGraphableExpression('x^2+2x+1'), true); expect(solver.isGraphableExpression('(x-1)(x+3)'), true); // 测试不可绘制的表达式 expect(solver.isGraphableExpression('2+3'), false); expect(solver.isGraphableExpression('hello'), false); expect(solver.isGraphableExpression('x^2=4'), false); // 方程而不是函数 }); test('函数表达式预处理', () { // 测试因式展开 final expanded = solver.prepareFunctionForGraphing('y=(x-1)(x+3)'); expect(expanded, 'x^2+2x-3'); // 测试已展开的表达式 final alreadyExpanded = solver.prepareFunctionForGraphing('x^2+2x+1'); expect(alreadyExpanded, 'x^2+2x+1'); // 测试无y=前缀的表达式 final noPrefix = solver.prepareFunctionForGraphing('(x-1)(x+3)'); expect(noPrefix, 'x^2+2x-3'); // 测试百分比表达式 final percentExpr = solver.prepareFunctionForGraphing('y=80%x'); expect(percentExpr, '80%x'); }); }); }