264 lines · c
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#ifndef TEST_STD_TIME_TIME_SYN_FORMATTER_TESTS_H10#define TEST_STD_TIME_TIME_SYN_FORMATTER_TESTS_H11 12#include "assert_macros.h"13#include "concat_macros.h"14#include "make_string.h"15#include "string_literal.h"16#include "test_format_string.h"17#include "test_macros.h"18 19#include <algorithm>20#include <cassert>21#include <iostream>22#include <set>23#include <string>24#include <string_view>25 26#define STR(S) MAKE_STRING(CharT, S)27#define SV(S) MAKE_STRING_VIEW(CharT, S)28 29#ifndef TEST_HAS_NO_WIDE_CHARACTERS30template <class CharT>31using format_context = std::conditional_t<std::same_as<CharT, char>, std::format_context, std::wformat_context>;32#else33template <class CharT>34using format_context = std::format_context;35#endif36 37template <class CharT, class... Args>38void check(std::basic_string_view<CharT> expected, test_format_string<CharT, Args...> fmt, Args&&... args) {39 std::basic_string<CharT> out = std::format(fmt, std::forward<Args>(args)...);40 TEST_REQUIRE(out == expected,41 TEST_WRITE_CONCATENATED(42 "\nFormat string ", fmt.get(), "\nExpected output ", expected, "\nActual output ", out, '\n'));43}44 45template <class CharT, class... Args>46void check(const std::locale& loc,47 std::basic_string_view<CharT> expected,48 test_format_string<CharT, Args...> fmt,49 Args&&... args) {50 std::basic_string<CharT> out = std::format(loc, fmt, std::forward<Args>(args)...);51 TEST_REQUIRE(out == expected,52 TEST_WRITE_CONCATENATED(53 "\nFormat string ", fmt.get(), "\nExpected output ", expected, "\nActual output ", out, '\n'));54}55 56template <class CharT, class... Args>57void check_exception([[maybe_unused]] std::string_view what,58 [[maybe_unused]] std::basic_string_view<CharT> fmt,59 [[maybe_unused]] const Args&... args) {60 TEST_VALIDATE_EXCEPTION(61 std::format_error,62 [&]([[maybe_unused]] const std::format_error& e) {63 TEST_LIBCPP_REQUIRE(64 e.what() == what,65 TEST_WRITE_CONCATENATED(66 "\nFormat string ", fmt, "\nExpected exception ", what, "\nActual exception ", e.what(), '\n'));67 },68 TEST_IGNORE_NODISCARD std::vformat(fmt, std::make_format_args<format_context<CharT>>(args...)));69}70 71template <class CharT, class T>72void check_invalid_type(const std::set<std::basic_string_view<CharT>>& valid_types,73 std::string_view what,74 std::basic_string<CharT> type,75 const T& arg) {76 std::basic_string<CharT> fmt{STR("{:%") + type + STR("}")};77 78 if (valid_types.contains(std::basic_string_view<CharT>{type})) {79#ifndef TEST_HAS_NO_EXCEPTIONS80 try {81#endif82 TEST_IGNORE_NODISCARD std::vformat(83 std::basic_string_view<CharT>{fmt}, std::make_format_args<format_context<CharT>>(arg));84#ifndef TEST_HAS_NO_EXCEPTIONS85 } catch (const std::format_error& e) {86 (void)e;87 if constexpr (std::same_as<CharT, char>)88 std::cerr << "\nFormat string " << fmt << "\nUnexpected exception " << e.what() << '\n';89 assert(false);90 }91#endif92 } else {93 check_exception(what, std::basic_string_view<CharT>{fmt}, arg);94 }95}96 97template <class CharT, class T>98void check_invalid_types(const std::set<std::basic_string_view<CharT>>& valid_types, const T& arg) {99 check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("a"), arg);100 check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("A"), arg);101 check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("b"), arg);102 check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("B"), arg);103 check_invalid_type(valid_types, "The supplied date time doesn't contain a date and time", STR("c"), arg);104 check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("C"), arg);105 check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("d"), arg);106 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("D"), arg);107 check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("e"), arg);108 // E - the modifier is checked separately109 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("f"), arg);110 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("F"), arg);111 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("g"), arg);112 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("G"), arg);113 check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("h"), arg);114 check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("H"), arg);115 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("i"), arg);116 check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("I"), arg);117 check_invalid_type(valid_types, "The supplied date time doesn't contain a date or duration", STR("j"), arg);118 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("J"), arg);119 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("k"), arg);120 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("K"), arg);121 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("l"), arg);122 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("L"), arg);123 check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("m"), arg);124 check_invalid_type(valid_types, "The supplied date time doesn't contain a minute", STR("M"), arg);125 // n - valid126 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("N"), arg);127 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("o"), arg);128 // O - the modifier is checked separately129 check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("p"), arg);130 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("P"), arg);131 check_invalid_type(valid_types, "The supplied date time doesn't contain a duration", STR("q"), arg);132 check_invalid_type(valid_types, "The supplied date time doesn't contain a duration", STR("Q"), arg);133 check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("r"), arg);134 check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("R"), arg);135 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("s"), arg);136 check_invalid_type(valid_types, "The supplied date time doesn't contain a second", STR("S"), arg);137 // t - valid138 check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("T"), arg);139 check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("u"), arg);140 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("U"), arg);141 check_invalid_type(valid_types, "The date time type specifier is invalid", STR("v"), arg);142 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("V"), arg);143 check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("w"), arg);144 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("W"), arg);145 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("x"), arg);146 check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("X"), arg);147 check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("y"), arg);148 check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("y"), arg);149 check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("z"), arg);150 check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("Z"), arg);151 152 // *** E modifier153 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ea"), arg);154 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EA"), arg);155 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eb"), arg);156 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EB"), arg);157 check_invalid_type(valid_types, "The supplied date time doesn't contain a date and time", STR("Ec"), arg);158 check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("EC"), arg);159 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ed"), arg);160 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ED"), arg);161 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ee"), arg);162 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EE"), arg);163 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ef"), arg);164 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EF"), arg);165 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eg"), arg);166 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EG"), arg);167 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eh"), arg);168 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EH"), arg);169 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ei"), arg);170 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EI"), arg);171 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ej"), arg);172 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EJ"), arg);173 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ek"), arg);174 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EK"), arg);175 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("El"), arg);176 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EL"), arg);177 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Em"), arg);178 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EM"), arg);179 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("En"), arg);180 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EN"), arg);181 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eo"), arg);182 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EO"), arg);183 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ep"), arg);184 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EP"), arg);185 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eq"), arg);186 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EQ"), arg);187 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Er"), arg);188 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ER"), arg);189 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Es"), arg);190 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ES"), arg);191 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Et"), arg);192 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("ET"), arg);193 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Eu"), arg);194 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EU"), arg);195 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ev"), arg);196 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EV"), arg);197 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("Ew"), arg);198 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EW"), arg);199 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("Ex"), arg);200 check_invalid_type(valid_types, "The supplied date time doesn't contain a time", STR("EX"), arg);201 check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("Ey"), arg);202 check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("EY"), arg);203 check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("Ez"), arg);204 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("EZ"), arg);205 check_invalid_type(valid_types, "The date time type specifier for modifier E is invalid", STR("E%"), arg);206 207 // *** O modifier208 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oa"), arg);209 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OA"), arg);210 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ob"), arg);211 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OB"), arg);212 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oc"), arg);213 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OC"), arg);214 check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("Od"), arg);215 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OD"), arg);216 check_invalid_type(valid_types, "The supplied date time doesn't contain a day", STR("Oe"), arg);217 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OE"), arg);218 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Of"), arg);219 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OF"), arg);220 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Og"), arg);221 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OG"), arg);222 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oh"), arg);223 check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("OH"), arg);224 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oi"), arg);225 check_invalid_type(valid_types, "The supplied date time doesn't contain an hour", STR("OI"), arg);226 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oj"), arg);227 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OJ"), arg);228 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ok"), arg);229 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OK"), arg);230 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ol"), arg);231 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OL"), arg);232 check_invalid_type(valid_types, "The supplied date time doesn't contain a month", STR("Om"), arg);233 check_invalid_type(valid_types, "The supplied date time doesn't contain a minute", STR("OM"), arg);234 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("On"), arg);235 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("ON"), arg);236 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oo"), arg);237 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OO"), arg);238 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Op"), arg);239 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OP"), arg);240 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Oq"), arg);241 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OQ"), arg);242 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Or"), arg);243 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OR"), arg);244 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Os"), arg);245 check_invalid_type(valid_types, "The supplied date time doesn't contain a second", STR("OS"), arg);246 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ot"), arg);247 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OT"), arg);248 check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("Ou"), arg);249 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("OU"), arg);250 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ov"), arg);251 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("OV"), arg);252 check_invalid_type(valid_types, "The supplied date time doesn't contain a weekday", STR("Ow"), arg);253 check_invalid_type(valid_types, "The supplied date time doesn't contain a date", STR("OW"), arg);254 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("Ox"), arg);255 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OX"), arg);256 check_invalid_type(valid_types, "The supplied date time doesn't contain a year", STR("Oy"), arg);257 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OY"), arg);258 check_invalid_type(valid_types, "The supplied date time doesn't contain a time zone", STR("Oz"), arg);259 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("OZ"), arg);260 check_invalid_type(valid_types, "The date time type specifier for modifier O is invalid", STR("O%"), arg);261}262 263#endif // TEST_STD_TIME_TIME_SYN_FORMATTER_TESTS_H264