Merge branch '2633_mclib_xterm_clear'
[midnight-commander.git] / tests / lib / vfs / vfs_path_string_convert.c
blobc9ff7754927f2def8b6ca5775d01a22bad3ade88
1 /*
2 lib/vfs - get vfs_path_t from string
4 Copyright (C) 2011-2024
5 Free Software Foundation, Inc.
7 Written by:
8 Slava Zanko <slavazanko@gmail.com>, 2011, 2013
10 This file is part of the Midnight Commander.
12 The Midnight Commander is free software: you can redistribute it
13 and/or modify it under the terms of the GNU General Public License as
14 published by the Free Software Foundation, either version 3 of the License,
15 or (at your option) any later version.
17 The Midnight Commander is distributed in the hope that it will be useful,
18 but WITHOUT ANY WARRANTY; without even the implied warranty of
19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 GNU General Public License for more details.
22 You should have received a copy of the GNU General Public License
23 along with this program. If not, see <http://www.gnu.org/licenses/>.
26 #define TEST_SUITE_NAME "/lib/vfs"
28 #include "tests/mctest.h"
30 #ifdef HAVE_CHARSET
31 #include "lib/charsets.h"
32 #endif
34 #include "lib/strutil.h"
35 #include "lib/vfs/xdirentry.h"
36 #include "lib/vfs/path.c" /* for testing static methods */
38 #include "src/vfs/local/local.c"
40 static struct vfs_class vfs_test_ops1, vfs_test_ops2, vfs_test_ops3;
42 #define ETALON_PATH_STR "/#test1/bla-bla/some/path/#test2/bla-bla/some/path#test3/111/22/33"
43 #define ETALON_PATH_URL_STR "/test1://bla-bla/some/path/test2://bla-bla/some/path/test3://111/22/33"
45 /* --------------------------------------------------------------------------------------------- */
47 /* @Before */
48 static void
49 setup (void)
51 str_init_strings ("UTF-8");
53 vfs_init ();
54 vfs_init_localfs ();
55 vfs_setup_work_dir ();
57 vfs_init_class (&vfs_test_ops1, "testfs1", VFSF_NOLINKS, "test1");
58 vfs_register_class (&vfs_test_ops1);
60 vfs_init_class (&vfs_test_ops2, "testfs2", VFSF_REMOTE, "test2");
61 vfs_register_class (&vfs_test_ops2);
63 vfs_init_class (&vfs_test_ops3, "testfs3", VFSF_UNKNOWN, "test3");
64 vfs_register_class (&vfs_test_ops3);
66 #ifdef HAVE_CHARSET
67 mc_global.sysconfig_dir = (char *) TEST_SHARE_DIR;
68 load_codepages_list ();
69 #endif /* HAVE_CHARSET */
72 /* --------------------------------------------------------------------------------------------- */
74 /* @After */
75 static void
76 teardown (void)
78 #ifdef HAVE_CHARSET
79 free_codepages_list ();
80 #endif /* HAVE_CHARSET */
82 vfs_shut ();
83 str_uninit_strings ();
86 /* --------------------------------------------------------------------------------------------- */
87 /* @DataSource("test_from_to_string_ds") */
88 /* *INDENT-OFF* */
89 static const struct test_from_to_string_ds
91 const char *input_string;
92 const char *expected_result;
93 const char *expected_element_path;
94 const size_t expected_elements_count;
95 struct vfs_class *expected_vfs_class;
96 } test_from_to_string_ds[] =
98 { /* 0. */
99 ETALON_PATH_STR,
100 ETALON_PATH_URL_STR,
101 "111/22/33",
103 &vfs_test_ops3
105 { /* 1. */
106 "/",
107 "/",
108 "/",
110 VFS_CLASS (&local_subclass)
112 { /* 2. */
113 "/test1://bla-bla/some/path/test2://user:passwd@some.host:1234/bla-bla/some/path/test3://111/22/33",
114 "/test1://bla-bla/some/path/test2://user:passwd@some.host:1234/bla-bla/some/path/test3://111/22/33",
115 "111/22/33",
117 &vfs_test_ops3
119 #ifdef HAVE_CHARSET
120 { /* 3. */
121 "/#test1/bla-bla1/some/path/#test2/bla-bla2/#enc:KOI8-R/some/path#test3/111/22/33",
122 "/test1://bla-bla1/some/path/test2://#enc:KOI8-R/bla-bla2/some/path/test3://111/22/33",
123 "111/22/33",
125 &vfs_test_ops3
127 { /* 4. */
128 "/#test1/bla-bla1/#enc:CP866/some/path/#test2/bla-bla2/#enc:KOI8-R/some/path#test3/111/22/33",
129 "/test1://#enc:CP866/bla-bla1/some/path/test2://#enc:KOI8-R/bla-bla2/some/path/test3://111/22/33",
130 "111/22/33",
132 &vfs_test_ops3
134 { /* 5. */
135 "/#test1/bla-bla1/some/path/#test2/bla-bla2/#enc:CP866/#enc:KOI8-R/some/path#test3/111/22/33",
136 "/test1://bla-bla1/some/path/test2://#enc:KOI8-R/bla-bla2/some/path/test3://111/22/33",
137 "111/22/33",
139 &vfs_test_ops3
141 { /* 6. */
142 "/#test1/bla-bla1/some/path/#test2/bla-bla2/#enc:CP866/some/#enc:KOI8-R/path#test3/111/22/33",
143 "/test1://bla-bla1/some/path/test2://#enc:KOI8-R/bla-bla2/some/path/test3://111/22/33",
144 "111/22/33",
146 &vfs_test_ops3
148 { /* 7. */
149 "/#test1/bla-bla1/some/path/#test2/#enc:CP866/bla-bla2/#enc:KOI8-R/some/path#test3/111/22/33",
150 "/test1://bla-bla1/some/path/test2://#enc:KOI8-R/bla-bla2/some/path/test3://111/22/33",
151 "111/22/33",
153 &vfs_test_ops3
155 { /* 8. */
156 "/#test1/bla-bla1/some/path/#enc:CP866/#test2/bla-bla2/#enc:KOI8-R/some/path#test3/111/22/33",
157 "/test1://#enc:CP866/bla-bla1/some/path/test2://#enc:KOI8-R/bla-bla2/some/path/test3://111/22/33",
158 "111/22/33",
160 &vfs_test_ops3
162 #endif /* HAVE_CHARSET */
164 /* *INDENT-ON* */
166 /* @Test */
167 /* *INDENT-OFF* */
168 START_PARAMETRIZED_TEST (test_from_to_string, test_from_to_string_ds)
169 /* *INDENT-ON* */
171 /* given */
172 vfs_path_t *vpath;
173 size_t vpath_len;
174 const vfs_path_element_t *path_element;
175 const char *actual_result;
177 vpath = vfs_path_from_str_flags (data->input_string, VPF_USE_DEPRECATED_PARSER);
179 /* when */
180 vpath_len = vfs_path_elements_count (vpath);
181 actual_result = vfs_path_as_str (vpath);
182 path_element = vfs_path_get_by_index (vpath, -1);
184 /* then */
185 ck_assert_int_eq (vpath_len, data->expected_elements_count);
186 mctest_assert_str_eq (actual_result, data->expected_result);
187 mctest_assert_ptr_eq (path_element->class, data->expected_vfs_class);
188 mctest_assert_str_eq (path_element->path, data->expected_element_path);
190 vfs_path_free (vpath, TRUE);
192 /* *INDENT-OFF* */
193 END_PARAMETRIZED_TEST
194 /* *INDENT-ON* */
196 /* --------------------------------------------------------------------------------------------- */
198 /* @DataSource("test_partial_string_by_index_ds") */
199 /* *INDENT-OFF* */
200 static const struct test_partial_string_by_index_ds
202 const char *input_string;
203 const off_t element_index;
204 const char *expected_result;
205 } test_partial_string_by_index_ds[] =
207 { /* 0. */
208 ETALON_PATH_STR,
210 "/test1://bla-bla/some/path/test2://bla-bla/some/path"
212 { /* 1. */
213 ETALON_PATH_STR,
215 "/test1://bla-bla/some/path/"
217 { /* 2. */
218 ETALON_PATH_STR,
222 { /* 3. Index out of bound */
223 ETALON_PATH_STR,
227 { /* 4. */
228 ETALON_PATH_STR,
232 { /* 5. */
233 ETALON_PATH_STR,
235 "/test1://bla-bla/some/path/"
237 { /* 6. */
238 ETALON_PATH_STR,
240 "/test1://bla-bla/some/path/test2://bla-bla/some/path"
242 { /* 6. */
243 ETALON_PATH_STR,
245 ETALON_PATH_URL_STR
247 { /* 7. Index out of bound */
248 ETALON_PATH_STR,
250 ETALON_PATH_URL_STR
253 /* *INDENT-ON* */
255 /* @Test(dataSource = "test_partial_string_by_index_ds") */
256 /* *INDENT-OFF* */
257 START_PARAMETRIZED_TEST (test_partial_string_by_index, test_partial_string_by_index_ds)
258 /* *INDENT-ON* */
260 /* given */
261 vfs_path_t *vpath;
262 char *actual_result;
263 vpath = vfs_path_from_str_flags (data->input_string, VPF_USE_DEPRECATED_PARSER);
265 /* when */
266 actual_result = vfs_path_to_str_elements_count (vpath, data->element_index);
268 /* then */
269 mctest_assert_str_eq (actual_result, data->expected_result);
270 g_free (actual_result);
272 vfs_path_free (vpath, TRUE);
274 /* *INDENT-OFF* */
275 END_PARAMETRIZED_TEST
276 /* *INDENT-ON* */
278 /* --------------------------------------------------------------------------------------------- */
279 #ifdef HAVE_CHARSET
280 /* --------------------------------------------------------------------------------------------- */
282 #define ETALON_STR "/path/to/file.ext/test1://#enc:KOI8-R"
283 /* @Test */
284 /* *INDENT-OFF* */
285 START_TEST (test_vfs_path_encoding_at_end)
286 /* *INDENT-ON* */
288 /* given */
289 vfs_path_t *vpath;
290 const char *result;
291 const vfs_path_element_t *element;
293 vpath =
294 vfs_path_from_str_flags ("/path/to/file.ext#test1:/#enc:KOI8-R", VPF_USE_DEPRECATED_PARSER);
296 /* when */
297 result = vfs_path_as_str (vpath);
298 element = vfs_path_get_by_index (vpath, -1);
300 /* then */
301 mctest_assert_str_eq (element->path, "");
302 mctest_assert_not_null (element->encoding);
303 mctest_assert_str_eq (result, ETALON_STR);
305 vfs_path_free (vpath, TRUE);
308 /* *INDENT-OFF* */
309 END_TEST
310 /* *INDENT-ON* */
311 #endif /* HAVE_CHARSET */
312 /* --------------------------------------------------------------------------------------------- */
315 main (void)
317 TCase *tc_core;
319 tc_core = tcase_create ("Core");
321 tcase_add_checked_fixture (tc_core, setup, teardown);
323 /* Add new tests here: *************** */
324 mctest_add_parameterized_test (tc_core, test_from_to_string, test_from_to_string_ds);
325 mctest_add_parameterized_test (tc_core, test_partial_string_by_index,
326 test_partial_string_by_index_ds);
327 #ifdef HAVE_CHARSET
328 tcase_add_test (tc_core, test_vfs_path_encoding_at_end);
329 #endif
330 /* *********************************** */
332 return mctest_run_all (tc_core);
335 /* --------------------------------------------------------------------------------------------- */