diff options
author | Yvan Roux <yvan.roux@linaro.org> | 2017-08-16 13:24:45 +0200 |
---|---|---|
committer | Yvan Roux <yvan.roux@linaro.org> | 2017-08-16 13:24:45 +0200 |
commit | ec19e4ad8414fcc7b102456daa5e8c9e58deb5f8 (patch) | |
tree | f07decce1533c6155f8745d5000a20e6cf0f7341 /libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc | |
parent | a1ff34fe4b774f1e27693129d6f2b93576ccef79 (diff) |
Merge branches/gcc-6-branch rev 251111.
Change-Id: I53b64fff4b70d6e8910ec081aab6060963fc16a0
Diffstat (limited to 'libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc')
-rw-r--r-- | libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc | 292 |
1 files changed, 292 insertions, 0 deletions
diff --git a/libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc b/libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc index 9c308c5e69e..2a3f9b89ce3 100644 --- a/libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc +++ b/libstdc++-v3/testsuite/30_threads/promise/members/set_value2.cc @@ -23,10 +23,13 @@ // with this library; see the file COPYING3. If not see // <http://www.gnu.org/licenses/>. +// Test that promise::set_value throws when required. #include <future> #include <testsuite_hooks.h> +// Check for promise_already_satisfied error conditions. + void test01() { bool test = false; @@ -81,9 +84,298 @@ void test02() VERIFY( test ); } +void test03() +{ + bool test = false; + + std::promise<int> p1; + std::future<int> f1 = p1.get_future(); + + p1.set_exception(std::make_exception_ptr(4)); + + try + { + p1.set_value(3); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == + std::make_error_code(std::future_errc::promise_already_satisfied)); + test = true; + } + + std::chrono::milliseconds delay(1); + VERIFY( f1.wait_for(delay) == std::future_status::ready ); + test = false; + try + { + f1.get(); + VERIFY( false ); + } + catch (int e) + { + VERIFY(e == 4 ); + test = true; + } + + VERIFY( test ); +} + +void test04() +{ + bool test = false; + + std::promise<int&> p1; + std::future<int&> f1 = p1.get_future(); + + int i = 1; + p1.set_value(i); + + try + { + p1.set_value(i); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == + std::make_error_code(std::future_errc::promise_already_satisfied)); + test = true; + } + + std::chrono::milliseconds delay(1); + VERIFY( f1.wait_for(delay) == std::future_status::ready ); + VERIFY( f1.get() == 1 ); + VERIFY( test ); +} + +void test05() +{ + bool test = false; + + std::promise<int&> p1; + std::future<int&> f1 = p1.get_future(); + + int i = 3; + p1.set_value(i); + + try + { + p1.set_exception(std::make_exception_ptr(4)); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == + std::make_error_code(std::future_errc::promise_already_satisfied)); + test = true; + } + + std::chrono::milliseconds delay(1); + VERIFY( f1.wait_for(delay) == std::future_status::ready ); + VERIFY( f1.get() == 3 ); + VERIFY( test ); +} + +void test06() +{ + bool test = false; + + std::promise<int&> p1; + std::future<int&> f1 = p1.get_future(); + + p1.set_exception(std::make_exception_ptr(4)); + + try + { + int i = 3; + p1.set_value(i); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == + std::make_error_code(std::future_errc::promise_already_satisfied)); + test = true; + } + + std::chrono::milliseconds delay(1); + VERIFY( f1.wait_for(delay) == std::future_status::ready ); + test = false; + try + { + f1.get(); + VERIFY( false ); + } + catch (int e) + { + VERIFY(e == 4 ); + test = true; + } + + VERIFY( test ); +} + +void test07() +{ + bool test = false; + + std::promise<void> p1; + std::future<void> f1 = p1.get_future(); + + p1.set_value(); + + try + { + p1.set_value(); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == + std::make_error_code(std::future_errc::promise_already_satisfied)); + test = true; + } + + std::chrono::milliseconds delay(1); + VERIFY( f1.wait_for(delay) == std::future_status::ready ); + f1.get(); + VERIFY( test ); +} + +void test08() +{ + bool test = false; + + std::promise<void> p1; + std::future<void> f1 = p1.get_future(); + + p1.set_value(); + + try + { + p1.set_exception(std::make_exception_ptr(4)); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == + std::make_error_code(std::future_errc::promise_already_satisfied)); + test = true; + } + + std::chrono::milliseconds delay(1); + VERIFY( f1.wait_for(delay) == std::future_status::ready ); + f1.get(); + VERIFY( test ); +} + +void test09() +{ + bool test = false; + + std::promise<void> p1; + std::future<void> f1 = p1.get_future(); + + p1.set_exception(std::make_exception_ptr(4)); + + try + { + p1.set_value(); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == + std::make_error_code(std::future_errc::promise_already_satisfied)); + test = true; + } + + std::chrono::milliseconds delay(1); + VERIFY( f1.wait_for(delay) == std::future_status::ready ); + test = false; + try + { + f1.get(); + VERIFY( false ); + } + catch (int e) + { + VERIFY(e == 4 ); + test = true; + } + + VERIFY( test ); +} + +// Check for no_state error condition (PR libstdc++/80316) + +void test10() +{ + using namespace std; + + promise<int> p1; + promise<int> p2(std::move(p1)); + try + { + p1.set_value(1); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == make_error_code(future_errc::no_state)); + } +} + +void test11() +{ + using namespace std; + + promise<int&> p1; + promise<int&> p2(std::move(p1)); + try + { + int i = 0; + p1.set_value(i); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == make_error_code(future_errc::no_state)); + } +} + +void test12() +{ + using namespace std; + + promise<void> p1; + promise<void> p2(std::move(p1)); + try + { + p1.set_value(); + VERIFY( false ); + } + catch (std::future_error& e) + { + VERIFY(e.code() == make_error_code(future_errc::no_state)); + } +} + int main() { test01(); test02(); + test03(); + test04(); + test05(); + test06(); + test07(); + test08(); + test09(); + test10(); + test11(); + test12(); return 0; } |