//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11 // UNSUPPORTED: no-localization // UNSUPPORTED: !stdlib=libc++ && c++14 // // quoted #include #include #include #include #include "test_macros.h" bool is_skipws(const std::istream* is) { return (is->flags() & std::ios_base::skipws) != 0; } #ifndef TEST_HAS_NO_WIDE_CHARACTERS bool is_skipws(const std::wistream* is) { return (is->flags() & std::ios_base::skipws) != 0; } #endif void round_trip(const char* p) { std::stringstream ss; bool skippingws = is_skipws(&ss); std::string_view sv{p}; ss << std::quoted(sv); std::string s; ss >> std::quoted(s); assert(s == sv); assert(skippingws == is_skipws(&ss)); } void round_trip_ws(const char* p) { std::stringstream ss; std::noskipws(ss); bool skippingws = is_skipws(&ss); std::string_view sv{p}; ss << std::quoted(sv); std::string s; ss >> std::quoted(s); assert(s == sv); assert(skippingws == is_skipws(&ss)); } void round_trip_d(const char* p, char delim) { std::stringstream ss; std::string_view sv{p}; ss << std::quoted(sv, delim); std::string s; ss >> std::quoted(s, delim); assert(s == sv); } void round_trip_e(const char* p, char escape) { std::stringstream ss; std::string_view sv{p}; ss << std::quoted(sv, '"', escape); std::string s; ss >> std::quoted(s, '"', escape); assert(s == sv); } std::string quote(const char* p, char delim = '"', char escape = '\\') { std::stringstream ss; ss << std::quoted(p, delim, escape); std::string s; ss >> s; // no quote return s; } std::string unquote(const char* p, char delim = '"', char escape = '\\') { std::stringstream ss; ss << p; std::string s; ss >> std::quoted(s, delim, escape); return s; } #ifndef TEST_HAS_NO_WIDE_CHARACTERS void round_trip(const wchar_t* p) { std::wstringstream ss; bool skippingws = is_skipws(&ss); std::wstring_view sv{p}; ss << std::quoted(sv); std::wstring s; ss >> std::quoted(s); assert(s == sv); assert(skippingws == is_skipws(&ss)); } void round_trip_ws(const wchar_t* p) { std::wstringstream ss; std::noskipws(ss); bool skippingws = is_skipws(&ss); std::wstring_view sv{p}; ss << std::quoted(sv); std::wstring s; ss >> std::quoted(s); assert(s == sv); assert(skippingws == is_skipws(&ss)); } void round_trip_d(const wchar_t* p, wchar_t delim) { std::wstringstream ss; std::wstring_view sv{p}; ss << std::quoted(sv, delim); std::wstring s; ss >> std::quoted(s, delim); assert(s == sv); } void round_trip_e(const wchar_t* p, wchar_t escape) { std::wstringstream ss; std::wstring_view sv{p}; ss << std::quoted(sv, wchar_t('"'), escape); std::wstring s; ss >> std::quoted(s, wchar_t('"'), escape); assert(s == sv); } std::wstring quote(const wchar_t* p, wchar_t delim = '"', wchar_t escape = '\\') { std::wstringstream ss; std::wstring_view sv{p}; ss << std::quoted(sv, delim, escape); std::wstring s; ss >> s; // no quote return s; } std::wstring unquote(const wchar_t* p, wchar_t delim = '"', wchar_t escape = '\\') { std::wstringstream ss; std::wstring_view sv{p}; ss << sv; std::wstring s; ss >> std::quoted(s, delim, escape); return s; } #endif // TEST_HAS_NO_WIDE_CHARACTERS int main(int, char**) { round_trip(""); round_trip_ws(""); round_trip_d("", 'q'); round_trip_e("", 'q'); #ifndef TEST_HAS_NO_WIDE_CHARACTERS round_trip(L""); round_trip_ws(L""); round_trip_d(L"", 'q'); round_trip_e(L"", 'q'); #endif round_trip("Hi"); round_trip_ws("Hi"); round_trip_d("Hi", '!'); round_trip_e("Hi", '!'); assert(quote("Hi", '!') == "!Hi!"); assert(quote("Hi!", '!') == R"(!Hi\!!)"); #ifndef TEST_HAS_NO_WIDE_CHARACTERS round_trip(L"Hi"); round_trip_ws(L"Hi"); round_trip_d(L"Hi", '!'); round_trip_e(L"Hi", '!'); assert(quote(L"Hi", '!') == L"!Hi!"); assert(quote(L"Hi!", '!') == LR"(!Hi\!!)"); #endif round_trip("Hi Mom"); round_trip_ws("Hi Mom"); #ifndef TEST_HAS_NO_WIDE_CHARACTERS round_trip(L"Hi Mom"); round_trip_ws(L"Hi Mom"); #endif assert(quote("") == "\"\""); assert(quote("a") == "\"a\""); #ifndef TEST_HAS_NO_WIDE_CHARACTERS assert(quote(L"") == L"\"\""); assert(quote(L"a") == L"\"a\""); #endif // missing end quote - must not hang assert(unquote("\"abc") == "abc"); assert(unquote("abc") == "abc"); // no delimiter assert(unquote("abc def") == "abc"); // no delimiter assert(unquote("") == ""); // nothing there #ifndef TEST_HAS_NO_WIDE_CHARACTERS assert(unquote(L"\"abc") == L"abc"); assert(unquote(L"abc") == L"abc"); // no delimiter assert(unquote(L"abc def") == L"abc"); // no delimiter assert(unquote(L"") == L""); // nothing there #endif return 0; }