LCOV - code coverage report
Current view: top level - src/test - result_tests.cpp (source / functions) Hit Total Coverage
Test: test_dash_coverage.info Lines: 49 53 92.5 %
Date: 2026-06-25 07:23:51 Functions: 29 31 93.5 %

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

Generated by: LCOV version 1.16