Merge branch '2452_handle_baudrate_error'
[midnight-commander.git] / tests / lib / vfs / canonicalize_pathname.c
blob16712fda6627913bca4cb04a102d99fddf6cecb3
1 /*
2 lib - canonicalize path
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/util.h"
36 #include "lib/vfs/xdirentry.h"
38 #include "src/vfs/local/local.c"
40 static struct vfs_class vfs_test_ops;
42 /* --------------------------------------------------------------------------------------------- */
44 /* @Before */
45 static void
46 setup (void)
48 str_init_strings (NULL);
50 vfs_init ();
51 vfs_init_localfs ();
52 vfs_setup_work_dir ();
54 #ifdef HAVE_CHARSET
55 mc_global.sysconfig_dir = (char *) TEST_SHARE_DIR;
56 load_codepages_list ();
57 #endif
59 vfs_init_class (&vfs_test_ops, "testfs", VFSF_NOLINKS | VFSF_REMOTE, "ftp");
60 vfs_register_class (&vfs_test_ops);
63 /* --------------------------------------------------------------------------------------------- */
65 /* @After */
66 static void
67 teardown (void)
69 #ifdef HAVE_CHARSET
70 free_codepages_list ();
71 #endif
73 vfs_shut ();
75 str_uninit_strings ();
78 /* --------------------------------------------------------------------------------------------- */
80 /* @DataSource("test_canonicalize_path_ds") */
81 /* *INDENT-OFF* */
82 static const struct test_canonicalize_path_ds
84 const char *input_path;
85 const char *expected_path;
86 } test_canonicalize_path_ds[] =
88 { /* 0. UNC path */
89 "//some_server/ww",
90 "//some_server/ww"
92 { /* 1. join slashes */
93 "///some_server/////////ww",
94 "/some_server/ww"
96 { /* 2. Collapse "/./" -> "/" */
97 "//some_server//.///////ww/./././.",
98 "//some_server/ww"
100 {/* 3. Remove leading "./" */
101 "./some_server/ww",
102 "some_server/ww"
104 { /* 4. some/.. -> . */
105 "some_server/..",
108 { /* 5. Collapse "/.." with the previous part of path */
109 "/some_server/ww/some_server/../ww/../some_server/..//ww/some_server/ww",
110 "/some_server/ww/ww/some_server/ww"
112 { /* 6. URI style */
113 "/some_server/ww/ftp://user:pass@host.net/path/",
114 "/some_server/ww/ftp://user:pass@host.net/path"
116 { /* 7. */
117 "/some_server/ww/ftp://user:pass@host.net/path/../../",
118 "/some_server/ww"
120 { /* 8. */
121 "ftp://user:pass@host.net/path/../../",
124 { /* 9. */
125 "ftp://user/../../",
126 ".."
128 #ifdef HAVE_CHARSET
129 { /* 10. Supported encoding */
130 "/b/#enc:utf-8/../c",
131 "/c"
133 { /* 11. Unsupported encoding */
134 "/b/#enc:aaaa/../c",
135 "/b/c"
137 { /* 12. Supported encoding */
138 "/b/../#enc:utf-8/c",
139 "/#enc:utf-8/c"
141 { /* 13. Unsupported encoding */
142 "/b/../#enc:aaaa/c",
143 "/#enc:aaaa/c"
145 { /* 14. Supported encoding */
146 "/b/c/#enc:utf-8/..",
147 "/b"
149 { /* 15. Unsupported encoding */
150 "/b/c/#enc:aaaa/..",
151 "/b/c"
153 { /* 16. Supported encoding */
154 "/b/c/../#enc:utf-8",
155 "/b/#enc:utf-8"
157 { /* 17. Unsupported encoding */
158 "/b/c/../#enc:aaaa",
159 "/b/#enc:aaaa"
161 #endif /* HAVE_CHARSET */
163 /* *INDENT-ON* */
165 /* @Test(dataSource = "test_canonicalize_path_ds") */
166 /* *INDENT-OFF* */
167 START_PARAMETRIZED_TEST (test_canonicalize_path, test_canonicalize_path_ds)
168 /* *INDENT-ON* */
170 /* given */
171 char *actual_path;
173 actual_path = g_strdup (data->input_path);
175 /* when */
176 canonicalize_pathname (actual_path);
178 /* then */
179 mctest_assert_str_eq (actual_path, data->expected_path) g_free (actual_path);
181 /* *INDENT-OFF* */
182 END_PARAMETRIZED_TEST
183 /* *INDENT-ON* */
185 /* --------------------------------------------------------------------------------------------- */
188 main (void)
190 TCase *tc_core;
192 tc_core = tcase_create ("Core");
194 tcase_add_checked_fixture (tc_core, setup, teardown);
196 /* Add new tests here: *************** */
197 mctest_add_parameterized_test (tc_core, test_canonicalize_path, test_canonicalize_path_ds);
198 /* *********************************** */
200 return mctest_run_all (tc_core);
203 /* --------------------------------------------------------------------------------------------- */