diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 3a5330f..f24a523 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,3 +1,4 @@ add_subdirectory(playground) add_subdirectory(threads) add_subdirectory(unit-test) +add_subdirectory(mock) diff --git a/test/mock/CMakeLists.txt b/test/mock/CMakeLists.txt new file mode 100644 index 0000000..70d7e1d --- /dev/null +++ b/test/mock/CMakeLists.txt @@ -0,0 +1,9 @@ +add_executable(test-mock + ${CMAKE_CURRENT_LIST_DIR}/test-mock.cpp) + +target_link_libraries(test-mock + PRIVATE + continuable) + +add_test(NAME continuable-mock-tests + COMMAND test-mock) diff --git a/test/mock/test-mock.cpp b/test/mock/test-mock.cpp new file mode 100644 index 0000000..2707ff6 --- /dev/null +++ b/test/mock/test-mock.cpp @@ -0,0 +1,67 @@ +/** + Copyright(c) 2015 - 2017 Denis Blank + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files(the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and / or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions : + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +**/ + +#include +#include + +struct continuable_base { + template continuable_base& then(T&&) { return *this; } + + template continuable_base& dropped(T&&) { return *this; } + + template continuable_base& thrown(T&&) { return *this; } + + template continuable_base& failed(T&&) { return *this; } +}; + +template +struct accumulator { + auto accumulate() { return [] {}; } +}; + +template +auto make_accumulator(Accumulator&& /*ac*/, Initial&&... /*initial*/) { + return std::make_tuple(continuable_base{}, accumulator{}); +} + +continuable_base http_request(std::string) { return {}; } + +int main(int, char**) { + auto accumulator = make_accumulator(std::plus{}, 0); + + http_request("github.com") + .then([](std::string response) { + // ... + (void)response; + }) + .then(std::get<1>(accumulator).accumulate()) + .thrown([](std::exception_ptr exception) { + // ... + (void)exception; + }) + .failed([](std::error_code code) { + // ... + (void)code; + }); + + return 0; +}