Differential D18758 Diff 58398 kdevplatform/3rdparty/qtpromise/qtpromise-0.5.0/tests/auto/qtpromise/helpers/connect/tst_connect.cpp
Changeset View
Changeset View
Standalone View
Standalone View
kdevplatform/3rdparty/qtpromise/qtpromise-0.5.0/tests/auto/qtpromise/helpers/connect/tst_connect.cpp
- This file was added.
1 | #include "../../shared/object.h" | ||||
---|---|---|---|---|---|
2 | #include "../../shared/utils.h" | ||||
3 | | ||||
4 | // QtPromise | ||||
5 | #include <QtPromise> | ||||
6 | | ||||
7 | // Qt | ||||
8 | #include <QtTest> | ||||
9 | | ||||
10 | using namespace QtPromise; | ||||
11 | | ||||
12 | class tst_helpers_connect : public QObject | ||||
13 | { | ||||
14 | Q_OBJECT | ||||
15 | | ||||
16 | private Q_SLOTS: | ||||
17 | // connect(QObject* sender, Signal resolver) | ||||
18 | void resolveOneSenderNoArg(); | ||||
19 | void resolveOneSenderOneArg(); | ||||
20 | void resolveOneSenderManyArgs(); | ||||
21 | | ||||
22 | // connect(QObject* sender, Signal resolver, Signal rejecter) | ||||
23 | void rejectOneSenderNoArg(); | ||||
24 | void rejectOneSenderOneArg(); | ||||
25 | void rejectOneSenderManyArgs(); | ||||
26 | void rejectOneSenderDestroyed(); | ||||
27 | | ||||
28 | // connect(QObject* s0, Signal resolver, QObject* s1, Signal rejecter) | ||||
29 | void rejectTwoSendersNoArg(); | ||||
30 | void rejectTwoSendersOneArg(); | ||||
31 | void rejectTwoSendersManyArgs(); | ||||
32 | void rejectTwoSendersDestroyed(); | ||||
33 | }; | ||||
34 | | ||||
35 | QTEST_MAIN(tst_helpers_connect) | ||||
36 | #include "tst_connect.moc" | ||||
37 | | ||||
38 | void tst_helpers_connect::resolveOneSenderNoArg() | ||||
39 | { | ||||
40 | Object sender; | ||||
41 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
42 | Q_EMIT sender.noArgSignal(); | ||||
43 | }); | ||||
44 | | ||||
45 | auto p = QtPromise::connect(&sender, &Object::noArgSignal); | ||||
46 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<void>>::value)); | ||||
47 | QCOMPARE(sender.hasConnections(), true); | ||||
48 | QCOMPARE(p.isPending(), true); | ||||
49 | QCOMPARE(waitForValue(p, -1, 42), 42); | ||||
50 | QCOMPARE(sender.hasConnections(), false); | ||||
51 | } | ||||
52 | | ||||
53 | void tst_helpers_connect::resolveOneSenderOneArg() | ||||
54 | { | ||||
55 | Object sender; | ||||
56 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
57 | Q_EMIT sender.oneArgSignal("foo"); | ||||
58 | }); | ||||
59 | | ||||
60 | auto p = QtPromise::connect(&sender, &Object::oneArgSignal); | ||||
61 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<QString>>::value)); | ||||
62 | QCOMPARE(sender.hasConnections(), true); | ||||
63 | QCOMPARE(p.isPending(), true); | ||||
64 | QCOMPARE(waitForValue(p, QString()), QString("foo")); | ||||
65 | QCOMPARE(sender.hasConnections(), false); | ||||
66 | } | ||||
67 | | ||||
68 | void tst_helpers_connect::resolveOneSenderManyArgs() | ||||
69 | { | ||||
70 | Object sender; | ||||
71 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
72 | Q_EMIT sender.twoArgsSignal(42, "foo"); | ||||
73 | }); | ||||
74 | | ||||
75 | auto p = QtPromise::connect(&sender, &Object::twoArgsSignal); | ||||
76 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<int>>::value)); | ||||
77 | QCOMPARE(sender.hasConnections(), true); | ||||
78 | QCOMPARE(p.isPending(), true); | ||||
79 | QCOMPARE(waitForValue(p, -1), 42); | ||||
80 | QCOMPARE(sender.hasConnections(), false); | ||||
81 | } | ||||
82 | | ||||
83 | void tst_helpers_connect::rejectOneSenderNoArg() | ||||
84 | { | ||||
85 | Object sender; | ||||
86 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
87 | Q_EMIT sender.noArgSignal(); | ||||
88 | }); | ||||
89 | | ||||
90 | auto p = QtPromise::connect(&sender, &Object::oneArgSignal, &Object::noArgSignal); | ||||
91 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<QString>>::value)); | ||||
92 | QCOMPARE(sender.hasConnections(), true); | ||||
93 | QCOMPARE(p.isPending(), true); | ||||
94 | QCOMPARE(waitForRejected<QPromiseUndefinedException>(p), true); | ||||
95 | QCOMPARE(sender.hasConnections(), false); | ||||
96 | } | ||||
97 | | ||||
98 | void tst_helpers_connect::rejectOneSenderOneArg() | ||||
99 | { | ||||
100 | Object sender; | ||||
101 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
102 | Q_EMIT sender.oneArgSignal("bar"); | ||||
103 | }); | ||||
104 | | ||||
105 | auto p = QtPromise::connect(&sender, &Object::noArgSignal, &Object::oneArgSignal); | ||||
106 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<void>>::value)); | ||||
107 | QCOMPARE(sender.hasConnections(), true); | ||||
108 | QCOMPARE(p.isPending(), true); | ||||
109 | QCOMPARE(waitForError(p, QString()), QString("bar")); | ||||
110 | QCOMPARE(sender.hasConnections(), false); | ||||
111 | } | ||||
112 | | ||||
113 | void tst_helpers_connect::rejectOneSenderManyArgs() | ||||
114 | { | ||||
115 | Object sender; | ||||
116 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
117 | Q_EMIT sender.twoArgsSignal(42, "bar"); | ||||
118 | }); | ||||
119 | | ||||
120 | auto p = QtPromise::connect(&sender, &Object::noArgSignal, &Object::twoArgsSignal); | ||||
121 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<void>>::value)); | ||||
122 | QCOMPARE(sender.hasConnections(), true); | ||||
123 | QCOMPARE(p.isPending(), true); | ||||
124 | QCOMPARE(waitForError(p, -1), 42); | ||||
125 | QCOMPARE(sender.hasConnections(), false); | ||||
126 | } | ||||
127 | | ||||
128 | void tst_helpers_connect::rejectOneSenderDestroyed() | ||||
129 | { | ||||
130 | Object* sender = new Object(); | ||||
131 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
132 | sender->deleteLater(); | ||||
133 | }); | ||||
134 | | ||||
135 | auto p = QtPromise::connect(sender, &Object::twoArgsSignal); | ||||
136 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<int>>::value)); | ||||
137 | QCOMPARE(p.isPending(), true); | ||||
138 | QCOMPARE(waitForRejected<QPromiseContextException>(p), true); | ||||
139 | } | ||||
140 | | ||||
141 | void tst_helpers_connect::rejectTwoSendersNoArg() | ||||
142 | { | ||||
143 | Object s0, s1; | ||||
144 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
145 | Q_EMIT s1.noArgSignal(); | ||||
146 | }); | ||||
147 | | ||||
148 | auto p = QtPromise::connect(&s0, &Object::noArgSignal, &s1, &Object::noArgSignal); | ||||
149 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<void>>::value)); | ||||
150 | QCOMPARE(s0.hasConnections(), true); | ||||
151 | QCOMPARE(s1.hasConnections(), true); | ||||
152 | QCOMPARE(p.isPending(), true); | ||||
153 | QCOMPARE(waitForRejected<QPromiseUndefinedException>(p), true); | ||||
154 | QCOMPARE(s0.hasConnections(), false); | ||||
155 | QCOMPARE(s1.hasConnections(), false); | ||||
156 | } | ||||
157 | | ||||
158 | void tst_helpers_connect::rejectTwoSendersOneArg() | ||||
159 | { | ||||
160 | Object s0, s1; | ||||
161 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
162 | Q_EMIT s1.oneArgSignal("bar"); | ||||
163 | }); | ||||
164 | | ||||
165 | auto p = QtPromise::connect(&s0, &Object::noArgSignal, &s1, &Object::oneArgSignal); | ||||
166 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<void>>::value)); | ||||
167 | QCOMPARE(s0.hasConnections(), true); | ||||
168 | QCOMPARE(s1.hasConnections(), true); | ||||
169 | QCOMPARE(p.isPending(), true); | ||||
170 | QCOMPARE(waitForError(p, QString()), QString("bar")); | ||||
171 | QCOMPARE(s0.hasConnections(), false); | ||||
172 | QCOMPARE(s1.hasConnections(), false); | ||||
173 | } | ||||
174 | | ||||
175 | void tst_helpers_connect::rejectTwoSendersManyArgs() | ||||
176 | { | ||||
177 | Object s0, s1; | ||||
178 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
179 | Q_EMIT s1.twoArgsSignal(42, "bar"); | ||||
180 | }); | ||||
181 | | ||||
182 | auto p = QtPromise::connect(&s0, &Object::noArgSignal, &s1, &Object::twoArgsSignal); | ||||
183 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<void>>::value)); | ||||
184 | QCOMPARE(s0.hasConnections(), true); | ||||
185 | QCOMPARE(s1.hasConnections(), true); | ||||
186 | QCOMPARE(p.isPending(), true); | ||||
187 | QCOMPARE(waitForError(p, -1), 42); | ||||
188 | QCOMPARE(s0.hasConnections(), false); | ||||
189 | QCOMPARE(s1.hasConnections(), false); | ||||
190 | } | ||||
191 | | ||||
192 | void tst_helpers_connect::rejectTwoSendersDestroyed() | ||||
193 | { | ||||
194 | Object* s0 = new Object(); | ||||
195 | Object* s1 = new Object(); | ||||
196 | | ||||
197 | QtPromisePrivate::qtpromise_defer([&]() { | ||||
198 | QObject::connect(s1, &QObject::destroyed, [&]() { | ||||
199 | // Let's first delete s1, then resolve s0 and make sure | ||||
200 | // we don't reject when the rejecter object is destroyed. | ||||
201 | Q_EMIT s0->noArgSignal(); | ||||
202 | }); | ||||
203 | | ||||
204 | s1->deleteLater(); | ||||
205 | }); | ||||
206 | | ||||
207 | auto p = QtPromise::connect(s0, &Object::noArgSignal, s1, &Object::twoArgsSignal); | ||||
208 | Q_STATIC_ASSERT((std::is_same<decltype(p), QPromise<void>>::value)); | ||||
209 | QCOMPARE(p.isPending(), true); | ||||
210 | QCOMPARE(waitForValue(p, -1, 42), 42); | ||||
211 | } |