diff options
author | Ivan Solovev <ivan.solovev@qt.io> | 2021-04-23 16:00:17 +0200 |
---|---|---|
committer | Ivan Solovev <ivan.solovev@qt.io> | 2021-05-11 21:05:09 +0200 |
commit | bdaaf99228f9d7385ec18ca7cc741535017e0033 (patch) | |
tree | dd77f32777db3b1cd8c6fe7f3cf20fc68d34c03b /tests/auto/corelib/itemmodels | |
parent | 9134113c4f7d168faa609bbab78fb4901562439c (diff) |
QSFPM: make filterRegularExpression and filterCaseSensitivity bindable
This takes care of the last two QSFPM properties. They were postponed
because of the tricky relation between them and some bugs in handling
the changes.
The bug was fixed in bcbbbdb2d640c059c19e9337c7418b83b1b7e4ea and
now the behavior is well-determined: updating filter regexp does
trigger case sensitivity change and vice versa. However updating
only regexp pattern (via QString overload or setFilterFixedString
or setFilterWildcard) does not change case sensitivity.
Task-number: QTBUG-85520
Change-Id: Idc41cf817de9e6263ed65a80fa40fc8415c8c856
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Andreas Buhr <andreas.buhr@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tests/auto/corelib/itemmodels')
-rw-r--r-- | tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp | 97 | ||||
-rw-r--r-- | tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h | 2 |
2 files changed, 99 insertions, 0 deletions
diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp index 2cee97348f..7df927eccc 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.cpp @@ -5356,4 +5356,101 @@ void tst_QSortFilterProxyModel::autoAcceptChildRowsBinding() "autoAcceptChildRows"); } +void tst_QSortFilterProxyModel::filterCaseSensitivityBinding() +{ + QSortFilterProxyModel proxyModel; + QCOMPARE(proxyModel.filterCaseSensitivity(), Qt::CaseSensitive); + QTestPrivate::testReadWritePropertyBasics<QSortFilterProxyModel, Qt::CaseSensitivity>( + proxyModel, Qt::CaseInsensitive, Qt::CaseSensitive, "filterCaseSensitivity"); + if (QTest::currentTestFailed()) + return; + + // Make sure that setting QRegularExpression updates filterCaseSensitivity + // and invalidates its binding. + QProperty<Qt::CaseSensitivity> setter(Qt::CaseSensitive); + proxyModel.bindableFilterCaseSensitivity().setBinding(Qt::makePropertyBinding(setter)); + QCOMPARE(proxyModel.filterCaseSensitivity(), Qt::CaseSensitive); + QVERIFY(proxyModel.bindableFilterCaseSensitivity().hasBinding()); + + QSignalSpy spy(&proxyModel, &QSortFilterProxyModel::filterCaseSensitivityChanged); + QRegularExpression regExp("pattern", QRegularExpression::CaseInsensitiveOption); + proxyModel.setFilterRegularExpression(regExp); + QCOMPARE(proxyModel.filterCaseSensitivity(), Qt::CaseInsensitive); + QCOMPARE(spy.count(), 1); + QVERIFY(!proxyModel.bindableFilterCaseSensitivity().hasBinding()); +} + +void tst_QSortFilterProxyModel::filterRegularExpressionBinding() +{ + QSortFilterProxyModel proxyModel; + QCOMPARE(proxyModel.filterRegularExpression(), QRegularExpression()); + const QRegularExpression initial("initial", QRegularExpression::CaseInsensitiveOption); + const QRegularExpression changed("changed"); + QTestPrivate::testReadWritePropertyBasics<QSortFilterProxyModel, QRegularExpression>( + proxyModel, initial, changed, "filterRegularExpression"); + if (QTest::currentTestFailed()) + return; + + // Make sure that setting filterCaseSensitivity updates QRegularExpression + // and invalidates its binding. + QProperty<QRegularExpression> setter(initial); + proxyModel.bindableFilterRegularExpression().setBinding(Qt::makePropertyBinding(setter)); + QCOMPARE(proxyModel.filterRegularExpression(), initial); + QVERIFY(proxyModel.bindableFilterRegularExpression().hasBinding()); + + int counter = 0; + auto handler = proxyModel.bindableFilterRegularExpression().onValueChanged( + [&counter]() { ++counter; }); + Q_UNUSED(handler); + proxyModel.setFilterCaseSensitivity(Qt::CaseSensitive); + QCOMPARE(proxyModel.filterRegularExpression(), QRegularExpression(initial.pattern())); + QCOMPARE(counter, 1); + QVERIFY(!proxyModel.bindableFilterRegularExpression().hasBinding()); + + QProperty<Qt::CaseSensitivity> csSetter(Qt::CaseInsensitive); + // Make sure that setting filter string updates QRegularExpression, but does + // not break the binding for case sensitivity. + proxyModel.setFilterRegularExpression(initial); + proxyModel.bindableFilterCaseSensitivity().setBinding(Qt::makePropertyBinding(csSetter)); + QVERIFY(proxyModel.bindableFilterCaseSensitivity().hasBinding()); + + counter = 0; + proxyModel.setFilterRegularExpression("ch(ang|opp)ed"); + // The pattern has changed, but the case sensitivity options are the same. + QCOMPARE(proxyModel.filterRegularExpression(), + QRegularExpression("ch(ang|opp)ed", QRegularExpression::CaseInsensitiveOption)); + QCOMPARE(counter, 1); + QVERIFY(proxyModel.bindableFilterCaseSensitivity().hasBinding()); + + // Make sure that setting filter wildcard updates QRegularExpression, but + // does not break the binding for case sensitivity. + proxyModel.setFilterRegularExpression(initial); + proxyModel.bindableFilterCaseSensitivity().setBinding(Qt::makePropertyBinding(csSetter)); + QVERIFY(proxyModel.bindableFilterCaseSensitivity().hasBinding()); + + counter = 0; + proxyModel.setFilterWildcard("*.jpeg"); + const QString wildcardStr = QRegularExpression::wildcardToRegularExpression( + "*.jpeg", QRegularExpression::UnanchoredWildcardConversion); + // The pattern has changed, but the case sensitivity options are the same. + QCOMPARE(proxyModel.filterRegularExpression(), + QRegularExpression(wildcardStr, QRegularExpression::CaseInsensitiveOption)); + QCOMPARE(counter, 1); + QVERIFY(proxyModel.bindableFilterCaseSensitivity().hasBinding()); + + // Make sure that setting filter fixed string updates QRegularExpression, + // but does not break the binding for case sensitivity. + proxyModel.setFilterRegularExpression(initial); + proxyModel.bindableFilterCaseSensitivity().setBinding(Qt::makePropertyBinding(csSetter)); + QVERIFY(proxyModel.bindableFilterCaseSensitivity().hasBinding()); + + counter = 0; + proxyModel.setFilterFixedString("test"); + // The pattern has changed, but the case sensitivity options are the same. + QCOMPARE(proxyModel.filterRegularExpression(), + QRegularExpression("test", QRegularExpression::CaseInsensitiveOption)); + QCOMPARE(counter, 1); + QVERIFY(proxyModel.bindableFilterCaseSensitivity().hasBinding()); +} + #include "tst_qsortfilterproxymodel.moc" diff --git a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h index 130ec510dd..23687b05b2 100644 --- a/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h +++ b/tests/auto/corelib/itemmodels/qsortfilterproxymodel_common/tst_qsortfilterproxymodel.h @@ -173,6 +173,8 @@ private slots: void filterRoleBinding(); void recursiveFilteringEnabledBinding(); void autoAcceptChildRowsBinding(); + void filterCaseSensitivityBinding(); + void filterRegularExpressionBinding(); protected: void buildHierarchy(const QStringList &data, QAbstractItemModel *model); |