Euphoria
stringeq.cc
Go to the documentation of this file.
1 #include "tests/stringeq.h"
2 
3 #include "catch2/catch_all.hpp"
4 #include <algorithm>
5 
6 #include "base/editdistance.h"
7 #include "assert/assert.h"
8 #include "base/stringutils.h"
9 
10 #include "tests/vectortostring.h"
11 
12 
13 namespace
14 {
15  std::string escape_string(const std::string& str)
16  {
17  return ::Catch::Detail::stringify(str);
18  }
19 }
20 
21 namespace eu::tests
22 {
23  FalseString
24  is_string_equal(const std::string& lhs, const std::string& rhs)
25  {
26  const auto s = find_first_index_of_mismatch(lhs, rhs);
27  ASSERTX((s==std::string::npos && lhs == rhs) || (s != std::string::npos && lhs != rhs), s, lhs, rhs);
28  if(s != std::string::npos )
29  {
31  (
32  fmt::format
33  (
34  "lhs: {} and rhs: {}, lengths are {} vs {}, first diff at {} "
35  "with {}/{}, edit-distance is {}",
36  escape_string(lhs), escape_string(rhs),
37  lhs.size(), rhs.size(),
38  s,
39  from_char_to_string(lhs[s]),
40  from_char_to_string(rhs[s]),
41  calc_edit_distance(lhs, rhs)
42  )
43  );
44  }
45 
46  return FalseString::create_true();
47  }
48 
49 
50  FalseString
51  is_string_equal(const std::vector<std::string>& lhs, const std::vector<std::string>& rhs)
52  {
53  auto size_equal = FalseString::create_true();
54  if(lhs.size() != rhs.size())
55  {
56  size_equal = FalseString::create_false
57  (
58  fmt::format
59  (
60  "Size mismatch: {} vs {}: {} != {}",
61  lhs.size(),
62  rhs.size(),
63  from_vector_to_string(lhs, escape_string),
64  from_vector_to_string(rhs, escape_string)
65  )
66  );
67  }
68 
69  const auto size = std::min(lhs.size(), rhs.size());
70  for(size_t index =0; index < size; index+=1)
71  {
72  const FalseString equals = is_string_equal(lhs[index], rhs[index]);
73  if(!equals)
74  {
75  const auto first_invalid = !size_equal
76  ? fmt::format("{}, and first invalid", size_equal.str)
77  : fmt::format("{}vs{} First invalid",
78  from_vector_to_string(lhs, escape_string),
79  from_vector_to_string(rhs, escape_string)
80  );
81 
83  (
84  fmt::format
85  (
86  "{} value at index {}, {}",
87  first_invalid,
88  index,
89  equals.str
90  )
91  );
92  }
93  }
94 
95  if(!size_equal)
96  {
97  return size_equal;
98  }
99 
100  return FalseString::create_true();
101  }
102 }
#define ASSERTX(x,...)
Definition: assert.h:48
std::string from_char_to_string(char c, CharToStringStyle style)
Definition: stringutils.cc:168
std::string::size_type find_first_index_of_mismatch(const std::string &lhs, const std::string &rhs)
Definition: stringutils.cc:244
FalseString is_string_equal(const std::string &lhs, const std::string &rhs)
Definition: stringeq.cc:24
std::string from_vector_to_string(const std::vector< T > &v, TConverter converter)
size2f min(const size2f lhs, const size2f rhs)
Definition: size2.cc:140
int calc_edit_distance(const std::string &source, const std::string &target)
Definition: editdistance.cc:14
String utility functions.
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