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*ac8c9f1eSLouis Dionne // UNSUPPORTED: c++03, c++11, c++14
10c352fa74SLouis Dionne // UNSUPPORTED: availability-filesystem-missing
11f7b43230SLouis Dionne 
12f7b43230SLouis Dionne // <filesystem>
13f7b43230SLouis Dionne 
14f7b43230SLouis Dionne // class path
15f7b43230SLouis Dionne 
16f7b43230SLouis Dionne // template <class charT, class traits>
17f7b43230SLouis Dionne // basic_ostream<charT, traits>&
18f7b43230SLouis Dionne // operator<<(basic_ostream<charT, traits>& os, const path& p);
19f7b43230SLouis Dionne //
20f7b43230SLouis Dionne // template <class charT, class traits>
21f7b43230SLouis Dionne // basic_istream<charT, traits>&
22f7b43230SLouis Dionne // operator>>(basic_istream<charT, traits>& is, path& p)
23f7b43230SLouis Dionne //
24f7b43230SLouis Dionne 
25f7b43230SLouis Dionne // TODO(EricWF) This test fails because "std::quoted" fails to compile
26f7b43230SLouis Dionne // for char16_t and char32_t types. Combine with path.io.pass.cpp when this
27f7b43230SLouis Dionne // passes.
28f7b43230SLouis Dionne // XFAIL: *
29f7b43230SLouis Dionne 
30*ac8c9f1eSLouis Dionne #include <filesystem>
31f7b43230SLouis Dionne #include <type_traits>
32f7b43230SLouis Dionne #include <sstream>
33f7b43230SLouis Dionne #include <cassert>
34f7b43230SLouis Dionne 
35f7b43230SLouis Dionne #include "test_macros.h"
36f7b43230SLouis Dionne #include "test_iterators.h"
37cc89063bSNico Weber #include "count_new.h"
38cc89063bSNico Weber #include "filesystem_test_helper.h"
39*ac8c9f1eSLouis Dionne namespace fs = std::filesystem;
40f7b43230SLouis Dionne 
41f7b43230SLouis Dionne MultiStringType InStr =  MKSTR("abcdefg/\"hijklmnop\"/qrstuvwxyz/123456789");
42f7b43230SLouis Dionne MultiStringType OutStr = MKSTR("\"abcdefg/\\\"hijklmnop\\\"/qrstuvwxyz/123456789\"");
43f7b43230SLouis Dionne 
44f7b43230SLouis Dionne template <class CharT>
doIOTest()45f7b43230SLouis Dionne void doIOTest() {
46f7b43230SLouis Dionne   using namespace fs;
47f7b43230SLouis Dionne   using Ptr = const CharT*;
48f7b43230SLouis Dionne   using StrStream = std::basic_stringstream<CharT>;
49f7b43230SLouis Dionne   const char* const InCStr = InStr;
50f7b43230SLouis Dionne   const Ptr E = OutStr;
51f7b43230SLouis Dionne   const path p((const char*)InStr);
52f7b43230SLouis Dionne   StrStream ss;
53f7b43230SLouis Dionne   { // test output
54f7b43230SLouis Dionne     auto& ret = (ss << p);
55f7b43230SLouis Dionne     assert(ss.str() == E);
56f7b43230SLouis Dionne     assert(&ret == &ss);
57f7b43230SLouis Dionne   }
58f7b43230SLouis Dionne   { // test input
59f7b43230SLouis Dionne     path p_in;
60f7b43230SLouis Dionne     auto& ret = ss >> p_in;
61f7b43230SLouis Dionne     assert(p_in.native() == (const char*)InStr);
62f7b43230SLouis Dionne     assert(&ret == &ss);
63f7b43230SLouis Dionne   }
64f7b43230SLouis Dionne }
65f7b43230SLouis Dionne 
66f7b43230SLouis Dionne 
main(int,char **)67f7b43230SLouis Dionne int main(int, char**) {
68f7b43230SLouis Dionne   doIOTest<char16_t>();
69f7b43230SLouis Dionne   doIOTest<char32_t>();
70f7b43230SLouis Dionne 
71f7b43230SLouis Dionne   return 0;
72f7b43230SLouis Dionne }
73