add any promise

This commit is contained in:
BlackMATov
2019-12-30 12:54:49 +07:00
parent 88fb09749e
commit 00b102f82c
2 changed files with 153 additions and 35 deletions

View File

@@ -692,9 +692,23 @@ TEST_CASE("promise") {
}
{
bool all_is_ok = false;
auto p = pr::make_all_promise(std::vector<pr::promise<int>>{
pr::make_resolved_promise(32),
pr::make_resolved_promise(10)
auto p = pr::make_resolved_promise().then_all([](){
return std::vector<pr::promise<int>>{
pr::make_resolved_promise(32),
pr::make_resolved_promise(10)};
}).then([&all_is_ok](const std::vector<int>& c){
all_is_ok = (2 == c.size())
&& c[0] == 32
&& c[1] == 10;
});
REQUIRE(all_is_ok);
}
{
bool all_is_ok = false;
auto p = pr::make_resolved_promise(1).then_all([](int){
return std::vector<pr::promise<int>>{
pr::make_resolved_promise(32),
pr::make_resolved_promise(10)};
}).then([&all_is_ok](const std::vector<int>& c){
all_is_ok = (2 == c.size())
&& c[0] == 32
@@ -749,6 +763,60 @@ TEST_CASE("promise") {
});
}
}
SECTION("make_any_promise") {
REQUIRE_THROWS_AS(
pr::make_any_promise(std::vector<pr::promise<int>>{}),
std::logic_error);
{
auto p = pr::make_resolved_promise().then_any([](){
return std::vector<pr::promise<int>>{
pr::make_resolved_promise(32),
pr::make_resolved_promise(10)};
}).then([](int i){
return i;
});
REQUIRE(p.get() == 32);
}
{
auto p = pr::make_resolved_promise(1).then_any([](int){
return std::vector<pr::promise<int>>{
pr::make_resolved_promise(32),
pr::make_resolved_promise(10)};
}).then([](int i){
return i;
});
REQUIRE(p.get() == 32);
}
{
auto p = pr::make_any_promise(std::vector<pr::promise<int>>{
pr::make_resolved_promise(32),
pr::make_rejected_promise<int>(std::logic_error("hello fail"))
}).then([](int i){
return i;
});
REQUIRE(p.get() == 32);
}
{
auto p = pr::make_any_promise(std::vector<pr::promise<int>>{
pr::make_rejected_promise<int>(std::logic_error("hello fail")),
pr::make_resolved_promise(32)
}).then([](int i){
return i;
});
REQUIRE(p.get() == 32);
}
{
bool all_is_ok = false;
auto p = pr::make_any_promise(std::vector<pr::promise<int>>{
pr::make_rejected_promise<int>(std::logic_error("hello fail")),
pr::make_rejected_promise<int>(std::logic_error("hello fail"))
}).except([&all_is_ok](std::exception_ptr e){
all_is_ok = true;
return 0;
});
REQUIRE(all_is_ok);
}
}
SECTION("make_race_promise") {
{
auto p1 = pr::promise<int>();