C++ Utilities  4.16.0
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 
6 #include "../io/misc.h"
7 
8 #include "../tests/testutils.h"
9 
10 #include <cppunit/TestFixture.h>
11 #include <cppunit/extensions/HelperMacros.h>
12 
13 #include <regex>
14 
15 using namespace std;
16 using namespace ConversionUtilities;
17 using namespace IoUtilities;
18 using namespace MiscUtilities;
19 using namespace TestUtilities;
20 using namespace TestUtilities::Literals;
21 
22 using namespace CPPUNIT_NS;
23 
27 class MiscTests : public TestFixture {
28  CPPUNIT_TEST_SUITE(MiscTests);
29  CPPUNIT_TEST(testMultiArray);
30  CPPUNIT_TEST(testLevenshtein);
31  CPPUNIT_TEST(testTestUtilities);
32  CPPUNIT_TEST_SUITE_END();
33 
34 public:
35  void setUp()
36  {
37  }
38  void tearDown()
39  {
40  }
41 
42  void testMultiArray();
43  void testLevenshtein();
44  void testTestUtilities();
45 };
46 
48 
50 {
51  static_assert(decltype(makeMultiArray<char>(3))::dimensionCount() == 1, "dimension count 1D");
52  static_assert(decltype(makeMultiArray<char>(3, 2))::dimensionCount() == 2, "dimension count 2D");
53  static_assert(decltype(makeMultiArray<char>(3, 2, 3))::dimensionCount() == 3, "dimension count 3D");
54 
55  auto array1d(makeMultiArray<char>(3));
56  CPPUNIT_ASSERT_EQUAL(3_st, array1d.dimensionSize<0>());
57  CPPUNIT_ASSERT_EQUAL(3_st, array1d.totalSize());
58  array1d.at(0) = 'a';
59  array1d.at(1) = 'b';
60  array1d.at(2) = 'c';
61  CPPUNIT_ASSERT_EQUAL("abc"s, string(array1d.data(), 3));
62 
63  auto array2d(makeMultiArray<char>(3, 2));
64  CPPUNIT_ASSERT_EQUAL(3_st, array2d.dimensionSize<0>());
65  CPPUNIT_ASSERT_EQUAL(2_st, array2d.dimensionSize<1>());
66  CPPUNIT_ASSERT_EQUAL(6_st, array2d.totalSize());
67  const char *const data(array2d.data());
68  array2d.at(0, 0) = 'a';
69  array2d.at(0, 1) = 'b';
70  array2d.at(1, 0) = 'c';
71  array2d.at(1, 1) = 'd';
72  array2d.at(2, 0) = 'e';
73  array2d.at(2, 1) = 'f';
74  CPPUNIT_ASSERT_EQUAL("abcdef"s, string(data, 6));
75 
76  auto array3d(makeMultiArray<char>(3, 2, 3));
77  CPPUNIT_ASSERT_EQUAL(3_st, array3d.dimensionSize<0>());
78  CPPUNIT_ASSERT_EQUAL(2_st, array3d.dimensionSize<1>());
79  CPPUNIT_ASSERT_EQUAL(3_st, array3d.dimensionSize<2>());
80  CPPUNIT_ASSERT_EQUAL(18_st, array3d.totalSize());
81  array3d.at(0, 0, 0) = 'a';
82  array3d.at(0, 0, 1) = 'b';
83  array3d.at(0, 0, 2) = 'c';
84  array3d.at(0, 1, 0) = 'd';
85  array3d.at(0, 1, 1) = 'e';
86  array3d.at(0, 1, 2) = 'f';
87  array3d.at(1, 0, 0) = 'g';
88  array3d.at(1, 0, 1) = 'h';
89  array3d.at(1, 0, 2) = 'i';
90  array3d.at(1, 1, 0) = 'j';
91  array3d.at(1, 1, 1) = 'k';
92  array3d.at(1, 1, 2) = 'l';
93  array3d.at(2, 0, 0) = 'm';
94  array3d.at(2, 0, 1) = 'n';
95  array3d.at(2, 0, 2) = 'o';
96  array3d.at(2, 1, 0) = 'p';
97  array3d.at(2, 1, 1) = 'q';
98  array3d.at(2, 1, 2) = 'r';
99  CPPUNIT_ASSERT_EQUAL("abcdefghijklmnopqr"s, string(array3d.data(), 18));
100 
101  auto stackMultiArray(makeFixedSizeMultiArray<char, 9>(3, 3));
102  CPPUNIT_ASSERT_EQUAL(3_st, stackMultiArray.dimensionSize<0>());
103  CPPUNIT_ASSERT_EQUAL(3_st, stackMultiArray.dimensionSize<1>());
104  CPPUNIT_ASSERT_EQUAL(9_st, stackMultiArray.totalSize());
105  stackMultiArray.at(0, 0) = 'a';
106  stackMultiArray.at(0, 1) = 'b';
107  stackMultiArray.at(0, 2) = 'c';
108  stackMultiArray.at(1, 0) = 'd';
109  stackMultiArray.at(1, 1) = 'e';
110  stackMultiArray.at(1, 2) = 'f';
111  stackMultiArray.at(2, 0) = 'g';
112  stackMultiArray.at(2, 1) = 'h';
113  stackMultiArray.at(2, 2) = 'i';
114  CPPUNIT_ASSERT_EQUAL("abcdefghi"s, string(stackMultiArray.data(), 9));
115 }
116 
118 {
119  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("ab", "abc"));
120  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("abc", "ab"));
121  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("xzaby", "xbay"));
122  CPPUNIT_ASSERT_EQUAL(0_st, computeDamerauLevenshteinDistance("", ""));
123  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("ab", "ba"));
124  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("xaby", "xbay"));
125  CPPUNIT_ASSERT_EQUAL(0_st, computeDamerauLevenshteinDistance("abc", "abc"));
126  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("ab", "abc"));
127  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("ca", "abc"));
128  CPPUNIT_ASSERT_EQUAL(4_st, computeDamerauLevenshteinDistance("", "abcd"));
129  CPPUNIT_ASSERT_EQUAL(4_st, computeDamerauLevenshteinDistance("abcd", ""));
130  CPPUNIT_ASSERT_EQUAL(3_st, computeDamerauLevenshteinDistance("abcd", "d"));
131  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("abcd", "bc"));
132  CPPUNIT_ASSERT_EQUAL(3_st, computeDamerauLevenshteinDistance("abcd", "a"));
133  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("adb", "abc"));
134  CPPUNIT_ASSERT_EQUAL(2_st, computeDamerauLevenshteinDistance("xxaxx", "xxäxx"));
135  CPPUNIT_ASSERT_EQUAL(1_st, computeDamerauLevenshteinDistance("xxöxx", "xxäxx"));
136  CPPUNIT_ASSERT_EQUAL(11_st, computeDamerauLevenshteinDistance("this is a long text", "this is too long for stack"));
137 }
138 
143 {
144  const auto workingCopyPathForNestedTestFile = workingCopyPath("subdir/nested-testfile.txt");
145  CPPUNIT_ASSERT_EQUAL_MESSAGE("creation of subdirectories in working dir", "some file\n"s, readFile(workingCopyPathForNestedTestFile));
146 
147  stringstream ss;
148  ss << asHexNumber(16);
149  CPPUNIT_ASSERT_EQUAL_MESSAGE("printing hex numbers", "0x10"s, ss.str());
150 
151  TESTUTILS_ASSERT_LIKE("assert like works", ".*foo.*", " foo ");
152 }
void setUp()
Definition: misctests.cpp:35
STL namespace.
CPPUNIT_TEST_SUITE_REGISTRATION(MiscTests)
void tearDown()
Definition: misctests.cpp:38
#define TESTUTILS_ASSERT_LIKE(message, expectedRegex, actualString)
Asserts whether the specified string matches the specified regex.
Definition: testutils.h:226
Contains literals to ease asserting with CPPUNIT_ASSERT_EQUAL.
Definition: testutils.h:259
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
Contains utility classes helping to read and write streams.
Definition: binaryreader.h:10
Contains classes and functions utilizing creating of test applications.
Definition: testutils.h:13
Contains several functions providing conversions between different data types.
CPP_UTILITIES_EXPORT std::string workingCopyPath(const std::string &name)
Convenience function which returns the full path to a working copy of the test file with the specifie...
Definition: testutils.h:116
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:180
CPP_UTILITIES_EXPORT std::size_t computeDamerauLevenshteinDistance(const char *str1, std::size_t size1, const char *str2, std::size_t size2)
void testLevenshtein()
Definition: misctests.cpp:117
Contains various utilities such as computing Damerau–Levenshtein distance and N-dimensional arrays...
Definition: multiarray.h:8
void testTestUtilities()
Tests helper from TestUtilities namespace which aren&#39;t used in other tests anyways.
Definition: misctests.cpp:142
void testMultiArray()
Definition: misctests.cpp:49
The MiscTests class tests misc functions and classes (mainly of files contained by the misc directory...
Definition: misctests.cpp:27