#include "day_manager.h" #include class DayManagerTest : public QObject { Q_OBJECT private slots: void testAddAvailableSlot(); void testDuration(); void testReserveFailure(); void testReserveImplMaximal(); void testReserveImplMinimal(); void testReserveImplQuick(); void testReserveImplRandom(); void testReserveSuccess(); }; void DayManagerTest::testAddAvailableSlot() { DayManager manager(QTime(9, 0), QTime(12, 0)); QCOMPARE(manager.minDurationMs_, 0); QVERIFY(!manager.availableSlots_.isEmpty()); QCOMPARE(manager.availableSlots_.size(), 1); QCOMPARE(manager.availableSlots_.value(QTime(9, 0)), QTime(12, 0)); } void DayManagerTest::testDuration() { DayManager manager(QTime(9, 0), QTime(12, 0)); QCOMPARE(manager.duration(QTime(10, 0)), {}); // Print warning QCOMPARE(manager.duration(QTime(9, 0)), QTime(3, 0)); manager.addAvailableSlot(QTime(12, 0), QTime(13, 0)); QCOMPARE(manager.duration(QTime(12, 0)), QTime(1, 0)); QCOMPARE(manager.duration(), QTime(4, 0)); } void DayManagerTest::testReserveImplQuick() { DayManager manager(QTime(9, 0), QTime(12, 0)); for (int i = 0; i < 3; ++i) { QCOMPARE(manager.slotCount(), 1); QTime availableHourCount = manager.duration(QTime(9 + i, 0)); QCOMPARE(manager.duration(QTime(9 + i, 0)), QTime(3 - i, 0)); auto [begin, end] = manager.reserveImplQuick(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin.isValid()); QVERIFY(end.isValid()); } QCOMPARE(manager.slotCount(), 0); } void DayManagerTest::testReserveImplMaximal() { DayManager manager; manager.addAvailableSlot(QTime(9, 0), QTime(12, 0)); // 3 hour; first, second manager.addAvailableSlot(QTime(8, 0), QTime(9, 0)); // 1 hour manager.addAvailableSlot(QTime(12, 0), QTime(14, 0)); // 2 hour; third auto [begin1, end1] = manager.reserveImplMaximal(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin1.isValid()); QVERIFY(end1.isValid()); QCOMPARE(begin1, QTime(9, 0)); auto [begin2, end2] = manager.reserveImplMaximal(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin2.isValid()); QVERIFY(end2.isValid()); QCOMPARE(begin2, QTime(10, 0)); auto [begin3, end3] = manager.reserveImplMaximal(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin3.isValid()); QVERIFY(end3.isValid()); QCOMPARE(begin3, QTime(12, 0)); QCOMPARE(manager.slotCount(), 3); } void DayManagerTest::testReserveImplMinimal() { DayManager manager; manager.addAvailableSlot(QTime(9, 0), QTime(12, 0)); // 3 hour manager.addAvailableSlot(QTime(8, 0), QTime(9, 0)); // 1 hour; first manager.addAvailableSlot(QTime(12, 0), QTime(14, 0)); // 2 hour; second, third auto [begin1, end1] = manager.reserveImplMinimal(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin1.isValid()); QVERIFY(end1.isValid()); QCOMPARE(begin1, QTime(8, 0)); auto [begin2, end2] = manager.reserveImplMinimal(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin2.isValid()); QVERIFY(end2.isValid()); QCOMPARE(begin2, QTime(12, 0)); auto [begin3, end3] = manager.reserveImplMinimal(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin3.isValid()); QVERIFY(end3.isValid()); QCOMPARE(begin3, QTime(13, 0)); QCOMPARE(manager.slotCount(), 1); } void DayManagerTest::testReserveImplRandom() { DayManager manager(QTime(9, 0), QTime(12, 0)); for (int i = 0; i < 3; ++i) { QCOMPARE(manager.slotCount(), 1); auto [begin, end] = manager.reserveImplRandom(QTime(1, 0).msecsSinceStartOfDay()); QVERIFY(begin.isValid()); QVERIFY(end.isValid()); } QCOMPARE(manager.slotCount(), 0); } void DayManagerTest::testReserveSuccess() { DayManager manager(QTime(9, 0), QTime(12, 0)); manager.setMinDuration(QTime(0, 30)); auto [begin, end] = manager.reserve(QTime(1, 0)); QVERIFY(begin.isValid()); QVERIFY(end.isValid()); QCOMPARE(begin.hour(), 9); QCOMPARE(end.hour(), 10); QCOMPARE(end.minute(), 0); std::tie(begin, end) = manager.reserve(QTime(1, 30)); QVERIFY(begin.isValid()); QVERIFY(end.isValid()); QCOMPARE(begin.hour(), 10); QCOMPARE(end.hour(), 11); QCOMPARE(end.minute(), 30); } void DayManagerTest::testReserveFailure() { DayManager manager(QTime(9, 0), QTime(12, 0)); manager.setMinDuration(QTime(0, 30)); QCOMPARE(manager.duration(QTime(9, 0)), QTime(3, 0)); QTime begin, end; std::tie(begin, end) = manager.reserve(QTime(4, 0)); QVERIFY(!begin.isValid()); QVERIFY(!end.isValid()); std::tie(begin, end) = manager.reserve(QTime(3, 0, 1)); QVERIFY(!begin.isValid()); QVERIFY(!end.isValid()); std::tie(begin, end) = manager.reserve(QTime(2, 30)); QVERIFY(begin.isValid()); QVERIFY(end.isValid()); QVERIFY(!manager.availableSlots_.isEmpty()); QCOMPARE(manager.duration(end), QTime(0, 30)); std::tie(begin, end) = manager.reserve(QTime(0, 0, 1)); QVERIFY(begin.isValid()); QVERIFY(end.isValid()); QCOMPARE(begin.msecsTo(end), QTime(0, 0, 1).msecsSinceStartOfDay()); QVERIFY(manager.availableSlots_.isEmpty()); } QTEST_MAIN(DayManagerTest) #include "day_manager_test.moc"