1f7b43230SLouis Dionne //===----------------------------------------------------------------------===//
2f7b43230SLouis Dionne //
3f7b43230SLouis Dionne // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4f7b43230SLouis Dionne // See https://llvm.org/LICENSE.txt for license information.
5f7b43230SLouis Dionne // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6f7b43230SLouis Dionne //
7f7b43230SLouis Dionne //===----------------------------------------------------------------------===//
8f7b43230SLouis Dionne
9*4c5bc766SRodrigo Salazar // REQUIRES: can-create-symlinks
10ac8c9f1eSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
11c352fa74SLouis Dionne // UNSUPPORTED: no-filesystem
12c352fa74SLouis Dionne // UNSUPPORTED: availability-filesystem-missing
13f7b43230SLouis Dionne
14f7b43230SLouis Dionne // <filesystem>
15f7b43230SLouis Dionne
16f7b43230SLouis Dionne // path proximate(const path& p, error_code &ec)
17f7b43230SLouis Dionne // path proximate(const path& p, const path& base = current_path())
18f7b43230SLouis Dionne // path proximate(const path& p, const path& base, error_code& ec);
19f7b43230SLouis Dionne
20ac8c9f1eSLouis Dionne #include <filesystem>
21f7b43230SLouis Dionne #include <string>
22f7b43230SLouis Dionne #include <type_traits>
23f7b43230SLouis Dionne #include <cassert>
24f7b43230SLouis Dionne
25f7b43230SLouis Dionne #include "test_macros.h"
26f7b43230SLouis Dionne #include "test_iterators.h"
27cc89063bSNico Weber #include "count_new.h"
28cc89063bSNico Weber #include "filesystem_test_helper.h"
29ac8c9f1eSLouis Dionne namespace fs = std::filesystem;
30f7b43230SLouis Dionne
test_signature_0()312f2ed477SMark de Wever static void test_signature_0() {
32f7b43230SLouis Dionne fs::path p("");
33f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
342f2ed477SMark de Wever assert(output == fs::path::string_type(fs::current_path()));
35f7b43230SLouis Dionne }
36f7b43230SLouis Dionne
test_signature_1()372f2ed477SMark de Wever static void test_signature_1() {
38f7b43230SLouis Dionne fs::path p(".");
39f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
402f2ed477SMark de Wever assert(output == fs::path::string_type(fs::current_path()));
41f7b43230SLouis Dionne }
42f7b43230SLouis Dionne
test_signature_2()432f2ed477SMark de Wever static void test_signature_2() {
44b62ce9e0SSergej Jaskiewicz static_test_env static_env;
45b62ce9e0SSergej Jaskiewicz fs::path p(static_env.File);
46f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
472f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.File));
48f7b43230SLouis Dionne }
49f7b43230SLouis Dionne
test_signature_3()502f2ed477SMark de Wever static void test_signature_3() {
51b62ce9e0SSergej Jaskiewicz static_test_env static_env;
52b62ce9e0SSergej Jaskiewicz fs::path p(static_env.Dir);
53f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
542f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir));
55f7b43230SLouis Dionne }
56f7b43230SLouis Dionne
test_signature_4()572f2ed477SMark de Wever static void test_signature_4() {
58b62ce9e0SSergej Jaskiewicz static_test_env static_env;
59b62ce9e0SSergej Jaskiewicz fs::path p(static_env.SymlinkToDir);
60f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
612f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir));
62f7b43230SLouis Dionne }
63f7b43230SLouis Dionne
test_signature_5()642f2ed477SMark de Wever static void test_signature_5() {
65b62ce9e0SSergej Jaskiewicz static_test_env static_env;
66b62ce9e0SSergej Jaskiewicz fs::path p(static_env.SymlinkToDir / "dir2/.");
67f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
682f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir / "dir2"));
69f7b43230SLouis Dionne }
70f7b43230SLouis Dionne
test_signature_6()712f2ed477SMark de Wever static void test_signature_6() {
72b62ce9e0SSergej Jaskiewicz static_test_env static_env;
73f7b43230SLouis Dionne // FIXME? If the trailing separator occurs in a part of the path that exists,
74437e0e51SStephan T. Lavavej // it is omitted. Otherwise it is added to the end of the result.
75b62ce9e0SSergej Jaskiewicz fs::path p(static_env.SymlinkToDir / "dir2/./");
76f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
772f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir / "dir2"));
78f7b43230SLouis Dionne }
79f7b43230SLouis Dionne
test_signature_7()802f2ed477SMark de Wever static void test_signature_7() {
81b62ce9e0SSergej Jaskiewicz static_test_env static_env;
82b62ce9e0SSergej Jaskiewicz fs::path p(static_env.SymlinkToDir / "dir2/DNE/./");
83f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
842f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir / "dir2/DNE/"));
85f7b43230SLouis Dionne }
86f7b43230SLouis Dionne
test_signature_8()872f2ed477SMark de Wever static void test_signature_8() {
88b62ce9e0SSergej Jaskiewicz static_test_env static_env;
89b62ce9e0SSergej Jaskiewicz fs::path p(static_env.SymlinkToDir / "dir2");
90f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
912f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir2));
92f7b43230SLouis Dionne }
93f7b43230SLouis Dionne
test_signature_9()942f2ed477SMark de Wever static void test_signature_9() {
95b62ce9e0SSergej Jaskiewicz static_test_env static_env;
96b62ce9e0SSergej Jaskiewicz fs::path p(static_env.SymlinkToDir / "dir2/../dir2/DNE/..");
97f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
987a154c32SMartin Storsjö // weakly_canonical has a quirk - if the path is considered to exist,
997a154c32SMartin Storsjö // it's returned without a trailing slash, otherwise it's returned with
1007a154c32SMartin Storsjö // one (see a note in fs.op.weakly_canonical/weakly_canonical.pass.cpp).
1017a154c32SMartin Storsjö // On Windows, a path like existent/nonexistentsubdir/.. is considered
1027a154c32SMartin Storsjö // to exist, on posix it's considered to not exist. Therefore, the
1037a154c32SMartin Storsjö // result here differs in the trailing slash.
1047a154c32SMartin Storsjö #ifdef _WIN32
1052f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir2));
1067a154c32SMartin Storsjö #else
1072f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir2 / ""));
1087a154c32SMartin Storsjö #endif
109f7b43230SLouis Dionne }
110f7b43230SLouis Dionne
test_signature_10()1112f2ed477SMark de Wever static void test_signature_10() {
112b62ce9e0SSergej Jaskiewicz static_test_env static_env;
113b62ce9e0SSergej Jaskiewicz fs::path p(static_env.SymlinkToDir / "dir2/dir3/../DNE/DNE2");
114f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
1152f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir2 / "DNE/DNE2"));
116f7b43230SLouis Dionne }
117f7b43230SLouis Dionne
test_signature_11()1182f2ed477SMark de Wever static void test_signature_11() {
119b62ce9e0SSergej Jaskiewicz static_test_env static_env;
120b62ce9e0SSergej Jaskiewicz fs::path p(static_env.Dir / "../dir1");
121f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
1222f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir));
123f7b43230SLouis Dionne }
124f7b43230SLouis Dionne
test_signature_12()1252f2ed477SMark de Wever static void test_signature_12() {
126b62ce9e0SSergej Jaskiewicz static_test_env static_env;
127b62ce9e0SSergej Jaskiewicz fs::path p(static_env.Dir / "./.");
128f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
1292f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir));
130f7b43230SLouis Dionne }
131f7b43230SLouis Dionne
test_signature_13()1322f2ed477SMark de Wever static void test_signature_13() {
133b62ce9e0SSergej Jaskiewicz static_test_env static_env;
134b62ce9e0SSergej Jaskiewicz fs::path p(static_env.Dir / "DNE/../foo");
135f7b43230SLouis Dionne const fs::path output = fs::weakly_canonical(p);
1362f2ed477SMark de Wever assert(output == fs::path::string_type(static_env.Dir / "foo"));
137f7b43230SLouis Dionne }
138f7b43230SLouis Dionne
main(int,char **)1392f2ed477SMark de Wever int main(int, char**) {
1402f2ed477SMark de Wever test_signature_0();
1412f2ed477SMark de Wever test_signature_1();
1422f2ed477SMark de Wever test_signature_2();
1432f2ed477SMark de Wever test_signature_3();
1442f2ed477SMark de Wever test_signature_4();
1452f2ed477SMark de Wever test_signature_5();
1462f2ed477SMark de Wever test_signature_6();
1472f2ed477SMark de Wever test_signature_7();
1482f2ed477SMark de Wever test_signature_8();
1492f2ed477SMark de Wever test_signature_9();
1502f2ed477SMark de Wever test_signature_10();
1512f2ed477SMark de Wever test_signature_11();
1522f2ed477SMark de Wever test_signature_12();
1532f2ed477SMark de Wever test_signature_13();
1542f2ed477SMark de Wever
1552f2ed477SMark de Wever return 0;
1562f2ed477SMark de Wever }
157