//===----------------------------------------------------------------------===//
// 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, c++14, c++17
// UNSUPPORTED: libcpp-no-concepts
// UNSUPPORTED: libcpp-has-no-localization
// UNSUPPORTED: libcpp-has-no-incomplete-format

// REQUIRES: locale.en_US.UTF-8

// <format>

// This test the locale-specific form for these formatting functions:
//
//  // [format.functions], formatting functions
//  template<class... Args>
//    string format(string_view fmt, const Args&... args);
//  template<class... Args>
//    wstring format(wstring_view fmt, const Args&... args);
//  template<class... Args>
//    string format(const locale& loc, string_view fmt, const Args&... args);
//  template<class... Args>
//    wstring format(const locale& loc, wstring_view fmt, const Args&... args);
//
//  string vformat(string_view fmt, format_args args);
//  wstring vformat(wstring_view fmt, wformat_args args);
//  string vformat(const locale& loc, string_view fmt, format_args args);
//  wstring vformat(const locale& loc, wstring_view fmt, wformat_args args);
//
//  template<class Out, class... Args>
//    Out format_to(Out out, string_view fmt, const Args&... args);
//  template<class Out, class... Args>
//    Out format_to(Out out, wstring_view fmt, const Args&... args);
//  template<class Out, class... Args>
//    Out format_to(Out out, const locale& loc, string_view fmt, const Args&... args);
//  template<class Out, class... Args>
//    Out format_to(Out out, const locale& loc, wstring_view fmt, const Args&... args);
//
//  template<class Out>
//    Out vformat_to(Out out, string_view fmt,
//                   format_args_t<type_identity_t<Out>, char> args);
//  template<class Out>
//    Out vformat_to(Out out, wstring_view fmt,
//                   format_args_t<type_identity_t<Out>, wchar_t> args);
//  template<class Out>
//    Out vformat_to(Out out, const locale& loc, string_view fmt,
//                   format_args_t<type_identity_t<Out>, char> args);
//  template<class Out>
//    Out vformat_to(Out out, const locale& loc, wstring_view fmt,
//                   format_args_t<type_identity_t<Out>, wchar_t> args);
//
//  template<class Out> struct format_to_n_result {
//    Out out;
//    iter_difference_t<Out> size;
//  };
//
// template<class Out, class... Args>
//    format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,
//                                        string_view fmt, const Args&... args);
//  template<class Out, class... Args>
//    format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,
//                                        wstring_view fmt, const Args&... args);
//  template<class Out, class... Args>
//    format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,
//                                        const locale& loc, string_view fmt,
//                                        const Args&... args);
//  template<class Out, class... Args>
//    format_to_n_result<Out> format_to_n(Out out, iter_difference_t<Out> n,
//                                        const locale& loc, wstring_view fmt,
//                                        const Args&... args);
//
//  template<class... Args>
//    size_t formatted_size(string_view fmt, const Args&... args);
//  template<class... Args>
//    size_t formatted_size(wstring_view fmt, const Args&... args);
//  template<class... Args>
//    size_t formatted_size(const locale& loc, string_view fmt, const Args&... args);
//  template<class... Args>
//    size_t formatted_size(const locale& loc, wstring_view fmt, const Args&... args);

#include <format>
#include <cassert>
#include <iostream>
#include <vector>

#include "test_macros.h"
#include "make_string.h"
#include "platform_support.h" // locale name macros

#define STR(S) MAKE_STRING(CharT, S)

template <class CharT>
struct numpunct;

template <>
struct numpunct<char> : std::numpunct<char> {
  string_type do_truename() const override { return "yes"; }
  string_type do_falsename() const override { return "no"; }

  std::string do_grouping() const override { return "\1\2\3\2\1"; };
  char do_thousands_sep() const override { return '_'; }
};

#ifndef TEST_HAS_NO_WIDE_CHARACTERS
template <>
struct numpunct<wchar_t> : std::numpunct<wchar_t> {
  string_type do_truename() const override { return L"yes"; }
  string_type do_falsename() const override { return L"no"; }

  std::string do_grouping() const override { return "\1\2\3\2\1"; };
  wchar_t do_thousands_sep() const override { return L'_'; }
};
#endif

