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