248 lines · cpp
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// UNSUPPORTED: c++03, c++11, c++14, c++1710// UNSUPPORTED: no-localization11// UNSUPPORTED: GCC-ALWAYS_INLINE-FIXME12 13// TODO FMT This test should not require std::to_chars(floating-point)14// XFAIL: availability-fp_to_chars-missing15 16// REQUIRES: locale.fr_FR.UTF-817// REQUIRES: locale.ja_JP.UTF-818 19// <chrono>20 21// template<class charT> struct formatter<chrono::year_month_weekday_last, charT>;22 23#include <chrono>24#include <format>25 26#include <cassert>27#include <concepts>28#include <locale>29#include <iostream>30#include <type_traits>31 32#include "formatter_tests.h"33#include "make_string.h"34#include "platform_support.h" // locale name macros35#include "string_literal.h"36#include "test_macros.h"37 38template <class CharT>39static void test_no_chrono_specs() {40 // Valid41 check(SV("1970/Jan/Mon[last]"),42 SV("{}"),43 std::chrono::year_month_weekday_last{44 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});45 check(SV("*1970/Jan/Mon[last]*"),46 SV("{:*^20}"),47 std::chrono::year_month_weekday_last{48 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});49 check(SV("*1970/Jan/Mon[last]"),50 SV("{:*>19}"),51 std::chrono::year_month_weekday_last{52 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});53 54 // Invalid55 check(SV("1970/Jan/8 is not a valid weekday[last]"),56 SV("{}"),57 std::chrono::year_month_weekday_last{58 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});59 check(SV("1970/0 is not a valid month/Mon[last]"),60 SV("{}"),61 std::chrono::year_month_weekday_last{62 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});63 check(SV("-32768 is not a valid year/Jan/Mon[last]"),64 SV("{}"),65 std::chrono::year_month_weekday_last{66 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});67}68 69template <class CharT>70static void test_invalid_values() {71 // *** Invalid weekday ***72 73 // Weekday name conversion74 check_exception(75 "Formatting a weekday name needs a valid weekday",76 SV("{:%a}"),77 std::chrono::year_month_weekday_last{78 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});79 check_exception(80 "Formatting a weekday name needs a valid weekday",81 SV("{:%A}"),82 std::chrono::year_month_weekday_last{83 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});84 85 // Weekday conversion86 check_exception(87 "Formatting a weekday needs a valid weekday",88 SV("{:%u}"),89 std::chrono::year_month_weekday_last{90 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});91 check_exception(92 "Formatting a weekday needs a valid weekday",93 SV("{:%w}"),94 std::chrono::year_month_weekday_last{95 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});96 check_exception(97 "Formatting a weekday needs a valid weekday",98 SV("{:%Ou}"),99 std::chrono::year_month_weekday_last{100 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});101 check_exception(102 "Formatting a weekday needs a valid weekday",103 SV("{:%Ow}"),104 std::chrono::year_month_weekday_last{105 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});106 107 // Day of year field108 check_exception(109 "Formatting a day of year needs a valid date",110 SV("{:%j}"),111 std::chrono::year_month_weekday_last{112 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});113 114 // Month name conversion115 check(SV("Jan"),116 SV("{:%b}"),117 std::chrono::year_month_weekday_last{118 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});119 check(SV("Jan"),120 SV("{:%h}"),121 std::chrono::year_month_weekday_last{122 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});123 check(SV("January"),124 SV("{:%B}"),125 std::chrono::year_month_weekday_last{126 std::chrono::year{1970}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{8}}});127 128 // *** Invalid month ***129 130 // Weekday name conversion131 check(SV("Mon"),132 SV("{:%a}"),133 std::chrono::year_month_weekday_last{134 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});135 check(SV("Monday"),136 SV("{:%A}"),137 std::chrono::year_month_weekday_last{138 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});139 // Weekday conversion140 check(SV("1"),141 SV("{:%u}"),142 std::chrono::year_month_weekday_last{143 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});144 check(SV("1"),145 SV("{:%w}"),146 std::chrono::year_month_weekday_last{147 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});148 check(SV("1"),149 SV("{:%Ou}"),150 std::chrono::year_month_weekday_last{151 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});152 check(SV("1"),153 SV("{:%Ow}"),154 std::chrono::year_month_weekday_last{155 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});156 157 // Day of year field158 check_exception(159 "Formatting a day of year needs a valid date",160 SV("{:%j}"),161 std::chrono::year_month_weekday_last{162 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});163 164 // Month name conversion165 check_exception(166 "Formatting a month name from an invalid month number",167 SV("{:%b}"),168 std::chrono::year_month_weekday_last{169 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});170 check_exception(171 "Formatting a month name from an invalid month number",172 SV("{:%h}"),173 std::chrono::year_month_weekday_last{174 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});175 check_exception(176 "Formatting a month name from an invalid month number",177 SV("{:%B}"),178 std::chrono::year_month_weekday_last{179 std::chrono::year{1970}, std::chrono::month{0}, std::chrono::weekday_last{std::chrono::weekday{1}}});180 181 // *** Invalid year ***182 183 // Weekday name conversion184 check(SV("Mon"),185 SV("{:%a}"),186 std::chrono::year_month_weekday_last{187 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});188 check(SV("Monday"),189 SV("{:%A}"),190 std::chrono::year_month_weekday_last{191 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});192 193 // Weekday conversion194 check(SV("1"),195 SV("{:%u}"),196 std::chrono::year_month_weekday_last{197 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});198 check(SV("1"),199 SV("{:%w}"),200 std::chrono::year_month_weekday_last{201 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});202 check(SV("1"),203 SV("{:%Ou}"),204 std::chrono::year_month_weekday_last{205 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});206 check(SV("1"),207 SV("{:%Ow}"),208 std::chrono::year_month_weekday_last{209 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});210 211 // Day of year field212 check_exception(213 "Formatting a day of year needs a valid date",214 SV("{:%j}"),215 std::chrono::year_month_weekday_last{216 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});217 218 // Month name conversion219 check(SV("Jan"),220 SV("{:%b}"),221 std::chrono::year_month_weekday_last{222 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});223 check(SV("Jan"),224 SV("{:%h}"),225 std::chrono::year_month_weekday_last{226 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});227 check(SV("January"),228 SV("{:%B}"),229 std::chrono::year_month_weekday_last{230 std::chrono::year{-32768}, std::chrono::month{1}, std::chrono::weekday_last{std::chrono::weekday{1}}});231}232 233template <class CharT>234static void test() {235 test_no_chrono_specs<CharT>();236 test_invalid_values<CharT>();237}238 239int main(int, char**) {240 test<char>();241 242#ifndef TEST_HAS_NO_WIDE_CHARACTERS243 test<wchar_t>();244#endif245 246 return 0;247}248