template <class CharT, class... Args>
void test(std::basic_string<CharT> expected, std::basic_string<CharT> fmt,
          const Args&... args) {
  // *** format ***
  {
    std::basic_string<CharT> out = std::format(fmt, args...);
    if constexpr (std::same_as<CharT, char>)
      if (out != expected)
        std::cerr << "\nFormat string   " << fmt << "\nExpected output "
                  << expected << "\nActual output   " << out << '\n';
    assert(out == expected);
  }
  // *** vformat ***
  {
    std::basic_string<CharT> out = std::vformat(
        fmt, std::make_format_args<std::basic_format_context<
                 std::back_insert_iterator<std::basic_string<CharT>>, CharT>>(
                 args...));
    assert(out == expected);
  }
  // *** format_to ***
  {
    std::basic_string<CharT> out(expected.size(), CharT(' '));
    auto it = std::format_to(out.begin(), fmt, args...);
    assert(it == out.end());
    assert(out == expected);
  }
  // *** vformat_to ***
  {
    std::basic_string<CharT> out(expected.size(), CharT(' '));
    auto it = std::vformat_to(
        out.begin(), fmt,
        std::make_format_args<std::basic_format_context<
            typename std::basic_string<CharT>::iterator, CharT>>(args...));
    assert(it == out.end());
    assert(out == expected);
  }
  // *** format_to_n ***
  {
    std::basic_string<CharT> out;
    std::format_to_n_result result =
        std::format_to_n(std::back_inserter(out), 1000, fmt, args...);
    using diff_type = decltype(result.size);
    diff_type formatted_size = std::formatted_size(fmt, args...);
    diff_type size = std::min<diff_type>(1000, formatted_size);

    assert(result.size == formatted_size);
    assert(out == expected.substr(0, size));
  }
  // *** formatted_size ***
  {
    size_t size = std::formatted_size(fmt, args...);
    assert(size == expected.size());
  }
}

template <class CharT, class... Args>
void test(std::basic_string<CharT> expected, std::locale loc,
          std::basic_string<CharT> fmt, const Args&... args) {
  // *** format ***
  {
    std::basic_string<CharT> out = std::format(loc, fmt, args...);
    if constexpr (std::same_as<CharT, char>)
      if (out != expected)
        std::cerr << "\nFormat string   " << fmt << "\nExpected output "
                  << expected << "\nActual output   " << out << '\n';
    assert(out == expected);
  }
  // *** vformat ***
  {
    std::basic_string<CharT> out = std::vformat(
        loc, fmt,
        std::make_format_args<std::basic_format_context<
            std::back_insert_iterator<std::basic_string<CharT>>, CharT>>(
            args...));
    assert(out == expected);
  }
  // *** format_to ***
  {
    std::basic_string<CharT> out(expected.size(), CharT(' '));
    auto it = std::format_to(out.begin(), loc, fmt, args...);
    assert(it == out.end());
    assert(out == expected);
  }
  // *** vformat_to ***
  {
    std::basic_string<CharT> out(expected.size(), CharT(' '));
    auto it = std::vformat_to(
        out.begin(), loc, fmt,
        std::make_format_args<std::basic_format_context<
            typename std::basic_string<CharT>::iterator, CharT>>(args...));
    assert(it == out.end());
    assert(out == expected);
  }
  // *** format_to_n ***
  {
    std::basic_string<CharT> out;
    std::format_to_n_result result =
        std::format_to_n(std::back_inserter(out), 1000, loc, fmt, args...);
    using diff_type = decltype(result.size);
    diff_type formatted_size = std::formatted_size(loc, fmt, args...);
    diff_type size = std::min<diff_type>(1000, formatted_size);

    assert(result.size == formatted_size);
    assert(out == expected.substr(0, size));
  }
  // *** formatted_size ***
  {
    size_t size = std::formatted_size(loc, fmt, args...);
    assert(size == expected.size());
  }
}

#ifndef _LIBCPP_HAS_NO_UNICODE
template <class CharT>
struct numpunct_unicode;

template <>
struct numpunct_unicode<char> : std::numpunct<char> {
  string_type do_truename() const override { return "gültig"; }
  string_type do_falsename() const override { return "ungültig"; }
};

#ifndef TEST_HAS_NO_WIDE_CHARACTERS
template <>
struct numpunct_unicode<wchar_t> : std::numpunct<wchar_t> {
  string_type do_truename() const override { return L"gültig"; }
  string_type do_falsename() const override { return L"ungültig"; }
};
#endif
#endif // _LIBCPP_HAS_NO_UNICODE

