| //===----------------------------------------------------------------------===// |
| // 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef TEST_STD_TIME_TIME_SYN_FORMATTER_TESTS_H |
| #define TEST_STD_TIME_TIME_SYN_FORMATTER_TESTS_H |
| |
| #include "assert_macros.h" |
| #include "concat_macros.h" |
| #include "make_string.h" |
| #include "string_literal.h" |
| #include "test_format_string.h" |
| #include "test_macros.h" |
| |
| #include <algorithm> |
| #include <cassert> |
| #include <iostream> |
| #include <set> |
| #include <string> |
| #include <string_view> |
| |
| #define STR(S) MAKE_STRING(CharT, S) |
| #define SV(S) MAKE_STRING_VIEW(CharT, S) |
| |
| #ifndef TEST_HAS_NO_WIDE_CHARACTERS |
| template <class CharT> |
| using format_context = std::conditional_t<std::same_as<CharT, char>, std::format_context, std::wformat_context>; |
| #else |
| template <class CharT> |
| using format_context = std::format_context; |
| #endif |
| |
| template <class CharT, class... Args> |
| void check(std::basic_string_view<CharT> expected, test_format_string<CharT, Args...> fmt, Args&&... args) { |
| std::basic_string<CharT> out = std::format(fmt, std::forward<Args>(args)...); |
| TEST_REQUIRE(out == expected, |
| TEST_WRITE_CONCATENATED( |
| "\nFormat string ", fmt.get(), "\nExpected output ", expected, "\nActual output ", out, '\n')); |
| } |
| |
| template <class CharT, class... Args> |
| void check(const std::locale& loc, |
| std::basic_string_view<CharT> expected, |
| test_format_string<CharT, Args...> fmt, |
| Args&&... args) { |
| std::basic_string<CharT> out = std::format(loc, fmt, std::forward<Args>(args)...); |
| TEST_REQUIRE(out == expected, |
| TEST_WRITE_CONCATENATED( |
| "\nFormat string ", fmt.get(), "\nExpected output ", expected, "\nActual output ", out, '\n')); |
| } |
| |
| template <class CharT, class... Args> |
| void check_exception([[maybe_unused]] std::string_view what, |
| [[maybe_unused]] std::basic_string_view<CharT> fmt, |
| [[maybe_unused]] const Args&... args) { |
| TEST_VALIDATE_EXCEPTION( |
| std::format_error, |
| [&]([[maybe_unused]] const std::format_error& e) { |
| TEST_LIBCPP_REQUIRE( |
| e.what() == what, |
| TEST_WRITE_CONCATENATED( |
| "\nFormat string ", fmt, "\nExpected exception ", what, "\nActual exception ", e.what(), '\n')); |
| }, |
| TEST_IGNORE_NODISCARD std::vformat(fmt, std::make_format_args<format_context<CharT>>(args...))); |
| } |
| |
| template <class CharT, class T> |
| void check_invalid_type(const std::set<std::basic_string_view<CharT>>& valid_types, |
| std::string_view what, |
| std::basic_string<CharT> type, |
| const T& arg) { |
| std::basic_string<CharT> fmt{STR("{:%") + type + STR("}")}; |
| |
| if (valid_types.contains(std::basic_string_view<CharT>{type})) { |
| #ifndef TEST_HAS_NO_EXCEPTIONS |
| try { |
| #endif |
| TEST_IGNORE_NODISCARD std::vformat( |
| std::basic_string_view<CharT>{fmt}, std::make_format_args<format_context<CharT>>(arg)); |
| #ifndef TEST_HAS_NO_EXCEPTIONS |
| } catch (const std::format_error& e) { |
| (void)e; |
| if constexpr (std::same_as<CharT, char>) |
| std::cerr << "\nFormat string " << fmt << "\nUnexpected exception " << e.what() << '\n'; |
| assert(false); |
| } |
| #endif |
| } else { |
| check_exception(what, std::basic_string_view<CharT>{fmt}, arg); |
| } |
| } |
| |
| template <class CharT, class T> |
| void check_invalid_types(const std::set<std::basic_string_view<CharT>>& valid_types, const T& arg) { |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("a"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("A"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("b"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("B"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date and time", STR("c"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("C"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("d"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("D"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("e"), arg); |
| // E - the modifier is checked separately |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("f"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("F"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("g"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("G"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("h"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("H"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("i"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("I"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date or duration", STR("j"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("J"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("k"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("K"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("l"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("L"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("m"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a minute", STR("M"), arg); |
| // n - valid |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("N"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("o"), arg); |
| // O - the modifier is checked separately |
| check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("p"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("P"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a duration", STR("q"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a duration", STR("Q"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("r"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("R"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("s"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a second", STR("S"), arg); |
| // t - valid |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("T"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("u"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("U"), arg); |
| check_invalid_type(valid_types, "The date time type specifier is invalid", STR("v"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("V"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("w"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("W"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("x"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("X"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("y"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("y"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("z"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("Z"), arg); |
| |
| // *** E modifier |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ea"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EA"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eb"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EB"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date and time", STR("Ec"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("EC"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ed"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ED"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ee"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EE"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ef"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EF"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eg"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EG"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eh"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EH"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ei"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EI"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ej"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EJ"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ek"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EK"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("El"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EL"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Em"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EM"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("En"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EN"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eo"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EO"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ep"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EP"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eq"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EQ"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Er"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ER"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Es"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ES"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Et"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ET"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eu"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EU"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ev"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EV"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ew"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EW"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("Ex"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("EX"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("Ey"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("EY"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("Ez"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EZ"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("E%"), arg); |
| |
| // *** O modifier |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oa"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OA"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ob"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OB"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oc"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OC"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("Od"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OD"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("Oe"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OE"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Of"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OF"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Og"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OG"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oh"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("OH"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oi"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("OI"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oj"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OJ"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ok"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OK"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ol"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OL"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("Om"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a minute", STR("OM"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("On"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("ON"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oo"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OO"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Op"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OP"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oq"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OQ"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Or"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OR"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Os"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a second", STR("OS"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ot"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OT"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("Ou"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("OU"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ov"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("OV"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("Ow"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("OW"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ox"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OX"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("Oy"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OY"), arg); |
| check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("Oz"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OZ"), arg); |
| check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("O%"), arg); |
| } |
| |
| #endif // TEST_STD_TIME_TIME_SYN_FORMATTER_TESTS_H |