ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
misc_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/misc"
33 #include "util/testing.h"
34 
35 #include "util/misc.h"
36 
37 using namespace colmap;
38 
39 BOOST_AUTO_TEST_CASE(TestEnsureTrailingSlash) {
40  BOOST_CHECK_EQUAL(EnsureTrailingSlash(""), "/");
41  BOOST_CHECK_EQUAL(EnsureTrailingSlash("/"), "/");
42  BOOST_CHECK_EQUAL(EnsureTrailingSlash("////"), "////");
43  BOOST_CHECK_EQUAL(EnsureTrailingSlash("test"), "test/");
44  BOOST_CHECK_EQUAL(EnsureTrailingSlash("/test"), "/test/");
45 }
46 
47 BOOST_AUTO_TEST_CASE(TestHasFileExtension) {
48  BOOST_CHECK_EQUAL(HasFileExtension("", ".jpg"), false);
49  BOOST_CHECK_EQUAL(HasFileExtension("testjpg", ".jpg"), false);
50  BOOST_CHECK_EQUAL(HasFileExtension("test.jpg", ".jpg"), true);
51  BOOST_CHECK_EQUAL(HasFileExtension("test.jpg", ".Jpg"), true);
52  BOOST_CHECK_EQUAL(HasFileExtension("test.jpg", ".JPG"), true);
53  BOOST_CHECK_EQUAL(HasFileExtension("test.", "."), true);
54 }
55 
56 BOOST_AUTO_TEST_CASE(TestSplitFileExtension) {
57  std::string root;
58  std::string ext;
59  SplitFileExtension("", &root, &ext);
60  BOOST_CHECK_EQUAL(root, "");
61  BOOST_CHECK_EQUAL(ext, "");
62  SplitFileExtension(".", &root, &ext);
63  BOOST_CHECK_EQUAL(root, "");
64  BOOST_CHECK_EQUAL(ext, "");
65  SplitFileExtension("file", &root, &ext);
66  BOOST_CHECK_EQUAL(root, "file");
67  BOOST_CHECK_EQUAL(ext, "");
68  SplitFileExtension("file.", &root, &ext);
69  BOOST_CHECK_EQUAL(root, "file");
70  BOOST_CHECK_EQUAL(ext, "");
71  SplitFileExtension("file.jpg", &root, &ext);
72  BOOST_CHECK_EQUAL(root, "file");
73  BOOST_CHECK_EQUAL(ext, ".jpg");
74  SplitFileExtension("dir/file.jpg", &root, &ext);
75  BOOST_CHECK_EQUAL(root, "dir/file");
76  BOOST_CHECK_EQUAL(ext, ".jpg");
77  SplitFileExtension("/dir/file.jpg", &root, &ext);
78  BOOST_CHECK_EQUAL(root, "/dir/file");
79  BOOST_CHECK_EQUAL(ext, ".jpg");
80  SplitFileExtension("dir/file.suffix.jpg", &root, &ext);
81  BOOST_CHECK_EQUAL(root, "dir/file.suffix");
82  BOOST_CHECK_EQUAL(ext, ".jpg");
83  SplitFileExtension("dir.suffix/file.suffix.jpg", &root, &ext);
84  BOOST_CHECK_EQUAL(root, "dir.suffix/file.suffix");
85  BOOST_CHECK_EQUAL(ext, ".jpg");
86  SplitFileExtension("dir.suffix/file.", &root, &ext);
87  BOOST_CHECK_EQUAL(root, "dir.suffix/file");
88  BOOST_CHECK_EQUAL(ext, "");
89  SplitFileExtension("./dir.suffix/file.", &root, &ext);
90  BOOST_CHECK_EQUAL(root, "./dir.suffix/file");
91  BOOST_CHECK_EQUAL(ext, "");
92 }
93 
94 BOOST_AUTO_TEST_CASE(TestGetPathBaseName) {
95  BOOST_CHECK_EQUAL(GetPathBaseName(""), "");
96  BOOST_CHECK_EQUAL(GetPathBaseName("test"), "test");
97  BOOST_CHECK_EQUAL(GetPathBaseName("/test"), "test");
98  BOOST_CHECK_EQUAL(GetPathBaseName("test/"), "test");
99  BOOST_CHECK_EQUAL(GetPathBaseName("/test/"), "test");
100  BOOST_CHECK_EQUAL(GetPathBaseName("test1/test2"), "test2");
101  BOOST_CHECK_EQUAL(GetPathBaseName("/test1/test2"), "test2");
102  BOOST_CHECK_EQUAL(GetPathBaseName("/test1/test2/"), "test2");
103  BOOST_CHECK_EQUAL(GetPathBaseName("/test1/test2/"), "test2");
104  BOOST_CHECK_EQUAL(GetPathBaseName("\\test1/test2/"), "test2");
105  BOOST_CHECK_EQUAL(GetPathBaseName("\\test1\\test2\\"), "test2");
106  BOOST_CHECK_EQUAL(GetPathBaseName("/test1/test2/test3.ext"), "test3.ext");
107 }
108 
109 BOOST_AUTO_TEST_CASE(TestGetParentDir) {
110  BOOST_CHECK_EQUAL(GetParentDir(""), "");
111  BOOST_CHECK_EQUAL(GetParentDir("test"), "");
112  BOOST_CHECK_EQUAL(GetParentDir("/test"), "/");
113  BOOST_CHECK_EQUAL(GetParentDir("/"), "");
114  BOOST_CHECK_EQUAL(GetParentDir("test/test"), "test");
115 }
116 
117 BOOST_AUTO_TEST_CASE(TestJoinPaths) {
118  BOOST_CHECK_EQUAL(JoinPaths(""), "");
119  BOOST_CHECK_EQUAL(JoinPaths("test"), "test");
120  BOOST_CHECK_EQUAL(JoinPaths("/test"), "/test");
121  BOOST_CHECK_EQUAL(JoinPaths("test/"), "test/");
122  BOOST_CHECK_EQUAL(JoinPaths("/test/"), "/test/");
123  BOOST_CHECK_EQUAL(JoinPaths("test1/test2"), "test1/test2");
124  BOOST_CHECK_EQUAL(JoinPaths("/test1/test2"), "/test1/test2");
125  BOOST_CHECK_EQUAL(JoinPaths("/test1/test2/"), "/test1/test2/");
126  BOOST_CHECK_EQUAL(JoinPaths("/test1/test2/"), "/test1/test2/");
127  BOOST_CHECK_EQUAL(JoinPaths("\\test1/test2/"), "\\test1/test2/");
128  BOOST_CHECK_EQUAL(JoinPaths("\\test1\\test2\\"), "\\test1\\test2\\");
129 #ifdef _MSC_VER
130  BOOST_CHECK_EQUAL(JoinPaths("test1", "test2"), "test1\\test2");
131  BOOST_CHECK_EQUAL(JoinPaths("/test1", "test2"), "/test1\\test2");
132 #else
133  BOOST_CHECK_EQUAL(JoinPaths("test1", "test2"), "test1/test2");
134  BOOST_CHECK_EQUAL(JoinPaths("/test1", "test2"), "/test1/test2");
135 #endif
136  BOOST_CHECK_EQUAL(JoinPaths("/test1", "/test2"), "/test1/test2");
137  BOOST_CHECK_EQUAL(JoinPaths("/test1", "/test2/"), "/test1/test2/");
138  BOOST_CHECK_EQUAL(JoinPaths("/test1", "/test2/", "test3.ext"),
139  "/test1/test2/test3.ext");
140 }
141 
142 BOOST_AUTO_TEST_CASE(TestVectorContainsValue) {
143  BOOST_CHECK(VectorContainsValue<int>({1, 2, 3}, 1));
144  BOOST_CHECK(!VectorContainsValue<int>({2, 3}, 1));
145 }
146 
147 BOOST_AUTO_TEST_CASE(TestVectorContainsDuplicateValues) {
148  BOOST_CHECK(!VectorContainsDuplicateValues<int>({}));
149  BOOST_CHECK(!VectorContainsDuplicateValues<int>({1}));
150  BOOST_CHECK(!VectorContainsDuplicateValues<int>({1, 2}));
151  BOOST_CHECK(!VectorContainsDuplicateValues<int>({1, 2, 3}));
152  BOOST_CHECK(VectorContainsDuplicateValues<int>({1, 1, 2, 3}));
153  BOOST_CHECK(VectorContainsDuplicateValues<int>({1, 1, 2, 2, 3}));
154  BOOST_CHECK(VectorContainsDuplicateValues<int>({1, 2, 3, 3}));
155  BOOST_CHECK(!VectorContainsDuplicateValues<std::string>({"a"}));
156  BOOST_CHECK(!VectorContainsDuplicateValues<std::string>({"a", "b"}));
157  BOOST_CHECK(VectorContainsDuplicateValues<std::string>({"a", "a"}));
158 }
159 
160 BOOST_AUTO_TEST_CASE(TestCSVToVector) {
161  const std::vector<int> list1 = CSVToVector<int>("1, 2, 3 , 4,5,6 ");
162  BOOST_CHECK_EQUAL(list1.size(), 6);
163  BOOST_CHECK_EQUAL(list1[0], 1);
164  BOOST_CHECK_EQUAL(list1[1], 2);
165  BOOST_CHECK_EQUAL(list1[2], 3);
166  BOOST_CHECK_EQUAL(list1[3], 4);
167  BOOST_CHECK_EQUAL(list1[4], 5);
168  BOOST_CHECK_EQUAL(list1[5], 6);
169  const std::vector<int> list2 = CSVToVector<int>("1; 2; 3 ; 4;5;6 ");
170  BOOST_CHECK_EQUAL(list2.size(), 6);
171  BOOST_CHECK_EQUAL(list2[0], 1);
172  BOOST_CHECK_EQUAL(list2[1], 2);
173  BOOST_CHECK_EQUAL(list2[2], 3);
174  BOOST_CHECK_EQUAL(list2[3], 4);
175  BOOST_CHECK_EQUAL(list2[4], 5);
176  BOOST_CHECK_EQUAL(list2[5], 6);
177  const std::vector<int> list3 = CSVToVector<int>("1;, 2;; 3 ; 4;5;6 ");
178  BOOST_CHECK_EQUAL(list3.size(), 6);
179  BOOST_CHECK_EQUAL(list3[0], 1);
180  BOOST_CHECK_EQUAL(list3[1], 2);
181  BOOST_CHECK_EQUAL(list3[2], 3);
182  BOOST_CHECK_EQUAL(list3[3], 4);
183  BOOST_CHECK_EQUAL(list3[4], 5);
184  BOOST_CHECK_EQUAL(list3[5], 6);
185 }
186 
187 BOOST_AUTO_TEST_CASE(TestVectorToCSV) {
188  BOOST_CHECK_EQUAL(VectorToCSV<int>({}), "");
189  BOOST_CHECK_EQUAL(VectorToCSV<int>({1}), "1");
190  BOOST_CHECK_EQUAL(VectorToCSV<int>({1, 2, 3}), "1, 2, 3");
191 }
192 
193 BOOST_AUTO_TEST_CASE(TestRemoveCommandLineArgument) {
194  int argc = 3;
195  std::unique_ptr<char[]> arg1(new char[4]);
196  memcpy(arg1.get(), "abc", 4 * sizeof(char));
197  std::unique_ptr<char[]> arg2(new char[4]);
198  memcpy(arg2.get(), "def", 4 * sizeof(char));
199  std::unique_ptr<char[]> arg3(new char[4]);
200  memcpy(arg3.get(), "ghi", 4 * sizeof(char));
201  std::vector<char*> argv = {arg1.get(), arg2.get(), arg3.get()};
202 
203  RemoveCommandLineArgument("abcd", &argc, argv.data());
204  BOOST_CHECK_EQUAL(argc, 3);
205  BOOST_CHECK_EQUAL(argv[0], "abc");
206  BOOST_CHECK_EQUAL(argv[1], "def");
207  BOOST_CHECK_EQUAL(argv[2], "ghi");
208 
209  RemoveCommandLineArgument("def", &argc, argv.data());
210  BOOST_CHECK_EQUAL(argc, 2);
211  BOOST_CHECK_EQUAL(argv[0], "abc");
212  BOOST_CHECK_EQUAL(argv[1], "ghi");
213 
214  RemoveCommandLineArgument("ghi", &argc, argv.data());
215  BOOST_CHECK_EQUAL(argc, 1);
216  BOOST_CHECK_EQUAL(argv[0], "abc");
217 
218  RemoveCommandLineArgument("abc", &argc, argv.data());
219  BOOST_CHECK_EQUAL(argc, 0);
220 
221  RemoveCommandLineArgument("abc", &argc, argv.data());
222  BOOST_CHECK_EQUAL(argc, 0);
223 }
BOOST_AUTO_TEST_CASE(TestEnsureTrailingSlash)
Definition: misc_test.cc:39
bool HasFileExtension(const std::string &file_name, const std::string &ext)
Definition: misc.cc:51
std::string GetPathBaseName(const std::string &path)
Definition: misc.cc:118
void SplitFileExtension(const std::string &path, std::string *root, std::string *ext)
Definition: misc.cc:64
std::string JoinPaths(T const &... paths)
Definition: misc.h:128
std::string EnsureTrailingSlash(const std::string &str)
Definition: misc.cc:40
std::string GetParentDir(const std::string &path)
Definition: misc.cc:128
void RemoveCommandLineArgument(const std::string &arg, int *argc, char **argv)
Definition: misc.cc:327