1 // 2 // coroutine.cpp 3 // ~~~~~~~~~~~~~ 4 // 5 // Copyright (c) 2003-2021 Christopher M. Kohlhoff (chris at kohlhoff dot com) 6 // 7 // Distributed under the Boost Software License, Version 1.0. (See accompanying 8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) 9 // 10 11 // Disable autolinking for unit tests. 12 #if !defined(BOOST_ALL_NO_LIB) 13 #define BOOST_ALL_NO_LIB 1 14 #endif // !defined(BOOST_ALL_NO_LIB) 15 16 // Test that header file is self-contained. 17 #include <boost/asio/coroutine.hpp> 18 19 #include "unit_test.hpp" 20 21 // Must come after all other headers. 22 #include <boost/asio/yield.hpp> 23 24 //------------------------------------------------------------------------------ 25 26 // Coroutine completes via yield break. 27 yield_break_coro(boost::asio::coroutine & coro)28void yield_break_coro(boost::asio::coroutine& coro) 29 { 30 reenter (coro) 31 { 32 yield return; 33 yield break; 34 } 35 } 36 yield_break_test()37void yield_break_test() 38 { 39 boost::asio::coroutine coro; 40 BOOST_ASIO_CHECK(!coro.is_complete()); 41 yield_break_coro(coro); 42 BOOST_ASIO_CHECK(!coro.is_complete()); 43 yield_break_coro(coro); 44 BOOST_ASIO_CHECK(coro.is_complete()); 45 } 46 47 //------------------------------------------------------------------------------ 48 49 // Coroutine completes via return. 50 return_coro(boost::asio::coroutine & coro)51void return_coro(boost::asio::coroutine& coro) 52 { 53 reenter (coro) 54 { 55 return; 56 } 57 } 58 return_test()59void return_test() 60 { 61 boost::asio::coroutine coro; 62 return_coro(coro); 63 BOOST_ASIO_CHECK(coro.is_complete()); 64 } 65 66 //------------------------------------------------------------------------------ 67 68 // Coroutine completes via exception. 69 exception_coro(boost::asio::coroutine & coro)70void exception_coro(boost::asio::coroutine& coro) 71 { 72 reenter (coro) 73 { 74 throw 1; 75 } 76 } 77 exception_test()78void exception_test() 79 { 80 boost::asio::coroutine coro; 81 try { exception_coro(coro); } catch (int) {} 82 BOOST_ASIO_CHECK(coro.is_complete()); 83 } 84 85 //------------------------------------------------------------------------------ 86 87 // Coroutine completes by falling off the end. 88 fall_off_end_coro(boost::asio::coroutine & coro)89void fall_off_end_coro(boost::asio::coroutine& coro) 90 { 91 reenter (coro) 92 { 93 } 94 } 95 fall_off_end_test()96void fall_off_end_test() 97 { 98 boost::asio::coroutine coro; 99 fall_off_end_coro(coro); 100 BOOST_ASIO_CHECK(coro.is_complete()); 101 } 102 103 //------------------------------------------------------------------------------ 104 105 BOOST_ASIO_TEST_SUITE 106 ( 107 "coroutine", 108 BOOST_ASIO_TEST_CASE(yield_break_test) 109 BOOST_ASIO_TEST_CASE(return_test) 110 BOOST_ASIO_TEST_CASE(exception_test) 111 BOOST_ASIO_TEST_CASE(fall_off_end_test) 112 ) 113