File indexing completed on 2024-04-28 15:31:52

0001 /*
0002     SPDX-FileCopyrightText: 2011 John Layt <john@layt.net>
0003     SPDX-FileCopyrightText: 2022 g10 Code GmbH
0004     SPDX-FileContributor: Ingo Klöcker <dev@ingo-kloecker.de>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 
0009 #include "kdatecomboboxtest.h"
0010 
0011 #include <QDate>
0012 
0013 #include "kdatecombobox.h"
0014 #include "kdatepickerpopup.h"
0015 
0016 #include <QLineEdit>
0017 #include <QSignalSpy>
0018 #include <QTest>
0019 
0020 QTEST_MAIN(KDateComboBoxTest)
0021 
0022 #ifndef Q_OS_WIN
0023 void initLocale()
0024 {
0025     setenv("LC_ALL", "en_US.utf-8", 1);
0026 }
0027 Q_CONSTRUCTOR_FUNCTION(initLocale)
0028 #endif
0029 
0030 void KDateComboBoxTest::testDefaults()
0031 {
0032     KDateComboBox combo;
0033     QCOMPARE(combo.date(), QDate::currentDate());
0034     // Missing support in QLocale;
0035     // QCOMPARE(m_combo.minimumDate(), KLocale::global()->calendar()->earliestValidDate());
0036     // QCOMPARE(m_combo.maximumDate(), KLocale::global()->calendar()->latestValidDate());
0037     QCOMPARE(combo.isValid(), true);
0038     QCOMPARE(combo.isNull(), false);
0039     QCOMPARE(combo.options(), KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::DateKeywords);
0040     QCOMPARE(combo.displayFormat(), QLocale::ShortFormat);
0041 }
0042 
0043 void KDateComboBoxTest::testValidNull()
0044 {
0045     KDateComboBox combo;
0046     QCOMPARE(combo.isValid(), true);
0047     QCOMPARE(combo.isNull(), false);
0048     combo.setDate(QDate());
0049     QCOMPARE(combo.isValid(), false);
0050     QCOMPARE(combo.isNull(), true);
0051     combo.setDate(QDate(2000, 1, 1));
0052     combo.lineEdit()->setText(QStringLiteral("invalid"));
0053     QCOMPARE(combo.isValid(), false);
0054     QCOMPARE(combo.isNull(), false);
0055 }
0056 
0057 void KDateComboBoxTest::testDateRange()
0058 {
0059     KDateComboBox combo;
0060     combo.setDate(QDate(2000, 1, 1));
0061     // Missing support in QLocale;
0062     // QCOMPARE(m_combo.minimumDate(), KLocale::global()->calendar()->earliestValidDate());
0063     // QCOMPARE(m_combo.maximumDate(), KLocale::global()->calendar()->latestValidDate());
0064     QCOMPARE(combo.isValid(), true);
0065 
0066     combo.setDateRange(QDate(2001, 1, 1), QDate(2002, 1, 1));
0067     QCOMPARE(combo.minimumDate(), QDate(2001, 1, 1));
0068     QCOMPARE(combo.maximumDate(), QDate(2002, 1, 1));
0069     QCOMPARE(combo.isValid(), false);
0070 
0071     combo.setDate(QDate(2003, 1, 1));
0072     QCOMPARE(combo.isValid(), false);
0073     combo.setDate(QDate(2001, 6, 1));
0074     QCOMPARE(combo.isValid(), true);
0075     combo.setDate(QDate(2001, 1, 1));
0076     QCOMPARE(combo.isValid(), true);
0077     combo.setDate(QDate(2002, 1, 1));
0078     QCOMPARE(combo.isValid(), true);
0079     combo.setDate(QDate(2000, 12, 31));
0080     QCOMPARE(combo.isValid(), false);
0081     combo.setDate(QDate(2002, 1, 2));
0082     QCOMPARE(combo.isValid(), false);
0083 
0084     combo.setDateRange(QDate(1995, 1, 1), QDate(1990, 1, 1));
0085     QCOMPARE(combo.minimumDate(), QDate(2001, 1, 1));
0086     QCOMPARE(combo.maximumDate(), QDate(2002, 1, 1));
0087 
0088     combo.setMinimumDate(QDate(2000, 1, 1));
0089     QCOMPARE(combo.minimumDate(), QDate(2000, 1, 1));
0090     QCOMPARE(combo.maximumDate(), QDate(2002, 1, 1));
0091 
0092     combo.setMaximumDate(QDate(2003, 1, 1));
0093     QCOMPARE(combo.minimumDate(), QDate(2000, 1, 1));
0094     QCOMPARE(combo.maximumDate(), QDate(2003, 1, 1));
0095 
0096     combo.resetDateRange();
0097     QVERIFY(!combo.minimumDate().isValid());
0098     QVERIFY(!combo.maximumDate().isValid());
0099 
0100     // Check functioning when the minimum or maximum date is not already set
0101 
0102     combo.setMinimumDate(QDate(2000, 1, 1));
0103     QCOMPARE(combo.minimumDate(), QDate(2000, 1, 1));
0104     QVERIFY(!combo.maximumDate().isValid());
0105 
0106     combo.resetMinimumDate();
0107     QVERIFY(!combo.minimumDate().isValid());
0108     QVERIFY(!combo.maximumDate().isValid());
0109 
0110     combo.setMaximumDate(QDate(2003, 1, 1));
0111     QVERIFY(!combo.minimumDate().isValid());
0112     QCOMPARE(combo.maximumDate(), QDate(2003, 1, 1));
0113 
0114     combo.resetMaximumDate();
0115     QVERIFY(!combo.minimumDate().isValid());
0116     QVERIFY(!combo.maximumDate().isValid());
0117 }
0118 
0119 void KDateComboBoxTest::testDateList()
0120 {
0121     KDateComboBox combo;
0122     QMap<QDate, QString> map;
0123 
0124     // Test default map
0125     QCOMPARE(combo.dateMap(), map);
0126 
0127     // Test basic map
0128     map.clear();
0129     map.insert(QDate(2000, 1, 1), QStringLiteral("New Years Day"));
0130     map.insert(QDate(2000, 1, 2), QString());
0131     map.insert(QDate(2000, 1, 3), QStringLiteral("separator"));
0132     map.insert(QDate(), QStringLiteral("No Date"));
0133     combo.setDateMap(map);
0134     QCOMPARE(combo.dateMap(), map);
0135 }
0136 
0137 void KDateComboBoxTest::testOptions()
0138 {
0139     KDateComboBox combo;
0140     auto datePicker = combo.findChild<KDatePickerPopup *>();
0141     QVERIFY(datePicker);
0142     KDateComboBox::Options options = KDateComboBox::EditDate | KDateComboBox::SelectDate | KDateComboBox::DatePicker | KDateComboBox::DateKeywords;
0143     QCOMPARE(combo.options(), options);
0144     QCOMPARE(datePicker->modes(), KDatePickerPopup::DatePicker | KDatePickerPopup::Words);
0145     options = KDateComboBox::EditDate | KDateComboBox::WarnOnInvalid;
0146     combo.setOptions(options);
0147     QCOMPARE(combo.options(), options);
0148     QCOMPARE(datePicker->modes(), 0);
0149 }
0150 
0151 void KDateComboBoxTest::testDisplayFormat()
0152 {
0153     KDateComboBox combo;
0154     QLocale::FormatType format = QLocale::ShortFormat;
0155     QCOMPARE(combo.displayFormat(), format);
0156     format = QLocale::NarrowFormat;
0157     combo.setDisplayFormat(format);
0158     QCOMPARE(combo.displayFormat(), format);
0159 }
0160 
0161 void KDateComboBoxTest::testSignals()
0162 {
0163     // GIVEN
0164     KDateComboBox combo;
0165     QSignalSpy spyDateEntered(&combo, &KDateComboBox::dateEntered);
0166     QSignalSpy spyDateEdited(&combo, &KDateComboBox::dateEdited);
0167     QSignalSpy spyDateChanged(&combo, &KDateComboBox::dateChanged);
0168     auto clearSpies = [&]() {
0169         spyDateEntered.clear();
0170         spyDateEdited.clear();
0171         spyDateChanged.clear();
0172     };
0173 
0174     // WHEN setting a date programmatically
0175     combo.setDate(QDate(2016, 05, 30));
0176 
0177     // THEN
0178     QCOMPARE(spyDateEntered.count(), 0);
0179     QCOMPARE(spyDateEdited.count(), 0);
0180     QCOMPARE(spyDateChanged.count(), 1);
0181     clearSpies();
0182 
0183     combo.show();
0184     combo.activateWindow();
0185     QVERIFY(QTest::qWaitForWindowActive(&combo));
0186     QCOMPARE(combo.currentText(), QStringLiteral("5/30/2016"));
0187     QCOMPARE(combo.date(), QDate(2016, 5, 30));
0188 
0189     // WHEN typing a new day (Home, Del, '4' -> 30 April 2016)
0190     QTest::keyClick(&combo, Qt::Key_Home);
0191     QTest::keyClick(&combo, Qt::Key_Delete);
0192     QTest::keyClick(&combo, Qt::Key_4);
0193 
0194     // THEN
0195     QCOMPARE(combo.currentText(), QStringLiteral("4/30/2016"));
0196     QCOMPARE(combo.date(), QDate(2016, 4, 30));
0197 
0198     // and losing focus
0199     combo.clearFocus();
0200 
0201     // THEN
0202     QCOMPARE(spyDateEdited.count(), 2);
0203     QCOMPARE(spyDateEntered.count(), 0);
0204     QCOMPARE(spyDateChanged.count(), 1);
0205     clearSpies();
0206 
0207     // WHEN typing Key_Up
0208     QTest::keyClick(&combo, Qt::Key_Up);
0209 
0210     // THEN
0211     QCOMPARE(combo.currentText(), QStringLiteral("5/1/2016"));
0212     QCOMPARE(combo.date(), QDate(2016, 5, 1));
0213     QCOMPARE(spyDateEdited.count(), 0);
0214     QCOMPARE(spyDateEntered.count(), 1);
0215     QCOMPARE(spyDateChanged.count(), 1);
0216     clearSpies();
0217 
0218     // WHEN typing a digit ('6' -> 1 june 2016) then Return
0219     QTest::keyClick(&combo, Qt::Key_Home);
0220     QTest::keyClick(&combo, Qt::Key_Delete);
0221     QTest::keyClick(&combo, Qt::Key_6);
0222     QTest::keyClick(&combo, Qt::Key_Return);
0223 
0224     // THEN
0225     QCOMPARE(combo.currentText(), QStringLiteral("6/1/2016"));
0226     QCOMPARE(combo.date(), QDate(2016, 6, 1));
0227     QCOMPARE(spyDateEdited.count(), 2);
0228     QCOMPARE(spyDateEntered.count(), 1);
0229     QCOMPARE(spyDateChanged.count(), 1);
0230     clearSpies();
0231 }
0232 
0233 void KDateComboBoxTest::testDatePickerIntegration()
0234 {
0235     // GIVEN
0236     KDateComboBox combo;
0237     const QDate minimumDate{2001, 1, 1};
0238     const QDate maximumDate{2106, 1, 1};
0239     combo.setDateRange(minimumDate, maximumDate);
0240     const QDate originalDate{2021, 6, 23};
0241     combo.setDate(originalDate);
0242 
0243     // WHEN the date picker emits dateChanged signal with an invalid date
0244     auto datePicker = combo.findChild<KDatePickerPopup *>();
0245     QVERIFY(datePicker);
0246     const QDate dateOutsideTheAllowedRange{1921, 6, 23};
0247     Q_EMIT datePicker->dateChanged(dateOutsideTheAllowedRange);
0248 
0249     // THEN the combo still has the original date
0250     QCOMPARE(combo.date(), originalDate);
0251 }
0252 
0253 #include "moc_kdatecomboboxtest.cpp"