summaryrefslogtreecommitdiffstats
path: root/tests/auto/concurrent/qtconcurrentfilter
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2020-04-27 14:51:00 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2020-05-07 15:23:58 +0200
commita245945f29621ce9011f4c82f23076d2a28b5aa9 (patch)
treee8ab1284874de87a9cd6f4d4686aefc7b0a762c5 /tests/auto/concurrent/qtconcurrentfilter
parentdaea738b9f04bd836d5f85ff06473c33a268220c (diff)
Add more tests for QtConcurrent::filterReduced()
Test the case where reduce function of the form: V function(T &result, const U &intermediate) has T and U types different. Task-number: QTBUG-83802 Change-Id: Ic89396caba16e7e47ae3ec1527e31b8620f1b08c Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
Diffstat (limited to 'tests/auto/concurrent/qtconcurrentfilter')
-rw-r--r--tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp b/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp
index da8647bbcc..6e01542a57 100644
--- a/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp
+++ b/tests/auto/concurrent/qtconcurrentfilter/tst_qtconcurrentfilter.cpp
@@ -40,7 +40,9 @@ private slots:
void filter();
void filtered();
void filteredReduced();
+ void filteredReducedDifferentType();
void filteredReducedInitialValue();
+ void filteredReducedDifferentTypeInitialValue();
void resultAt();
void incrementalResults();
void noDetach();
@@ -275,6 +277,55 @@ void tst_QtConcurrentFilter::filteredReduced()
CHECK_FAIL("lambda-lambda");
}
+void tst_QtConcurrentFilter::filteredReducedDifferentType()
+{
+ const QList<Number> numberList {1, 2, 3, 4};
+ const int sum = 6; // sum of even values
+
+ auto lambdaIsEven = [](const Number &x) {
+ return (x.toInt() & 1) == 0;
+ };
+ auto lambdaSumReduce = [](int &sum, const Number &x) {
+ sum += x.toInt();
+ };
+
+ // Test the case where reduce function of the form:
+ // V function(T &result, const U &intermediate)
+ // has T and U types different.
+
+ // FUNCTOR-other
+ testFilteredReduced(numberList, sum, KeepEvenNumbers(), NumberSumReduce());
+ CHECK_FAIL("functor-functor");
+ testFilteredReduced(numberList, sum, KeepEvenNumbers(), numberSumReduce);
+ CHECK_FAIL("functor-function");
+ testFilteredReduced(numberList, sum, KeepEvenNumbers(), lambdaSumReduce);
+ CHECK_FAIL("functor-lambda");
+
+ // FUNCTION-other
+ testFilteredReduced(numberList, sum, keepEvenNumbers, NumberSumReduce());
+ CHECK_FAIL("function-functor");
+ testFilteredReduced(numberList, sum, keepEvenNumbers, numberSumReduce);
+ CHECK_FAIL("function-function");
+ testFilteredReduced(numberList, sum, keepEvenNumbers, lambdaSumReduce);
+ CHECK_FAIL("function-lambda");
+
+ // MEMBER-other
+ testFilteredReduced(numberList, sum, &Number::isEven, NumberSumReduce());
+ CHECK_FAIL("member-functor");
+ testFilteredReduced(numberList, sum, &Number::isEven, numberSumReduce);
+ CHECK_FAIL("member-function");
+ testFilteredReduced(numberList, sum, &Number::isEven, lambdaSumReduce);
+ CHECK_FAIL("member-lambda");
+
+ // LAMBDA-other
+ testFilteredReduced(numberList, sum, lambdaIsEven, NumberSumReduce());
+ CHECK_FAIL("lambda-functor");
+ testFilteredReduced(numberList, sum, lambdaIsEven, numberSumReduce);
+ CHECK_FAIL("lambda-function");
+ testFilteredReduced(numberList, sum, lambdaIsEven, lambdaSumReduce);
+ CHECK_FAIL("lambda-lambda");
+}
+
template <typename SourceObject,
typename ResultObject,
typename InitialObject,
@@ -421,6 +472,56 @@ void tst_QtConcurrentFilter::filteredReducedInitialValue()
CHECK_FAIL("lambda-lambda");
}
+void tst_QtConcurrentFilter::filteredReducedDifferentTypeInitialValue()
+{
+ const QList<Number> numberList {1, 2, 3, 4};
+ const int initial = 10;
+ const int sum = 16; // sum of even values and initial value
+
+ auto lambdaIsEven = [](const Number &x) {
+ return (x.toInt() & 1) == 0;
+ };
+ auto lambdaSumReduce = [](int &sum, const Number &x) {
+ sum += x.toInt();
+ };
+
+ // Test the case where reduce function of the form:
+ // V function(T &result, const U &intermediate)
+ // has T and U types different.
+
+ // FUNCTOR-other
+ testFilteredReducedInitialValue(numberList, sum, KeepEvenNumbers(), NumberSumReduce(), initial);
+ CHECK_FAIL("functor-functor");
+ testFilteredReducedInitialValue(numberList, sum, KeepEvenNumbers(), numberSumReduce, initial);
+ CHECK_FAIL("functor-function");
+ testFilteredReducedInitialValue(numberList, sum, KeepEvenNumbers(), lambdaSumReduce, initial);
+ CHECK_FAIL("functor-lambda");
+
+ // FUNCTION-other
+ testFilteredReducedInitialValue(numberList, sum, keepEvenNumbers, NumberSumReduce(), initial);
+ CHECK_FAIL("function-functor");
+ testFilteredReducedInitialValue(numberList, sum, keepEvenNumbers, numberSumReduce, initial);
+ CHECK_FAIL("function-function");
+ testFilteredReducedInitialValue(numberList, sum, keepEvenNumbers, lambdaSumReduce, initial);
+ CHECK_FAIL("function-lambda");
+
+ // MEMBER-other
+ testFilteredReducedInitialValue(numberList, sum, &Number::isEven, NumberSumReduce(), initial);
+ CHECK_FAIL("member-functor");
+ testFilteredReducedInitialValue(numberList, sum, &Number::isEven, numberSumReduce, initial);
+ CHECK_FAIL("member-function");
+ testFilteredReducedInitialValue(numberList, sum, &Number::isEven, lambdaSumReduce, initial);
+ CHECK_FAIL("member-lambda");
+
+ // LAMBDA-other
+ testFilteredReducedInitialValue(numberList, sum, lambdaIsEven, NumberSumReduce(), initial);
+ CHECK_FAIL("lambda-functor");
+ testFilteredReducedInitialValue(numberList, sum, lambdaIsEven, numberSumReduce, initial);
+ CHECK_FAIL("lambda-function");
+ testFilteredReducedInitialValue(numberList, sum, lambdaIsEven, lambdaSumReduce, initial);
+ CHECK_FAIL("lambda-lambda");
+}
+
bool filterfn(int i)
{
return (i % 2);