20#ifndef UNIT_TEST_UTILS__H
21#define UNIT_TEST_UTILS__H
23#define BOOST_NO_AUTO_PTR
25#include <boost/test/unit_test.hpp>
26#include <turtle/mock.hpp>
53#define KI_CHECK_OPT_EQUAL( lhs, rhs ) \
54 BOOST_CHECK_EQUAL( PRINTABLE_OPT( lhs ), PRINTABLE_OPT( rhs ) )
60 if( aOptional.
m_Opt.has_value() )
61 aOs << *aOptional.
m_Opt;
69template <
class L,
class R>
72 if( !aLhs.
m_Opt.has_value() && !aRhs.
m_Opt.has_value() )
79template <
class L,
class R>
82 return !( aLhs == aRhs );
96 os <<
"std::vector size " << aVec.size() <<
" [";
98 for(
const auto& i : aVec )
110template <
typename K,
typename V>
113 os <<
"std::map size " << aMap.size() <<
" [";
115 for(
const auto& [key, value] : aMap )
117 os <<
"\n " << key <<
" = " << value;
127template <
typename K,
typename V>
130 os <<
"[" << aPair.first <<
", " << aPair.second <<
"]";
147 os << v.ToUTF8().data();
156template <std::
size_t N>
161 os << tmp.ToUTF8().data();
171template<std::
size_t N>
172struct print_log_value<wchar_t[
N ]>
178 os << tmp.ToUTF8().data();
197template <
typename EXP_CONT>
using EXP_OBJ =
typename EXP_CONT::value_type;
198template <
typename FOUND_CONT>
using FOUND_OBJ =
typename FOUND_CONT::value_type;
216template <
typename EXP_OBJ,
typename FOUND_OBJ>
253template <
typename EXP_CONT,
typename FOUND_CONT,
typename MATCH_PRED>
257 using EXP_OBJ =
typename EXP_CONT::value_type;
260 std::set<const EXP_OBJ*> matched;
263 for(
const auto& found : aFound )
265 for(
const auto&
expected : aExpected )
267 if( aMatchPredicate(
expected, found ) )
276 for(
const EXP_OBJ& exp : aExpected )
278 BOOST_CHECK_MESSAGE( matched.count( &exp ) > 0,
"Expected item was not found. Expected: \n"
283 for(
const EXP_OBJ* found : matched )
285 const bool was_expected = std::find_if( aExpected.begin(), aExpected.end(),
288 return &aObj == found;
289 } ) != aExpected.end();
302 T sorted = aCollection;
303 std::sort( sorted.begin(), sorted.end() );
305 return std::adjacent_find( sorted.begin(), sorted.end() ) == sorted.end();
336#define CHECK_WX_ASSERT( STATEMENT ) BOOST_CHECK_THROW( STATEMENT, KI_TEST::WX_ASSERT_ERROR );
338#define CHECK_WX_ASSERT( STATEMENT )
361std::vector<uint8_t>
LoadBinaryData(
const std::string& aFilePath, std::optional<size_t> aLoadBytes = std::nullopt );
std::string GetTestDataRootDir()
std::vector< uint8_t > LoadBinaryData(const std::string &aFilePath, std::optional< size_t > aLoadBytes=std::nullopt)
Load the contents of a file into a vector of bytes.
void CheckUnorderedMatches(const EXP_CONT &aExpected, const FOUND_CONT &aFound, MATCH_PRED aMatchPredicate)
Check that a container of "found" objects matches a container of "expected" objects.
typename FOUND_CONT::value_type FOUND_OBJ
std::function< bool(const EXP_OBJ &, const FOUND_OBJ &)> MATCH_PRED
A match predicate: check that a "found" object is equivalent to or represents an "expected" object,...
std::string GetEeschemaTestDataDir()
Get the configured location of Eeschema test data.
typename EXP_CONT::value_type EXP_OBJ
bool CollectionHasNoDuplicates(const T &aCollection)
Predicate to check a collection has no duplicate elements.
std::ostream & boost_test_print_type(std::ostream &os, std::vector< T > const &aVec)
Boost print helper for generic vectors.
A named data-driven test case.
friend std::ostream & operator<<(std::ostream &os, const NAMED_CASE &aCase)
PRINTABLE_OPT(const T &aVal)
PRINTABLE_OPT(const std::optional< T > &aOpt)
VECTOR3I expected(15, 30, 45)
BOOST_CHECK_MESSAGE(totalMismatches==0, std::to_string(totalMismatches)+" board(s) with strategy disagreements")
bool operator!=(const PRINTABLE_OPT< L > &aLhs, const PRINTABLE_OPT< R > &aRhs)
bool operator==(const PRINTABLE_OPT< L > &aLhs, const PRINTABLE_OPT< R > &aRhs)
std::ostream & operator<<(std::ostream &aOs, const PRINTABLE_OPT< T > &aOptional)
std::ostream & boost_test_print_type(std::ostream &os, const wxString &v)