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