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 current_path();
17f7b43230SLouis Dionne // path current_path(error_code& ec);
18f7b43230SLouis Dionne // void current_path(path const&);
19f7b43230SLouis Dionne // void current_path(path const&, std::error_code& ec) noexcept;
20f7b43230SLouis Dionne
21ac8c9f1eSLouis Dionne #include <filesystem>
22f7b43230SLouis Dionne #include <type_traits>
23f7b43230SLouis Dionne #include <cassert>
24f7b43230SLouis Dionne
25f7b43230SLouis Dionne #include "test_macros.h"
26cc89063bSNico Weber #include "filesystem_test_helper.h"
27ac8c9f1eSLouis Dionne namespace fs = std::filesystem;
28f7b43230SLouis Dionne using namespace fs;
29f7b43230SLouis Dionne
current_path_signature_test()302f2ed477SMark de Wever static void current_path_signature_test()
31f7b43230SLouis Dionne {
32f7b43230SLouis Dionne const path p; ((void)p);
33f7b43230SLouis Dionne std::error_code ec; ((void)ec);
34f7b43230SLouis Dionne ASSERT_NOT_NOEXCEPT(current_path());
35f7b43230SLouis Dionne ASSERT_NOT_NOEXCEPT(current_path(ec));
36f7b43230SLouis Dionne ASSERT_NOT_NOEXCEPT(current_path(p));
37f7b43230SLouis Dionne ASSERT_NOEXCEPT(current_path(p, ec));
38f7b43230SLouis Dionne }
39f7b43230SLouis Dionne
current_path_test()402f2ed477SMark de Wever static void current_path_test()
41f7b43230SLouis Dionne {
42f7b43230SLouis Dionne std::error_code ec;
43f7b43230SLouis Dionne const path p = current_path(ec);
442f2ed477SMark de Wever assert(!ec);
452f2ed477SMark de Wever assert(p.is_absolute());
462f2ed477SMark de Wever assert(is_directory(p));
47f7b43230SLouis Dionne
48f7b43230SLouis Dionne const path p2 = current_path();
492f2ed477SMark de Wever assert(p2 == p);
50f7b43230SLouis Dionne }
51f7b43230SLouis Dionne
current_path_after_change_test()522f2ed477SMark de Wever static void current_path_after_change_test()
53f7b43230SLouis Dionne {
54b62ce9e0SSergej Jaskiewicz static_test_env static_env;
554c402ae8SMartin Storsjö CWDGuard guard;
56b62ce9e0SSergej Jaskiewicz const path new_path = static_env.Dir;
57f7b43230SLouis Dionne current_path(new_path);
582f2ed477SMark de Wever assert(current_path() == new_path);
59f7b43230SLouis Dionne }
60f7b43230SLouis Dionne
current_path_is_file_test()612f2ed477SMark de Wever static void current_path_is_file_test()
62f7b43230SLouis Dionne {
63b62ce9e0SSergej Jaskiewicz static_test_env static_env;
644c402ae8SMartin Storsjö CWDGuard guard;
65b62ce9e0SSergej Jaskiewicz const path p = static_env.File;
66f7b43230SLouis Dionne std::error_code ec;
67f7b43230SLouis Dionne const path old_p = current_path();
68f7b43230SLouis Dionne current_path(p, ec);
692f2ed477SMark de Wever assert(ec);
702f2ed477SMark de Wever assert(old_p == current_path());
71f7b43230SLouis Dionne }
72f7b43230SLouis Dionne
set_to_non_absolute_path()732f2ed477SMark de Wever static void set_to_non_absolute_path()
74f7b43230SLouis Dionne {
75b62ce9e0SSergej Jaskiewicz static_test_env static_env;
764c402ae8SMartin Storsjö CWDGuard guard;
77b62ce9e0SSergej Jaskiewicz const path base = static_env.Dir;
78f7b43230SLouis Dionne current_path(base);
79b62ce9e0SSergej Jaskiewicz const path p = static_env.Dir2.filename();
80f7b43230SLouis Dionne std::error_code ec;
81f7b43230SLouis Dionne current_path(p, ec);
822f2ed477SMark de Wever assert(!ec);
83f7b43230SLouis Dionne const path new_cwd = current_path();
842f2ed477SMark de Wever assert(new_cwd == static_env.Dir2);
852f2ed477SMark de Wever assert(new_cwd.is_absolute());
86f7b43230SLouis Dionne }
87f7b43230SLouis Dionne
set_to_empty()882f2ed477SMark de Wever static void set_to_empty()
89f7b43230SLouis Dionne {
90f7b43230SLouis Dionne const path p = "";
91f7b43230SLouis Dionne std::error_code ec;
92f7b43230SLouis Dionne const path old_p = current_path();
93f7b43230SLouis Dionne current_path(p, ec);
942f2ed477SMark de Wever assert(ec);
952f2ed477SMark de Wever assert(old_p == current_path());
96f7b43230SLouis Dionne }
97f7b43230SLouis Dionne
main(int,char **)982f2ed477SMark de Wever int main(int, char**) {
992f2ed477SMark de Wever current_path_signature_test();
1002f2ed477SMark de Wever current_path_test();
1012f2ed477SMark de Wever current_path_after_change_test();
1022f2ed477SMark de Wever current_path_is_file_test();
1032f2ed477SMark de Wever set_to_non_absolute_path();
1042f2ed477SMark de Wever set_to_empty();
1052f2ed477SMark de Wever
1062f2ed477SMark de Wever return 0;
1072f2ed477SMark de Wever }
108