Home | History | Annotate | Download | only in string.view.nonmem
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <iomanip>
     11 
     12 // quoted
     13 
     14 #include <iomanip>
     15 #include <sstream>
     16 #include <experimental/string_view>
     17 #include <cassert>
     18 
     19 #include "test_macros.h"
     20 
     21 #if TEST_STD_VER > 11
     22 // quoted is C++14 only
     23 
     24 bool is_skipws ( const std::istream *is ) {
     25     return ( is->flags() & std::ios_base::skipws ) != 0;
     26     }
     27 
     28 
     29 bool is_skipws ( const std::wistream *is ) {
     30     return ( is->flags() & std::ios_base::skipws ) != 0;
     31     }
     32 
     33 void round_trip ( const char *p ) {
     34     std::stringstream ss;
     35     bool skippingws = is_skipws ( &ss );
     36     std::experimental::string_view sv {p};
     37 
     38     ss << std::quoted(sv);
     39     std::string s;
     40     ss >> std::quoted(s);
     41     assert ( s == sv );
     42     assert ( skippingws == is_skipws ( &ss ));
     43     }
     44 
     45 void round_trip_ws ( const char *p ) {
     46     std::stringstream ss;
     47     std::noskipws ( ss );
     48     bool skippingws = is_skipws ( &ss );
     49     std::experimental::string_view sv {p};
     50 
     51     ss << std::quoted(sv);
     52     std::string s;
     53     ss >> std::quoted(s);
     54     assert ( s == sv );
     55     assert ( skippingws == is_skipws ( &ss ));
     56     }
     57 
     58 void round_trip_d ( const char *p, char delim ) {
     59     std::stringstream ss;
     60     std::experimental::string_view sv {p};
     61 
     62     ss << std::quoted(sv, delim);
     63     std::string s;
     64     ss >> std::quoted(s, delim);
     65     assert ( s == sv );
     66     }
     67 
     68 void round_trip_e ( const char *p, char escape ) {
     69     std::stringstream ss;
     70     std::experimental::string_view sv {p};
     71 
     72     ss << std::quoted(sv, '"', escape );
     73     std::string s;
     74     ss >> std::quoted(s, '"', escape );
     75     assert ( s == sv );
     76     }
     77 
     78 
     79 
     80 std::string quote ( const char *p, char delim='"', char escape='\\' ) {
     81     std::stringstream ss;
     82     ss << std::quoted(p, delim, escape);
     83     std::string s;
     84     ss >> s;    // no quote
     85     return s;
     86 }
     87 
     88 std::string unquote ( const char *p, char delim='"', char escape='\\' ) {
     89     std::stringstream ss;
     90     ss << p;
     91     std::string s;
     92     ss >> std::quoted(s, delim, escape);
     93     return s;
     94 }
     95 
     96 
     97 void round_trip ( const wchar_t *p ) {
     98     std::wstringstream ss;
     99     bool skippingws = is_skipws ( &ss );
    100     std::experimental::wstring_view sv {p};
    101 
    102     ss << std::quoted(sv);
    103     std::wstring s;
    104     ss >> std::quoted(s);
    105     assert ( s == sv );
    106     assert ( skippingws == is_skipws ( &ss ));
    107     }
    108 
    109 
    110 void round_trip_ws ( const wchar_t *p ) {
    111     std::wstringstream ss;
    112     std::noskipws ( ss );
    113     bool skippingws = is_skipws ( &ss );
    114     std::experimental::wstring_view sv {p};
    115 
    116     ss << std::quoted(sv);
    117     std::wstring s;
    118     ss >> std::quoted(s);
    119     assert ( s == sv );
    120     assert ( skippingws == is_skipws ( &ss ));
    121     }
    122 
    123 void round_trip_d ( const wchar_t *p, wchar_t delim ) {
    124     std::wstringstream ss;
    125     std::experimental::wstring_view sv {p};
    126 
    127     ss << std::quoted(sv, delim);
    128     std::wstring s;
    129     ss >> std::quoted(s, delim);
    130     assert ( s == sv );
    131     }
    132 
    133 void round_trip_e ( const wchar_t *p, wchar_t escape ) {
    134     std::wstringstream ss;
    135     std::experimental::wstring_view sv {p};
    136 
    137     ss << std::quoted(sv, wchar_t('"'), escape );
    138     std::wstring s;
    139     ss >> std::quoted(s, wchar_t('"'), escape );
    140     assert ( s == sv );
    141     }
    142 
    143 
    144 std::wstring quote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) {
    145     std::wstringstream ss;
    146     std::experimental::wstring_view sv {p};
    147 
    148     ss << std::quoted(sv, delim, escape);
    149     std::wstring s;
    150     ss >> s;    // no quote
    151     return s;
    152 }
    153 
    154 std::wstring unquote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) {
    155     std::wstringstream ss;
    156     std::experimental::wstring_view sv {p};
    157 
    158     ss << sv;
    159     std::wstring s;
    160     ss >> std::quoted(s, delim, escape);
    161     return s;
    162 }
    163 
    164 int main()
    165 {
    166     round_trip    (  "" );
    167     round_trip_ws (  "" );
    168     round_trip_d  (  "", 'q' );
    169     round_trip_e  (  "", 'q' );
    170 
    171     round_trip    ( L"" );
    172     round_trip_ws ( L"" );
    173     round_trip_d  ( L"", 'q' );
    174     round_trip_e  ( L"", 'q' );
    175 
    176     round_trip    (  "Hi" );
    177     round_trip_ws (  "Hi" );
    178     round_trip_d  (  "Hi", '!' );
    179     round_trip_e  (  "Hi", '!' );
    180     assert ( quote ( "Hi", '!' ) == "!Hi!" );
    181     assert ( quote ( "Hi!", '!' ) == R"(!Hi\!!)" );
    182 
    183     round_trip    ( L"Hi" );
    184     round_trip_ws ( L"Hi" );
    185     round_trip_d  ( L"Hi", '!' );
    186     round_trip_e  ( L"Hi", '!' );
    187     assert ( quote ( L"Hi", '!' )  == L"!Hi!" );
    188     assert ( quote ( L"Hi!", '!' ) == LR"(!Hi\!!)" );
    189 
    190     round_trip    (  "Hi Mom" );
    191     round_trip_ws (  "Hi Mom" );
    192     round_trip    ( L"Hi Mom" );
    193     round_trip_ws ( L"Hi Mom" );
    194 
    195     assert ( quote (  "" )  ==  "\"\"" );
    196     assert ( quote ( L"" )  == L"\"\"" );
    197     assert ( quote (  "a" ) ==  "\"a\"" );
    198     assert ( quote ( L"a" ) == L"\"a\"" );
    199 
    200 //  missing end quote - must not hang
    201     assert ( unquote (  "\"abc" ) ==  "abc" );
    202     assert ( unquote ( L"\"abc" ) == L"abc" );
    203 
    204     assert ( unquote (  "abc" ) == "abc" ); // no delimiter
    205     assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter
    206     assert ( unquote (  "abc def" ) ==  "abc" ); // no delimiter
    207     assert ( unquote ( L"abc def" ) == L"abc" ); // no delimiter
    208 
    209     assert ( unquote (  "" ) ==  "" ); // nothing there
    210     assert ( unquote ( L"" ) == L"" ); // nothing there
    211     }
    212 #else
    213 int main() {}
    214 #endif
    215