|
| 1 | +// Copyright (c) 2022 The Bitcoin Core developers |
| 2 | +// Distributed under the MIT software license, see the accompanying |
| 3 | +// file COPYING or http://www.opensource.org/licenses/mit-license.php. |
| 4 | + |
| 5 | +#include <util/result.h> |
| 6 | + |
| 7 | +#include <boost/test/unit_test.hpp> |
| 8 | + |
| 9 | +inline bool operator==(const bilingual_str& a, const bilingual_str& b) |
| 10 | +{ |
| 11 | + return a.original == b.original && a.translated == b.translated; |
| 12 | +} |
| 13 | + |
| 14 | +inline std::ostream& operator<<(std::ostream& os, const bilingual_str& s) |
| 15 | +{ |
| 16 | + return os << "bilingual_str('" << s.original << "' , '" << s.translated << "')"; |
| 17 | +} |
| 18 | + |
| 19 | +BOOST_AUTO_TEST_SUITE(result_tests) |
| 20 | + |
| 21 | +struct NoCopy { |
| 22 | + NoCopy(int n) : m_n{std::make_unique<int>(n)} {} |
| 23 | + std::unique_ptr<int> m_n; |
| 24 | +}; |
| 25 | + |
| 26 | +bool operator==(const NoCopy& a, const NoCopy& b) |
| 27 | +{ |
| 28 | + return *a.m_n == *b.m_n; |
| 29 | +} |
| 30 | + |
| 31 | +std::ostream& operator<<(std::ostream& os, const NoCopy& o) |
| 32 | +{ |
| 33 | + return os << "NoCopy(" << *o.m_n << ")"; |
| 34 | +} |
| 35 | + |
| 36 | +util::Result<int> IntFn(int i, bool success) |
| 37 | +{ |
| 38 | + if (success) return i; |
| 39 | + return util::Error{Untranslated(strprintf("int %i error.", i))}; |
| 40 | +} |
| 41 | + |
| 42 | +util::Result<bilingual_str> StrFn(bilingual_str s, bool success) |
| 43 | +{ |
| 44 | + if (success) return s; |
| 45 | + return util::Error{strprintf(Untranslated("str %s error."), s.original)}; |
| 46 | +} |
| 47 | + |
| 48 | +util::Result<NoCopy> NoCopyFn(int i, bool success) |
| 49 | +{ |
| 50 | + if (success) return {i}; |
| 51 | + return util::Error{Untranslated(strprintf("nocopy %i error.", i))}; |
| 52 | +} |
| 53 | + |
| 54 | +template <typename T> |
| 55 | +void ExpectResult(const util::Result<T>& result, bool success, const bilingual_str& str) |
| 56 | +{ |
| 57 | + BOOST_CHECK_EQUAL(bool(result), success); |
| 58 | + BOOST_CHECK_EQUAL(util::ErrorString(result), str); |
| 59 | +} |
| 60 | + |
| 61 | +template <typename T, typename... Args> |
| 62 | +void ExpectSuccess(const util::Result<T>& result, const bilingual_str& str, Args&&... args) |
| 63 | +{ |
| 64 | + ExpectResult(result, true, str); |
| 65 | + BOOST_CHECK_EQUAL(result.has_value(), true); |
| 66 | + BOOST_CHECK_EQUAL(result.value(), T{std::forward<Args>(args)...}); |
| 67 | + BOOST_CHECK_EQUAL(&result.value(), &*result); |
| 68 | +} |
| 69 | + |
| 70 | +template <typename T, typename... Args> |
| 71 | +void ExpectFail(const util::Result<T>& result, const bilingual_str& str) |
| 72 | +{ |
| 73 | + ExpectResult(result, false, str); |
| 74 | +} |
| 75 | + |
| 76 | +BOOST_AUTO_TEST_CASE(check_returned) |
| 77 | +{ |
| 78 | + ExpectSuccess(IntFn(5, true), {}, 5); |
| 79 | + ExpectFail(IntFn(5, false), Untranslated("int 5 error.")); |
| 80 | + ExpectSuccess(NoCopyFn(5, true), {}, 5); |
| 81 | + ExpectFail(NoCopyFn(5, false), Untranslated("nocopy 5 error.")); |
| 82 | + ExpectSuccess(StrFn(Untranslated("S"), true), {}, Untranslated("S")); |
| 83 | + ExpectFail(StrFn(Untranslated("S"), false), Untranslated("str S error.")); |
| 84 | +} |
| 85 | + |
| 86 | +BOOST_AUTO_TEST_CASE(check_value_or) |
| 87 | +{ |
| 88 | + BOOST_CHECK_EQUAL(IntFn(10, true).value_or(20), 10); |
| 89 | + BOOST_CHECK_EQUAL(IntFn(10, false).value_or(20), 20); |
| 90 | + BOOST_CHECK_EQUAL(NoCopyFn(10, true).value_or(20), 10); |
| 91 | + BOOST_CHECK_EQUAL(NoCopyFn(10, false).value_or(20), 20); |
| 92 | + BOOST_CHECK_EQUAL(StrFn(Untranslated("A"), true).value_or(Untranslated("B")), Untranslated("A")); |
| 93 | + BOOST_CHECK_EQUAL(StrFn(Untranslated("A"), false).value_or(Untranslated("B")), Untranslated("B")); |
| 94 | +} |
| 95 | + |
| 96 | +BOOST_AUTO_TEST_SUITE_END() |
0 commit comments