// // coroutine.cpp // ~~~~~~~~~~~~~ // // Copyright (c) 2003-2020 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // // Disable autolinking for unit tests. #if !defined(BOOST_ALL_NO_LIB) #define BOOST_ALL_NO_LIB 1 #endif // !defined(BOOST_ALL_NO_LIB) // Test that header file is self-contained. #include "asio/coroutine.hpp" #include "unit_test.hpp" // Must come after all other headers. #include "asio/yield.hpp" //------------------------------------------------------------------------------ // Coroutine completes via yield break. void yield_break_coro(asio::coroutine& coro) { reenter (coro) { yield return; yield break; } } void yield_break_test() { asio::coroutine coro; ASIO_CHECK(!coro.is_complete()); yield_break_coro(coro); ASIO_CHECK(!coro.is_complete()); yield_break_coro(coro); ASIO_CHECK(coro.is_complete()); } //------------------------------------------------------------------------------ // Coroutine completes via return. void return_coro(asio::coroutine& coro) { reenter (coro) { return; } } void return_test() { asio::coroutine coro; return_coro(coro); ASIO_CHECK(coro.is_complete()); } //------------------------------------------------------------------------------ // Coroutine completes via exception. void exception_coro(asio::coroutine& coro) { reenter (coro) { throw 1; } } void exception_test() { asio::coroutine coro; try { exception_coro(coro); } catch (int) {} ASIO_CHECK(coro.is_complete()); } //------------------------------------------------------------------------------ // Coroutine completes by falling off the end. void fall_off_end_coro(asio::coroutine& coro) { reenter (coro) { } } void fall_off_end_test() { asio::coroutine coro; fall_off_end_coro(coro); ASIO_CHECK(coro.is_complete()); } //------------------------------------------------------------------------------ ASIO_TEST_SUITE ( "coroutine", ASIO_TEST_CASE(yield_break_test) ASIO_TEST_CASE(return_test) ASIO_TEST_CASE(exception_test) ASIO_TEST_CASE(fall_off_end_test) )