diff options
Diffstat (limited to 'tests/test_tagdialog.cpp')
| -rw-r--r-- | tests/test_tagdialog.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/tests/test_tagdialog.cpp b/tests/test_tagdialog.cpp index df0fece..5289599 100644 --- a/tests/test_tagdialog.cpp +++ b/tests/test_tagdialog.cpp @@ -45,6 +45,8 @@ private slots: void nothingTouchedYieldsNoChange(); void completionFollowsTheTagAfterAComma(); void acceptingACandidateKeepsTheOtherTags(); + void removeCompletesOnlyTheSelectionsOwnTags(); + void removeStillAcceptsATagItDoesNotSuggest(); }; void TestTagDialog::validNamesAreAccepted() @@ -319,5 +321,65 @@ void TestTagDialog::acceptingACandidateKeepsTheOtherTags() QVERIFY(addEdit->text().contains(QStringLiteral(", "))); } +void TestTagDialog::removeCompletesOnlyTheSelectionsOwnTags() +{ + // Reported by the user: removing a tag suggested every tag in the database. + // Only the tags the selection already carries can be removed, and those are + // already in the dialog as currentTags. + // + // Typed rather than setText(), which does not drive a completer at all. + TagDialog dialog({ QStringLiteral("inbox"), QStringLiteral("unread"), + QStringLiteral("flagged"), QStringLiteral("archive") }, + { { QStringLiteral("inbox"), 1 } }, 1); + dialog.show(); + QVERIFY(QTest::qWaitForWindowExposed(&dialog)); + + const QList<QLineEdit *> edits = dialog.findChildren<QLineEdit *>(); + QVERIFY(edits.size() >= 2); + QLineEdit *removeEdit = edits.at(1); + removeEdit->setFocus(); + QTRY_COMPARE(QApplication::focusWidget(), removeEdit); + + QCompleter *completer = removeEdit->findChild<QCompleter *>(); + QVERIFY(completer); + + // "fl" matches "flagged", which the database has and the selection does not. + QTest::keyClicks(removeEdit, QStringLiteral("fl")); + QCOMPARE(completer->completionPrefix(), QStringLiteral("fl")); + QCOMPARE(completer->completionCount(), 0); + + // A tag the selection does carry still completes. + removeEdit->clear(); + QTest::keyClicks(removeEdit, QStringLiteral("inb")); + QCOMPARE(completer->completionPrefix(), QStringLiteral("inb")); + QCOMPARE(completer->completionCount(), 1); + QCOMPARE(completer->currentCompletion(), QStringLiteral("inbox")); + + // Add is unchanged: it must still reach the whole vocabulary, since + // creating a tag is what that field is for. + QLineEdit *addEdit = edits.at(0); + addEdit->setFocus(); + QTRY_COMPARE(QApplication::focusWidget(), addEdit); + QCompleter *addCompleter = addEdit->findChild<QCompleter *>(); + QVERIFY(addCompleter); + QTest::keyClicks(addEdit, QStringLiteral("fl")); + QVERIFY(addCompleter->completionCount() > 0); +} + +void TestTagDialog::removeStillAcceptsATagItDoesNotSuggest() +{ + // Completion is a suggestion, never a whitelist. Narrowing the candidates + // must not start validating input against them. + TagDialog dialog({ QStringLiteral("inbox") }, + { { QStringLiteral("inbox"), 1 } }, 1); + + const QList<QLineEdit *> edits = dialog.findChildren<QLineEdit *>(); + QVERIFY(edits.size() >= 2); + edits.at(1)->setText(QStringLiteral("flagged")); + dialog.accept(); + + QVERIFY(dialog.tagsToRemove().contains(QStringLiteral("flagged"))); +} + QTEST_MAIN(TestTagDialog) #include "test_tagdialog.moc" |
