123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- //
- // coroutine.cpp
- // ~~~~~~~~~~~~~
- //
- // Copyright (c) 2003-2019 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 <boost/asio/coroutine.hpp>
- #include "unit_test.hpp"
- // Must come after all other headers.
- #include <boost/asio/yield.hpp>
- //------------------------------------------------------------------------------
- // Coroutine completes via yield break.
- void yield_break_coro(boost::asio::coroutine& coro)
- {
- reenter (coro)
- {
- yield return;
- yield break;
- }
- }
- void yield_break_test()
- {
- boost::asio::coroutine coro;
- BOOST_ASIO_CHECK(!coro.is_complete());
- yield_break_coro(coro);
- BOOST_ASIO_CHECK(!coro.is_complete());
- yield_break_coro(coro);
- BOOST_ASIO_CHECK(coro.is_complete());
- }
- //------------------------------------------------------------------------------
- // Coroutine completes via return.
- void return_coro(boost::asio::coroutine& coro)
- {
- reenter (coro)
- {
- return;
- }
- }
- void return_test()
- {
- boost::asio::coroutine coro;
- return_coro(coro);
- BOOST_ASIO_CHECK(coro.is_complete());
- }
- //------------------------------------------------------------------------------
- // Coroutine completes via exception.
- void exception_coro(boost::asio::coroutine& coro)
- {
- reenter (coro)
- {
- throw 1;
- }
- }
- void exception_test()
- {
- boost::asio::coroutine coro;
- try { exception_coro(coro); } catch (int) {}
- BOOST_ASIO_CHECK(coro.is_complete());
- }
- //------------------------------------------------------------------------------
- // Coroutine completes by falling off the end.
- void fall_off_end_coro(boost::asio::coroutine& coro)
- {
- reenter (coro)
- {
- }
- }
- void fall_off_end_test()
- {
- boost::asio::coroutine coro;
- fall_off_end_coro(coro);
- BOOST_ASIO_CHECK(coro.is_complete());
- }
- //------------------------------------------------------------------------------
- BOOST_ASIO_TEST_SUITE
- (
- "coroutine",
- BOOST_ASIO_TEST_CASE(yield_break_test)
- BOOST_ASIO_TEST_CASE(return_test)
- BOOST_ASIO_TEST_CASE(exception_test)
- BOOST_ASIO_TEST_CASE(fall_off_end_test)
- )
|