logging.h raw

   1  // Copyright (c) 2019-2022 The Limenka 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  #ifndef LIMENKA_TEST_UTIL_LOGGING_H
   6  #define LIMENKA_TEST_UTIL_LOGGING_H
   7  
   8  #include <util/macros.h>
   9  
  10  #include <functional>
  11  #include <list>
  12  #include <string>
  13  
  14  class DebugLogHelper
  15  {
  16      const std::string m_message;
  17      bool m_found{false};
  18      std::list<std::function<void(const std::string&)>>::iterator m_print_connection;
  19  
  20      //! Custom match checking function.
  21      //!
  22      //! Invoked with pointers to lines containing matching strings, and with
  23      //! null if check_found() is called without any successful match.
  24      //!
  25      //! Can return true to enable default DebugLogHelper behavior of:
  26      //! (1) ending search after first successful match, and
  27      //! (2) raising an error in check_found if no match was found
  28      //! Can return false to do the opposite in either case.
  29      using MatchFn = std::function<bool(const std::string* line)>;
  30      MatchFn m_match;
  31  
  32      void check_found();
  33  
  34  public:
  35      explicit DebugLogHelper(std::string message, MatchFn match = [](const std::string*){ return true; });
  36      ~DebugLogHelper() noexcept(false) { check_found(); }
  37  };
  38  
  39  #define ASSERT_DEBUG_LOG(message) DebugLogHelper UNIQUE_NAME(debugloghelper)(message)
  40  
  41  #endif // LIMENKA_TEST_UTIL_LOGGING_H
  42