1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8
9 // UNSUPPORTED: c++03, c++11, c++14
10 // UNSUPPORTED: availability-filesystem-missing
11
12 // <filesystem>
13
14 // class path
15
16 // path& remove_filename()
17
18 #include <filesystem>
19 #include <type_traits>
20 #include <cassert>
21
22 #include "test_iterators.h"
23 #include "count_new.h"
24 namespace fs = std::filesystem;
25
26 struct RemoveFilenameTestcase {
27 const char* value;
28 const char* expect;
29 };
30
31 const RemoveFilenameTestcase TestCases[] =
32 {
33 {"", ""}
34 , {"/", "/"}
35 , {"//", "//"}
36 , {"///", "///"}
37 #ifdef _WIN32
38 , {"\\", "\\"}
39 #else
40 , {"\\", ""}
41 #endif
42 , {".", ""}
43 , {"..", ""}
44 , {"/foo", "/"}
45 , {"foo/bar", "foo/"}
46 , {"foo/", "foo/"}
47 #ifdef _WIN32
48 , {"//foo", "//foo"}
49 #else
50 , {"//foo", "//"}
51 #endif
52 , {"//foo/", "//foo/"}
53 , {"//foo///", "//foo///"}
54 , {"///foo", "///"}
55 , {"///foo/", "///foo/"}
56 , {"/foo/", "/foo/"}
57 , {"/foo/.", "/foo/"}
58 , {"/foo/..", "/foo/"}
59 , {"/foo/////", "/foo/////"}
60 #ifdef _WIN32
61 , {"/foo\\\\", "/foo\\\\"}
62 #else
63 , {"/foo\\\\", "/"}
64 #endif
65 , {"/foo//\\/", "/foo//\\/"}
66 , {"///foo", "///"}
67 , {"file.txt", ""}
68 , {"bar/../baz/./file.txt", "bar/../baz/./"}
69 };
70
main(int,char **)71 int main(int, char**)
72 {
73 using namespace fs;
74 for (auto const & TC : TestCases) {
75 path const p_orig(TC.value);
76 path p(p_orig);
77 assert(p == TC.value);
78 path& Ref = (p.remove_filename());
79 assert(p == TC.expect);
80 assert(&Ref == &p);
81 assert(!p.has_filename());
82 }
83
84 return 0;
85 }
86