Skip to content

Commit 21ead1d

Browse files
authored
Merge pull request #1644 from jehelset/jeh/fix-test_concepts_receiver
Uncomment and adjust tests.
2 parents 4214ecc + d282f87 commit 21ead1d

File tree

1 file changed

+129
-133
lines changed

1 file changed

+129
-133
lines changed

test/stdexec/concepts/test_concepts_receiver.cpp

Lines changed: 129 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -14,136 +14,132 @@
1414
// * limitations under the License.
1515
// */
1616

17-
// #include <catch2/catch.hpp>
18-
// #include <stdexec/execution.hpp>
19-
// #include <test_common/receivers.hpp>
20-
21-
// namespace ex = stdexec;
22-
23-
// struct recv_no_set_value {
24-
// friend void tag_invoke(ex::set_stopped_t, recv_no_set_value) noexcept {}
25-
// friend void tag_invoke(ex::set_error_t, recv_no_set_value, std::exception_ptr) noexcept {}
26-
// friend ex::env<> tag_invoke(ex::get_env_t, const recv_no_set_value&) noexcept {
27-
// return {};
28-
// }
29-
// };
30-
31-
// struct recv_set_value_except {
32-
// friend void tag_invoke(ex::set_value_t, recv_set_value_except) {}
33-
// friend void tag_invoke(ex::set_stopped_t, recv_set_value_except) noexcept {}
34-
// friend void tag_invoke(ex::set_error_t, recv_set_value_except, std::exception_ptr) noexcept {}
35-
// friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_except&) noexcept {
36-
// return {};
37-
// }
38-
// };
39-
40-
// struct recv_set_value_noexcept {
41-
// friend void tag_invoke(ex::set_value_t, recv_set_value_noexcept) noexcept {}
42-
// friend void tag_invoke(ex::set_stopped_t, recv_set_value_noexcept) noexcept {}
43-
// friend void tag_invoke(ex::set_error_t, recv_set_value_noexcept, std::exception_ptr) noexcept
44-
// {} friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_noexcept&) noexcept {
45-
// return {};
46-
// }
47-
// };
48-
49-
// struct recv_set_error_except {
50-
// friend void tag_invoke(ex::set_value_t, recv_set_error_except) noexcept {}
51-
// friend void tag_invoke(ex::set_stopped_t, recv_set_error_except) noexcept {}
52-
// friend void tag_invoke(ex::set_error_t, recv_set_error_except, std::exception_ptr) {
53-
// throw std::logic_error{"err"};
54-
// }
55-
// friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_error_except&) noexcept {
56-
// return {};
57-
// }
58-
// };
59-
// struct recv_set_stopped_except {
60-
// friend void tag_invoke(ex::set_value_t, recv_set_stopped_except) noexcept {}
61-
// friend void tag_invoke(ex::set_stopped_t, recv_set_stopped_except) { throw
62-
// std::logic_error{"err"}; } friend void tag_invoke(ex::set_error_t, recv_set_stopped_except,
63-
// std::exception_ptr) noexcept {} friend ex::env<> tag_invoke(ex::get_env_t, const
64-
// recv_set_stopped_except&) noexcept {
65-
// return {};
66-
// }
67-
// };
68-
69-
// struct recv_non_movable {
70-
// recv_non_movable() = default;
71-
// ~recv_non_movable() = default;
72-
// recv_non_movable(recv_non_movable&&) = delete;
73-
// recv_non_movable& operator=(recv_non_movable&&) = delete;
74-
// recv_non_movable(const recv_non_movable&) = default;
75-
// recv_non_movable& operator=(const recv_non_movable&) = default;
76-
77-
// friend void tag_invoke(ex::set_value_t, recv_non_movable) noexcept {}
78-
// friend void tag_invoke(ex::set_stopped_t, recv_non_movable) noexcept {}
79-
// friend void tag_invoke(ex::set_error_t, recv_non_movable, std::exception_ptr) noexcept {}
80-
// friend ex::env<> tag_invoke(ex::get_env_t, const recv_non_movable&) noexcept {
81-
// return {};
82-
// }
83-
// };
84-
85-
// TEST_CASE("receiver types satisfy the receiver concept", "[concepts][receiver]") {
86-
// using namespace empty_recv;
87-
88-
// REQUIRE(ex::receiver<recv0>);
89-
// REQUIRE(ex::receiver<recv_int>);
90-
// REQUIRE(ex::receiver<recv0_ec>);
91-
// REQUIRE(ex::receiver<recv_int_ec>);
92-
// REQUIRE(ex::receiver<recv0_ec, std::error_code>);
93-
// REQUIRE(ex::receiver<recv_int_ec, std::error_code>);
94-
// REQUIRE(ex::receiver<expect_void_receiver>);
95-
// REQUIRE(ex::receiver<expect_void_receiver_ex>);
96-
// REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, int>>);
97-
// REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, double>>);
98-
// REQUIRE(ex::receiver<expect_stopped_receiver>);
99-
// REQUIRE(ex::receiver<expect_stopped_receiver_ex>);
100-
// REQUIRE(ex::receiver<expect_error_receiver>);
101-
// REQUIRE(ex::receiver<expect_error_receiver_ex>);
102-
// REQUIRE(ex::receiver<logging_receiver>);
103-
// }
104-
105-
// TEST_CASE("receiver types satisfy the receiver_of concept", "[concepts][receiver]") {
106-
// using namespace empty_recv;
107-
108-
// REQUIRE(ex::receiver_of<recv0>);
109-
// REQUIRE(ex::receiver_of<recv_int, int>);
110-
// REQUIRE(ex::receiver_of<recv0_ec>);
111-
// REQUIRE(ex::receiver_of<recv_int_ec, int>);
112-
// REQUIRE(ex::receiver_of<expect_void_receiver>);
113-
// REQUIRE(ex::receiver_of<expect_void_receiver_ex>);
114-
// REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, int>, int>);
115-
// REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, double>, double>);
116-
// REQUIRE(ex::receiver_of<expect_stopped_receiver, char>);
117-
// REQUIRE(ex::receiver_of<expect_stopped_receiver_ex, char>);
118-
// REQUIRE(ex::receiver_of<expect_error_receiver, char>);
119-
// REQUIRE(ex::receiver_of<expect_error_receiver_ex, char>);
120-
// REQUIRE(ex::receiver_of<logging_receiver>);
121-
// }
122-
123-
// TEST_CASE(
124-
// "receiver type w/o set_value models receiver but not receiver_of", "[concepts][receiver]") {
125-
// REQUIRE(ex::receiver<recv_no_set_value>);
126-
// REQUIRE(!ex::receiver_of<recv_no_set_value>);
127-
// }
128-
129-
// TEST_CASE("type with set_value noexcept is a receiver", "[concepts][receiver]") {
130-
// REQUIRE(ex::receiver<recv_set_value_noexcept>);
131-
// REQUIRE(ex::receiver_of<recv_set_value_noexcept>);
132-
// }
133-
// TEST_CASE("type with throwing set_value is not a receiver", "[concepts][receiver]") {
134-
// REQUIRE(!ex::receiver<recv_set_value_except>);
135-
// REQUIRE(!ex::receiver_of<recv_set_value_except>);
136-
// }
137-
// TEST_CASE("type with throwing set_error is not a receiver", "[concepts][receiver]") {
138-
// REQUIRE(!ex::receiver<recv_set_error_except>);
139-
// REQUIRE(!ex::receiver_of<recv_set_error_except>);
140-
// }
141-
// TEST_CASE("type with throwing set_stopped is not a receiver", "[concepts][receiver]") {
142-
// REQUIRE(!ex::receiver<recv_set_stopped_except>);
143-
// REQUIRE(!ex::receiver_of<recv_set_stopped_except>);
144-
// }
145-
146-
// TEST_CASE("non-movable type is not a receiver", "[concepts][receiver]") {
147-
// REQUIRE(!ex::receiver<recv_non_movable>);
148-
// REQUIRE(!ex::receiver_of<recv_non_movable>);
149-
// }
17+
#include <catch2/catch.hpp>
18+
#include <stdexec/execution.hpp>
19+
#include <test_common/receivers.hpp>
20+
21+
namespace ex = stdexec;
22+
23+
struct recv_no_set_value {
24+
using receiver_concept = stdexec::receiver_t;
25+
26+
friend void tag_invoke(ex::set_stopped_t, recv_no_set_value) noexcept {}
27+
friend void tag_invoke(ex::set_error_t, recv_no_set_value, std::exception_ptr) noexcept {}
28+
friend ex::env<> tag_invoke(ex::get_env_t, const recv_no_set_value&) noexcept {
29+
return {};
30+
}
31+
};
32+
33+
struct recv_set_value_except {
34+
using receiver_concept = stdexec::receiver_t;
35+
36+
friend void tag_invoke(ex::set_value_t, recv_set_value_except) {}
37+
friend void tag_invoke(ex::set_stopped_t, recv_set_value_except) noexcept {}
38+
friend void tag_invoke(ex::set_error_t, recv_set_value_except, std::exception_ptr) noexcept {}
39+
friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_except&) noexcept {
40+
return {};
41+
}
42+
};
43+
44+
struct recv_set_value_noexcept {
45+
using receiver_concept = stdexec::receiver_t;
46+
47+
friend void tag_invoke(ex::set_value_t, recv_set_value_noexcept) noexcept {}
48+
friend void tag_invoke(ex::set_stopped_t, recv_set_value_noexcept) noexcept {}
49+
friend void tag_invoke(ex::set_error_t, recv_set_value_noexcept, std::exception_ptr) noexcept
50+
{} friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_value_noexcept&) noexcept {
51+
return {};
52+
}
53+
};
54+
55+
struct recv_set_error_except {
56+
using receiver_concept = stdexec::receiver_t;
57+
58+
friend void tag_invoke(ex::set_value_t, recv_set_error_except) noexcept {}
59+
friend void tag_invoke(ex::set_stopped_t, recv_set_error_except) noexcept {}
60+
friend void tag_invoke(ex::set_error_t, recv_set_error_except, std::exception_ptr) {
61+
throw std::logic_error{"err"};
62+
}
63+
friend ex::env<> tag_invoke(ex::get_env_t, const recv_set_error_except&) noexcept {
64+
return {};
65+
}
66+
};
67+
struct recv_set_stopped_except {
68+
using receiver_concept = stdexec::receiver_t;
69+
70+
friend void tag_invoke(ex::set_value_t, recv_set_stopped_except) noexcept {}
71+
friend void tag_invoke(ex::set_stopped_t, recv_set_stopped_except) { throw
72+
std::logic_error{"err"}; } friend void tag_invoke(ex::set_error_t, recv_set_stopped_except,
73+
std::exception_ptr) noexcept {} friend ex::env<> tag_invoke(ex::get_env_t, const
74+
recv_set_stopped_except&) noexcept {
75+
return {};
76+
}
77+
};
78+
79+
struct recv_non_movable {
80+
using receiver_concept = stdexec::receiver_t;
81+
82+
recv_non_movable() = default;
83+
~recv_non_movable() = default;
84+
recv_non_movable(recv_non_movable&&) = delete;
85+
recv_non_movable& operator=(recv_non_movable&&) = delete;
86+
recv_non_movable(const recv_non_movable&) = default;
87+
recv_non_movable& operator=(const recv_non_movable&) = default;
88+
89+
friend void tag_invoke(ex::set_value_t, recv_non_movable) noexcept {}
90+
friend void tag_invoke(ex::set_stopped_t, recv_non_movable) noexcept {}
91+
friend void tag_invoke(ex::set_error_t, recv_non_movable, std::exception_ptr) noexcept {}
92+
friend ex::env<> tag_invoke(ex::get_env_t, const recv_non_movable&) noexcept {
93+
return {};
94+
}
95+
};
96+
97+
TEST_CASE("receiver types satisfy the receiver concept", "[concepts][receiver]") {
98+
using namespace empty_recv;
99+
100+
REQUIRE(ex::receiver<recv0>);
101+
REQUIRE(ex::receiver<recv_int>);
102+
REQUIRE(ex::receiver<recv0_ec>);
103+
REQUIRE(ex::receiver<recv_int_ec>);
104+
REQUIRE(ex::receiver<expect_void_receiver<>>);
105+
REQUIRE(ex::receiver<expect_void_receiver_ex>);
106+
REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, int>>);
107+
REQUIRE(ex::receiver<expect_value_receiver<ex::env<>, double>>);
108+
REQUIRE(ex::receiver<expect_stopped_receiver<>>);
109+
REQUIRE(ex::receiver<expect_stopped_receiver_ex<>>);
110+
REQUIRE(ex::receiver<expect_error_receiver<>>);
111+
REQUIRE(ex::receiver<expect_error_receiver_ex<std::error_code>>);
112+
REQUIRE(ex::receiver<logging_receiver>);
113+
}
114+
115+
TEST_CASE("receiver types satisfy the receiver_of concept", "[concepts][receiver]") {
116+
using namespace empty_recv;
117+
118+
REQUIRE(ex::receiver_of<recv_int, ex::completion_signatures<ex::set_value_t(int)>>);
119+
REQUIRE(ex::receiver_of<recv0_ec, ex::completion_signatures<ex::set_error_t(std::error_code)>>);
120+
REQUIRE(ex::receiver_of<recv_int_ec, ex::completion_signatures<ex::set_error_t(std::error_code)>>);
121+
REQUIRE(ex::receiver_of<recv_int_ec, ex::completion_signatures<ex::set_value_t(int)>>);
122+
REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, int>, ex::completion_signatures<ex::set_value_t(int)>>);
123+
REQUIRE(ex::receiver_of<expect_value_receiver<ex::env<>, double>, ex::completion_signatures<ex::set_value_t(double)>>);
124+
REQUIRE(ex::receiver_of<expect_stopped_receiver<>, ex::completion_signatures<ex::set_value_t(char)>>);
125+
REQUIRE(ex::receiver_of<expect_stopped_receiver_ex<>, ex::completion_signatures<ex::set_value_t(char)>>);
126+
REQUIRE(ex::receiver_of<expect_error_receiver<>, ex::completion_signatures<ex::set_value_t(char)>>);
127+
REQUIRE(ex::receiver_of<expect_error_receiver_ex<std::error_code>, ex::completion_signatures<ex::set_value_t(char)>>);
128+
REQUIRE(ex::receiver_of<logging_receiver, ex::completion_signatures<ex::set_value_t(char)>>);
129+
}
130+
131+
TEST_CASE(
132+
"receiver type w/o set_value models receiver but not receiver_of", "[concepts][receiver]") {
133+
REQUIRE(ex::receiver<recv_no_set_value>);
134+
REQUIRE(!ex::receiver_of<recv_no_set_value, ex::completion_signatures<ex::set_value_t()>>);
135+
}
136+
137+
TEST_CASE("type with set_value noexcept is a receiver", "[concepts][receiver]") {
138+
REQUIRE(ex::receiver<recv_set_value_noexcept>);
139+
REQUIRE(ex::receiver_of<recv_set_value_noexcept, ex::completion_signatures<ex::set_value_t()>>);
140+
}
141+
142+
TEST_CASE("non-movable type is not a receiver", "[concepts][receiver]") {
143+
REQUIRE(!ex::receiver<recv_non_movable>);
144+
REQUIRE(!ex::receiver_of<recv_non_movable, ex::completion_signatures<ex::set_value_t()>>);
145+
}

0 commit comments

Comments
 (0)