// { dg-do run { target c++20 } }
// { dg-require-namedlocale "fr_FR.ISO8859-15" }
// { dg-timeout-factor 2 }

#include <chrono>
#include <sstream>
#include <testsuite_hooks.h>

void
test_ostream()
{
  using std::ostringstream;
  using namespace std::chrono;

  ostringstream ss;
  for (int i = 0; i <= 7; ++i)
    ss << weekday(i);
  VERIFY( ss.str() == "SunMonTueWedThuFriSatSun" );
  ss.str("");
  ss << weekday(8) << '|' << weekday(99);
  VERIFY( ss.str() == "8 is not a valid weekday|99 is not a valid weekday" );

  ss.str("");
  ss.imbue(std::locale(ISO_8859(15,fr_FR)));
  ss << weekday(6);
  VERIFY( ss.str() == "sam." );
}

void
test_format()
{
  using std::chrono::weekday;

  auto s = std::format("{:%a%%%A%t%u%n%w}", std::chrono::Monday);
  VERIFY( s == "Mon%Monday\t1\n1" );
  auto ws = std::format(L"{:%a%%%A%t%u%n%w}", weekday(7));
  VERIFY( ws == L"Sun%Sunday\t7\n0" );

  s = std::format("{:%w}", weekday(8));
  VERIFY( s == "8" );

  try
  {
    (void) std::format("{:%a}", weekday(8));
    VERIFY(false);
  }
  catch (const std::format_error&)
  {
  }

  s = std::format("{} is OK, but {:L}", weekday(2), weekday(13));
  VERIFY( s == "Tue is OK, but 13 is not a valid weekday" );

  std::locale loc_fr(ISO_8859(15,fr_FR));

  s = std::format("{:%Ow}", weekday(1));
  VERIFY( s == "1" );
  s = std::format(std::locale::classic(), "{:%Ow}", weekday(1));
  VERIFY( s == "1" );
  s = std::format(std::locale::classic(), "{:L%Ow}", weekday(1));
  VERIFY( s == "1" );
  s = std::format(loc_fr, "{:%Ow}", weekday(1));
  VERIFY( s == "1" );
  s = std::format(loc_fr, "{:L%Ow}", weekday(1));
  VERIFY( s == "1" );
  // TODO test "{:L%Ow}" with locale that has alternative numeric rep.

  s = std::format(loc_fr, "{:%a}", weekday(1));
  VERIFY( s == "Mon" );
  s = std::format(loc_fr, "{:L%a}", weekday(1));
  VERIFY( s == "lun." );
  s = std::format(loc_fr, "{:L}", weekday(25));
  VERIFY( s == "25 is not a valid weekday" );

  std::string_view specs = "aAbBcCdDeFgGhHIjmMpqQrRSTuUVwWxXyYzZ";
  std::string_view my_specs = "aAuw";
  for (char c : specs)
  {
    char fmt[] = { '{', ':', '%', c, '}' };
    try
    {
      weekday wd(1);
      (void) std::vformat(std::string_view(fmt, 5), std::make_format_args(wd));
      // The call above should throw for any conversion-spec not in my_specs:
      VERIFY(my_specs.find(c) != my_specs.npos);
    }
    catch (const std::format_error& e)
    {
      VERIFY(my_specs.find(c) == my_specs.npos);
      std::string_view s = e.what();
      // Libstdc++-specific message:
      VERIFY(s.find("format argument does not contain the information "
		    "required by the chrono-specs") != s.npos);
    }
  }
}

void
test_parse()
{
  using namespace std::chrono;
  std::istringstream is;
  weekday wd{};

  is.str("fRi funday");
  VERIFY( is >> std::chrono::parse(" %A   funday", wd) );
  VERIFY( wd == Friday );

  is.str("MONDAY xxx");
  VERIFY( is >> std::chrono::parse(" %a   xxx ", wd) );
  VERIFY( wd == Monday );

  is.clear();
  is.str("1");
  VERIFY( is >> std::chrono::parse("%u", wd) );
  VERIFY( wd == Monday );
  is.clear();
  is.str("7");
  VERIFY( is >> std::chrono::parse("%u", wd) );
  VERIFY( wd == Sunday );
  wd = weekday(99);
  is.clear();
  is.str("0");
  VERIFY( ! (is >> std::chrono::parse("%u", wd)) );
  VERIFY( wd == weekday(99) );
  is.clear();
  is.str("8");
  VERIFY( ! (is >> std::chrono::parse("%u", wd)) );
  VERIFY( wd == weekday(99) );

  is.clear();
  is.str("003");
  VERIFY( is >> std::chrono::parse("%3u", wd) );
  VERIFY( wd == Wednesday );
  wd = weekday(99);
  is.clear();
  is.str("004");
  VERIFY( ! (is >> std::chrono::parse("%2u", wd)) );
  VERIFY( wd == weekday(99) );

  is.clear();
  is.str("1");
  VERIFY( is >> std::chrono::parse("%w", wd) );
  VERIFY( wd == Monday );
  is.clear();
  is.str("0");
  VERIFY( is >> std::chrono::parse("%w", wd) );
  VERIFY( wd == Sunday );
  wd = weekday(99);
  is.clear();
  is.str("7");
  VERIFY( ! (is >> std::chrono::parse("%w", wd)) );
  VERIFY( wd == weekday(99) );
  is.clear();
  is.str("8");
  VERIFY( ! (is >> std::chrono::parse("%w", wd)) );
  VERIFY( wd == weekday(99) );

  is.clear();
  is.str("003");
  VERIFY( is >> std::chrono::parse("%3w", wd) );
  VERIFY( wd == Wednesday );
  is.clear();
  is.str("004");
  VERIFY( is >> std::chrono::parse("%2w", wd) );
  VERIFY( wd == Sunday );

  is.clear();
  is.str("2023-8-11");
  VERIFY( is >> std::chrono::parse("%F", wd) );
  VERIFY( wd == Friday );
}

int main()
{
  test_ostream();
  test_format();
  test_parse();
}
