//===----------------------------------------------------------------------===//
//
// 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++98, c++03, c++11

// <iomanip>

// quoted

#include <iomanip>
#include <sstream>
#include <string>
#include <cassert>

#include "test_macros.h"

template <class CharT, class Traits>
bool is_skipws ( const std::basic_istream<CharT, Traits>& is ) {
    return ( is.flags() & std::ios_base::skipws ) != 0;
    }

template <class CharT, class Traits = std::char_traits<CharT>>
void both_ways ( const CharT *p ) {
    std::basic_string<CharT, Traits> str(p);
    auto q = std::quoted(str);

    std::basic_stringstream<CharT, Traits> ss;
    bool skippingws = is_skipws ( ss );
    ((void)skippingws); // Prevent unused warning
    ss << q;
    ss >> q;
    }

template <class CharT, class Traits = std::char_traits<CharT>>
void round_trip ( const CharT *p ) {
    std::basic_stringstream<CharT, Traits> ss;
    bool skippingws = is_skipws ( ss );

    ss << std::quoted(p);
    std::basic_string<CharT, Traits> s;
    ss >> std::quoted(s);
    assert ( s == p );
    assert ( skippingws == is_skipws ( ss ));
    }


template <class CharT, class Traits = std::char_traits<CharT>>
void round_trip_ws ( const CharT *p ) {
    std::basic_stringstream<CharT, Traits> ss;
    std::noskipws ( ss );
    bool skippingws = is_skipws ( ss );

    ss << std::quoted(p);
    std::basic_string<CharT, Traits> s;
    ss >> std::quoted(s);
    assert ( s == p );
    assert ( skippingws == is_skipws ( ss ));
    }

template <class CharT, class Traits = std::char_traits<CharT>>
void round_trip_d ( const CharT *p, char delim ) {
    std::basic_stringstream<CharT, Traits> ss;
    CharT d(delim);

    ss << std::quoted(p, d);
    std::basic_string<CharT, Traits> s;
    ss >> std::quoted(s, d);
    assert ( s == p );
    }

template <class CharT, class Traits = std::char_traits<CharT>>
void round_trip_e ( const CharT *p, char escape ) {
    std::basic_stringstream<CharT, Traits> ss;
    CharT e(escape);

    ss << std::quoted(p, CharT('"'), e );
    std::basic_string<CharT, Traits> s;
    ss >> std::quoted(s, CharT('"'), e );
    assert ( s == p );
    }


template <class CharT, class Traits = std::char_traits<CharT>>
std::basic_string<CharT, Traits> quote ( const CharT *p, char delim='"', char escape='\\' ) {
    std::basic_stringstream<CharT, Traits> ss;
    CharT d(delim);
    CharT e(escape);
    ss << std::quoted(p, d, e);
    std::basic_string<CharT, Traits> s;
    ss >> s;    // no quote
    return s;
}

template <class CharT, class Traits = std::char_traits<CharT>>
std::basic_string<CharT, Traits> unquote ( const CharT *p, char delim='"', char escape='\\' ) {
    std::basic_stringstream<CharT, Traits> ss;
    ss << p;

    CharT d(delim);
    CharT e(escape);
    std::basic_string<CharT, Traits> s;
    ss >> std::quoted(s, d, e);
    return s;
}

void test_padding () {
    {
    std::stringstream ss;
    ss << std::left << std::setw(10) << std::setfill('!') << std::quoted("abc", '`');
    assert ( ss.str() == "`abc`!!!!!" );
    }

    {
    std::stringstream ss;
    ss << std::right << std::setw(10) << std::setfill('!') << std::quoted("abc", '`');
    assert ( ss.str() == "!!!!!`abc`" );
    }
}


int main(int, char**)
{
    both_ways ( "" );   // This is a compilation check

    round_trip    (  "" );
    round_trip_ws (  "" );
    round_trip_d  (  "", 'q' );
    round_trip_e  (  "", 'q' );

    round_trip    ( L"" );
    round_trip_ws ( L"" );
    round_trip_d  ( L"", 'q' );
    round_trip_e  ( L"", 'q' );

    round_trip    (  "Hi" );
    round_trip_ws (  "Hi" );
    round_trip_d  (  "Hi", '!' );
    round_trip_e  (  "Hi", '!' );
    assert ( quote ( "Hi", '!' ) == "!Hi!" );
    assert ( quote ( "Hi!", '!' ) == R"(!Hi\!!)" );

    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\!!)" );

    round_trip    (  "Hi Mom" );
    round_trip_ws (  "Hi Mom" );
    round_trip    ( L"Hi Mom" );
    round_trip_ws ( L"Hi Mom" );

    assert ( quote (  "" )  ==  "\"\"" );
    assert ( quote ( L"" )  == L"\"\"" );
    assert ( quote (  "a" ) ==  "\"a\"" );
    assert ( quote ( L"a" ) == L"\"a\"" );

//  missing end quote - must not hang
    assert ( unquote (  "\"abc" ) ==  "abc" );
    assert ( unquote ( L"\"abc" ) == L"abc" );

    assert ( unquote (  "abc" ) == "abc" ); // no delimiter
    assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter
    assert ( unquote (  "abc def" ) ==  "abc" ); // no delimiter
    assert ( unquote ( L"abc def" ) == L"abc" ); // no delimiter

    assert ( unquote (  "" ) ==  "" ); // nothing there
    assert ( unquote ( L"" ) == L"" ); // nothing there
    test_padding ();

    return 0;
}
