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