/ src / test / result_tests.cpp
result_tests.cpp
 1  // Copyright (c) 2022-present 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{Untranslated(strprintf("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      T expected{std::forward<Args>(args)...};
67      BOOST_CHECK_EQUAL(result.value(), expected);
68      BOOST_CHECK_EQUAL(&result.value(), &*result);
69  }
70  
71  template <typename T, typename... Args>
72  void ExpectFail(const util::Result<T>& result, const bilingual_str& str)
73  {
74      ExpectResult(result, false, str);
75  }
76  
77  BOOST_AUTO_TEST_CASE(check_returned)
78  {
79      ExpectSuccess(IntFn(5, true), {}, 5);
80      ExpectFail(IntFn(5, false), Untranslated("int 5 error."));
81      ExpectSuccess(NoCopyFn(5, true), {}, 5);
82      ExpectFail(NoCopyFn(5, false), Untranslated("nocopy 5 error."));
83      ExpectSuccess(StrFn(Untranslated("S"), true), {}, Untranslated("S"));
84      ExpectFail(StrFn(Untranslated("S"), false), Untranslated("str S error."));
85  }
86  
87  BOOST_AUTO_TEST_CASE(check_value_or)
88  {
89      BOOST_CHECK_EQUAL(IntFn(10, true).value_or(20), 10);
90      BOOST_CHECK_EQUAL(IntFn(10, false).value_or(20), 20);
91      BOOST_CHECK_EQUAL(NoCopyFn(10, true).value_or(20), 10);
92      BOOST_CHECK_EQUAL(NoCopyFn(10, false).value_or(20), 20);
93      BOOST_CHECK_EQUAL(StrFn(Untranslated("A"), true).value_or(Untranslated("B")), Untranslated("A"));
94      BOOST_CHECK_EQUAL(StrFn(Untranslated("A"), false).value_or(Untranslated("B")), Untranslated("B"));
95  }
96  
97  BOOST_AUTO_TEST_SUITE_END()