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*31cbe0f2SLouis Dionne // UNSUPPORTED: c++03
10f7b43230SLouis Dionne 
11f7b43230SLouis Dionne // <filesystem>
12f7b43230SLouis Dionne 
13f7b43230SLouis Dionne // class path
14f7b43230SLouis Dionne 
15f7b43230SLouis Dionne // path& replace_extension(path const& p = path())
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 
27f7b43230SLouis Dionne struct ReplaceExtensionTestcase {
28f7b43230SLouis Dionne   const char* value;
29f7b43230SLouis Dionne   const char* expect;
30f7b43230SLouis Dionne   const char* extension;
31f7b43230SLouis Dionne };
32f7b43230SLouis Dionne 
33f7b43230SLouis Dionne const ReplaceExtensionTestcase TestCases[] =
34f7b43230SLouis Dionne   {
35f7b43230SLouis Dionne       {"", "", ""}
36f7b43230SLouis Dionne     , {"foo.cpp", "foo", ""}
37f7b43230SLouis Dionne     , {"foo.cpp", "foo.", "."}
38f7b43230SLouis Dionne     , {"foo..cpp", "foo..txt", "txt"}
39f7b43230SLouis Dionne     , {"", ".txt", "txt"}
40f7b43230SLouis Dionne     , {"", ".txt", ".txt"}
41f7b43230SLouis Dionne     , {"/foo", "/foo.txt", ".txt"}
42f7b43230SLouis Dionne     , {"/foo", "/foo.txt", "txt"}
43f7b43230SLouis Dionne     , {"/foo.cpp", "/foo.txt", ".txt"}
44f7b43230SLouis Dionne     , {"/foo.cpp", "/foo.txt", "txt"}
45f7b43230SLouis Dionne   };
46f7b43230SLouis Dionne const ReplaceExtensionTestcase NoArgCases[] =
47f7b43230SLouis Dionne   {
48f7b43230SLouis Dionne       {"", "", ""}
49f7b43230SLouis Dionne     , {"foo", "foo", ""}
50f7b43230SLouis Dionne     , {"foo.cpp", "foo", ""}
51f7b43230SLouis Dionne     , {"foo..cpp", "foo.", ""}
52f7b43230SLouis Dionne };
53f7b43230SLouis Dionne 
main(int,char **)54f7b43230SLouis Dionne int main(int, char**)
55f7b43230SLouis Dionne {
56f7b43230SLouis Dionne   using namespace fs;
57f7b43230SLouis Dionne   for (auto const & TC : TestCases) {
58f7b43230SLouis Dionne     path p(TC.value);
59f7b43230SLouis Dionne     assert(p == TC.value);
60f7b43230SLouis Dionne     path& Ref = (p.replace_extension(TC.extension));
61f7b43230SLouis Dionne     assert(p == TC.expect);
62f7b43230SLouis Dionne     assert(&Ref == &p);
63f7b43230SLouis Dionne   }
64f7b43230SLouis Dionne   for (auto const& TC : NoArgCases) {
65f7b43230SLouis Dionne     path p(TC.value);
66f7b43230SLouis Dionne     assert(p == TC.value);
67f7b43230SLouis Dionne     path& Ref = (p.replace_extension());
68f7b43230SLouis Dionne     assert(p == TC.expect);
69f7b43230SLouis Dionne     assert(&Ref == &p);
70f7b43230SLouis Dionne   }
71f7b43230SLouis Dionne 
72f7b43230SLouis Dionne   return 0;
73f7b43230SLouis Dionne }
74