#include #include #include #include #include #include #include #include "roster.h" #include "mainwindow.h" #include #include #include "appearance.h" static void savePreview(QWidget &window, const QString &fileName) { const QString folder = QString::fromLocal8Bit(qgetenv("QT_TEACHING_SCREENSHOTS")); if (folder.isEmpty()) return; QDir().mkpath(folder); window.show(); QApplication::processEvents(); QVERIFY(window.grab().save(QDir(folder).filePath(fileName))); } class RaffleTest : public QObject { Q_OBJECT private slots: void initTestCase() { applyAppearance(*qApp); } void parsing() { auto parsed = Roster::parse(QStringLiteral(" 01 张三 \r\n\n02 李四\r\n")); QVERIFY(parsed.ok()); QCOMPARE(parsed.names.size(), 2); QCOMPARE(parsed.names.first(), QStringLiteral("01 张三")); QVERIFY(!Roster::parse(QStringLiteral("张三\n 张三 ")).ok()); QVERIFY(!Roster::parse(QStringLiteral(" \n ")).ok()); QVERIFY(Roster::parse(QStringLiteral("01 张三\n02 张三")).ok()); QVERIFY(!Roster::parse(QString(101, QLatin1Char('x'))).ok()); } void drawingWithoutReplacement() { Roster::Session session; const QStringList names = {QStringLiteral("A"), QStringLiteral("B"), QStringLiteral("C"), QStringLiteral("D")}; session.setNames(names); QRandomGenerator random(12345); QVERIFY(session.draw(5, random).isEmpty()); QCOMPARE(session.remainingCount(), 4); QStringList drawn = session.draw(2, random); drawn.append(session.draw(2, random)); QSet unique; for (const QString &name : drawn) unique.insert(name); QCOMPARE(unique.size(), 4); QCOMPARE(session.remainingCount(), 0); QVERIFY(session.draw(1, random).isEmpty()); session.resetDraw(); QCOMPARE(session.remainingCount(), 4); } void groupingInvariants() { QRandomGenerator random(54321); for (int n = 1; n <= 100; ++n) { QStringList names; for (int i = 0; i < n; ++i) names.append(QString::number(i)); Roster::Session session; session.setNames(names); session.draw(1, random); // 分组仍使用全部名单。 for (bool byCount : {false, true}) { const int value = byCount ? qMin(n, 7) : 7; const auto groups = session.groups(value, byCount, random); QCOMPARE(groups.size(), byCount ? value : (n + value - 1) / value); QSet all; int total = 0, smallest = n, largest = 0; for (const QStringList &group : groups) { QVERIFY(!group.isEmpty()); smallest = qMin(smallest, static_cast(group.size())); largest = qMax(largest, static_cast(group.size())); total += static_cast(group.size()); for (const QString &name : group) all.insert(name); } QCOMPARE(total, n); QCOMPARE(all.size(), n); QVERIFY(largest - smallest <= 1); if (!byCount) QVERIFY(largest <= value); } QVERIFY(session.groups(n + 1, true, random).isEmpty()); } } void uiWorkflow() { MainWindow w; w.show(); auto *names = w.findChild(QStringLiteral("namesEdit")); auto *apply = w.findChild(QStringLiteral("applyButton")); auto *draw = w.findChild(QStringLiteral("drawButton")); auto *chosen = w.findChild(QStringLiteral("chosenEdit")); QVERIFY(!draw->isEnabled()); QTest::mouseClick(apply, Qt::LeftButton); QVERIFY(draw->isEnabled()); QTest::mouseClick(draw, Qt::LeftButton); QVERIFY(!chosen->toPlainText().isEmpty()); savePreview(w, QStringLiteral("03_raffle.png")); w.findChild(QStringLiteral("resultTabs"))->setCurrentIndex(1); QTest::mouseClick(w.findChild(QStringLiteral("groupsButton")), Qt::LeftButton); auto *groups = w.findChild(QStringLiteral("groupsEdit")); QVERIFY(groups->toPlainText().contains(QStringLiteral("第 3 组"))); savePreview(w, QStringLiteral("03_groups.png")); names->setPlainText(QStringLiteral("A\nA")); QVERIFY(!draw->isEnabled()); QVERIFY(groups->toPlainText().isEmpty()); QTest::mouseClick(apply, Qt::LeftButton); QVERIFY(w.findChild(QStringLiteral("statusLabel"))->text().contains(QStringLiteral("重复"))); names->setPlainText(QStringLiteral("A\nB")); QTest::mouseClick(apply, Qt::LeftButton); w.findChild(QStringLiteral("resultTabs"))->setCurrentIndex(0); w.findChild(QStringLiteral("drawCountSpin"))->setValue(2); QTest::mouseClick(draw, Qt::LeftButton); QVERIFY(!draw->isEnabled()); QTest::mouseClick(w.findChild(QStringLiteral("resetButton")), Qt::LeftButton); QVERIFY(draw->isEnabled()); } }; QTEST_MAIN(RaffleTest) #include "test_RaffleGroups.moc"