result_tests.cpp raw

   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()
  98