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 // class path
14f7b43230SLouis Dionne
15*ab67fd39SMartin Storsjö // path& replace_filename( const path& replacement );
16f7b43230SLouis Dionne
17cc89063bSNico Weber #include "filesystem_include.h"
18f7b43230SLouis Dionne #include <type_traits>
19f7b43230SLouis Dionne #include <cassert>
20f7b43230SLouis Dionne
21f7b43230SLouis Dionne #include "test_macros.h"
22f7b43230SLouis Dionne #include "test_iterators.h"
23cc89063bSNico Weber #include "count_new.h"
24cc89063bSNico Weber #include "filesystem_test_helper.h"
25f7b43230SLouis Dionne
26f7b43230SLouis Dionne struct ReplaceFilenameTestcase {
27f7b43230SLouis Dionne const char* value;
28f7b43230SLouis Dionne const char* expect;
29f7b43230SLouis Dionne const char* filename;
30f7b43230SLouis Dionne };
31f7b43230SLouis Dionne
32f7b43230SLouis Dionne const ReplaceFilenameTestcase TestCases[] =
33f7b43230SLouis Dionne {
34f7b43230SLouis Dionne {"/foo", "/bar", "bar"}
35f7b43230SLouis Dionne , {"/foo", "/", ""}
36f7b43230SLouis Dionne , {"foo", "bar", "bar"}
37f7b43230SLouis Dionne , {"/", "/bar", "bar"}
38*ab67fd39SMartin Storsjö #ifdef _WIN32
39*ab67fd39SMartin Storsjö , {"\\", "\\bar", "bar"}
40*ab67fd39SMartin Storsjö #else
41f7b43230SLouis Dionne , {"\\", "bar", "bar"}
42*ab67fd39SMartin Storsjö #endif
43f7b43230SLouis Dionne , {"///", "///bar", "bar"}
44*ab67fd39SMartin Storsjö #ifdef _WIN32
45*ab67fd39SMartin Storsjö , {"\\\\", "\\\\bar", "bar"}
46*ab67fd39SMartin Storsjö , {"\\/\\", "\\/\\bar", "bar"}
47*ab67fd39SMartin Storsjö #else
48f7b43230SLouis Dionne , {"\\\\", "bar", "bar"}
49f7b43230SLouis Dionne , {"\\/\\", "\\/bar", "bar"}
50*ab67fd39SMartin Storsjö #endif
51f7b43230SLouis Dionne , {".", "bar", "bar"}
52f7b43230SLouis Dionne , {"..", "bar", "bar"}
53f7b43230SLouis Dionne , {"/foo\\baz/bong/", "/foo\\baz/bong/bar", "bar"}
54f7b43230SLouis Dionne , {"/foo\\baz/bong", "/foo\\baz/bar", "bar"}
55f7b43230SLouis Dionne };
56f7b43230SLouis Dionne
main(int,char **)57f7b43230SLouis Dionne int main(int, char**)
58f7b43230SLouis Dionne {
59f7b43230SLouis Dionne using namespace fs;
60f7b43230SLouis Dionne for (auto const & TC : TestCases) {
61f7b43230SLouis Dionne path p(TC.value);
62e557b6a6SLouis Dionne assert(p == TC.value);
63e557b6a6SLouis Dionne path& Ref = p.replace_filename(TC.filename);
64e557b6a6SLouis Dionne assert(p == TC.expect);
65f7b43230SLouis Dionne assert(&Ref == &p);
66f7b43230SLouis Dionne // Tests Effects "as-if": remove_filename() append(filename)
67f7b43230SLouis Dionne {
68f7b43230SLouis Dionne path p2(TC.value);
69f7b43230SLouis Dionne path replace(TC.filename);
70f7b43230SLouis Dionne p2.remove_filename();
71f7b43230SLouis Dionne p2 /= replace;
72e557b6a6SLouis Dionne assert(p == p2);
73f7b43230SLouis Dionne }
74f7b43230SLouis Dionne }
75f7b43230SLouis Dionne
76f7b43230SLouis Dionne return 0;
77f7b43230SLouis Dionne }
78