1 #include <stic.h>
2
3 #include <unistd.h> /* symlink() unlink() */
4
5 #include <stdio.h> /* fclose() fopen() */
6
7 #include <test-utils.h>
8
9 #include "../../src/utils/str.h"
10 #include "../../src/utils/path.h"
11
TEST(in_one_dir)12 TEST(in_one_dir)
13 {
14 const char *buf;
15
16 buf = make_rel_path("/vifm-test/a", "/vifm-test/");
17 assert_string_equal("a", buf);
18
19 buf = make_rel_path("/vifm-test/", "/vifm-test/");
20 assert_string_equal(".", buf);
21
22 buf = make_rel_path("/vifm-test", "/vifm-test/");
23 assert_string_equal(".", buf);
24
25 buf = make_rel_path("/vifm-test/", "/vifm-test");
26 assert_string_equal(".", buf);
27
28 buf = make_rel_path("/vifm-test", "/vifm-test");
29 assert_string_equal(".", buf);
30 }
31
TEST(slashes)32 TEST(slashes)
33 {
34 const char *buf;
35
36 buf = make_rel_path("/vifm-test/a", "/vifm-test");
37 assert_string_equal("a", buf);
38
39 buf = make_rel_path("/vifm-test/a", "/vifm-test/");
40 assert_string_equal("a", buf);
41
42 buf = make_rel_path("/vifm-test/a/", "/vifm-test");
43 assert_string_equal("a", buf);
44
45 buf = make_rel_path("/vifm-test/a/", "/vifm-test/");
46 assert_string_equal("a", buf);
47 }
48
TEST(under_dir)49 TEST(under_dir)
50 {
51 const char *buf;
52
53 buf = make_rel_path("/vifm-test/a/b", "/vifm-test/");
54 assert_string_equal("a/b", buf);
55
56 buf = make_rel_path("/vifm-test/a/b///c", "/vifm-test/");
57 assert_string_equal("a/b/c", buf);
58 }
59
TEST(parent_dir)60 TEST(parent_dir)
61 {
62 const char *buf;
63
64 buf = make_rel_path("/", "/vifm-test/");
65 assert_string_equal("..", buf);
66
67 buf = make_rel_path("/", "/vifm-test/user/");
68 assert_string_equal("../..", buf);
69
70 buf = make_rel_path("/", "/vifm-test/////user/dir/");
71 assert_string_equal("../../..", buf);
72 }
73
TEST(different_subtree)74 TEST(different_subtree)
75 {
76 const char *buf;
77
78 buf = make_rel_path("/vifm-test/user1///u1dir1",
79 "/vifm-test/user2/././/u2dir1/.");
80 assert_string_equal("../../user1/u1dir1", buf);
81
82 buf = make_rel_path("/vifm-test/file", "/dir-in-root");
83 assert_string_equal("../vifm-test/file", buf);
84 }
85
TEST(windows_specific,IF (windows))86 TEST(windows_specific, IF(windows))
87 {
88 const char *buf;
89
90 buf = make_rel_path("c:/vifm-test/user1/dir1", "c:/vifm-test/user1/");
91 assert_string_equal("dir1", buf);
92
93 buf = make_rel_path("c:/vifm-test/user1/", "d:/vifm-test/user1/dir1");
94 assert_string_equal("c:/vifm-test/user1/", buf);
95 }
96
TEST(relative_links_are_built_for_real_paths,IF (not_windows))97 TEST(relative_links_are_built_for_real_paths, IF(not_windows))
98 {
99 /* symlink() is not available on Windows, but the rest of the code is fine. */
100 #ifndef _WIN32
101 assert_success(symlink(".", SANDBOX_PATH "/a"));
102 assert_success(symlink(".", SANDBOX_PATH "/b"));
103 #endif
104
105 fclose(fopen(SANDBOX_PATH "/target", "w"));
106
107 const char *rel_path = make_rel_path(SANDBOX_PATH "/a/a/a/target",
108 SANDBOX_PATH "/a/a/a/b/b/b");
109 assert_string_equal("target", rel_path);
110
111 assert_success(unlink(SANDBOX_PATH "/a"));
112 assert_success(unlink(SANDBOX_PATH "/b"));
113 assert_success(unlink(SANDBOX_PATH "/target"));
114 }
115
116 /* vim: set tabstop=2 softtabstop=2 shiftwidth=2 noexpandtab cinoptions-=(0 : */
117 /* vim: set cinoptions+=t0 filetype=c : */
118