Euphoria
vectorequals.h
Go to the documentation of this file.
1 #pragma once
2 
3 
4 
5 #include <functional>
6 #include <algorithm>
7 
8 #include "tests/falsestring.h"
9 #include "tests/vectortostring.h"
10 
11 
12 namespace eu::tests
13 {
14  template
15  <
16  typename T,
17  // std::function<std::string (const T&)>
18  typename TToString,
19  // std::function<false_string (const T&, const T&)>
20  typename TCompare
21  >
22  FalseString
24  (
25  const std::vector<T>& lhs,
26  const std::vector<T>& rhs,
27  TToString to_string_functor,
28  TCompare compare_functor
29  )
30  {
31  auto size_equal = FalseString::create_true();
32  if(lhs.size() != rhs.size())
33  {
34  size_equal = FalseString::create_false
35  (
36  fmt::format
37  (
38  "Size mismatch: {} vs {}{} {}",
39  lhs.size(), rhs.size(),
40  from_vector_to_string(lhs, to_string_functor),
41  from_vector_to_string(rhs, to_string_functor)
42  )
43  );
44  }
45 
46  const auto size = std::min(lhs.size(), rhs.size());
47  for(size_t index =0; index < size; index+=1)
48  {
49  const FalseString equals = compare_functor(lhs[index], rhs[index]);
50  if(!equals)
51  {
52  const auto first_invalid = !size_equal
53  ? fmt::format("{}, and first invalid", size_equal.str)
54  : ([&]()
55  {
56  const auto alhs = from_vector_to_string_ex(lhs, to_string_functor);
57  const auto arhs = from_vector_to_string_ex(rhs, to_string_functor);
58  const auto same = alhs.second == arhs.second;
59  const auto lhsstr = same || alhs.second==false? alhs.first : from_vector_to_string_impl(lhs, false, to_string_functor);
60  const auto rhsstr = same || arhs.second==false? arhs.first : from_vector_to_string_impl(rhs, false, to_string_functor);
61  const auto oneliner = same && alhs.second == true;
62 
63  if(oneliner)
64  {
65  return fmt::format("{} vs {} First invalid", lhsstr, rhsstr);
66  }
67  else
68  {
69  return fmt::format(" {}vs{}First invalid", lhsstr, rhsstr);
70  }
71  })()
72  ;
74  (
75  fmt::format("{} value at index {}, {}", first_invalid, index, equals.str)
76  );
77  }
78  }
79 
80  if(!size_equal)
81  {
82  return size_equal;
83  }
84 
85  return FalseString::create_true();
86  }
87 }
FalseString is_vector_equal(const std::vector< T > &lhs, const std::vector< T > &rhs, TToString to_string_functor, TCompare compare_functor)
Definition: vectorequals.h:24
std::pair< std::string, bool > from_vector_to_string_ex(const std::vector< T > &v, TConverter converter)
std::string from_vector_to_string(const std::vector< T > &v, TConverter converter)
std::string from_vector_to_string_impl(const std::vector< T > &v, bool one_line, TConverter converter)
size2f min(const size2f lhs, const size2f rhs)
Definition: size2.cc:140
represents a error (false) or empty string (true)
Definition: falsestring.h:10
static FalseString create_true()
Definition: falsestring.cc:13
static FalseString create_false(const std::string &text)
Definition: falsestring.cc:6