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 1288ffc727SLouis Dionne // These tests require locale for non-char paths 13a7f9895cSLouis Dionne // UNSUPPORTED: no-localization 1488ffc727SLouis Dionne 15f7b43230SLouis Dionne // <filesystem> 16f7b43230SLouis Dionne 17f7b43230SLouis Dionne // class path 18f7b43230SLouis Dionne 19f7b43230SLouis Dionne // std::string generic_string() const; 20f7b43230SLouis Dionne // std::wstring generic_wstring() const; 21f7b43230SLouis Dionne // std::u8string generic_u8string() const; 22f7b43230SLouis Dionne // std::u16string generic_u16string() const; 23f7b43230SLouis Dionne // std::u32string generic_u32string() const; 24f7b43230SLouis Dionne 25*ac8c9f1eSLouis Dionne #include <filesystem> 26f7b43230SLouis Dionne #include <cassert> 27c352fa74SLouis Dionne #include <string> 28c352fa74SLouis Dionne #include <type_traits> 29f7b43230SLouis Dionne 30cc89063bSNico Weber #include "count_new.h" 31c352fa74SLouis Dionne #include "make_string.h" 32f7b43230SLouis Dionne #include "min_allocator.h" 33c352fa74SLouis Dionne #include "test_iterators.h" 34c352fa74SLouis Dionne #include "test_macros.h" 35*ac8c9f1eSLouis Dionne namespace fs = std::filesystem; 36f7b43230SLouis Dionne 37f4f5fb91SMartin Storsjö MultiStringType input = MKSTR("c:\\foo\\bar"); 38f4f5fb91SMartin Storsjö #ifdef _WIN32 39f4f5fb91SMartin Storsjö // On windows, the generic_* accessors return a path with forward slashes 40f4f5fb91SMartin Storsjö MultiStringType ref = MKSTR("c:/foo/bar"); 41f4f5fb91SMartin Storsjö #else 42f4f5fb91SMartin Storsjö // On posix, the input string is returned as-is 43f4f5fb91SMartin Storsjö MultiStringType ref = MKSTR("c:\\foo\\bar"); 44f4f5fb91SMartin Storsjö #endif 45f7b43230SLouis Dionne main(int,char **)46f7b43230SLouis Dionneint main(int, char**) 47f7b43230SLouis Dionne { 48f7b43230SLouis Dionne using namespace fs; 49f4f5fb91SMartin Storsjö auto const& MS = ref; 50f4f5fb91SMartin Storsjö const char* value = input; 51f7b43230SLouis Dionne const path p(value); 52f7b43230SLouis Dionne { 53f7b43230SLouis Dionne std::string s = p.generic_string(); 54f4f5fb91SMartin Storsjö assert(s == (const char*)MS); 55f7b43230SLouis Dionne } 56f7b43230SLouis Dionne { 576be11e35SMartin Storsjö #if TEST_STD_VER > 17 && defined(__cpp_char8_t) 586be11e35SMartin Storsjö ASSERT_SAME_TYPE(decltype(p.generic_u8string()), std::u8string); 596be11e35SMartin Storsjö std::u8string s = p.generic_u8string(); 606be11e35SMartin Storsjö assert(s == (const char8_t*)MS); 616be11e35SMartin Storsjö #else 626be11e35SMartin Storsjö ASSERT_SAME_TYPE(decltype(p.generic_u8string()), std::string); 63f7b43230SLouis Dionne std::string s = p.generic_u8string(); 64f7b43230SLouis Dionne assert(s == (const char*)MS); 656be11e35SMartin Storsjö #endif 66f7b43230SLouis Dionne } 67f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS 68f7b43230SLouis Dionne { 69f7b43230SLouis Dionne std::wstring s = p.generic_wstring(); 70f7b43230SLouis Dionne assert(s == (const wchar_t*)MS); 71f7b43230SLouis Dionne } 72f4c1258dSLouis Dionne #endif 73f7b43230SLouis Dionne { 74f7b43230SLouis Dionne std::u16string s = p.generic_u16string(); 75f7b43230SLouis Dionne assert(s == (const char16_t*)MS); 76f7b43230SLouis Dionne } 77f7b43230SLouis Dionne { 78f7b43230SLouis Dionne std::u32string s = p.generic_u32string(); 79f7b43230SLouis Dionne assert(s == (const char32_t*)MS); 80f7b43230SLouis Dionne } 81f7b43230SLouis Dionne 82f7b43230SLouis Dionne return 0; 83f7b43230SLouis Dionne } 84