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 
15f7b43230SLouis Dionne // path& make_preferred()
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 MakePreferredTestcase {
28f7b43230SLouis Dionne   const char* value;
29*87d7c000SMartin Storsjö   const char* expected_posix;
30*87d7c000SMartin Storsjö   const char* expected_windows;
31f7b43230SLouis Dionne };
32f7b43230SLouis Dionne 
33f7b43230SLouis Dionne const MakePreferredTestcase TestCases[] =
34f7b43230SLouis Dionne   {
35*87d7c000SMartin Storsjö       {"", "", ""}
36*87d7c000SMartin Storsjö     , {"hello_world", "hello_world", "hello_world"}
37*87d7c000SMartin Storsjö     , {"/", "/", "\\"}
38*87d7c000SMartin Storsjö     , {"/foo/bar/baz/", "/foo/bar/baz/", "\\foo\\bar\\baz\\"}
39*87d7c000SMartin Storsjö     , {"\\", "\\", "\\"}
40*87d7c000SMartin Storsjö     , {"\\foo\\bar\\baz\\", "\\foo\\bar\\baz\\", "\\foo\\bar\\baz\\"}
41*87d7c000SMartin Storsjö     , {"\\foo\\/bar\\/baz\\", "\\foo\\/bar\\/baz\\", "\\foo\\\\bar\\\\baz\\"}
42f7b43230SLouis Dionne   };
43f7b43230SLouis Dionne 
main(int,char **)44f7b43230SLouis Dionne int main(int, char**)
45f7b43230SLouis Dionne {
46f7b43230SLouis Dionne   // This operation is an identity operation on linux.
47*87d7c000SMartin Storsjö   // On windows, compare with preferred_win, if set.
48f7b43230SLouis Dionne   using namespace fs;
49f7b43230SLouis Dionne   for (auto const & TC : TestCases) {
50f7b43230SLouis Dionne     path p(TC.value);
51f7b43230SLouis Dionne     assert(p == TC.value);
52f7b43230SLouis Dionne     path& Ref = (p.make_preferred());
53*87d7c000SMartin Storsjö #ifdef _WIN32
54*87d7c000SMartin Storsjö     std::string s(TC.expected_windows);
55*87d7c000SMartin Storsjö #else
56*87d7c000SMartin Storsjö     std::string s(TC.expected_posix);
57*87d7c000SMartin Storsjö #endif
58*87d7c000SMartin Storsjö     assert(p.string() == s);
59f7b43230SLouis Dionne     assert(&Ref == &p);
60f7b43230SLouis Dionne   }
61f7b43230SLouis Dionne 
62f7b43230SLouis Dionne   return 0;
63f7b43230SLouis Dionne }
64