#include #include #include #include "calculatordesigner.h" // ------------------------------------------------------------ 自测入口 ---- // 与 ../calculator/qt_calculator.cpp 完全相同的 5 组用例:验证「界面搭建方式 // 换了,行为不变」。 static bool expectEqual(const char* label, const QString& actual, const QString& expected) { if (actual != expected) { qCritical() << "自测失败:" << label << "实际=" << actual << "预期=" << expected; return false; } qInfo() << "自测通过:" << label << "=>" << actual; return true; } static bool runSelfTest(CalculatorDesigner* calc) { calc->onClear(); calc->onDigit(7); calc->onOperator(QLatin1Char('+')); calc->onDigit(3); calc->onEquals(); if (!expectEqual("7 + 3 =", calc->displayText(), QStringLiteral("10"))) return false; calc->onClear(); calc->onDigit(6); calc->onOperator(QLatin1Char('/')); calc->onDigit(0); calc->onEquals(); if (!expectEqual("6 ÷ 0 =", calc->displayText(), QStringLiteral("Error"))) return false; calc->onClear(); calc->onDigit(4); calc->onDot(); calc->onDigit(5); calc->onOperator(QLatin1Char('+')); calc->onDigit(0); calc->onDot(); calc->onDigit(5); calc->onEquals(); if (!expectEqual("4.5 + 0.5 =", calc->displayText(), QStringLiteral("5"))) return false; calc->onClear(); calc->onDigit(1); calc->onDigit(2); calc->onBackspace(); if (!expectEqual("12 退格", calc->displayText(), QStringLiteral("1"))) return false; calc->onClear(); calc->onDigit(2); calc->onOperator(QLatin1Char('+')); calc->onDigit(3); calc->onOperator(QLatin1Char('+')); calc->onDigit(4); calc->onEquals(); if (!expectEqual("2 + 3 + 4 =(链式运算)", calc->displayText(), QStringLiteral("9"))) return false; calc->onClear(); calc->onDigit(2); calc->onOperator(QLatin1Char('+')); calc->onDigit(3); calc->onOperator(QLatin1Char('*')); calc->onDigit(4); calc->onEquals(); if (!expectEqual("2 + 3 × 4 =(乘法优先于加法)", calc->displayText(), QStringLiteral("14"))) return false; calc->onClear(); calc->onLeftParen(); calc->onDigit(2); calc->onOperator(QLatin1Char('+')); calc->onDigit(3); calc->onRightParen(); calc->onOperator(QLatin1Char('*')); calc->onDigit(4); calc->onEquals(); if (!expectEqual("(2 + 3) × 4 =(括号提升优先级)", calc->displayText(), QStringLiteral("20"))) return false; if (!expectEqual("(2 + 3) × 4 = 表达式区文本", calc->expressionText(), QStringLiteral("(2+3)*4 = 20"))) return false; calc->onClear(); calc->onDigit(1); calc->onOperator(QLatin1Char('+')); calc->onLeftParen(); calc->onDigit(2); calc->onOperator(QLatin1Char('*')); calc->onLeftParen(); calc->onDigit(3); calc->onOperator(QLatin1Char('+')); calc->onDigit(4); calc->onRightParen(); calc->onRightParen(); calc->onEquals(); if (!expectEqual("1 + (2 × (3 + 4)) =(嵌套括号)", calc->displayText(), QStringLiteral("15"))) return false; calc->onClear(); calc->onLeftParen(); calc->onDigit(1); calc->onOperator(QLatin1Char('+')); calc->onDigit(2); calc->onEquals(); // 未手动补齐右括号,应自动闭合后求值 if (!expectEqual("(1 + 2 =(自动补全括号)", calc->displayText(), QStringLiteral("3"))) return false; return true; } int main(int argc, char* argv[]) { QApplication app(argc, argv); CalculatorDesigner calc; calc.show(); if (qgetenv("QT_QPA_PLATFORM") == "offscreen") { QTimer::singleShot(0, &calc, [&calc] { const bool ok = runSelfTest(&calc); QCoreApplication::exit(ok ? 0 : 1); }); } return app.exec(); }