`string_view` is supported all the way back to C++03 as an extension in `libc++`, and so many of the tests run in all standards modes for all vendors. This is unlikely desired by other standard library vendors using our test suite. So, disable the tests for vendors other than `libc++` in these older standards modes. Differential Revision: https://reviews.llvm.org/D126850
226 lines
5.6 KiB
C++
226 lines
5.6 KiB
C++
//===----------------------------------------------------------------------===//
|
|
//
|
|
// 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
|
|
|
|
// <iomanip>
|
|
|
|
// quoted
|
|
|
|
#include <iomanip>
|
|
#include <sstream>
|
|
#include <string_view>
|
|
#include <cassert>
|
|
|
|
#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;
|
|
}
|