C++ Utilities  5.10.5
Useful C++ classes and routines such as argument parser, IO and conversion utilities
misctests.cpp
Go to the documentation of this file.
1 #include "../misc/levenshtein.h"
2 #include "../misc/multiarray.h"
3 
4 #include "../conversion/stringbuilder.h"
5 #include "../conversion/stringconversion.h"
6 
7 #include "../io/misc.h"
8 
9 #include "../tests/testutils.h"
10 
11 #include "resources/version.h"
12 
13 #include <cppunit/TestFixture.h>
14 #include <cppunit/extensions/HelperMacros.h>
15 
16 #include <regex>
17 
18 using namespace std;
19 using namespace CppUtilities;
20 using namespace CppUtilities::Literals;
21 using namespace CPPUNIT_NS;
22 
23 // test version check macro
24 #if CPP_UTILITIES_VERSION_CHECK(5, 2, 1) > CPP_UTILITIES_VERSION_CHECK(6, 0, 0)
25 #error "Check for major version doesn't work"
26 #endif
27 #if CPP_UTILITIES_VERSION_CHECK(5, 2, 2) > CPP_UTILITIES_VERSION_CHECK(5, 3, 0)
28 #error "Check for minor version doesn't work"
29 #endif
30 #if CPP_UTILITIES_VERSION_CHECK(5, 2, 1) > CPP_UTILITIES_VERSION_CHECK(5, 2, 2)
31 #error "Check for path version doesn't work"
32 #endif
33 #if CPP_UTILITIES_VERSION < CPP_UTILITIES_VERSION_CHECK(5, 0, 0)
34 #error "Library version seems wrongly defined, should be already >= 5.0.0"
35 #endif
36 
40 class MiscTests : public TestFixture {
41  CPPUNIT_TEST_SUITE(MiscTests);
42  CPPUNIT_TEST(testMultiArray);
43  CPPUNIT_TEST(testLevenshtein);
44  CPPUNIT_TEST(testTestUtilities);
45  CPPUNIT_TEST_SUITE_END();
46 
47 public:
48  void setUp()
49  {
50  }
51  void tearDown()
52  {
53  }
54 
55  void testMultiArray();
56  void testLevenshtein();
57  void testTestUtilities();
58 };
59 
61 
63 {
64  static_assert(decltype(makeMultiArray<char>(3))::dimensionCount() == 1, "dimension count 1D");
65  static_assert(decltype(makeMultiArray<char>(3, 2))::dimensionCount() == 2, "dimension count 2D");
66  static_assert(decltype(makeMultiArray<char>(3, 2, 3))::dimensionCount() == 3, "dimension count 3D");
67 
68  auto array1d(makeMultiArray<char>(3));
69  CPPUNIT_ASSERT_EQUAL(3_st, array1d.dimensionSize<0>());
70  CPPUNIT_ASSERT_EQUAL(3_st, array1d.totalSize());
71  array1d.at(0) = 'a';
72  array1d.at(1) = 'b';
73  array1d.at(2) = 'c';
74  CPPUNIT_ASSERT_EQUAL("abc"s, string(array1d.data(), 3));
75 
76  auto array2d(makeMultiArray<char>(3, 2));
77  CPPUNIT_ASSERT_EQUAL(3_st, array2d.dimensionSize<0>());
78  CPPUNIT_ASSERT_EQUAL(2_st, array2d.dimensionSize<1>());
79  CPPUNIT_ASSERT_EQUAL(6_st, array2d.totalSize());
80  const char *const data(array2d.data());
81  array2d.at(0, 0) = 'a';
82  array2d.at(0, 1) = 'b';
83  array2d.at(1, 0) = 'c';
84  array2d.at(1, 1) = 'd';
85  array2d.at(2, 0) = 'e';
86  array2d.at(2, 1) = 'f';
87  CPPUNIT_ASSERT_EQUAL("abcdef"s, string(data, 6));
88 
89  auto array3d(makeMultiArray<char>(3, 2, 3));
90  CPPUNIT_ASSERT_EQUAL(3_st, array3d.dimensionSize<0>());
91  CPPUNIT_ASSERT_EQUAL(2_st, array3d.dimensionSize<1>());
92  CPPUNIT_ASSERT_EQUAL(3_st, array3d.dimensionSize<2>());
93  CPPUNIT_ASSERT_EQUAL(18_st, array3d.totalSize());
94  array3d.at(0, 0, 0) = 'a';
95  array3d.at(0, 0, 1) = 'b';
96  array3d.at(0, 0, 2) = 'c';
97  array3d.at(0, 1, 0) = 'd';
98  array3d.at(0, 1, 1) = 'e';
99  array3d.at(0, 1, 2) = 'f';
100  array3d.at(1, 0, 0) = 'g';
101  array3d.at(1, 0, 1) = 'h';
102  array3d.at(1, 0, 2) = 'i';
103  array3d.at(1, 1, 0) = 'j';
104  array3d.at(1, 1, 1) = 'k';
105  array3d.at(1, 1, 2) = 'l';
106  array3d.at(2, 0, 0) = 'm';
107  array3d.at(2, 0, 1) = 'n';
108  array3d.at(2, 0, 2) = 'o';
109  array3d.at(2, 1, 0) = 'p';
110  array3d.at(2, 1, 1) = 'q';
111  array3d.at(2, 1, 2) = 'r';
112  CPPUNIT_ASSERT_EQUAL("abcdefghijklmnopqr"s, string(array3d.data(), 18));
113 
114  auto stackMultiArray(makeFixedSizeMultiArray<char, 9>(3, 3));
115  CPPUNIT_ASSERT_EQUAL(3_st, stackMultiArray.dimensionSize<0>());
116  CPPUNIT_ASSERT_EQUAL(3_st, stackMultiArray.dimensionSize<1>());
117  CPPUNIT_ASSERT_EQUAL(9_st, stackMultiArray.totalSize());
118  stackMultiArray.at(0, 0) = 'a';
119  stackMultiArray.at(0, 1) = 'b';
120  stackMultiArray.at(0, 2) = 'c';
121  stackMultiArray.at(1, 0) = 'd';
122  stackMultiArray.at(1, 1) = 'e';
123  stackMultiArray.at(1, 2) = 'f';
124  stackMultiArray.at(2, 0) = 'g';
125  stackMultiArray.at(2, 1) = 'h';
126  stackMultiArray.at(2, 2) = 'i';
127  CPPUNIT_ASSERT_EQUAL("abcdefghi"s, string(stackMultiArray.data(), 9));
128 }
129 
131 {
132  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("ab", "abc"));
133  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("abc", "ab"));
134  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("xzaby", "xbay"));
135  CPPUNIT_ASSERT_EQUAL(0_st, computeDamerauLevenshteinDistance("", ""));
136  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("ab", "ba"));
137  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("xaby", "xbay"));
138  CPPUNIT_ASSERT_EQUAL(0_st, computeDamerauLevenshteinDistance("abc", "abc"));
139  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("ab", "abc"));
140  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("ca", "abc"));
141  CPPUNIT_ASSERT_EQUAL(4_st, computeDamerauLevenshteinDistance("", "abcd"));
142  CPPUNIT_ASSERT_EQUAL(4_st, computeDamerauLevenshteinDistance("abcd", ""));
143  CPPUNIT_ASSERT_EQUAL(3_st, computeDamerauLevenshteinDistance("abcd", "d"));
144  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("abcd", "bc"));
145  CPPUNIT_ASSERT_EQUAL(3_st, computeDamerauLevenshteinDistance("abcd", "a"));
146  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("adb", "abc"));
147  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("xxaxx", "xxäxx"));
148  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("xxöxx", "xxäxx"));
149  CPPUNIT_ASSERT_EQUAL(11_st, computeDamerauLevenshteinDistance("this is a long text", "this is too long for stack"));
150 }
151 
156 {
157  const auto workingCopyPathForNestedTestFile = workingCopyPath("subdir/nested-testfile.txt");
158  CPPUNIT_ASSERT_EQUAL_MESSAGE("creation of subdirectories in working dir", "some file\n"s, readFile(workingCopyPathForNestedTestFile));
159 
160  const auto workingCopyPathUnderDifferentNameForNestedTestFile = workingCopyPathAs("subdir/nested-testfile.txt", "subdir2/foo.txt");
161  const auto splittedPath = splitString<vector<string>>(workingCopyPathUnderDifferentNameForNestedTestFile, "/", EmptyPartsTreat::Omit);
162  CPPUNIT_ASSERT_GREATEREQUAL(2_st, splittedPath.size());
163  CPPUNIT_ASSERT_EQUAL_MESSAGE("different subdir", "subdir2"s, splittedPath[splittedPath.size() - 2]);
164  CPPUNIT_ASSERT_EQUAL_MESSAGE("different file name", "foo.txt"s, splittedPath[splittedPath.size() - 1]);
165  CPPUNIT_ASSERT_EQUAL_MESSAGE(
166  "creation of subdirectories in working dir", "some file\n"s, readFile(workingCopyPathUnderDifferentNameForNestedTestFile));
167 
168  stringstream ss;
169  ss << asHexNumber(16);
170  CPPUNIT_ASSERT_EQUAL_MESSAGE("printing hex numbers", "0x10"s, ss.str());
171 
172  TESTUTILS_ASSERT_LIKE("assert like works", ".*foo.*", " foo ");
173 }
The MiscTests class tests misc functions and classes (mainly of files contained by the misc directory...
Definition: misctests.cpp:40
void testTestUtilities()
Tests helper from TestUtilities namespace which aren't used in other tests anyways.
Definition: misctests.cpp:155
void setUp()
Definition: misctests.cpp:48
void tearDown()
Definition: misctests.cpp:51
void testLevenshtein()
Definition: misctests.cpp:130
void testMultiArray()
Definition: misctests.cpp:62
CPPUNIT_TEST_SUITE_REGISTRATION(MiscTests)
Contains literals to ease asserting with CPPUNIT_ASSERT_EQUAL.
Definition: testutils.h:317
Contains all utilities provides by the c++utilities library.
CPP_UTILITIES_EXPORT std::string readFile(const std::string &path, std::string::size_type maxSize=std::string::npos)
Reads all contents of the specified file in a single call.
Definition: misc.cpp:16
CPP_UTILITIES_EXPORT std::string workingCopyPath(const std::string &relativeTestFilePath, WorkingCopyMode mode=WorkingCopyMode::CreateCopy)
Convenience function to invoke TestApplication::workingCopyPath().
Definition: testutils.h:166
AsHexNumber< T > asHexNumber(const T &value)
Wraps a value to be printed using the hex system in the error case when asserted with cppunit (or sim...
Definition: testutils.h:232
CPP_UTILITIES_EXPORT std::string workingCopyPathAs(const std::string &relativeTestFilePath, const std::string &relativeWorkingCopyPath, WorkingCopyMode mode=WorkingCopyMode::CreateCopy)
Convenience function to invoke TestApplication::workingCopyPathAs().
Definition: testutils.h:175
CPP_UTILITIES_EXPORT std::size_t computeDamerauLevenshteinDistance(const char *str1, std::size_t size1, const char *str2, std::size_t size2)
#define TESTUTILS_ASSERT_LIKE(message, expectedRegex, actualString)
Asserts whether the specified string matches the specified regex.
Definition: testutils.h:287