ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
string_test.cc
Go to the documentation of this file.
1 // Copyright (c) 2018, ETH Zurich and UNC Chapel Hill.
2 // All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 //
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 //
14 // * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of
15 // its contributors may be used to endorse or promote products derived
16 // from this software without specific prior written permission.
17 //
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
22 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
23 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
24 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
25 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
26 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 // POSSIBILITY OF SUCH DAMAGE.
29 //
30 // Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de)
31 
32 #define TEST_NAME "util/string"
33 #include "util/testing.h"
34 
35 #include "util/string.h"
36 
37 using namespace colmap;
38 
39 #define TEST_STRING_INPLACE(Func, str, ref_str) \
40  { \
41  std::string str_inplace = str; \
42  Func(&str_inplace); \
43  BOOST_CHECK_EQUAL(str_inplace, ref_str); \
44  }
45 
46 BOOST_AUTO_TEST_CASE(TestStringPrintf) {
47  BOOST_CHECK_EQUAL(StringPrintf("%s", "test"), "test");
48  BOOST_CHECK_EQUAL(StringPrintf("%d", 1), "1");
49  BOOST_CHECK_EQUAL(StringPrintf("%.3f", 1.234), "1.234");
50  BOOST_CHECK_EQUAL(StringPrintf("test%s", "test"), "testtest");
51  BOOST_CHECK_EQUAL(StringPrintf("test%d", 1), "test1");
52  BOOST_CHECK_EQUAL(StringPrintf("test%.3f", 1.234), "test1.234");
53  BOOST_CHECK_EQUAL(StringPrintf("%s%s", "test", "test"), "testtest");
54  BOOST_CHECK_EQUAL(StringPrintf("%d%s", 1, "test"), "1test");
55  BOOST_CHECK_EQUAL(StringPrintf("%.3f%s", 1.234, "test"), "1.234test");
56 }
57 
58 BOOST_AUTO_TEST_CASE(TestStringReplace) {
59  BOOST_CHECK_EQUAL(StringReplace("test", "-", ""), "test");
60  BOOST_CHECK_EQUAL(StringReplace("test", "t", "a"), "aesa");
61  BOOST_CHECK_EQUAL(StringReplace("test", "t", "---"), "---es---");
62  BOOST_CHECK_EQUAL(StringReplace("test", "", "a"), "test");
63  BOOST_CHECK_EQUAL(StringReplace("test", "", ""), "test");
64  BOOST_CHECK_EQUAL(StringReplace("ttt", "ttt", "+++"), "+++");
65 }
66 
67 BOOST_AUTO_TEST_CASE(TestStringGetAfter) {
68  BOOST_CHECK_EQUAL(StringGetAfter("test", ""), "test");
69  BOOST_CHECK_EQUAL(StringGetAfter("test", "notinit"), "");
70  BOOST_CHECK_EQUAL(StringGetAfter("test", "e"), "st");
71  BOOST_CHECK_EQUAL(StringGetAfter("test, multiple tests", "test"), "s");
72  BOOST_CHECK_EQUAL(StringGetAfter("", ""), "");
73  BOOST_CHECK_EQUAL(StringGetAfter("path/to/dataset/sub1/image.png", "sub1/"),
74  "image.png");
75 }
76 
77 BOOST_AUTO_TEST_CASE(TestStringSplit) {
78  const std::vector<std::string> list1 = StringSplit("1,2,3,4,5 , 6", ",");
79  BOOST_CHECK_EQUAL(list1.size(), 6);
80  BOOST_CHECK_EQUAL(list1[0], "1");
81  BOOST_CHECK_EQUAL(list1[1], "2");
82  BOOST_CHECK_EQUAL(list1[2], "3");
83  BOOST_CHECK_EQUAL(list1[3], "4");
84  BOOST_CHECK_EQUAL(list1[4], "5 ");
85  BOOST_CHECK_EQUAL(list1[5], " 6");
86  const std::vector<std::string> list2 = StringSplit("1,2,3,4,5 , 6", "");
87  BOOST_CHECK_EQUAL(list2.size(), 1);
88  BOOST_CHECK_EQUAL(list2[0], "1,2,3,4,5 , 6");
89  const std::vector<std::string> list3 = StringSplit("1,,2,,3,4,5 , 6", ",");
90  BOOST_CHECK_EQUAL(list3.size(), 6);
91  BOOST_CHECK_EQUAL(list3[0], "1");
92  BOOST_CHECK_EQUAL(list3[1], "2");
93  BOOST_CHECK_EQUAL(list3[2], "3");
94  BOOST_CHECK_EQUAL(list3[3], "4");
95  BOOST_CHECK_EQUAL(list3[4], "5 ");
96  BOOST_CHECK_EQUAL(list3[5], " 6");
97  const std::vector<std::string> list4 = StringSplit("1,,2,,3,4,5 , 6", ",,");
98  BOOST_CHECK_EQUAL(list4.size(), 6);
99  BOOST_CHECK_EQUAL(list4[0], "1");
100  BOOST_CHECK_EQUAL(list4[1], "2");
101  BOOST_CHECK_EQUAL(list4[2], "3");
102  BOOST_CHECK_EQUAL(list4[3], "4");
103  BOOST_CHECK_EQUAL(list4[4], "5 ");
104  BOOST_CHECK_EQUAL(list4[5], " 6");
105  const std::vector<std::string> list5 = StringSplit("1,,2,,3,4,5 , 6", ", ");
106  BOOST_CHECK_EQUAL(list5.size(), 6);
107  BOOST_CHECK_EQUAL(list5[0], "1");
108  BOOST_CHECK_EQUAL(list5[1], "2");
109  BOOST_CHECK_EQUAL(list5[2], "3");
110  BOOST_CHECK_EQUAL(list5[3], "4");
111  BOOST_CHECK_EQUAL(list5[4], "5");
112  BOOST_CHECK_EQUAL(list5[5], "6");
113  const std::vector<std::string> list6 = StringSplit(",1,,2,,3,4,5 , 6 ", ", ");
114  BOOST_CHECK_EQUAL(list6.size(), 8);
115  BOOST_CHECK_EQUAL(list6[0], "");
116  BOOST_CHECK_EQUAL(list6[1], "1");
117  BOOST_CHECK_EQUAL(list6[2], "2");
118  BOOST_CHECK_EQUAL(list6[3], "3");
119  BOOST_CHECK_EQUAL(list6[4], "4");
120  BOOST_CHECK_EQUAL(list6[5], "5");
121  BOOST_CHECK_EQUAL(list6[6], "6");
122  BOOST_CHECK_EQUAL(list6[7], "");
123 }
124 
125 BOOST_AUTO_TEST_CASE(TestStringStartsWith) {
126  BOOST_CHECK(!StringStartsWith("", ""));
127  BOOST_CHECK(!StringStartsWith("a", ""));
128  BOOST_CHECK(!StringStartsWith("", "a"));
129  BOOST_CHECK(StringStartsWith("a", "a"));
130  BOOST_CHECK(StringStartsWith("aa", "a"));
131  BOOST_CHECK(StringStartsWith("aa", "aa"));
132  BOOST_CHECK(StringStartsWith("aaaaaaaaa", "aa"));
133 }
134 
135 BOOST_AUTO_TEST_CASE(TestStringStrim) {
138  TEST_STRING_INPLACE(StringTrim, "a", "a");
139  TEST_STRING_INPLACE(StringTrim, " a", "a");
140  TEST_STRING_INPLACE(StringTrim, "a ", "a");
141  TEST_STRING_INPLACE(StringTrim, " a ", "a");
142  TEST_STRING_INPLACE(StringTrim, " a ", "a");
143  TEST_STRING_INPLACE(StringTrim, "aa ", "aa");
144  TEST_STRING_INPLACE(StringTrim, "a a ", "a a");
145  TEST_STRING_INPLACE(StringTrim, "a a a ", "a a a");
146  TEST_STRING_INPLACE(StringTrim, "\n\r\t", "");
147 }
148 
149 BOOST_AUTO_TEST_CASE(TestStringLeftString) {
154  TEST_STRING_INPLACE(StringLeftTrim, "a ", "a ");
155  TEST_STRING_INPLACE(StringLeftTrim, " a ", "a ");
156  TEST_STRING_INPLACE(StringLeftTrim, " a ", "a ");
157  TEST_STRING_INPLACE(StringLeftTrim, "aa ", "aa ");
158  TEST_STRING_INPLACE(StringLeftTrim, "a a ", "a a ");
159  TEST_STRING_INPLACE(StringLeftTrim, " a a", "a a");
160  TEST_STRING_INPLACE(StringLeftTrim, "a a a ", "a a a ");
161  TEST_STRING_INPLACE(StringTrim, "\n\r\ta", "a");
162 }
163 
164 BOOST_AUTO_TEST_CASE(TestStringStrimRight) {
170  TEST_STRING_INPLACE(StringRightTrim, " a ", " a");
171  TEST_STRING_INPLACE(StringRightTrim, " a ", " a");
172  TEST_STRING_INPLACE(StringRightTrim, "aa ", "aa");
173  TEST_STRING_INPLACE(StringRightTrim, "a a ", "a a");
174  TEST_STRING_INPLACE(StringRightTrim, "a a a ", "a a a");
175  TEST_STRING_INPLACE(StringTrim, "a\n\r\t", "a");
176 }
177 
178 BOOST_AUTO_TEST_CASE(TestStringToLower) {
182  TEST_STRING_INPLACE(StringToLower, " a", " a");
183  TEST_STRING_INPLACE(StringToLower, "a ", "a ");
184  TEST_STRING_INPLACE(StringToLower, " a ", " a ");
185  TEST_STRING_INPLACE(StringToLower, "aa ", "aa ");
187  TEST_STRING_INPLACE(StringToLower, " A", " a");
188  TEST_STRING_INPLACE(StringToLower, "A ", "a ");
189  TEST_STRING_INPLACE(StringToLower, " A ", " a ");
190  TEST_STRING_INPLACE(StringToLower, "AA ", "aa ");
191  TEST_STRING_INPLACE(StringToLower, "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
192  "abcdefghijklmnopqrstuvwxyz");
193  TEST_STRING_INPLACE(StringToLower, "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ",
194  "0123456789 abcdefghijklmnopqrstuvwxyz");
195 }
196 
197 BOOST_AUTO_TEST_CASE(TestStringToUpper) {
201  TEST_STRING_INPLACE(StringToUpper, " A", " A");
202  TEST_STRING_INPLACE(StringToUpper, "A ", "A ");
203  TEST_STRING_INPLACE(StringToUpper, " A ", " A ");
204  TEST_STRING_INPLACE(StringToUpper, "AA ", "AA ");
206  TEST_STRING_INPLACE(StringToUpper, " a", " A");
207  TEST_STRING_INPLACE(StringToUpper, "a ", "A ");
208  TEST_STRING_INPLACE(StringToUpper, " a ", " A ");
209  TEST_STRING_INPLACE(StringToUpper, "aa ", "AA ");
210  TEST_STRING_INPLACE(StringToUpper, "abcdefghijklmnopqrstuvwxyz",
211  "ABCDEFGHIJKLMNOPQRSTUVWXYZ");
212  TEST_STRING_INPLACE(StringToUpper, "0123456789 abcdefghijklmnopqrstuvwxyz",
213  "0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZ");
214 }
215 
216 BOOST_AUTO_TEST_CASE(TestStringContains) {
217  BOOST_CHECK(StringContains("", ""));
218  BOOST_CHECK(StringContains("a", ""));
219  BOOST_CHECK(StringContains("a", "a"));
220  BOOST_CHECK(StringContains("ab", "a"));
221  BOOST_CHECK(StringContains("ab", "ab"));
222  BOOST_CHECK(!StringContains("", "a"));
223  BOOST_CHECK(!StringContains("ab", "c"));
224 }
std::string StringGetAfter(const std::string &str, const std::string &key)
Definition: string.cc:154
void StringTrim(std::string *str)
Definition: string.cc:188
bool StringStartsWith(const std::string &str, const std::string &prefix)
Definition: string.cc:173
std::string StringReplace(const std::string &str, const std::string &old_str, const std::string &new_str)
Definition: string.cc:140
void StringToLower(std::string *str)
Definition: string.cc:193
void StringLeftTrim(std::string *str)
Definition: string.cc:178
void StringRightTrim(std::string *str)
Definition: string.cc:183
std::vector< std::string > StringSplit(const std::string &str, const std::string &delim)
Definition: string.cc:166
std::string StringPrintf(const char *format,...)
Definition: string.cc:131
void StringToUpper(std::string *str)
Definition: string.cc:197
bool StringContains(const std::string &str, const std::string &sub_str)
Definition: string.cc:201
BOOST_AUTO_TEST_CASE(TestStringPrintf)
Definition: string_test.cc:46
#define TEST_STRING_INPLACE(Func, str, ref_str)
Definition: string_test.cc:39