template <class CharT>
void test_bool() {
  std::locale loc = std::locale(std::locale(), new numpunct<CharT>());

  std::locale::global(std::locale(LOCALE_en_US_UTF_8));
  assert(std::locale().name() == LOCALE_en_US_UTF_8);
  test(STR("true"), STR("{:L}"), true);
  test(STR("false"), STR("{:L}"), false);

  test(STR("yes"), loc, STR("{:L}"), true);
  test(STR("no"), loc, STR("{:L}"), false);

  std::locale::global(loc);
  test(STR("yes"), STR("{:L}"), true);
  test(STR("no"), STR("{:L}"), false);

  test(STR("true"), std::locale(LOCALE_en_US_UTF_8), STR("{:L}"), true);
  test(STR("false"), std::locale(LOCALE_en_US_UTF_8), STR("{:L}"), false);

#ifndef _LIBCPP_HAS_NO_UNICODE
  std::locale loc_unicode =
      std::locale(std::locale(), new numpunct_unicode<CharT>());

  test(STR("gültig"), loc_unicode, STR("{:L}"), true);
  test(STR("ungültig"), loc_unicode, STR("{:L}"), false);

  test(STR("gültig   "), loc_unicode, STR("{:9L}"), true);
  test(STR("gültig!!!"), loc_unicode, STR("{:!<9L}"), true);
  test(STR("_gültig__"), loc_unicode, STR("{:_^9L}"), true);
  test(STR("   gültig"), loc_unicode, STR("{:>9L}"), true);
#endif
}

