1 /*
2 * Medical Image Registration ToolKit (MIRTK)
3 *
4 * Copyright 2016 Imperial College London
5 * Copyright 2016 Andreas Schuh
6 *
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 */
19
20 #include "gtest/gtest.h"
21
22 #include "mirtk/String.h"
23 using namespace mirtk;
24
25
26 // =============================================================================
27 // String conversion
28 // =============================================================================
29
30 // -----------------------------------------------------------------------------
TEST(String,FromString)31 TEST(String, FromString)
32 {
33 {
34 bool b;
35 EXPECT_FALSE(FromString("1.0", b));
36 EXPECT_FALSE(FromString("a", b));
37 EXPECT_TRUE(FromString("1", b));
38 EXPECT_TRUE(b);
39 EXPECT_TRUE(FromString("0", b));
40 EXPECT_FALSE(b);
41 EXPECT_TRUE(FromString("On", b));
42 EXPECT_TRUE(b);
43 }
44 {
45 double v;
46 EXPECT_TRUE(FromString("1.0", v));
47 EXPECT_EQ(1.0, v);
48 }
49 }
50
51 // =============================================================================
52 // String processing
53 // =============================================================================
54
55 // -----------------------------------------------------------------------------
TEST(String,ToLower)56 TEST(String, ToLower)
57 {
58 EXPECT_EQ(string(""), ToLower(string("")));
59 EXPECT_EQ(string("test"), ToLower(string("test")));
60 EXPECT_EQ(string("test"), ToLower(string("Test")));
61 EXPECT_EQ(string("test"), ToLower(string("TeSt")));
62 EXPECT_EQ(string("test"), ToLower(string("TEST")));
63 EXPECT_EQ(string("test"), ToLower(string("tesT")));
64 EXPECT_EQ(string(" test"), ToLower(string(" tesT")));
65 }
66
67 // -----------------------------------------------------------------------------
TEST(String,ToUpper)68 TEST(String, ToUpper)
69 {
70 EXPECT_EQ(string(""), ToUpper(string("")));
71 EXPECT_EQ(string("TEST"), ToUpper(string("TEST")));
72 EXPECT_EQ(string("TEST"), ToUpper(string("tEST")));
73 EXPECT_EQ(string("TEST"), ToUpper(string("tEsT")));
74 EXPECT_EQ(string("TEST"), ToUpper(string("test")));
75 EXPECT_EQ(string("TEST"), ToUpper(string("TESt")));
76 EXPECT_EQ(string(" TEST"), ToUpper(string(" TESt")));
77 }
78
79 // -----------------------------------------------------------------------------
TEST(String,Trim)80 TEST(String, Trim)
81 {
82 EXPECT_EQ(string("test"), Trim(" \ttest \t "));
83 EXPECT_EQ(string("test"), Trim("test \t \n"));
84 EXPECT_EQ(string("test"), Trim(" \n \ttest"));
85 }
86
87 // -----------------------------------------------------------------------------
TEST(String,Split)88 TEST(String, Split)
89 {
90 const int n = 5;
91 const char *delim[n] = {" ", ",", "\t", ";", "_@#$"};
92 {
93 Array<string> parts = Split("a b c d", " ");
94 ASSERT_EQ(4u, parts.size());
95 EXPECT_EQ(string("a"), parts[0]);
96 EXPECT_EQ(string("b"), parts[1]);
97 EXPECT_EQ(string("c"), parts[2]);
98 EXPECT_EQ(string("d"), parts[3]);
99 }
100 {
101 for (int i = 0; i < n; ++i) {
102 string str = string("a") + delim[i] + delim[i] + "b" + delim[i] + "c";
103 for (int j = 0; j < 5; ++j) {
104 str += delim[i];
105 }
106 str += "d";
107 Array<string> parts = Split(str, delim[i]);
108 ASSERT_EQ(9u, parts.size());
109 EXPECT_EQ(string("a"), parts[0]);
110 EXPECT_EQ(string(""), parts[1]);
111 EXPECT_EQ(string("b"), parts[2]);
112 EXPECT_EQ(string("c"), parts[3]);
113 EXPECT_EQ(string(""), parts[4]);
114 EXPECT_EQ(string(""), parts[5]);
115 EXPECT_EQ(string(""), parts[6]);
116 EXPECT_EQ(string(""), parts[7]);
117 EXPECT_EQ(string("d"), parts[8]);
118 }
119 }
120 {
121 const bool discard_empty = true;
122 for (int i = 0; i < n; ++i) {
123 string str = string("a") + delim[i] + delim[i] + "b" + delim[i] + "c";
124 for (int j = 0; j < 5; ++j) {
125 str += delim[i];
126 }
127 str += "d";
128 Array<string> parts = Split(str, delim[i], 0, discard_empty);
129 ASSERT_EQ(4u, parts.size());
130 EXPECT_EQ(string("a"), parts[0]);
131 EXPECT_EQ(string("b"), parts[1]);
132 EXPECT_EQ(string("c"), parts[2]);
133 EXPECT_EQ(string("d"), parts[3]);
134 }
135 }
136 {
137 const bool discard_empty = true;
138 for (int i = 0; i < n; ++i) {
139 string str = string("a") + delim[i] + delim[i] + "b" + delim[i] + "c";
140 for (int j = 0; j < 5; ++j) {
141 str += delim[i];
142 }
143 str += "d";
144 Array<string> parts = Split(str, delim[i], -1, discard_empty);
145 ASSERT_EQ(1u, parts.size());
146 EXPECT_EQ(string("d"), parts[0]);
147 }
148 }
149 {
150 const bool discard_empty = true;
151 for (int i = 0; i < n; ++i) {
152 string str = string("a") + delim[i] + delim[i] + "b" + delim[i] + "c";
153 for (int j = 0; j < 5; ++j) {
154 str += delim[i];
155 }
156 str += "d";
157 Array<string> parts = Split(str, delim[i], -4, discard_empty);
158 ASSERT_EQ(4u, parts.size());
159 EXPECT_EQ(string("a"), parts[0]);
160 EXPECT_EQ(string("b"), parts[1]);
161 EXPECT_EQ(string("c"), parts[2]);
162 EXPECT_EQ(string("d"), parts[3]);
163 }
164 }
165 {
166 const bool discard_empty = false;
167 const bool handle_quotes = true;
168 auto parts = Split(" \t 'a' \"b\"b \tc \t\"d\"", " ", 0, discard_empty, handle_quotes);
169 ASSERT_EQ(5u, parts.size());
170 EXPECT_TRUE(parts[0].empty());
171 EXPECT_EQ(string("\t"), parts[1]);
172 EXPECT_EQ(string("a"), parts[2]);
173 EXPECT_TRUE(parts[3].empty());
174 EXPECT_EQ(string("b\"b \tc \t\"d"), parts[4]);
175 }
176 {
177 const bool discard_empty = false;
178 const bool handle_quotes = true;
179 auto parts = Split(" \t 'a' \"b\"b \tc \t\"d\"", " ", -2, discard_empty, handle_quotes);
180 EXPECT_TRUE(parts[0].empty());
181 EXPECT_EQ(string("b\"b \tc \t\"d"), parts[1]);
182 }
183 {
184 const bool discard_empty = true;
185 const bool handle_quotes = true;
186 auto parts = Split(" \t 'a' \"b\"b \tc \t\"d\"", " ", -2, discard_empty, handle_quotes);
187 EXPECT_EQ(string("a"), parts[0]);
188 EXPECT_EQ(string("b\"b \tc \t\"d"), parts[1]);
189 }
190 {
191 const bool discard_empty = true;
192 const bool handle_quotes = true;
193 auto parts = Split(" first 'sec ond ' t \t\"fo\"ur th\"", " ", 0, discard_empty, handle_quotes);
194 ASSERT_EQ(4u, parts.size());
195 EXPECT_EQ(string("first"), parts[0]);
196 EXPECT_EQ(string("sec ond "), parts[1]);
197 EXPECT_EQ(string("t"), parts[2]);
198 EXPECT_EQ(string("fo\"ur th"), parts[3]);
199 }
200 {
201 const bool discard_empty = true;
202 const bool handle_quotes = true;
203 auto parts = Split(" first,'sec o,nd ' , t,\t \"fo\"ur th\"\n", ",", 0, discard_empty, handle_quotes);
204 ASSERT_EQ(4u, parts.size());
205 EXPECT_EQ(string(" first"), parts[0]);
206 EXPECT_EQ(string("sec o,nd "), parts[1]);
207 EXPECT_EQ(string(" t"), parts[2]);
208 EXPECT_EQ(string("fo\"ur th"), parts[3]);
209 }
210 }
211
212 // -----------------------------------------------------------------------------
TEST(String,StandardUnits)213 TEST(String, StandardUnits)
214 {
215 EXPECT_EQ(string("vox"), StandardUnits("voxels"));
216 EXPECT_EQ(string("vox"), StandardUnits("VOX"));
217 EXPECT_EQ(string("vox"), StandardUnits("VOXEL"));
218 EXPECT_EQ(string("%"), StandardUnits("percentage"));
219 EXPECT_EQ(string("mm"), StandardUnits("millimeters"));
220 EXPECT_EQ(string("mm"), StandardUnits("MM"));
221 EXPECT_EQ(string("rel"), StandardUnits("relative"));
222 EXPECT_EQ(string("abs"), StandardUnits("ABSOLUTE"));
223 EXPECT_EQ(string("abs"), StandardUnits("absolute"));
224 }
225
226 // -----------------------------------------------------------------------------
TEST(String,ParameterUnits)227 TEST(String, ParameterUnits)
228 {
229 {
230 string name;
231 EXPECT_EQ(string("mm"), ParameterUnits("Resolution[mm] \n", &name));
232 EXPECT_EQ("Resolution", name);
233 }
234 EXPECT_EQ(string("mm"), ParameterUnits("Resolution [mm]"));
235 EXPECT_EQ(string("mm"), ParameterUnits("Resolution [MM]"));
236 {
237 string name;
238 EXPECT_EQ(string("mm"), ParameterUnits(" Resolution [MM]", &name));
239 EXPECT_EQ("Resolution", name);
240 }
241 {
242 string name;
243 EXPECT_EQ(string(""), ParameterUnits("Resolution", &name));
244 EXPECT_EQ("Resolution", name);
245 }
246 {
247 string name;
248 EXPECT_EQ(string(""), ParameterUnits("Resolution of image 1", &name));
249 EXPECT_EQ("Resolution of image 1", name);
250 }
251 EXPECT_EQ(string("rel"), ParameterUnits("Resolution [relative] \t"));
252 }
253
254 // -----------------------------------------------------------------------------
TEST(String,ValueUnits)255 TEST(String, ValueUnits)
256 {
257 EXPECT_EQ(string("mm"), ValueUnits("1 mm"));
258 EXPECT_EQ(string("mm"), ValueUnits("1mm"));
259 EXPECT_EQ(string("mm"), ValueUnits("1 [mm]"));
260 {
261 string value;
262 EXPECT_EQ(string("mm"), ValueUnits(" 1[mm] \n", &value));
263 EXPECT_EQ(string("1"), value);
264 }
265 {
266 string value;
267 EXPECT_EQ(string("mm"), ValueUnits(" 1 2 3mm", &value));
268 EXPECT_EQ(string("1 2 3"), value);
269 }
270 {
271 string value;
272 EXPECT_EQ(string("mm"), ValueUnits(" 1.5mm", &value));
273 EXPECT_EQ(string("1.5"), value);
274 }
275 {
276 string value;
277 EXPECT_EQ(string("mm"), ValueUnits(" 1 2 3 [mm]", &value));
278 EXPECT_EQ(string("1 2 3"), value);
279 }
280 EXPECT_EQ(string(""), ValueUnits("1"));
281 EXPECT_EQ(string(""), ValueUnits("foo mm"));
282 EXPECT_EQ(string("mm"), ValueUnits("foo [mm]\n"));
283 }
284
285 // =============================================================================
286 // Main
287 // =============================================================================
288
289 // -----------------------------------------------------------------------------
main(int argc,char * argv[])290 int main(int argc, char *argv[])
291 {
292 ::testing::InitGoogleTest(&argc, argv);
293 return RUN_ALL_TESTS();
294 }
295