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 
1188ffc727SLouis Dionne // These tests require locale for non-char paths
12*a7f9895cSLouis Dionne // UNSUPPORTED: no-localization
1388ffc727SLouis Dionne 
14f7b43230SLouis Dionne // <filesystem>
15f7b43230SLouis Dionne 
16f7b43230SLouis Dionne // class path
17f7b43230SLouis Dionne 
18f7b43230SLouis Dionne // template <class Source>
19f7b43230SLouis Dionne //      path(const Source& source);
20f7b43230SLouis Dionne // template <class InputIterator>
21f7b43230SLouis Dionne //      path(InputIterator first, InputIterator last);
22f7b43230SLouis Dionne 
23f7b43230SLouis Dionne 
24cc89063bSNico Weber #include "filesystem_include.h"
25f7b43230SLouis Dionne #include <type_traits>
26f7b43230SLouis Dionne #include <cassert>
27f7b43230SLouis Dionne 
28f7b43230SLouis Dionne #include "test_macros.h"
29f7b43230SLouis Dionne #include "test_iterators.h"
30f7b43230SLouis Dionne #include "min_allocator.h"
31cc89063bSNico Weber #include "filesystem_test_helper.h"
32f7b43230SLouis Dionne 
33f7b43230SLouis Dionne 
34f7b43230SLouis Dionne template <class CharT, class ...Args>
RunTestCaseImpl(MultiStringType const & MS,Args...args)35f7b43230SLouis Dionne void RunTestCaseImpl(MultiStringType const& MS, Args... args) {
36f7b43230SLouis Dionne   using namespace fs;
373784bdf2SMartin Storsjö   const fs::path::value_type* Expect = MS;
38f7b43230SLouis Dionne   const CharT* TestPath = MS;
39f7b43230SLouis Dionne   const CharT* TestPathEnd = StrEnd(TestPath);
40f7b43230SLouis Dionne   const std::size_t Size = TestPathEnd - TestPath;
41f7b43230SLouis Dionne   const std::size_t SSize = StrEnd(Expect) - Expect;
42f7b43230SLouis Dionne   assert(Size == SSize);
43f7b43230SLouis Dionne   // StringTypes
44f7b43230SLouis Dionne   {
45f7b43230SLouis Dionne     const std::basic_string<CharT> S(TestPath);
46f7b43230SLouis Dionne     path p(S, args...);
47f7b43230SLouis Dionne     assert(p.native() == Expect);
48f7b43230SLouis Dionne     assert(p.string<CharT>() == TestPath);
49f7b43230SLouis Dionne     assert(p.string<CharT>() == S);
50f7b43230SLouis Dionne   }
51f7b43230SLouis Dionne   {
52f7b43230SLouis Dionne     const std::basic_string_view<CharT> S(TestPath);
53f7b43230SLouis Dionne     path p(S, args...);
54f7b43230SLouis Dionne     assert(p.native() == Expect);
55f7b43230SLouis Dionne     assert(p.string<CharT>() == TestPath);
56f7b43230SLouis Dionne     assert(p.string<CharT>() == S);
57f7b43230SLouis Dionne   }
58f7b43230SLouis Dionne   // Char* pointers
59f7b43230SLouis Dionne   {
60f7b43230SLouis Dionne     path p(TestPath, args...);
61f7b43230SLouis Dionne     assert(p.native() == Expect);
62f7b43230SLouis Dionne     assert(p.string<CharT>() == TestPath);
63f7b43230SLouis Dionne   }
64f7b43230SLouis Dionne   {
65f7b43230SLouis Dionne     path p(TestPath, TestPathEnd, args...);
66f7b43230SLouis Dionne     assert(p.native() == Expect);
67f7b43230SLouis Dionne     assert(p.string<CharT>() == TestPath);
68f7b43230SLouis Dionne   }
69f7b43230SLouis Dionne   // Iterators
70f7b43230SLouis Dionne   {
71773ae441SChristopher Di Bella     using It = cpp17_input_iterator<const CharT*>;
72f7b43230SLouis Dionne     path p(It{TestPath}, args...);
73f7b43230SLouis Dionne     assert(p.native() == Expect);
74f7b43230SLouis Dionne     assert(p.string<CharT>() == TestPath);
75f7b43230SLouis Dionne   }
76f7b43230SLouis Dionne   {
77773ae441SChristopher Di Bella     using It = cpp17_input_iterator<const CharT*>;
78f7b43230SLouis Dionne     path p(It{TestPath}, It{TestPathEnd}, args...);
79f7b43230SLouis Dionne     assert(p.native() == Expect);
80f7b43230SLouis Dionne     assert(p.string<CharT>() == TestPath);
81f7b43230SLouis Dionne   }
82f7b43230SLouis Dionne }
83f7b43230SLouis Dionne 
84f7b43230SLouis Dionne template <class CharT, class ...Args>
RunTestCase(MultiStringType const & MS)85f7b43230SLouis Dionne void RunTestCase(MultiStringType const& MS) {
86f7b43230SLouis Dionne   RunTestCaseImpl<CharT>(MS);
87f7b43230SLouis Dionne   RunTestCaseImpl<CharT>(MS, fs::path::format::auto_format);
88f7b43230SLouis Dionne   RunTestCaseImpl<CharT>(MS, fs::path::format::native_format);
89f7b43230SLouis Dionne   RunTestCaseImpl<CharT>(MS, fs::path::format::generic_format);
9026005c78SMartin Storsjö   RunTestCaseImpl<CharT>(MS, fs::path::auto_format);
9126005c78SMartin Storsjö   RunTestCaseImpl<CharT>(MS, fs::path::native_format);
9226005c78SMartin Storsjö   RunTestCaseImpl<CharT>(MS, fs::path::generic_format);
93f7b43230SLouis Dionne }
94f7b43230SLouis Dionne 
test_sfinae()95f7b43230SLouis Dionne void test_sfinae() {
96f7b43230SLouis Dionne   using namespace fs;
97f7b43230SLouis Dionne   {
98f7b43230SLouis Dionne     using It = const char* const;
99f7b43230SLouis Dionne     static_assert(std::is_constructible<path, It>::value, "");
100f7b43230SLouis Dionne   }
101f7b43230SLouis Dionne   {
102773ae441SChristopher Di Bella     using It = cpp17_input_iterator<const char*>;
103f7b43230SLouis Dionne     static_assert(std::is_constructible<path, It>::value, "");
104f7b43230SLouis Dionne   }
105f7b43230SLouis Dionne   {
106f7b43230SLouis Dionne     struct Traits {
107f7b43230SLouis Dionne       using iterator_category = std::input_iterator_tag;
108f7b43230SLouis Dionne       using value_type = const char;
109f7b43230SLouis Dionne       using pointer = const char*;
110f7b43230SLouis Dionne       using reference = const char&;
111f7b43230SLouis Dionne       using difference_type = std::ptrdiff_t;
112f7b43230SLouis Dionne     };
113773ae441SChristopher Di Bella     using It = cpp17_input_iterator<const char*, Traits>;
114f7b43230SLouis Dionne     static_assert(std::is_constructible<path, It>::value, "");
115f7b43230SLouis Dionne   }
116f7b43230SLouis Dionne   {
1175e97d37bSMark de Wever     using It = cpp17_output_iterator<const char*>;
118f7b43230SLouis Dionne     static_assert(!std::is_constructible<path, It>::value, "");
119f7b43230SLouis Dionne 
120f7b43230SLouis Dionne   }
121f7b43230SLouis Dionne   {
122f7b43230SLouis Dionne     static_assert(!std::is_constructible<path, int*>::value, "");
123f7b43230SLouis Dionne   }
124f7b43230SLouis Dionne }
125f7b43230SLouis Dionne 
main(int,char **)126f7b43230SLouis Dionne int main(int, char**) {
127f7b43230SLouis Dionne   for (auto const& MS : PathList) {
128f7b43230SLouis Dionne     RunTestCase<char>(MS);
1296be11e35SMartin Storsjö #if TEST_STD_VER > 17 && defined(__cpp_char8_t)
1306be11e35SMartin Storsjö     RunTestCase<char8_t>(MS);
1316be11e35SMartin Storsjö #endif
132f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS
133f7b43230SLouis Dionne     RunTestCase<wchar_t>(MS);
134f4c1258dSLouis Dionne #endif
135f7b43230SLouis Dionne     RunTestCase<char16_t>(MS);
136f7b43230SLouis Dionne     RunTestCase<char32_t>(MS);
137f7b43230SLouis Dionne   }
138f7b43230SLouis Dionne   test_sfinae();
139f7b43230SLouis Dionne 
140f7b43230SLouis Dionne   return 0;
141f7b43230SLouis Dionne }
142