template <class CharT>
void test_integer() {
  std::locale loc = std::locale(std::locale(), new numpunct<CharT>());
  std::locale en_US = std::locale(LOCALE_en_US_UTF_8);

  // *** Decimal ***
  std::locale::global(en_US);
  test(STR("0"), STR("{:L}"), 0);
  test(STR("1"), STR("{:L}"), 1);
  test(STR("10"), STR("{:L}"), 10);
  test(STR("100"), STR("{:L}"), 100);
  test(STR("1,000"), STR("{:L}"), 1'000);
  test(STR("10,000"), STR("{:L}"), 10'000);
  test(STR("100,000"), STR("{:L}"), 100'000);
  test(STR("1,000,000"), STR("{:L}"), 1'000'000);
  test(STR("10,000,000"), STR("{:L}"), 10'000'000);
  test(STR("100,000,000"), STR("{:L}"), 100'000'000);
  test(STR("1,000,000,000"), STR("{:L}"), 1'000'000'000);

  test(STR("-1"), STR("{:L}"), -1);
  test(STR("-10"), STR("{:L}"), -10);
  test(STR("-100"), STR("{:L}"), -100);
  test(STR("-1,000"), STR("{:L}"), -1'000);
  test(STR("-10,000"), STR("{:L}"), -10'000);
  test(STR("-100,000"), STR("{:L}"), -100'000);
  test(STR("-1,000,000"), STR("{:L}"), -1'000'000);
  test(STR("-10,000,000"), STR("{:L}"), -10'000'000);
  test(STR("-100,000,000"), STR("{:L}"), -100'000'000);
  test(STR("-1,000,000,000"), STR("{:L}"), -1'000'000'000);

  std::locale::global(loc);
  test(STR("0"), STR("{:L}"), 0);
  test(STR("1"), STR("{:L}"), 1);
  test(STR("1_0"), STR("{:L}"), 10);
  test(STR("10_0"), STR("{:L}"), 100);
  test(STR("1_00_0"), STR("{:L}"), 1'000);
  test(STR("10_00_0"), STR("{:L}"), 10'000);
  test(STR("100_00_0"), STR("{:L}"), 100'000);
  test(STR("1_000_00_0"), STR("{:L}"), 1'000'000);
  test(STR("10_000_00_0"), STR("{:L}"), 10'000'000);
  test(STR("1_00_000_00_0"), STR("{:L}"), 100'000'000);
  test(STR("1_0_00_000_00_0"), STR("{:L}"), 1'000'000'000);

  test(STR("-1"), STR("{:L}"), -1);
  test(STR("-1_0"), STR("{:L}"), -10);
  test(STR("-10_0"), STR("{:L}"), -100);
  test(STR("-1_00_0"), STR("{:L}"), -1'000);
  test(STR("-10_00_0"), STR("{:L}"), -10'000);
  test(STR("-100_00_0"), STR("{:L}"), -100'000);
  test(STR("-1_000_00_0"), STR("{:L}"), -1'000'000);
  test(STR("-10_000_00_0"), STR("{:L}"), -10'000'000);
  test(STR("-1_00_000_00_0"), STR("{:L}"), -100'000'000);
  test(STR("-1_0_00_000_00_0"), STR("{:L}"), -1'000'000'000);

  test(STR("0"), en_US, STR("{:L}"), 0);
  test(STR("1"), en_US, STR("{:L}"), 1);
  test(STR("10"), en_US, STR("{:L}"), 10);
  test(STR("100"), en_US, STR("{:L}"), 100);
  test(STR("1,000"), en_US, STR("{:L}"), 1'000);
  test(STR("10,000"), en_US, STR("{:L}"), 10'000);
  test(STR("100,000"), en_US, STR("{:L}"), 100'000);
  test(STR("1,000,000"), en_US, STR("{:L}"), 1'000'000);
  test(STR("10,000,000"), en_US, STR("{:L}"), 10'000'000);
  test(STR("100,000,000"), en_US, STR("{:L}"), 100'000'000);
  test(STR("1,000,000,000"), en_US, STR("{:L}"), 1'000'000'000);

  test(STR("-1"), en_US, STR("{:L}"), -1);
  test(STR("-10"), en_US, STR("{:L}"), -10);
  test(STR("-100"), en_US, STR("{:L}"), -100);
  test(STR("-1,000"), en_US, STR("{:L}"), -1'000);
  test(STR("-10,000"), en_US, STR("{:L}"), -10'000);
  test(STR("-100,000"), en_US, STR("{:L}"), -100'000);
  test(STR("-1,000,000"), en_US, STR("{:L}"), -1'000'000);
  test(STR("-10,000,000"), en_US, STR("{:L}"), -10'000'000);
  test(STR("-100,000,000"), en_US, STR("{:L}"), -100'000'000);
  test(STR("-1,000,000,000"), en_US, STR("{:L}"), -1'000'000'000);

  std::locale::global(en_US);
  test(STR("0"), loc, STR("{:L}"), 0);
  test(STR("1"), loc, STR("{:L}"), 1);
  test(STR("1_0"), loc, STR("{:L}"), 10);
  test(STR("10_0"), loc, STR("{:L}"), 100);
  test(STR("1_00_0"), loc, STR("{:L}"), 1'000);
  test(STR("10_00_0"), loc, STR("{:L}"), 10'000);
  test(STR("100_00_0"), loc, STR("{:L}"), 100'000);
  test(STR("1_000_00_0"), loc, STR("{:L}"), 1'000'000);
  test(STR("10_000_00_0"), loc, STR("{:L}"), 10'000'000);
  test(STR("1_00_000_00_0"), loc, STR("{:L}"), 100'000'000);
  test(STR("1_0_00_000_00_0"), loc, STR("{:L}"), 1'000'000'000);

  test(STR("-1"), loc, STR("{:L}"), -1);
  test(STR("-1_0"), loc, STR("{:L}"), -10);
  test(STR("-10_0"), loc, STR("{:L}"), -100);
  test(STR("-1_00_0"), loc, STR("{:L}"), -1'000);
  test(STR("-10_00_0"), loc, STR("{:L}"), -10'000);
  test(STR("-100_00_0"), loc, STR("{:L}"), -100'000);
  test(STR("-1_000_00_0"), loc, STR("{:L}"), -1'000'000);
  test(STR("-10_000_00_0"), loc, STR("{:L}"), -10'000'000);
  test(STR("-1_00_000_00_0"), loc, STR("{:L}"), -100'000'000);
  test(STR("-1_0_00_000_00_0"), loc, STR("{:L}"), -1'000'000'000);

  // *** Binary ***
  std::locale::global(en_US);
  test(STR("0"), STR("{:Lb}"), 0b0);
  test(STR("1"), STR("{:Lb}"), 0b1);
  test(STR("1,000,000,000"), STR("{:Lb}"), 0b1'000'000'000);

  test(STR("0b0"), STR("{:#Lb}"), 0b0);
  test(STR("0b1"), STR("{:#Lb}"), 0b1);
  test(STR("0b1,000,000,000"), STR("{:#Lb}"), 0b1'000'000'000);

  test(STR("-1"), STR("{:LB}"), -0b1);
  test(STR("-1,000,000,000"), STR("{:LB}"), -0b1'000'000'000);

  test(STR("-0B1"), STR("{:#LB}"), -0b1);
  test(STR("-0B1,000,000,000"), STR("{:#LB}"), -0b1'000'000'000);

  std::locale::global(loc);
  test(STR("0"), STR("{:Lb}"), 0b0);
  test(STR("1"), STR("{:Lb}"), 0b1);
  test(STR("1_0_00_000_00_0"), STR("{:Lb}"), 0b1'000'000'000);

  test(STR("0b0"), STR("{:#Lb}"), 0b0);
  test(STR("0b1"), STR("{:#Lb}"), 0b1);
  test(STR("0b1_0_00_000_00_0"), STR("{:#Lb}"), 0b1'000'000'000);

  test(STR("-1"), STR("{:LB}"), -0b1);
  test(STR("-1_0_00_000_00_0"), STR("{:LB}"), -0b1'000'000'000);

  test(STR("-0B1"), STR("{:#LB}"), -0b1);
  test(STR("-0B1_0_00_000_00_0"), STR("{:#LB}"), -0b1'000'000'000);

  test(STR("0"), en_US, STR("{:Lb}"), 0b0);
  test(STR("1"), en_US, STR("{:Lb}"), 0b1);
  test(STR("1,000,000,000"), en_US, STR("{:Lb}"), 0b1'000'000'000);

  test(STR("0b0"), en_US, STR("{:#Lb}"), 0b0);
  test(STR("0b1"), en_US, STR("{:#Lb}"), 0b1);
  test(STR("0b1,000,000,000"), en_US, STR("{:#Lb}"), 0b1'000'000'000);

  test(STR("-1"), en_US, STR("{:LB}"), -0b1);
  test(STR("-1,000,000,000"), en_US, STR("{:LB}"), -0b1'000'000'000);

  test(STR("-0B1"), en_US, STR("{:#LB}"), -0b1);
  test(STR("-0B1,000,000,000"), en_US, STR("{:#LB}"), -0b1'000'000'000);

  std::locale::global(en_US);
  test(STR("0"), loc, STR("{:Lb}"), 0b0);
  test(STR("1"), loc, STR("{:Lb}"), 0b1);
  test(STR("1_0_00_000_00_0"), loc, STR("{:Lb}"), 0b1'000'000'000);

  test(STR("0b0"), loc, STR("{:#Lb}"), 0b0);
  test(STR("0b1"), loc, STR("{:#Lb}"), 0b1);
  test(STR("0b1_0_00_000_00_0"), loc, STR("{:#Lb}"), 0b1'000'000'000);

  test(STR("-1"), loc, STR("{:LB}"), -0b1);
  test(STR("-1_0_00_000_00_0"), loc, STR("{:LB}"), -0b1'000'000'000);

  test(STR("-0B1"), loc, STR("{:#LB}"), -0b1);
  test(STR("-0B1_0_00_000_00_0"), loc, STR("{:#LB}"), -0b1'000'000'000);

  // *** Octal ***
  std::locale::global(en_US);
  test(STR("0"), STR("{:Lo}"), 00);
  test(STR("1"), STR("{:Lo}"), 01);
  test(STR("1,000,000,000"), STR("{:Lo}"), 01'000'000'000);

  test(STR("0"), STR("{:#Lo}"), 00);
  test(STR("01"), STR("{:#Lo}"), 01);
  test(STR("01,000,000,000"), STR("{:#Lo}"), 01'000'000'000);

  test(STR("-1"), STR("{:Lo}"), -01);
  test(STR("-1,000,000,000"), STR("{:Lo}"), -01'000'000'000);

  test(STR("-01"), STR("{:#Lo}"), -01);
  test(STR("-01,000,000,000"), STR("{:#Lo}"), -01'000'000'000);

  std::locale::global(loc);
  test(STR("0"), STR("{:Lo}"), 00);
  test(STR("1"), STR("{:Lo}"), 01);
  test(STR("1_0_00_000_00_0"), STR("{:Lo}"), 01'000'000'000);

  test(STR("0"), STR("{:#Lo}"), 00);
  test(STR("01"), STR("{:#Lo}"), 01);
  test(STR("01_0_00_000_00_0"), STR("{:#Lo}"), 01'000'000'000);

  test(STR("-1"), STR("{:Lo}"), -01);
  test(STR("-1_0_00_000_00_0"), STR("{:Lo}"), -01'000'000'000);

  test(STR("-01"), STR("{:#Lo}"), -01);
  test(STR("-01_0_00_000_00_0"), STR("{:#Lo}"), -01'000'000'000);

  test(STR("0"), en_US, STR("{:Lo}"), 00);
  test(STR("1"), en_US, STR("{:Lo}"), 01);
  test(STR("1,000,000,000"), en_US, STR("{:Lo}"), 01'000'000'000);

  test(STR("0"), en_US, STR("{:#Lo}"), 00);
  test(STR("01"), en_US, STR("{:#Lo}"), 01);
  test(STR("01,000,000,000"), en_US, STR("{:#Lo}"), 01'000'000'000);

  test(STR("-1"), en_US, STR("{:Lo}"), -01);
  test(STR("-1,000,000,000"), en_US, STR("{:Lo}"), -01'000'000'000);

  test(STR("-01"), en_US, STR("{:#Lo}"), -01);
  test(STR("-01,000,000,000"), en_US, STR("{:#Lo}"), -01'000'000'000);

  std::locale::global(en_US);
  test(STR("0"), loc, STR("{:Lo}"), 00);
  test(STR("1"), loc, STR("{:Lo}"), 01);
  test(STR("1_0_00_000_00_0"), loc, STR("{:Lo}"), 01'000'000'000);

  test(STR("0"), loc, STR("{:#Lo}"), 00);
  test(STR("01"), loc, STR("{:#Lo}"), 01);
  test(STR("01_0_00_000_00_0"), loc, STR("{:#Lo}"), 01'000'000'000);

  test(STR("-1"), loc, STR("{:Lo}"), -01);
  test(STR("-1_0_00_000_00_0"), loc, STR("{:Lo}"), -01'000'000'000);

  test(STR("-01"), loc, STR("{:#Lo}"), -01);
  test(STR("-01_0_00_000_00_0"), loc, STR("{:#Lo}"), -01'000'000'000);

  // *** Hexadecimal ***
  std::locale::global(en_US);
  test(STR("0"), STR("{:Lx}"), 0x0);
  test(STR("1"), STR("{:Lx}"), 0x1);
  test(STR("1,000,000,000"), STR("{:Lx}"), 0x1'000'000'000);

  test(STR("0x0"), STR("{:#Lx}"), 0x0);
  test(STR("0x1"), STR("{:#Lx}"), 0x1);
  test(STR("0x1,000,000,000"), STR("{:#Lx}"), 0x1'000'000'000);

  test(STR("-1"), STR("{:LX}"), -0x1);
  test(STR("-1,000,000,000"), STR("{:LX}"), -0x1'000'000'000);

  test(STR("-0X1"), STR("{:#LX}"), -0x1);
  test(STR("-0X1,000,000,000"), STR("{:#LX}"), -0x1'000'000'000);

  std::locale::global(loc);
  test(STR("0"), STR("{:Lx}"), 0x0);
  test(STR("1"), STR("{:Lx}"), 0x1);
  test(STR("1_0_00_000_00_0"), STR("{:Lx}"), 0x1'000'000'000);

  test(STR("0x0"), STR("{:#Lx}"), 0x0);
  test(STR("0x1"), STR("{:#Lx}"), 0x1);
  test(STR("0x1_0_00_000_00_0"), STR("{:#Lx}"), 0x1'000'000'000);

  test(STR("-1"), STR("{:LX}"), -0x1);
  test(STR("-1_0_00_000_00_0"), STR("{:LX}"), -0x1'000'000'000);

  test(STR("-0X1"), STR("{:#LX}"), -0x1);
  test(STR("-0X1_0_00_000_00_0"), STR("{:#LX}"), -0x1'000'000'000);

  test(STR("0"), en_US, STR("{:Lx}"), 0x0);
  test(STR("1"), en_US, STR("{:Lx}"), 0x1);
  test(STR("1,000,000,000"), en_US, STR("{:Lx}"), 0x1'000'000'000);

  test(STR("0x0"), en_US, STR("{:#Lx}"), 0x0);
  test(STR("0x1"), en_US, STR("{:#Lx}"), 0x1);
  test(STR("0x1,000,000,000"), en_US, STR("{:#Lx}"), 0x1'000'000'000);

  test(STR("-1"), en_US, STR("{:LX}"), -0x1);
  test(STR("-1,000,000,000"), en_US, STR("{:LX}"), -0x1'000'000'000);

  test(STR("-0X1"), en_US, STR("{:#LX}"), -0x1);
  test(STR("-0X1,000,000,000"), en_US, STR("{:#LX}"), -0x1'000'000'000);

  std::locale::global(en_US);
  test(STR("0"), loc, STR("{:Lx}"), 0x0);
  test(STR("1"), loc, STR("{:Lx}"), 0x1);
  test(STR("1_0_00_000_00_0"), loc, STR("{:Lx}"), 0x1'000'000'000);

  test(STR("0x0"), loc, STR("{:#Lx}"), 0x0);
  test(STR("0x1"), loc, STR("{:#Lx}"), 0x1);
  test(STR("0x1_0_00_000_00_0"), loc, STR("{:#Lx}"), 0x1'000'000'000);

  test(STR("-1"), loc, STR("{:LX}"), -0x1);
  test(STR("-1_0_00_000_00_0"), loc, STR("{:LX}"), -0x1'000'000'000);

  test(STR("-0X1"), loc, STR("{:#LX}"), -0x1);
  test(STR("-0X1_0_00_000_00_0"), loc, STR("{:#LX}"), -0x1'000'000'000);

  // *** align-fill & width ***
  test(STR("4_2"), loc, STR("{:L}"), 42);

  test(STR("   4_2"), loc, STR("{:6L}"), 42);
  test(STR("4_2   "), loc, STR("{:<6L}"), 42);
  test(STR(" 4_2  "), loc, STR("{:^6L}"), 42);
  test(STR("   4_2"), loc, STR("{:>6L}"), 42);

  test(STR("4_2***"), loc, STR("{:*<6L}"), 42);
  test(STR("*4_2**"), loc, STR("{:*^6L}"), 42);
  test(STR("***4_2"), loc, STR("{:*>6L}"), 42);

  test(STR("4_a*****"), loc, STR("{:*<8Lx}"), 0x4a);
  test(STR("**4_a***"), loc, STR("{:*^8Lx}"), 0x4a);
  test(STR("*****4_a"), loc, STR("{:*>8Lx}"), 0x4a);

  test(STR("0x4_a***"), loc, STR("{:*<#8Lx}"), 0x4a);
  test(STR("*0x4_a**"), loc, STR("{:*^#8Lx}"), 0x4a);
  test(STR("***0x4_a"), loc, STR("{:*>#8Lx}"), 0x4a);

  test(STR("4_A*****"), loc, STR("{:*<8LX}"), 0x4a);
  test(STR("**4_A***"), loc, STR("{:*^8LX}"), 0x4a);
  test(STR("*****4_A"), loc, STR("{:*>8LX}"), 0x4a);

  test(STR("0X4_A***"), loc, STR("{:*<#8LX}"), 0x4a);
  test(STR("*0X4_A**"), loc, STR("{:*^#8LX}"), 0x4a);
  test(STR("***0X4_A"), loc, STR("{:*>#8LX}"), 0x4a);

  // Test whether zero padding is ignored
  test(STR("4_2   "), loc, STR("{:<06L}"), 42);
  test(STR(" 4_2  "), loc, STR("{:^06L}"), 42);
  test(STR("   4_2"), loc, STR("{:>06L}"), 42);

  // *** zero-padding & width ***
  test(STR("   4_2"), loc, STR("{:6L}"), 42);
  test(STR("0004_2"), loc, STR("{:06L}"), 42);
  test(STR("-004_2"), loc, STR("{:06L}"), -42);

  test(STR("000004_a"), loc, STR("{:08Lx}"), 0x4a);
  test(STR("0x0004_a"), loc, STR("{:#08Lx}"), 0x4a);
  test(STR("0X0004_A"), loc, STR("{:#08LX}"), 0x4a);

  test(STR("-00004_a"), loc, STR("{:08Lx}"), -0x4a);
  test(STR("-0x004_a"), loc, STR("{:#08Lx}"), -0x4a);
  test(STR("-0X004_A"), loc, STR("{:#08LX}"), -0x4a);
}

template <class CharT>
void test() {
  test_bool<CharT>();
  test_integer<CharT>();
}

int main(int, char**) {
  test<char>();
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
  test<wchar_t>();
#endif

  return 0;
}
