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 
931cbe0f2SLouis Dionne // UNSUPPORTED: c++03
10f7b43230SLouis Dionne 
11f7b43230SLouis Dionne // <filesystem>
12f7b43230SLouis Dionne 
13f7b43230SLouis Dionne // path current_path();
14f7b43230SLouis Dionne // path current_path(error_code& ec);
15f7b43230SLouis Dionne // void current_path(path const&);
16f7b43230SLouis Dionne // void current_path(path const&, std::error_code& ec) noexcept;
17f7b43230SLouis Dionne 
18cc89063bSNico Weber #include "filesystem_include.h"
19f7b43230SLouis Dionne #include <type_traits>
20f7b43230SLouis Dionne #include <cassert>
21f7b43230SLouis Dionne 
22f7b43230SLouis Dionne #include "test_macros.h"
23cc89063bSNico Weber #include "rapid-cxx-test.h"
24cc89063bSNico Weber #include "filesystem_test_helper.h"
25f7b43230SLouis Dionne 
26f7b43230SLouis Dionne using namespace fs;
27f7b43230SLouis Dionne 
28f7b43230SLouis Dionne TEST_SUITE(filesystem_current_path_path_test_suite)
29f7b43230SLouis Dionne 
TEST_CASE(current_path_signature_test)30f7b43230SLouis Dionne TEST_CASE(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 
TEST_CASE(current_path_test)40f7b43230SLouis Dionne TEST_CASE(current_path_test)
41f7b43230SLouis Dionne {
42f7b43230SLouis Dionne     std::error_code ec;
43f7b43230SLouis Dionne     const path p = current_path(ec);
44f7b43230SLouis Dionne     TEST_REQUIRE(!ec);
45f7b43230SLouis Dionne     TEST_CHECK(p.is_absolute());
46f7b43230SLouis Dionne     TEST_CHECK(is_directory(p));
47f7b43230SLouis Dionne 
48f7b43230SLouis Dionne     const path p2 = current_path();
49f7b43230SLouis Dionne     TEST_CHECK(p2 == p);
50f7b43230SLouis Dionne }
51f7b43230SLouis Dionne 
TEST_CASE(current_path_after_change_test)52f7b43230SLouis Dionne TEST_CASE(current_path_after_change_test)
53f7b43230SLouis Dionne {
54b62ce9e0SSergej Jaskiewicz     static_test_env static_env;
55*4c402ae8SMartin Storsjö     CWDGuard guard;
56b62ce9e0SSergej Jaskiewicz     const path new_path = static_env.Dir;
57f7b43230SLouis Dionne     current_path(new_path);
58f7b43230SLouis Dionne     TEST_CHECK(current_path() == new_path);
59f7b43230SLouis Dionne }
60f7b43230SLouis Dionne 
TEST_CASE(current_path_is_file_test)61f7b43230SLouis Dionne TEST_CASE(current_path_is_file_test)
62f7b43230SLouis Dionne {
63b62ce9e0SSergej Jaskiewicz     static_test_env static_env;
64*4c402ae8SMartin 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);
69f7b43230SLouis Dionne     TEST_CHECK(ec);
70f7b43230SLouis Dionne     TEST_CHECK(old_p == current_path());
71f7b43230SLouis Dionne }
72f7b43230SLouis Dionne 
TEST_CASE(set_to_non_absolute_path)73f7b43230SLouis Dionne TEST_CASE(set_to_non_absolute_path)
74f7b43230SLouis Dionne {
75b62ce9e0SSergej Jaskiewicz     static_test_env static_env;
76*4c402ae8SMartin 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);
82f7b43230SLouis Dionne     TEST_CHECK(!ec);
83f7b43230SLouis Dionne     const path new_cwd = current_path();
84b62ce9e0SSergej Jaskiewicz     TEST_CHECK(new_cwd == static_env.Dir2);
85f7b43230SLouis Dionne     TEST_CHECK(new_cwd.is_absolute());
86f7b43230SLouis Dionne }
87f7b43230SLouis Dionne 
TEST_CASE(set_to_empty)88f7b43230SLouis Dionne TEST_CASE(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);
94f7b43230SLouis Dionne     TEST_CHECK(ec);
95f7b43230SLouis Dionne     TEST_CHECK(old_p == current_path());
96f7b43230SLouis Dionne }
97f7b43230SLouis Dionne 
98f7b43230SLouis Dionne TEST_SUITE_END()
99