Branch data Line data Source code
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 : 0 : inline bool operator==(const bilingual_str& a, const bilingual_str& b)
10 : : {
11 : 0 : return a.original == b.original && a.translated == b.translated;
12 : : }
13 : :
14 : 0 : inline std::ostream& operator<<(std::ostream& os, const bilingual_str& s)
15 : : {
16 : 0 : return os << "bilingual_str('" << s.original << "' , '" << s.translated << "')";
17 : : }
18 : :
19 : 0 : BOOST_AUTO_TEST_SUITE(result_tests)
20 : :
21 : : struct NoCopy {
22 : 0 : NoCopy(int n) : m_n{std::make_unique<int>(n)} {}
23 : : std::unique_ptr<int> m_n;
24 : : };
25 : :
26 : 0 : bool operator==(const NoCopy& a, const NoCopy& b)
27 : : {
28 : 0 : return *a.m_n == *b.m_n;
29 : : }
30 : :
31 : 0 : std::ostream& operator<<(std::ostream& os, const NoCopy& o)
32 : : {
33 : 0 : return os << "NoCopy(" << *o.m_n << ")";
34 : : }
35 : :
36 : 0 : util::Result<int> IntFn(int i, bool success)
37 : : {
38 : 0 : if (success) return i;
39 : 0 : return util::Error{Untranslated(strprintf("int %i error.", i))};
40 : 0 : }
41 : :
42 : 0 : util::Result<bilingual_str> StrFn(bilingual_str s, bool success)
43 : : {
44 : 0 : if (success) return s;
45 : 0 : return util::Error{strprintf(Untranslated("str %s error."), s.original)};
46 : 0 : }
47 : :
48 : 0 : util::Result<NoCopy> NoCopyFn(int i, bool success)
49 : : {
50 : 0 : if (success) return {i};
51 : 0 : return util::Error{Untranslated(strprintf("nocopy %i error.", i))};
52 : 0 : }
53 : :
54 : : template <typename T>
55 : 0 : void ExpectResult(const util::Result<T>& result, bool success, const bilingual_str& str)
56 : : {
57 : 0 : BOOST_CHECK_EQUAL(bool(result), success);
58 : 0 : BOOST_CHECK_EQUAL(util::ErrorString(result), str);
59 : 0 : }
60 : :
61 : : template <typename T, typename... Args>
62 : 0 : void ExpectSuccess(const util::Result<T>& result, const bilingual_str& str, Args&&... args)
63 : : {
64 : 0 : ExpectResult(result, true, str);
65 : 0 : BOOST_CHECK_EQUAL(result.has_value(), true);
66 : 0 : BOOST_CHECK_EQUAL(result.value(), T{std::forward<Args>(args)...});
67 : 0 : BOOST_CHECK_EQUAL(&result.value(), &*result);
68 : 0 : }
69 : :
70 : : template <typename T, typename... Args>
71 : 0 : void ExpectFail(const util::Result<T>& result, const bilingual_str& str)
72 : : {
73 : 0 : ExpectResult(result, false, str);
74 : 0 : }
75 : :
76 : 0 : BOOST_AUTO_TEST_CASE(check_returned)
77 : : {
78 : 0 : ExpectSuccess(IntFn(5, true), {}, 5);
79 : 0 : ExpectFail(IntFn(5, false), Untranslated("int 5 error."));
80 : 0 : ExpectSuccess(NoCopyFn(5, true), {}, 5);
81 : 0 : ExpectFail(NoCopyFn(5, false), Untranslated("nocopy 5 error."));
82 : 0 : ExpectSuccess(StrFn(Untranslated("S"), true), {}, Untranslated("S"));
83 : 0 : ExpectFail(StrFn(Untranslated("S"), false), Untranslated("str S error."));
84 : 0 : }
85 : :
86 : 0 : BOOST_AUTO_TEST_CASE(check_value_or)
87 : : {
88 : 0 : BOOST_CHECK_EQUAL(IntFn(10, true).value_or(20), 10);
89 : 0 : BOOST_CHECK_EQUAL(IntFn(10, false).value_or(20), 20);
90 : 0 : BOOST_CHECK_EQUAL(NoCopyFn(10, true).value_or(20), 10);
91 : 0 : BOOST_CHECK_EQUAL(NoCopyFn(10, false).value_or(20), 20);
92 : 0 : BOOST_CHECK_EQUAL(StrFn(Untranslated("A"), true).value_or(Untranslated("B")), Untranslated("A"));
93 : 0 : BOOST_CHECK_EQUAL(StrFn(Untranslated("A"), false).value_or(Untranslated("B")), Untranslated("B"));
94 : 0 : }
95 : :
96 : 0 : BOOST_AUTO_TEST_SUITE_END()
|