git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-11.0.2/test/chrono-test.cc

normal view · raw

47fd5c32 Poul Sander 2024-10-05 08:44 1
// Formatting library for C++ - time formatting tests
47fd5c32 Poul Sander 2024-10-05 08:44 2
//
47fd5c32 Poul Sander 2024-10-05 08:44 3
// Copyright (c) 2012 - present, Victor Zverovich
47fd5c32 Poul Sander 2024-10-05 08:44 4
// All rights reserved.
47fd5c32 Poul Sander 2024-10-05 08:44 5
//
47fd5c32 Poul Sander 2024-10-05 08:44 6
// For the license information refer to format.h.
47fd5c32 Poul Sander 2024-10-05 08:44 7
47fd5c32 Poul Sander 2024-10-05 08:44 8
#include "fmt/chrono.h"
47fd5c32 Poul Sander 2024-10-05 08:44 9
47fd5c32 Poul Sander 2024-10-05 08:44 10
#include <algorithm>
47fd5c32 Poul Sander 2024-10-05 08:44 11
#include <ctime>
47fd5c32 Poul Sander 2024-10-05 08:44 12
#include <vector>
47fd5c32 Poul Sander 2024-10-05 08:44 13
47fd5c32 Poul Sander 2024-10-05 08:44 14
#include "gtest-extra.h"  // EXPECT_THROW_MSG
47fd5c32 Poul Sander 2024-10-05 08:44 15
#include "util.h"         // get_locale
47fd5c32 Poul Sander 2024-10-05 08:44 16
47fd5c32 Poul Sander 2024-10-05 08:44 17
using fmt::runtime;
47fd5c32 Poul Sander 2024-10-05 08:44 18
using testing::Contains;
47fd5c32 Poul Sander 2024-10-05 08:44 19
47fd5c32 Poul Sander 2024-10-05 08:44 20
template <typename Duration>
47fd5c32 Poul Sander 2024-10-05 08:44 21
using sys_time = std::chrono::time_point<std::chrono::system_clock, Duration>;
47fd5c32 Poul Sander 2024-10-05 08:44 22
47fd5c32 Poul Sander 2024-10-05 08:44 23
#if defined(__MINGW32__) && !defined(_UCRT)
47fd5c32 Poul Sander 2024-10-05 08:44 24
// Only C89 conversion specifiers when using MSVCRT instead of UCRT
47fd5c32 Poul Sander 2024-10-05 08:44 25
#  define FMT_HAS_C99_STRFTIME 0
47fd5c32 Poul Sander 2024-10-05 08:44 26
#else
47fd5c32 Poul Sander 2024-10-05 08:44 27
#  define FMT_HAS_C99_STRFTIME 1
47fd5c32 Poul Sander 2024-10-05 08:44 28
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 29
47fd5c32 Poul Sander 2024-10-05 08:44 30
#if defined(__cpp_lib_chrono) && __cpp_lib_chrono >= 201907L
47fd5c32 Poul Sander 2024-10-05 08:44 31
using days = std::chrono::days;
47fd5c32 Poul Sander 2024-10-05 08:44 32
#else
47fd5c32 Poul Sander 2024-10-05 08:44 33
using days = std::chrono::duration<std::chrono::hours::rep, std::ratio<86400>>;
47fd5c32 Poul Sander 2024-10-05 08:44 34
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 35
47fd5c32 Poul Sander 2024-10-05 08:44 36
auto make_tm() -> std::tm {
47fd5c32 Poul Sander 2024-10-05 08:44 37
  auto time = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 38
  time.tm_mday = 1;
47fd5c32 Poul Sander 2024-10-05 08:44 39
  return time;
47fd5c32 Poul Sander 2024-10-05 08:44 40
}
47fd5c32 Poul Sander 2024-10-05 08:44 41
47fd5c32 Poul Sander 2024-10-05 08:44 42
auto make_hour(int h) -> std::tm {
47fd5c32 Poul Sander 2024-10-05 08:44 43
  auto time = make_tm();
47fd5c32 Poul Sander 2024-10-05 08:44 44
  time.tm_hour = h;
47fd5c32 Poul Sander 2024-10-05 08:44 45
  return time;
47fd5c32 Poul Sander 2024-10-05 08:44 46
}
47fd5c32 Poul Sander 2024-10-05 08:44 47
47fd5c32 Poul Sander 2024-10-05 08:44 48
auto make_minute(int m) -> std::tm {
47fd5c32 Poul Sander 2024-10-05 08:44 49
  auto time = make_tm();
47fd5c32 Poul Sander 2024-10-05 08:44 50
  time.tm_min = m;
47fd5c32 Poul Sander 2024-10-05 08:44 51
  return time;
47fd5c32 Poul Sander 2024-10-05 08:44 52
}
47fd5c32 Poul Sander 2024-10-05 08:44 53
47fd5c32 Poul Sander 2024-10-05 08:44 54
auto make_second(int s) -> std::tm {
47fd5c32 Poul Sander 2024-10-05 08:44 55
  auto time = make_tm();
47fd5c32 Poul Sander 2024-10-05 08:44 56
  time.tm_sec = s;
47fd5c32 Poul Sander 2024-10-05 08:44 57
  return time;
47fd5c32 Poul Sander 2024-10-05 08:44 58
}
47fd5c32 Poul Sander 2024-10-05 08:44 59
47fd5c32 Poul Sander 2024-10-05 08:44 60
std::string system_strftime(const std::string& format, const std::tm* timeptr,
47fd5c32 Poul Sander 2024-10-05 08:44 61
                            std::locale* locptr = nullptr) {
47fd5c32 Poul Sander 2024-10-05 08:44 62
  auto loc = locptr ? *locptr : std::locale::classic();
47fd5c32 Poul Sander 2024-10-05 08:44 63
  auto& facet = std::use_facet<std::time_put<char>>(loc);
47fd5c32 Poul Sander 2024-10-05 08:44 64
  std::ostringstream os;
47fd5c32 Poul Sander 2024-10-05 08:44 65
  os.imbue(loc);
47fd5c32 Poul Sander 2024-10-05 08:44 66
  facet.put(os, os, ' ', timeptr, format.c_str(),
47fd5c32 Poul Sander 2024-10-05 08:44 67
            format.c_str() + format.size());
47fd5c32 Poul Sander 2024-10-05 08:44 68
#ifdef _WIN32
47fd5c32 Poul Sander 2024-10-05 08:44 69
  // Workaround a bug in older versions of Universal CRT.
47fd5c32 Poul Sander 2024-10-05 08:44 70
  auto str = os.str();
47fd5c32 Poul Sander 2024-10-05 08:44 71
  if (str == "-0000") str = "+0000";
47fd5c32 Poul Sander 2024-10-05 08:44 72
  return str;
47fd5c32 Poul Sander 2024-10-05 08:44 73
#else
47fd5c32 Poul Sander 2024-10-05 08:44 74
  return os.str();
47fd5c32 Poul Sander 2024-10-05 08:44 75
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 76
}
47fd5c32 Poul Sander 2024-10-05 08:44 77
47fd5c32 Poul Sander 2024-10-05 08:44 78
FMT_CONSTEXPR std::tm make_tm(int year, int mon, int mday, int hour, int min,
47fd5c32 Poul Sander 2024-10-05 08:44 79
                              int sec) {
47fd5c32 Poul Sander 2024-10-05 08:44 80
  auto tm = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 81
  tm.tm_sec = sec;
47fd5c32 Poul Sander 2024-10-05 08:44 82
  tm.tm_min = min;
47fd5c32 Poul Sander 2024-10-05 08:44 83
  tm.tm_hour = hour;
47fd5c32 Poul Sander 2024-10-05 08:44 84
  tm.tm_mday = mday;
47fd5c32 Poul Sander 2024-10-05 08:44 85
  tm.tm_mon = mon - 1;
47fd5c32 Poul Sander 2024-10-05 08:44 86
  tm.tm_year = year - 1900;
47fd5c32 Poul Sander 2024-10-05 08:44 87
  return tm;
47fd5c32 Poul Sander 2024-10-05 08:44 88
}
47fd5c32 Poul Sander 2024-10-05 08:44 89
47fd5c32 Poul Sander 2024-10-05 08:44 90
TEST(chrono_test, format_tm) {
47fd5c32 Poul Sander 2024-10-05 08:44 91
  auto tm = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 92
  tm.tm_year = 116;
47fd5c32 Poul Sander 2024-10-05 08:44 93
  tm.tm_mon = 3;
47fd5c32 Poul Sander 2024-10-05 08:44 94
  tm.tm_mday = 25;
47fd5c32 Poul Sander 2024-10-05 08:44 95
  tm.tm_hour = 11;
47fd5c32 Poul Sander 2024-10-05 08:44 96
  tm.tm_min = 22;
47fd5c32 Poul Sander 2024-10-05 08:44 97
  tm.tm_sec = 33;
47fd5c32 Poul Sander 2024-10-05 08:44 98
  EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm),
47fd5c32 Poul Sander 2024-10-05 08:44 99
            "The date is 2016-04-25 11:22:33.");
47fd5c32 Poul Sander 2024-10-05 08:44 100
  EXPECT_EQ(fmt::format("{:%Y}", tm), "2016");
47fd5c32 Poul Sander 2024-10-05 08:44 101
  EXPECT_EQ(fmt::format("{:%C}", tm), "20");
47fd5c32 Poul Sander 2024-10-05 08:44 102
  EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 103
  EXPECT_EQ(fmt::format("{:%e}", tm), "25");
47fd5c32 Poul Sander 2024-10-05 08:44 104
  EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/16");
47fd5c32 Poul Sander 2024-10-05 08:44 105
  EXPECT_EQ(fmt::format("{:%F}", tm), "2016-04-25");
47fd5c32 Poul Sander 2024-10-05 08:44 106
  EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33");
47fd5c32 Poul Sander 2024-10-05 08:44 107
47fd5c32 Poul Sander 2024-10-05 08:44 108
  // Short year
47fd5c32 Poul Sander 2024-10-05 08:44 109
  tm.tm_year = 999 - 1900;
47fd5c32 Poul Sander 2024-10-05 08:44 110
  tm.tm_mon = 0;   // for %G
47fd5c32 Poul Sander 2024-10-05 08:44 111
  tm.tm_mday = 2;  // for %G
47fd5c32 Poul Sander 2024-10-05 08:44 112
  tm.tm_wday = 3;  // for %G
47fd5c32 Poul Sander 2024-10-05 08:44 113
  tm.tm_yday = 1;  // for %G
47fd5c32 Poul Sander 2024-10-05 08:44 114
  EXPECT_EQ(fmt::format("{:%Y}", tm), "0999");
47fd5c32 Poul Sander 2024-10-05 08:44 115
  EXPECT_EQ(fmt::format("{:%C%y}", tm), "0999");
47fd5c32 Poul Sander 2024-10-05 08:44 116
  EXPECT_EQ(fmt::format("{:%G}", tm), "0999");
47fd5c32 Poul Sander 2024-10-05 08:44 117
47fd5c32 Poul Sander 2024-10-05 08:44 118
  tm.tm_year = 27 - 1900;
47fd5c32 Poul Sander 2024-10-05 08:44 119
  EXPECT_EQ(fmt::format("{:%Y}", tm), "0027");
47fd5c32 Poul Sander 2024-10-05 08:44 120
  EXPECT_EQ(fmt::format("{:%C%y}", tm), "0027");
47fd5c32 Poul Sander 2024-10-05 08:44 121
47fd5c32 Poul Sander 2024-10-05 08:44 122
  // Overflow year
47fd5c32 Poul Sander 2024-10-05 08:44 123
  tm.tm_year = 2147483647;
47fd5c32 Poul Sander 2024-10-05 08:44 124
  EXPECT_EQ(fmt::format("{:%Y}", tm), "2147485547");
47fd5c32 Poul Sander 2024-10-05 08:44 125
47fd5c32 Poul Sander 2024-10-05 08:44 126
  tm.tm_year = -2147483648;
47fd5c32 Poul Sander 2024-10-05 08:44 127
  EXPECT_EQ(fmt::format("{:%Y}", tm), "-2147481748");
47fd5c32 Poul Sander 2024-10-05 08:44 128
47fd5c32 Poul Sander 2024-10-05 08:44 129
  // for week on the year
47fd5c32 Poul Sander 2024-10-05 08:44 130
  // https://www.cl.cam.ac.uk/~mgk25/iso-time.html
47fd5c32 Poul Sander 2024-10-05 08:44 131
  std::vector<std::tm> tm_list = {
47fd5c32 Poul Sander 2024-10-05 08:44 132
      make_tm(1975, 12, 29, 12, 14, 16),  // W01
47fd5c32 Poul Sander 2024-10-05 08:44 133
      make_tm(1977, 1, 2, 12, 14, 16),    // W53
47fd5c32 Poul Sander 2024-10-05 08:44 134
      make_tm(1999, 12, 27, 12, 14, 16),  // W52
47fd5c32 Poul Sander 2024-10-05 08:44 135
      make_tm(1999, 12, 31, 12, 14, 16),  // W52
47fd5c32 Poul Sander 2024-10-05 08:44 136
      make_tm(2000, 1, 1, 12, 14, 16),    // W52
47fd5c32 Poul Sander 2024-10-05 08:44 137
      make_tm(2000, 1, 2, 12, 14, 16),    // W52
47fd5c32 Poul Sander 2024-10-05 08:44 138
      make_tm(2000, 1, 3, 12, 14, 16)     // W1
47fd5c32 Poul Sander 2024-10-05 08:44 139
  };
47fd5c32 Poul Sander 2024-10-05 08:44 140
47fd5c32 Poul Sander 2024-10-05 08:44 141
#if !FMT_HAS_C99_STRFTIME
47fd5c32 Poul Sander 2024-10-05 08:44 142
  GTEST_SKIP() << "Skip the rest of this test because it relies on strftime() "
47fd5c32 Poul Sander 2024-10-05 08:44 143
                  "conforming to C99, but on this platform, MINGW + MSVCRT, "
47fd5c32 Poul Sander 2024-10-05 08:44 144
                  "the function conforms only to C89.";
47fd5c32 Poul Sander 2024-10-05 08:44 145
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 146
47fd5c32 Poul Sander 2024-10-05 08:44 147
  const std::string iso_week_spec = "%Y-%m-%d: %G %g %V";
47fd5c32 Poul Sander 2024-10-05 08:44 148
  for (auto ctm : tm_list) {
47fd5c32 Poul Sander 2024-10-05 08:44 149
    // Calculate tm_yday, tm_wday, etc.
47fd5c32 Poul Sander 2024-10-05 08:44 150
    std::time_t t = std::mktime(&ctm);
47fd5c32 Poul Sander 2024-10-05 08:44 151
    tm = *std::localtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 152
47fd5c32 Poul Sander 2024-10-05 08:44 153
    auto fmt_spec = fmt::format("{{:{}}}", iso_week_spec);
47fd5c32 Poul Sander 2024-10-05 08:44 154
    EXPECT_EQ(system_strftime(iso_week_spec, &tm),
47fd5c32 Poul Sander 2024-10-05 08:44 155
              fmt::format(fmt::runtime(fmt_spec), tm));
47fd5c32 Poul Sander 2024-10-05 08:44 156
  }
47fd5c32 Poul Sander 2024-10-05 08:44 157
47fd5c32 Poul Sander 2024-10-05 08:44 158
  // Every day from 1970-01-01
47fd5c32 Poul Sander 2024-10-05 08:44 159
  std::time_t time_now = std::time(nullptr);
47fd5c32 Poul Sander 2024-10-05 08:44 160
  for (std::time_t t = 6 * 3600; t < time_now; t += 86400) {
47fd5c32 Poul Sander 2024-10-05 08:44 161
    tm = *std::localtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 162
47fd5c32 Poul Sander 2024-10-05 08:44 163
    auto fmt_spec = fmt::format("{{:{}}}", iso_week_spec);
47fd5c32 Poul Sander 2024-10-05 08:44 164
    EXPECT_EQ(system_strftime(iso_week_spec, &tm),
47fd5c32 Poul Sander 2024-10-05 08:44 165
              fmt::format(fmt::runtime(fmt_spec), tm));
47fd5c32 Poul Sander 2024-10-05 08:44 166
  }
47fd5c32 Poul Sander 2024-10-05 08:44 167
}
47fd5c32 Poul Sander 2024-10-05 08:44 168
47fd5c32 Poul Sander 2024-10-05 08:44 169
// MSVC:
47fd5c32 Poul Sander 2024-10-05 08:44 170
//  minkernel\crts\ucrt\src\appcrt\time\wcsftime.cpp(971) : Assertion failed:
47fd5c32 Poul Sander 2024-10-05 08:44 171
//  timeptr->tm_year >= -1900 && timeptr->tm_year <= 8099
47fd5c32 Poul Sander 2024-10-05 08:44 172
#ifndef _WIN32
47fd5c32 Poul Sander 2024-10-05 08:44 173
TEST(chrono_test, format_tm_future) {
47fd5c32 Poul Sander 2024-10-05 08:44 174
  auto tm = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 175
  tm.tm_year = 10445;  // 10000+ years
47fd5c32 Poul Sander 2024-10-05 08:44 176
  tm.tm_mon = 3;
47fd5c32 Poul Sander 2024-10-05 08:44 177
  tm.tm_mday = 25;
47fd5c32 Poul Sander 2024-10-05 08:44 178
  tm.tm_hour = 11;
47fd5c32 Poul Sander 2024-10-05 08:44 179
  tm.tm_min = 22;
47fd5c32 Poul Sander 2024-10-05 08:44 180
  tm.tm_sec = 33;
47fd5c32 Poul Sander 2024-10-05 08:44 181
  EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm),
47fd5c32 Poul Sander 2024-10-05 08:44 182
            "The date is 12345-04-25 11:22:33.");
47fd5c32 Poul Sander 2024-10-05 08:44 183
  EXPECT_EQ(fmt::format("{:%Y}", tm), "12345");
47fd5c32 Poul Sander 2024-10-05 08:44 184
  EXPECT_EQ(fmt::format("{:%C}", tm), "123");
47fd5c32 Poul Sander 2024-10-05 08:44 185
  EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 186
  EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/45");
47fd5c32 Poul Sander 2024-10-05 08:44 187
  EXPECT_EQ(fmt::format("{:%F}", tm), "12345-04-25");
47fd5c32 Poul Sander 2024-10-05 08:44 188
  EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33");
47fd5c32 Poul Sander 2024-10-05 08:44 189
}
47fd5c32 Poul Sander 2024-10-05 08:44 190
47fd5c32 Poul Sander 2024-10-05 08:44 191
TEST(chrono_test, format_tm_past) {
47fd5c32 Poul Sander 2024-10-05 08:44 192
  auto tm = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 193
  tm.tm_year = -2001;
47fd5c32 Poul Sander 2024-10-05 08:44 194
  tm.tm_mon = 3;
47fd5c32 Poul Sander 2024-10-05 08:44 195
  tm.tm_mday = 25;
47fd5c32 Poul Sander 2024-10-05 08:44 196
  tm.tm_hour = 11;
47fd5c32 Poul Sander 2024-10-05 08:44 197
  tm.tm_min = 22;
47fd5c32 Poul Sander 2024-10-05 08:44 198
  tm.tm_sec = 33;
47fd5c32 Poul Sander 2024-10-05 08:44 199
  EXPECT_EQ(fmt::format("The date is {:%Y-%m-%d %H:%M:%S}.", tm),
47fd5c32 Poul Sander 2024-10-05 08:44 200
            "The date is -101-04-25 11:22:33.");
47fd5c32 Poul Sander 2024-10-05 08:44 201
  EXPECT_EQ(fmt::format("{:%Y}", tm), "-101");
47fd5c32 Poul Sander 2024-10-05 08:44 202
47fd5c32 Poul Sander 2024-10-05 08:44 203
  // macOS  %C - "-1"
47fd5c32 Poul Sander 2024-10-05 08:44 204
  // Linux  %C - "-2"
47fd5c32 Poul Sander 2024-10-05 08:44 205
  // fmt    %C - "-1"
47fd5c32 Poul Sander 2024-10-05 08:44 206
  EXPECT_EQ(fmt::format("{:%C}", tm), "-1");
47fd5c32 Poul Sander 2024-10-05 08:44 207
  EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 208
47fd5c32 Poul Sander 2024-10-05 08:44 209
  // macOS  %D - "04/25/01" (%y)
47fd5c32 Poul Sander 2024-10-05 08:44 210
  // Linux  %D - "04/25/99" (%y)
47fd5c32 Poul Sander 2024-10-05 08:44 211
  // fmt    %D - "04/25/01" (%y)
47fd5c32 Poul Sander 2024-10-05 08:44 212
  EXPECT_EQ(fmt::format("{:%D}", tm), "04/25/01");
47fd5c32 Poul Sander 2024-10-05 08:44 213
47fd5c32 Poul Sander 2024-10-05 08:44 214
  EXPECT_EQ(fmt::format("{:%F}", tm), "-101-04-25");
47fd5c32 Poul Sander 2024-10-05 08:44 215
  EXPECT_EQ(fmt::format("{:%T}", tm), "11:22:33");
47fd5c32 Poul Sander 2024-10-05 08:44 216
47fd5c32 Poul Sander 2024-10-05 08:44 217
  tm.tm_year = -1901;  // -1
47fd5c32 Poul Sander 2024-10-05 08:44 218
  EXPECT_EQ(fmt::format("{:%Y}", tm), "-001");
47fd5c32 Poul Sander 2024-10-05 08:44 219
  EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 220
47fd5c32 Poul Sander 2024-10-05 08:44 221
  tm.tm_year = -1911;  // -11
47fd5c32 Poul Sander 2024-10-05 08:44 222
  EXPECT_EQ(fmt::format("{:%Y}", tm), "-011");
47fd5c32 Poul Sander 2024-10-05 08:44 223
  EXPECT_EQ(fmt::format("{:%C%y}", tm), fmt::format("{:%Y}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 224
}
47fd5c32 Poul Sander 2024-10-05 08:44 225
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 226
47fd5c32 Poul Sander 2024-10-05 08:44 227
TEST(chrono_test, grow_buffer) {
47fd5c32 Poul Sander 2024-10-05 08:44 228
  auto s = std::string("{:");
47fd5c32 Poul Sander 2024-10-05 08:44 229
  for (int i = 0; i < 30; ++i) s += "%c";
47fd5c32 Poul Sander 2024-10-05 08:44 230
  s += "}\n";
47fd5c32 Poul Sander 2024-10-05 08:44 231
  auto t = std::time(nullptr);
47fd5c32 Poul Sander 2024-10-05 08:44 232
  (void)fmt::format(fmt::runtime(s), *std::localtime(&t));
47fd5c32 Poul Sander 2024-10-05 08:44 233
}
47fd5c32 Poul Sander 2024-10-05 08:44 234
47fd5c32 Poul Sander 2024-10-05 08:44 235
TEST(chrono_test, format_to_empty_container) {
47fd5c32 Poul Sander 2024-10-05 08:44 236
  auto time = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 237
  time.tm_sec = 42;
47fd5c32 Poul Sander 2024-10-05 08:44 238
  auto s = std::string();
47fd5c32 Poul Sander 2024-10-05 08:44 239
  fmt::format_to(std::back_inserter(s), "{:%S}", time);
47fd5c32 Poul Sander 2024-10-05 08:44 240
  EXPECT_EQ(s, "42");
47fd5c32 Poul Sander 2024-10-05 08:44 241
}
47fd5c32 Poul Sander 2024-10-05 08:44 242
47fd5c32 Poul Sander 2024-10-05 08:44 243
TEST(chrono_test, empty_result) { EXPECT_EQ(fmt::format("{}", std::tm()), ""); }
47fd5c32 Poul Sander 2024-10-05 08:44 244
47fd5c32 Poul Sander 2024-10-05 08:44 245
auto equal(const std::tm& lhs, const std::tm& rhs) -> bool {
47fd5c32 Poul Sander 2024-10-05 08:44 246
  return lhs.tm_sec == rhs.tm_sec && lhs.tm_min == rhs.tm_min &&
47fd5c32 Poul Sander 2024-10-05 08:44 247
         lhs.tm_hour == rhs.tm_hour && lhs.tm_mday == rhs.tm_mday &&
47fd5c32 Poul Sander 2024-10-05 08:44 248
         lhs.tm_mon == rhs.tm_mon && lhs.tm_year == rhs.tm_year &&
47fd5c32 Poul Sander 2024-10-05 08:44 249
         lhs.tm_wday == rhs.tm_wday && lhs.tm_yday == rhs.tm_yday &&
47fd5c32 Poul Sander 2024-10-05 08:44 250
         lhs.tm_isdst == rhs.tm_isdst;
47fd5c32 Poul Sander 2024-10-05 08:44 251
}
47fd5c32 Poul Sander 2024-10-05 08:44 252
47fd5c32 Poul Sander 2024-10-05 08:44 253
TEST(chrono_test, gmtime) {
47fd5c32 Poul Sander 2024-10-05 08:44 254
  auto t = std::time(nullptr);
47fd5c32 Poul Sander 2024-10-05 08:44 255
  auto tm = *std::gmtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 256
  EXPECT_TRUE(equal(tm, fmt::gmtime(t)));
47fd5c32 Poul Sander 2024-10-05 08:44 257
}
47fd5c32 Poul Sander 2024-10-05 08:44 258
47fd5c32 Poul Sander 2024-10-05 08:44 259
template <typename TimePoint>
47fd5c32 Poul Sander 2024-10-05 08:44 260
auto strftime_full_utc(TimePoint tp) -> std::string {
47fd5c32 Poul Sander 2024-10-05 08:44 261
  auto t = std::chrono::system_clock::to_time_t(tp);
47fd5c32 Poul Sander 2024-10-05 08:44 262
  auto tm = *std::gmtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 263
  return system_strftime("%Y-%m-%d %H:%M:%S", &tm);
47fd5c32 Poul Sander 2024-10-05 08:44 264
}
47fd5c32 Poul Sander 2024-10-05 08:44 265
47fd5c32 Poul Sander 2024-10-05 08:44 266
TEST(chrono_test, system_clock_time_point) {
47fd5c32 Poul Sander 2024-10-05 08:44 267
  auto t1 = std::chrono::time_point_cast<std::chrono::seconds>(
47fd5c32 Poul Sander 2024-10-05 08:44 268
      std::chrono::system_clock::now());
47fd5c32 Poul Sander 2024-10-05 08:44 269
  EXPECT_EQ(strftime_full_utc(t1), fmt::format("{:%Y-%m-%d %H:%M:%S}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 270
  EXPECT_EQ(strftime_full_utc(t1), fmt::format("{}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 271
  EXPECT_EQ(strftime_full_utc(t1), fmt::format("{:}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 272
47fd5c32 Poul Sander 2024-10-05 08:44 273
  auto t2 = sys_time<std::chrono::seconds>(std::chrono::seconds(42));
47fd5c32 Poul Sander 2024-10-05 08:44 274
  EXPECT_EQ(strftime_full_utc(t2), fmt::format("{:%Y-%m-%d %H:%M:%S}", t2));
47fd5c32 Poul Sander 2024-10-05 08:44 275
47fd5c32 Poul Sander 2024-10-05 08:44 276
  std::vector<std::string> spec_list = {
47fd5c32 Poul Sander 2024-10-05 08:44 277
      "%%",  "%n",  "%t",  "%Y",  "%EY", "%y",  "%Oy", "%Ey", "%C",
47fd5c32 Poul Sander 2024-10-05 08:44 278
      "%EC", "%G",  "%g",  "%b",  "%h",  "%B",  "%m",  "%Om", "%U",
47fd5c32 Poul Sander 2024-10-05 08:44 279
      "%OU", "%W",  "%OW", "%V",  "%OV", "%j",  "%d",  "%Od", "%e",
47fd5c32 Poul Sander 2024-10-05 08:44 280
      "%Oe", "%a",  "%A",  "%w",  "%Ow", "%u",  "%Ou", "%H",  "%OH",
47fd5c32 Poul Sander 2024-10-05 08:44 281
      "%I",  "%OI", "%M",  "%OM", "%S",  "%OS", "%x",  "%Ex", "%X",
47fd5c32 Poul Sander 2024-10-05 08:44 282
      "%EX", "%D",  "%F",  "%R",  "%T",  "%p"};
47fd5c32 Poul Sander 2024-10-05 08:44 283
#ifndef _WIN32
47fd5c32 Poul Sander 2024-10-05 08:44 284
  // Disabled on Windows because these formats are not consistent among
47fd5c32 Poul Sander 2024-10-05 08:44 285
  // platforms.
47fd5c32 Poul Sander 2024-10-05 08:44 286
  spec_list.insert(spec_list.end(), {"%c", "%Ec", "%r"});
47fd5c32 Poul Sander 2024-10-05 08:44 287
#elif !FMT_HAS_C99_STRFTIME
47fd5c32 Poul Sander 2024-10-05 08:44 288
  // Only C89 conversion specifiers when using MSVCRT instead of UCRT
47fd5c32 Poul Sander 2024-10-05 08:44 289
  spec_list = {"%%", "%Y", "%y", "%b", "%B", "%m", "%U", "%W", "%j", "%d",
47fd5c32 Poul Sander 2024-10-05 08:44 290
               "%a", "%A", "%w", "%H", "%I", "%M", "%S", "%x", "%X", "%p"};
47fd5c32 Poul Sander 2024-10-05 08:44 291
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 292
  spec_list.push_back("%Y-%m-%d %H:%M:%S");
47fd5c32 Poul Sander 2024-10-05 08:44 293
47fd5c32 Poul Sander 2024-10-05 08:44 294
  for (const auto& spec : spec_list) {
47fd5c32 Poul Sander 2024-10-05 08:44 295
    auto t = std::chrono::system_clock::to_time_t(t1);
47fd5c32 Poul Sander 2024-10-05 08:44 296
    auto tm = *std::gmtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 297
47fd5c32 Poul Sander 2024-10-05 08:44 298
    auto sys_output = system_strftime(spec, &tm);
47fd5c32 Poul Sander 2024-10-05 08:44 299
47fd5c32 Poul Sander 2024-10-05 08:44 300
    auto fmt_spec = fmt::format("{{:{}}}", spec);
47fd5c32 Poul Sander 2024-10-05 08:44 301
    EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), t1));
47fd5c32 Poul Sander 2024-10-05 08:44 302
    EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), tm));
47fd5c32 Poul Sander 2024-10-05 08:44 303
  }
47fd5c32 Poul Sander 2024-10-05 08:44 304
47fd5c32 Poul Sander 2024-10-05 08:44 305
  // Timezone formatters tests makes sense for localtime.
47fd5c32 Poul Sander 2024-10-05 08:44 306
#if FMT_HAS_C99_STRFTIME
47fd5c32 Poul Sander 2024-10-05 08:44 307
  spec_list = {"%z", "%Z"};
47fd5c32 Poul Sander 2024-10-05 08:44 308
#else
47fd5c32 Poul Sander 2024-10-05 08:44 309
  spec_list = {"%Z"};
47fd5c32 Poul Sander 2024-10-05 08:44 310
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 311
  for (const auto& spec : spec_list) {
47fd5c32 Poul Sander 2024-10-05 08:44 312
    auto t = std::chrono::system_clock::to_time_t(t1);
47fd5c32 Poul Sander 2024-10-05 08:44 313
    auto tm = *std::localtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 314
47fd5c32 Poul Sander 2024-10-05 08:44 315
    auto sys_output = system_strftime(spec, &tm);
47fd5c32 Poul Sander 2024-10-05 08:44 316
47fd5c32 Poul Sander 2024-10-05 08:44 317
    auto fmt_spec = fmt::format("{{:{}}}", spec);
47fd5c32 Poul Sander 2024-10-05 08:44 318
    EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), tm));
47fd5c32 Poul Sander 2024-10-05 08:44 319
47fd5c32 Poul Sander 2024-10-05 08:44 320
    if (spec == "%z") {
47fd5c32 Poul Sander 2024-10-05 08:44 321
      sys_output.insert(sys_output.end() - 2, 1, ':');
47fd5c32 Poul Sander 2024-10-05 08:44 322
      EXPECT_EQ(sys_output, fmt::format("{:%Ez}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 323
      EXPECT_EQ(sys_output, fmt::format("{:%Oz}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 324
    }
47fd5c32 Poul Sander 2024-10-05 08:44 325
  }
47fd5c32 Poul Sander 2024-10-05 08:44 326
47fd5c32 Poul Sander 2024-10-05 08:44 327
  // Separate tests for UTC, since std::time_put can use local time and ignoring
47fd5c32 Poul Sander 2024-10-05 08:44 328
  // the timezone in std::tm (if it presents on platform).
47fd5c32 Poul Sander 2024-10-05 08:44 329
  if (fmt::detail::has_member_data_tm_zone<std::tm>::value) {
47fd5c32 Poul Sander 2024-10-05 08:44 330
    auto t = std::chrono::system_clock::to_time_t(t1);
47fd5c32 Poul Sander 2024-10-05 08:44 331
    auto tm = *std::gmtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 332
47fd5c32 Poul Sander 2024-10-05 08:44 333
    std::vector<std::string> tz_names = {"GMT", "UTC"};
47fd5c32 Poul Sander 2024-10-05 08:44 334
    EXPECT_THAT(tz_names, Contains(fmt::format("{:%Z}", t1)));
47fd5c32 Poul Sander 2024-10-05 08:44 335
    EXPECT_THAT(tz_names, Contains(fmt::format("{:%Z}", tm)));
47fd5c32 Poul Sander 2024-10-05 08:44 336
  }
47fd5c32 Poul Sander 2024-10-05 08:44 337
47fd5c32 Poul Sander 2024-10-05 08:44 338
  if (fmt::detail::has_member_data_tm_gmtoff<std::tm>::value) {
47fd5c32 Poul Sander 2024-10-05 08:44 339
    auto t = std::chrono::system_clock::to_time_t(t1);
47fd5c32 Poul Sander 2024-10-05 08:44 340
    auto tm = *std::gmtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 341
47fd5c32 Poul Sander 2024-10-05 08:44 342
    EXPECT_EQ(fmt::format("{:%z}", t1), "+0000");
47fd5c32 Poul Sander 2024-10-05 08:44 343
    EXPECT_EQ(fmt::format("{:%z}", tm), "+0000");
47fd5c32 Poul Sander 2024-10-05 08:44 344
47fd5c32 Poul Sander 2024-10-05 08:44 345
    EXPECT_EQ(fmt::format("{:%Ez}", t1), "+00:00");
47fd5c32 Poul Sander 2024-10-05 08:44 346
    EXPECT_EQ(fmt::format("{:%Ez}", tm), "+00:00");
47fd5c32 Poul Sander 2024-10-05 08:44 347
47fd5c32 Poul Sander 2024-10-05 08:44 348
    EXPECT_EQ(fmt::format("{:%Oz}", t1), "+00:00");
47fd5c32 Poul Sander 2024-10-05 08:44 349
    EXPECT_EQ(fmt::format("{:%Oz}", tm), "+00:00");
47fd5c32 Poul Sander 2024-10-05 08:44 350
  }
47fd5c32 Poul Sander 2024-10-05 08:44 351
}
47fd5c32 Poul Sander 2024-10-05 08:44 352
47fd5c32 Poul Sander 2024-10-05 08:44 353
#if FMT_USE_LOCAL_TIME
47fd5c32 Poul Sander 2024-10-05 08:44 354
47fd5c32 Poul Sander 2024-10-05 08:44 355
TEST(chrono_test, localtime) {
47fd5c32 Poul Sander 2024-10-05 08:44 356
  auto t = std::time(nullptr);
47fd5c32 Poul Sander 2024-10-05 08:44 357
  auto tm = *std::localtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 358
  EXPECT_TRUE(equal(tm, fmt::localtime(t)));
47fd5c32 Poul Sander 2024-10-05 08:44 359
}
47fd5c32 Poul Sander 2024-10-05 08:44 360
47fd5c32 Poul Sander 2024-10-05 08:44 361
template <typename Duration>
47fd5c32 Poul Sander 2024-10-05 08:44 362
auto strftime_full_local(std::chrono::local_time<Duration> tp) -> std::string {
47fd5c32 Poul Sander 2024-10-05 08:44 363
  auto t = std::chrono::system_clock::to_time_t(
47fd5c32 Poul Sander 2024-10-05 08:44 364
      std::chrono::current_zone()->to_sys(tp));
47fd5c32 Poul Sander 2024-10-05 08:44 365
  auto tm = *std::localtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 366
  return system_strftime("%Y-%m-%d %H:%M:%S", &tm);
47fd5c32 Poul Sander 2024-10-05 08:44 367
}
47fd5c32 Poul Sander 2024-10-05 08:44 368
47fd5c32 Poul Sander 2024-10-05 08:44 369
TEST(chrono_test, local_system_clock_time_point) {
47fd5c32 Poul Sander 2024-10-05 08:44 370
#  ifdef _WIN32
47fd5c32 Poul Sander 2024-10-05 08:44 371
  return;  // Not supported on Windows.
47fd5c32 Poul Sander 2024-10-05 08:44 372
#  endif
47fd5c32 Poul Sander 2024-10-05 08:44 373
  auto t1 = std::chrono::time_point_cast<std::chrono::seconds>(
47fd5c32 Poul Sander 2024-10-05 08:44 374
      std::chrono::current_zone()->to_local(std::chrono::system_clock::now()));
47fd5c32 Poul Sander 2024-10-05 08:44 375
  EXPECT_EQ(strftime_full_local(t1), fmt::format("{:%Y-%m-%d %H:%M:%S}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 376
  EXPECT_EQ(strftime_full_local(t1), fmt::format("{}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 377
  EXPECT_EQ(strftime_full_local(t1), fmt::format("{:}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 378
  using time_point = std::chrono::local_time<std::chrono::seconds>;
47fd5c32 Poul Sander 2024-10-05 08:44 379
  auto t2 = time_point(std::chrono::seconds(86400 + 42));
47fd5c32 Poul Sander 2024-10-05 08:44 380
  EXPECT_EQ(strftime_full_local(t2), fmt::format("{:%Y-%m-%d %H:%M:%S}", t2));
47fd5c32 Poul Sander 2024-10-05 08:44 381
47fd5c32 Poul Sander 2024-10-05 08:44 382
  std::vector<std::string> spec_list = {
47fd5c32 Poul Sander 2024-10-05 08:44 383
      "%%",  "%n",  "%t",  "%Y",  "%EY", "%y",  "%Oy", "%Ey", "%C",
47fd5c32 Poul Sander 2024-10-05 08:44 384
      "%EC", "%G",  "%g",  "%b",  "%h",  "%B",  "%m",  "%Om", "%U",
47fd5c32 Poul Sander 2024-10-05 08:44 385
      "%OU", "%W",  "%OW", "%V",  "%OV", "%j",  "%d",  "%Od", "%e",
47fd5c32 Poul Sander 2024-10-05 08:44 386
      "%Oe", "%a",  "%A",  "%w",  "%Ow", "%u",  "%Ou", "%H",  "%OH",
47fd5c32 Poul Sander 2024-10-05 08:44 387
      "%I",  "%OI", "%M",  "%OM", "%S",  "%OS", "%x",  "%Ex", "%X",
47fd5c32 Poul Sander 2024-10-05 08:44 388
      "%EX", "%D",  "%F",  "%R",  "%T",  "%p",  "%z",  "%Z"};
47fd5c32 Poul Sander 2024-10-05 08:44 389
#  ifndef _WIN32
47fd5c32 Poul Sander 2024-10-05 08:44 390
  // Disabled on Windows because these formats are not consistent among
47fd5c32 Poul Sander 2024-10-05 08:44 391
  // platforms.
47fd5c32 Poul Sander 2024-10-05 08:44 392
  spec_list.insert(spec_list.end(), {"%c", "%Ec", "%r"});
47fd5c32 Poul Sander 2024-10-05 08:44 393
#  elif !FMT_HAS_C99_STRFTIME
47fd5c32 Poul Sander 2024-10-05 08:44 394
  // Only C89 conversion specifiers when using MSVCRT instead of UCRT
47fd5c32 Poul Sander 2024-10-05 08:44 395
  spec_list = {"%%", "%Y", "%y", "%b", "%B", "%m", "%U", "%W", "%j", "%d", "%a",
47fd5c32 Poul Sander 2024-10-05 08:44 396
               "%A", "%w", "%H", "%I", "%M", "%S", "%x", "%X", "%p", "%Z"};
47fd5c32 Poul Sander 2024-10-05 08:44 397
#  endif
47fd5c32 Poul Sander 2024-10-05 08:44 398
  spec_list.push_back("%Y-%m-%d %H:%M:%S");
47fd5c32 Poul Sander 2024-10-05 08:44 399
47fd5c32 Poul Sander 2024-10-05 08:44 400
  for (const auto& spec : spec_list) {
47fd5c32 Poul Sander 2024-10-05 08:44 401
    auto t = std::chrono::system_clock::to_time_t(
47fd5c32 Poul Sander 2024-10-05 08:44 402
        std::chrono::current_zone()->to_sys(t1));
47fd5c32 Poul Sander 2024-10-05 08:44 403
    auto tm = *std::localtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 404
47fd5c32 Poul Sander 2024-10-05 08:44 405
    auto sys_output = system_strftime(spec, &tm);
47fd5c32 Poul Sander 2024-10-05 08:44 406
47fd5c32 Poul Sander 2024-10-05 08:44 407
    auto fmt_spec = fmt::format("{{:{}}}", spec);
47fd5c32 Poul Sander 2024-10-05 08:44 408
    EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), t1));
47fd5c32 Poul Sander 2024-10-05 08:44 409
    EXPECT_EQ(sys_output, fmt::format(fmt::runtime(fmt_spec), tm));
47fd5c32 Poul Sander 2024-10-05 08:44 410
  }
47fd5c32 Poul Sander 2024-10-05 08:44 411
47fd5c32 Poul Sander 2024-10-05 08:44 412
  if (std::find(spec_list.cbegin(), spec_list.cend(), "%z") !=
47fd5c32 Poul Sander 2024-10-05 08:44 413
      spec_list.cend()) {
47fd5c32 Poul Sander 2024-10-05 08:44 414
    auto t = std::chrono::system_clock::to_time_t(
47fd5c32 Poul Sander 2024-10-05 08:44 415
        std::chrono::current_zone()->to_sys(t1));
47fd5c32 Poul Sander 2024-10-05 08:44 416
    auto tm = *std::localtime(&t);
47fd5c32 Poul Sander 2024-10-05 08:44 417
47fd5c32 Poul Sander 2024-10-05 08:44 418
    auto sys_output = system_strftime("%z", &tm);
47fd5c32 Poul Sander 2024-10-05 08:44 419
    sys_output.insert(sys_output.end() - 2, 1, ':');
47fd5c32 Poul Sander 2024-10-05 08:44 420
47fd5c32 Poul Sander 2024-10-05 08:44 421
    EXPECT_EQ(sys_output, fmt::format("{:%Ez}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 422
    EXPECT_EQ(sys_output, fmt::format("{:%Ez}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 423
47fd5c32 Poul Sander 2024-10-05 08:44 424
    EXPECT_EQ(sys_output, fmt::format("{:%Oz}", t1));
47fd5c32 Poul Sander 2024-10-05 08:44 425
    EXPECT_EQ(sys_output, fmt::format("{:%Oz}", tm));
47fd5c32 Poul Sander 2024-10-05 08:44 426
  }
47fd5c32 Poul Sander 2024-10-05 08:44 427
}
47fd5c32 Poul Sander 2024-10-05 08:44 428
47fd5c32 Poul Sander 2024-10-05 08:44 429
#endif  // FMT_USE_LOCAL_TIME
47fd5c32 Poul Sander 2024-10-05 08:44 430
47fd5c32 Poul Sander 2024-10-05 08:44 431
#ifndef FMT_STATIC_THOUSANDS_SEPARATOR
47fd5c32 Poul Sander 2024-10-05 08:44 432
47fd5c32 Poul Sander 2024-10-05 08:44 433
TEST(chrono_test, format_default) {
47fd5c32 Poul Sander 2024-10-05 08:44 434
  EXPECT_EQ(fmt::format("{}", std::chrono::seconds(42)), "42s");
47fd5c32 Poul Sander 2024-10-05 08:44 435
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::atto>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 436
            "42as");
47fd5c32 Poul Sander 2024-10-05 08:44 437
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::femto>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 438
            "42fs");
47fd5c32 Poul Sander 2024-10-05 08:44 439
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::pico>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 440
            "42ps");
47fd5c32 Poul Sander 2024-10-05 08:44 441
  EXPECT_EQ(fmt::format("{}", std::chrono::nanoseconds(42)), "42ns");
47fd5c32 Poul Sander 2024-10-05 08:44 442
  EXPECT_EQ(fmt::format("{}", std::chrono::microseconds(42)), "42µs");
47fd5c32 Poul Sander 2024-10-05 08:44 443
  EXPECT_EQ(fmt::format("{}", std::chrono::milliseconds(42)), "42ms");
47fd5c32 Poul Sander 2024-10-05 08:44 444
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::centi>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 445
            "42cs");
47fd5c32 Poul Sander 2024-10-05 08:44 446
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::deci>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 447
            "42ds");
47fd5c32 Poul Sander 2024-10-05 08:44 448
  EXPECT_EQ(fmt::format("{}", std::chrono::seconds(42)), "42s");
47fd5c32 Poul Sander 2024-10-05 08:44 449
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::deca>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 450
            "42das");
47fd5c32 Poul Sander 2024-10-05 08:44 451
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::hecto>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 452
            "42hs");
47fd5c32 Poul Sander 2024-10-05 08:44 453
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::kilo>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 454
            "42ks");
47fd5c32 Poul Sander 2024-10-05 08:44 455
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::mega>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 456
            "42Ms");
47fd5c32 Poul Sander 2024-10-05 08:44 457
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::giga>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 458
            "42Gs");
47fd5c32 Poul Sander 2024-10-05 08:44 459
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::tera>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 460
            "42Ts");
47fd5c32 Poul Sander 2024-10-05 08:44 461
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::peta>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 462
            "42Ps");
47fd5c32 Poul Sander 2024-10-05 08:44 463
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<int, std::exa>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 464
            "42Es");
47fd5c32 Poul Sander 2024-10-05 08:44 465
  EXPECT_EQ(fmt::format("{}", std::chrono::minutes(42)), "42min");
47fd5c32 Poul Sander 2024-10-05 08:44 466
  EXPECT_EQ(fmt::format("{}", std::chrono::hours(42)), "42h");
47fd5c32 Poul Sander 2024-10-05 08:44 467
  EXPECT_EQ(fmt::format("{}", days(42)), "42d");
47fd5c32 Poul Sander 2024-10-05 08:44 468
  EXPECT_EQ(
47fd5c32 Poul Sander 2024-10-05 08:44 469
      fmt::format("{}", std::chrono::duration<int, std::ratio<15, 1>>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 470
      "42[15]s");
47fd5c32 Poul Sander 2024-10-05 08:44 471
  EXPECT_EQ(
47fd5c32 Poul Sander 2024-10-05 08:44 472
      fmt::format("{}", std::chrono::duration<int, std::ratio<15, 4>>(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 473
      "42[15/4]s");
47fd5c32 Poul Sander 2024-10-05 08:44 474
}
47fd5c32 Poul Sander 2024-10-05 08:44 475
47fd5c32 Poul Sander 2024-10-05 08:44 476
TEST(chrono_test, duration_align) {
47fd5c32 Poul Sander 2024-10-05 08:44 477
  auto s = std::chrono::seconds(42);
47fd5c32 Poul Sander 2024-10-05 08:44 478
  EXPECT_EQ(fmt::format("{:5}", s), "42s  ");
47fd5c32 Poul Sander 2024-10-05 08:44 479
  EXPECT_EQ(fmt::format("{:{}}", s, 5), "42s  ");
47fd5c32 Poul Sander 2024-10-05 08:44 480
  EXPECT_EQ(fmt::format("{:>5}", s), "  42s");
47fd5c32 Poul Sander 2024-10-05 08:44 481
  EXPECT_EQ(fmt::format("{:*^7}", s), "**42s**");
47fd5c32 Poul Sander 2024-10-05 08:44 482
  EXPECT_EQ(fmt::format("{:12%H:%M:%S}", std::chrono::seconds(12345)),
47fd5c32 Poul Sander 2024-10-05 08:44 483
            "03:25:45    ");
47fd5c32 Poul Sander 2024-10-05 08:44 484
  EXPECT_EQ(fmt::format("{:>12%H:%M:%S}", std::chrono::seconds(12345)),
47fd5c32 Poul Sander 2024-10-05 08:44 485
            "    03:25:45");
47fd5c32 Poul Sander 2024-10-05 08:44 486
  EXPECT_EQ(fmt::format("{:~^12%H:%M:%S}", std::chrono::seconds(12345)),
47fd5c32 Poul Sander 2024-10-05 08:44 487
            "~~03:25:45~~");
47fd5c32 Poul Sander 2024-10-05 08:44 488
  EXPECT_EQ(fmt::format("{:{}%H:%M:%S}", std::chrono::seconds(12345), 12),
47fd5c32 Poul Sander 2024-10-05 08:44 489
            "03:25:45    ");
47fd5c32 Poul Sander 2024-10-05 08:44 490
}
47fd5c32 Poul Sander 2024-10-05 08:44 491
47fd5c32 Poul Sander 2024-10-05 08:44 492
TEST(chrono_test, tm_align) {
47fd5c32 Poul Sander 2024-10-05 08:44 493
  auto t = make_tm(1975, 12, 29, 12, 14, 16);
47fd5c32 Poul Sander 2024-10-05 08:44 494
  EXPECT_EQ(fmt::format("{:%F %T}", t), "1975-12-29 12:14:16");
47fd5c32 Poul Sander 2024-10-05 08:44 495
  EXPECT_EQ(fmt::format("{:30%F %T}", t), "1975-12-29 12:14:16           ");
47fd5c32 Poul Sander 2024-10-05 08:44 496
  EXPECT_EQ(fmt::format("{:{}%F %T}", t, 30), "1975-12-29 12:14:16           ");
47fd5c32 Poul Sander 2024-10-05 08:44 497
  EXPECT_EQ(fmt::format("{:<30%F %T}", t), "1975-12-29 12:14:16           ");
47fd5c32 Poul Sander 2024-10-05 08:44 498
  EXPECT_EQ(fmt::format("{:^30%F %T}", t), "     1975-12-29 12:14:16      ");
47fd5c32 Poul Sander 2024-10-05 08:44 499
  EXPECT_EQ(fmt::format("{:>30%F %T}", t), "           1975-12-29 12:14:16");
47fd5c32 Poul Sander 2024-10-05 08:44 500
47fd5c32 Poul Sander 2024-10-05 08:44 501
  EXPECT_EQ(fmt::format("{:*<30%F %T}", t), "1975-12-29 12:14:16***********");
47fd5c32 Poul Sander 2024-10-05 08:44 502
  EXPECT_EQ(fmt::format("{:*^30%F %T}", t), "*****1975-12-29 12:14:16******");
47fd5c32 Poul Sander 2024-10-05 08:44 503
  EXPECT_EQ(fmt::format("{:*>30%F %T}", t), "***********1975-12-29 12:14:16");
47fd5c32 Poul Sander 2024-10-05 08:44 504
}
47fd5c32 Poul Sander 2024-10-05 08:44 505
47fd5c32 Poul Sander 2024-10-05 08:44 506
TEST(chrono_test, tp_align) {
47fd5c32 Poul Sander 2024-10-05 08:44 507
  auto tp = std::chrono::time_point_cast<std::chrono::microseconds>(
47fd5c32 Poul Sander 2024-10-05 08:44 508
      std::chrono::system_clock::from_time_t(0));
47fd5c32 Poul Sander 2024-10-05 08:44 509
  EXPECT_EQ(fmt::format("{:%M:%S}", tp), "00:00.000000");
47fd5c32 Poul Sander 2024-10-05 08:44 510
  EXPECT_EQ(fmt::format("{:15%M:%S}", tp), "00:00.000000   ");
47fd5c32 Poul Sander 2024-10-05 08:44 511
  EXPECT_EQ(fmt::format("{:{}%M:%S}", tp, 15), "00:00.000000   ");
47fd5c32 Poul Sander 2024-10-05 08:44 512
  EXPECT_EQ(fmt::format("{:<15%M:%S}", tp), "00:00.000000   ");
47fd5c32 Poul Sander 2024-10-05 08:44 513
  EXPECT_EQ(fmt::format("{:^15%M:%S}", tp), " 00:00.000000  ");
47fd5c32 Poul Sander 2024-10-05 08:44 514
  EXPECT_EQ(fmt::format("{:>15%M:%S}", tp), "   00:00.000000");
47fd5c32 Poul Sander 2024-10-05 08:44 515
47fd5c32 Poul Sander 2024-10-05 08:44 516
  EXPECT_EQ(fmt::format("{:*<15%M:%S}", tp), "00:00.000000***");
47fd5c32 Poul Sander 2024-10-05 08:44 517
  EXPECT_EQ(fmt::format("{:*^15%M:%S}", tp), "*00:00.000000**");
47fd5c32 Poul Sander 2024-10-05 08:44 518
  EXPECT_EQ(fmt::format("{:*>15%M:%S}", tp), "***00:00.000000");
47fd5c32 Poul Sander 2024-10-05 08:44 519
}
47fd5c32 Poul Sander 2024-10-05 08:44 520
47fd5c32 Poul Sander 2024-10-05 08:44 521
TEST(chrono_test, format_specs) {
47fd5c32 Poul Sander 2024-10-05 08:44 522
  EXPECT_EQ(fmt::format("{:%%}", std::chrono::seconds(0)), "%");
47fd5c32 Poul Sander 2024-10-05 08:44 523
  EXPECT_EQ(fmt::format("{:%n}", std::chrono::seconds(0)), "\n");
47fd5c32 Poul Sander 2024-10-05 08:44 524
  EXPECT_EQ(fmt::format("{:%t}", std::chrono::seconds(0)), "\t");
47fd5c32 Poul Sander 2024-10-05 08:44 525
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::seconds(0)), "00");
47fd5c32 Poul Sander 2024-10-05 08:44 526
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::seconds(60)), "00");
47fd5c32 Poul Sander 2024-10-05 08:44 527
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::seconds(42)), "42");
47fd5c32 Poul Sander 2024-10-05 08:44 528
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::milliseconds(1234)), "01.234");
47fd5c32 Poul Sander 2024-10-05 08:44 529
  EXPECT_EQ(fmt::format("{:%M}", std::chrono::minutes(0)), "00");
47fd5c32 Poul Sander 2024-10-05 08:44 530
  EXPECT_EQ(fmt::format("{:%M}", std::chrono::minutes(60)), "00");
47fd5c32 Poul Sander 2024-10-05 08:44 531
  EXPECT_EQ(fmt::format("{:%M}", std::chrono::minutes(42)), "42");
47fd5c32 Poul Sander 2024-10-05 08:44 532
  EXPECT_EQ(fmt::format("{:%M}", std::chrono::seconds(61)), "01");
47fd5c32 Poul Sander 2024-10-05 08:44 533
  EXPECT_EQ(fmt::format("{:%H}", std::chrono::hours(0)), "00");
47fd5c32 Poul Sander 2024-10-05 08:44 534
  EXPECT_EQ(fmt::format("{:%H}", std::chrono::hours(24)), "00");
47fd5c32 Poul Sander 2024-10-05 08:44 535
  EXPECT_EQ(fmt::format("{:%H}", std::chrono::hours(14)), "14");
47fd5c32 Poul Sander 2024-10-05 08:44 536
  EXPECT_EQ(fmt::format("{:%H}", std::chrono::minutes(61)), "01");
47fd5c32 Poul Sander 2024-10-05 08:44 537
  EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(0)), "12");
47fd5c32 Poul Sander 2024-10-05 08:44 538
  EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(12)), "12");
47fd5c32 Poul Sander 2024-10-05 08:44 539
  EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(24)), "12");
47fd5c32 Poul Sander 2024-10-05 08:44 540
  EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(4)), "04");
47fd5c32 Poul Sander 2024-10-05 08:44 541
  EXPECT_EQ(fmt::format("{:%I}", std::chrono::hours(14)), "02");
47fd5c32 Poul Sander 2024-10-05 08:44 542
  EXPECT_EQ(fmt::format("{:%j}", days(12345)), "12345");
47fd5c32 Poul Sander 2024-10-05 08:44 543
  EXPECT_EQ(fmt::format("{:%j}", std::chrono::hours(12345 * 24 + 12)), "12345");
47fd5c32 Poul Sander 2024-10-05 08:44 544
  EXPECT_EQ(fmt::format("{:%H:%M:%S}", std::chrono::seconds(12345)),
47fd5c32 Poul Sander 2024-10-05 08:44 545
            "03:25:45");
47fd5c32 Poul Sander 2024-10-05 08:44 546
  EXPECT_EQ(fmt::format("{:%R}", std::chrono::seconds(12345)), "03:25");
47fd5c32 Poul Sander 2024-10-05 08:44 547
  EXPECT_EQ(fmt::format("{:%T}", std::chrono::seconds(12345)), "03:25:45");
47fd5c32 Poul Sander 2024-10-05 08:44 548
  EXPECT_EQ(fmt::format("{:%Q}", std::chrono::seconds(12345)), "12345");
47fd5c32 Poul Sander 2024-10-05 08:44 549
  EXPECT_EQ(fmt::format("{:%q}", std::chrono::seconds(12345)), "s");
47fd5c32 Poul Sander 2024-10-05 08:44 550
}
47fd5c32 Poul Sander 2024-10-05 08:44 551
47fd5c32 Poul Sander 2024-10-05 08:44 552
TEST(chrono_test, invalid_specs) {
47fd5c32 Poul Sander 2024-10-05 08:44 553
  auto sec = std::chrono::seconds(0);
47fd5c32 Poul Sander 2024-10-05 08:44 554
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%a}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 555
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 556
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%A}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 557
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 558
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%c}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 559
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 560
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%x}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 561
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 562
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Ex}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 563
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 564
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%X}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 565
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 566
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%EX}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 567
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 568
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%D}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 569
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 570
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%F}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 571
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 572
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Ec}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 573
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 574
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%w}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 575
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 576
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%u}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 577
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 578
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%b}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 579
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 580
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%B}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 581
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 582
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%z}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 583
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 584
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Z}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 585
                   "no date");
47fd5c32 Poul Sander 2024-10-05 08:44 586
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Eq}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 587
                   "invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 588
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%Oq}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 589
                   "invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 590
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:abc}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 591
                   "invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 592
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:.2f}"), sec), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 593
                   "invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 594
}
47fd5c32 Poul Sander 2024-10-05 08:44 595
47fd5c32 Poul Sander 2024-10-05 08:44 596
auto format_tm(const std::tm& time, fmt::string_view spec,
47fd5c32 Poul Sander 2024-10-05 08:44 597
               const std::locale& loc) -> std::string {
47fd5c32 Poul Sander 2024-10-05 08:44 598
  auto& facet = std::use_facet<std::time_put<char>>(loc);
47fd5c32 Poul Sander 2024-10-05 08:44 599
  std::ostringstream os;
47fd5c32 Poul Sander 2024-10-05 08:44 600
  os.imbue(loc);
47fd5c32 Poul Sander 2024-10-05 08:44 601
  facet.put(os, os, ' ', &time, spec.begin(), spec.end());
47fd5c32 Poul Sander 2024-10-05 08:44 602
  return os.str();
47fd5c32 Poul Sander 2024-10-05 08:44 603
}
47fd5c32 Poul Sander 2024-10-05 08:44 604
47fd5c32 Poul Sander 2024-10-05 08:44 605
TEST(chrono_test, locale) {
47fd5c32 Poul Sander 2024-10-05 08:44 606
  auto loc = get_locale("ja_JP.utf8");
47fd5c32 Poul Sander 2024-10-05 08:44 607
  if (loc == std::locale::classic()) return;
47fd5c32 Poul Sander 2024-10-05 08:44 608
#  define EXPECT_TIME(spec, time, duration)                     \
47fd5c32 Poul Sander 2024-10-05 08:44 609
    {                                                           \
47fd5c32 Poul Sander 2024-10-05 08:44 610
      auto jp_loc = std::locale("ja_JP.utf8");                  \
47fd5c32 Poul Sander 2024-10-05 08:44 611
      EXPECT_EQ(format_tm(time, spec, jp_loc),                  \
47fd5c32 Poul Sander 2024-10-05 08:44 612
                fmt::format(jp_loc, "{:L" spec "}", duration)); \
47fd5c32 Poul Sander 2024-10-05 08:44 613
    }
47fd5c32 Poul Sander 2024-10-05 08:44 614
  EXPECT_TIME("%OH", make_hour(14), std::chrono::hours(14));
47fd5c32 Poul Sander 2024-10-05 08:44 615
  EXPECT_TIME("%OI", make_hour(14), std::chrono::hours(14));
47fd5c32 Poul Sander 2024-10-05 08:44 616
  EXPECT_TIME("%OM", make_minute(42), std::chrono::minutes(42));
47fd5c32 Poul Sander 2024-10-05 08:44 617
  EXPECT_TIME("%OS", make_second(42), std::chrono::seconds(42));
47fd5c32 Poul Sander 2024-10-05 08:44 618
  auto time = make_tm();
47fd5c32 Poul Sander 2024-10-05 08:44 619
  time.tm_hour = 3;
47fd5c32 Poul Sander 2024-10-05 08:44 620
  time.tm_min = 25;
47fd5c32 Poul Sander 2024-10-05 08:44 621
  time.tm_sec = 45;
47fd5c32 Poul Sander 2024-10-05 08:44 622
  auto sec = std::chrono::seconds(12345);
47fd5c32 Poul Sander 2024-10-05 08:44 623
  EXPECT_TIME("%r", time, sec);
47fd5c32 Poul Sander 2024-10-05 08:44 624
  EXPECT_TIME("%p", time, sec);
47fd5c32 Poul Sander 2024-10-05 08:44 625
}
47fd5c32 Poul Sander 2024-10-05 08:44 626
47fd5c32 Poul Sander 2024-10-05 08:44 627
using dms = std::chrono::duration<double, std::milli>;
47fd5c32 Poul Sander 2024-10-05 08:44 628
47fd5c32 Poul Sander 2024-10-05 08:44 629
TEST(chrono_test, format_default_fp) {
47fd5c32 Poul Sander 2024-10-05 08:44 630
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<float>(1.234)), "1.234s");
47fd5c32 Poul Sander 2024-10-05 08:44 631
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::milli>(1.234)),
47fd5c32 Poul Sander 2024-10-05 08:44 632
            "1.234ms");
47fd5c32 Poul Sander 2024-10-05 08:44 633
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<double>(1.234)), "1.234s");
47fd5c32 Poul Sander 2024-10-05 08:44 634
  EXPECT_EQ(fmt::format("{}", dms(1.234)), "1.234ms");
47fd5c32 Poul Sander 2024-10-05 08:44 635
}
47fd5c32 Poul Sander 2024-10-05 08:44 636
47fd5c32 Poul Sander 2024-10-05 08:44 637
TEST(chrono_test, format_precision) {
47fd5c32 Poul Sander 2024-10-05 08:44 638
  EXPECT_THROW_MSG(
47fd5c32 Poul Sander 2024-10-05 08:44 639
      (void)fmt::format(runtime("{:.2%Q}"), std::chrono::seconds(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 640
      fmt::format_error, "precision not allowed for this argument type");
47fd5c32 Poul Sander 2024-10-05 08:44 641
  EXPECT_EQ(fmt::format("{:.0}", dms(1.234)), "1ms");
47fd5c32 Poul Sander 2024-10-05 08:44 642
  EXPECT_EQ(fmt::format("{:.1}", dms(1.234)), "1.2ms");
47fd5c32 Poul Sander 2024-10-05 08:44 643
  EXPECT_EQ(fmt::format("{:.{}}", dms(1.234), 2), "1.23ms");
47fd5c32 Poul Sander 2024-10-05 08:44 644
47fd5c32 Poul Sander 2024-10-05 08:44 645
  EXPECT_EQ(fmt::format("{:.0}", dms(12.56)), "13ms");
47fd5c32 Poul Sander 2024-10-05 08:44 646
  EXPECT_EQ(fmt::format("{:.1}", dms(12.56)), "12.6ms");
47fd5c32 Poul Sander 2024-10-05 08:44 647
  EXPECT_EQ(fmt::format("{:.2}", dms(12.56)), "12.56ms");
47fd5c32 Poul Sander 2024-10-05 08:44 648
}
47fd5c32 Poul Sander 2024-10-05 08:44 649
47fd5c32 Poul Sander 2024-10-05 08:44 650
TEST(chrono_test, format_full_specs) {
47fd5c32 Poul Sander 2024-10-05 08:44 651
  EXPECT_EQ(fmt::format("{:6.0}", dms(1.234)), "1ms   ");
47fd5c32 Poul Sander 2024-10-05 08:44 652
  EXPECT_EQ(fmt::format("{:6.1}", dms(1.234)), "1.2ms ");
47fd5c32 Poul Sander 2024-10-05 08:44 653
  EXPECT_EQ(fmt::format("{:>8.{}}", dms(1.234), 2), "  1.23ms");
47fd5c32 Poul Sander 2024-10-05 08:44 654
  EXPECT_EQ(fmt::format("{:^{}.{}}", dms(1.234), 7, 1), " 1.2ms ");
47fd5c32 Poul Sander 2024-10-05 08:44 655
  EXPECT_EQ(fmt::format("{0:^{2}.{1}}", dms(1.234), 2, 8), " 1.23ms ");
47fd5c32 Poul Sander 2024-10-05 08:44 656
  EXPECT_EQ(fmt::format("{:=^{}.{}}", dms(1.234), 9, 3), "=1.234ms=");
47fd5c32 Poul Sander 2024-10-05 08:44 657
  EXPECT_EQ(fmt::format("{:*^10.4}", dms(1.234)), "*1.2340ms*");
47fd5c32 Poul Sander 2024-10-05 08:44 658
47fd5c32 Poul Sander 2024-10-05 08:44 659
  EXPECT_EQ(fmt::format("{:6.0}", dms(12.56)), "13ms  ");
47fd5c32 Poul Sander 2024-10-05 08:44 660
  EXPECT_EQ(fmt::format("{:>8.{}}", dms(12.56), 0), "    13ms");
47fd5c32 Poul Sander 2024-10-05 08:44 661
  EXPECT_EQ(fmt::format("{:^{}.{}}", dms(12.56), 6, 0), " 13ms ");
47fd5c32 Poul Sander 2024-10-05 08:44 662
  EXPECT_EQ(fmt::format("{0:^{2}.{1}}", dms(12.56), 0, 8), "  13ms  ");
47fd5c32 Poul Sander 2024-10-05 08:44 663
  EXPECT_EQ(fmt::format("{:=^{}.{}}", dms(12.56), 9, 0), "==13ms===");
47fd5c32 Poul Sander 2024-10-05 08:44 664
  EXPECT_EQ(fmt::format("{:*^10.0}", dms(12.56)), "***13ms***");
47fd5c32 Poul Sander 2024-10-05 08:44 665
}
47fd5c32 Poul Sander 2024-10-05 08:44 666
47fd5c32 Poul Sander 2024-10-05 08:44 667
TEST(chrono_test, format_simple_q) {
47fd5c32 Poul Sander 2024-10-05 08:44 668
  EXPECT_EQ(fmt::format("{:%Q %q}", std::chrono::duration<float>(1.234)),
47fd5c32 Poul Sander 2024-10-05 08:44 669
            "1.234 s");
47fd5c32 Poul Sander 2024-10-05 08:44 670
  EXPECT_EQ(
47fd5c32 Poul Sander 2024-10-05 08:44 671
      fmt::format("{:%Q %q}", std::chrono::duration<float, std::milli>(1.234)),
47fd5c32 Poul Sander 2024-10-05 08:44 672
      "1.234 ms");
47fd5c32 Poul Sander 2024-10-05 08:44 673
  EXPECT_EQ(fmt::format("{:%Q %q}", std::chrono::duration<double>(1.234)),
47fd5c32 Poul Sander 2024-10-05 08:44 674
            "1.234 s");
47fd5c32 Poul Sander 2024-10-05 08:44 675
  EXPECT_EQ(fmt::format("{:%Q %q}", dms(1.234)), "1.234 ms");
47fd5c32 Poul Sander 2024-10-05 08:44 676
}
47fd5c32 Poul Sander 2024-10-05 08:44 677
47fd5c32 Poul Sander 2024-10-05 08:44 678
TEST(chrono_test, format_precision_q) {
47fd5c32 Poul Sander 2024-10-05 08:44 679
  EXPECT_THROW_MSG(
47fd5c32 Poul Sander 2024-10-05 08:44 680
      (void)fmt::format(runtime("{:.2%Q %q}"), std::chrono::seconds(42)),
47fd5c32 Poul Sander 2024-10-05 08:44 681
      fmt::format_error, "precision not allowed for this argument type");
47fd5c32 Poul Sander 2024-10-05 08:44 682
  EXPECT_EQ(fmt::format("{:.1%Q %q}", dms(1.234)), "1.2 ms");
47fd5c32 Poul Sander 2024-10-05 08:44 683
  EXPECT_EQ(fmt::format("{:.{}%Q %q}", dms(1.234), 2), "1.23 ms");
47fd5c32 Poul Sander 2024-10-05 08:44 684
}
47fd5c32 Poul Sander 2024-10-05 08:44 685
47fd5c32 Poul Sander 2024-10-05 08:44 686
TEST(chrono_test, format_full_specs_q) {
47fd5c32 Poul Sander 2024-10-05 08:44 687
  EXPECT_EQ(fmt::format("{:7.0%Q %q}", dms(1.234)), "1 ms   ");
47fd5c32 Poul Sander 2024-10-05 08:44 688
  EXPECT_EQ(fmt::format("{:7.1%Q %q}", dms(1.234)), "1.2 ms ");
47fd5c32 Poul Sander 2024-10-05 08:44 689
  EXPECT_EQ(fmt::format("{:>8.{}%Q %q}", dms(1.234), 2), " 1.23 ms");
47fd5c32 Poul Sander 2024-10-05 08:44 690
  EXPECT_EQ(fmt::format("{:^{}.{}%Q %q}", dms(1.234), 8, 1), " 1.2 ms ");
47fd5c32 Poul Sander 2024-10-05 08:44 691
  EXPECT_EQ(fmt::format("{0:^{2}.{1}%Q %q}", dms(1.234), 2, 9), " 1.23 ms ");
47fd5c32 Poul Sander 2024-10-05 08:44 692
  EXPECT_EQ(fmt::format("{:=^{}.{}%Q %q}", dms(1.234), 10, 3), "=1.234 ms=");
47fd5c32 Poul Sander 2024-10-05 08:44 693
  EXPECT_EQ(fmt::format("{:*^11.4%Q %q}", dms(1.234)), "*1.2340 ms*");
47fd5c32 Poul Sander 2024-10-05 08:44 694
47fd5c32 Poul Sander 2024-10-05 08:44 695
  EXPECT_EQ(fmt::format("{:7.0%Q %q}", dms(12.56)), "13 ms  ");
47fd5c32 Poul Sander 2024-10-05 08:44 696
  EXPECT_EQ(fmt::format("{:>8.{}%Q %q}", dms(12.56), 0), "   13 ms");
47fd5c32 Poul Sander 2024-10-05 08:44 697
  EXPECT_EQ(fmt::format("{:^{}.{}%Q %q}", dms(12.56), 8, 0), " 13 ms  ");
47fd5c32 Poul Sander 2024-10-05 08:44 698
  EXPECT_EQ(fmt::format("{0:^{2}.{1}%Q %q}", dms(12.56), 0, 9), "  13 ms  ");
47fd5c32 Poul Sander 2024-10-05 08:44 699
  EXPECT_EQ(fmt::format("{:=^{}.{}%Q %q}", dms(12.56), 9, 0), "==13 ms==");
47fd5c32 Poul Sander 2024-10-05 08:44 700
  EXPECT_EQ(fmt::format("{:*^11.0%Q %q}", dms(12.56)), "***13 ms***");
47fd5c32 Poul Sander 2024-10-05 08:44 701
}
47fd5c32 Poul Sander 2024-10-05 08:44 702
47fd5c32 Poul Sander 2024-10-05 08:44 703
TEST(chrono_test, invalid_width_id) {
47fd5c32 Poul Sander 2024-10-05 08:44 704
  EXPECT_THROW((void)fmt::format(runtime("{:{o}"), std::chrono::seconds(0)),
47fd5c32 Poul Sander 2024-10-05 08:44 705
               fmt::format_error);
47fd5c32 Poul Sander 2024-10-05 08:44 706
}
47fd5c32 Poul Sander 2024-10-05 08:44 707
47fd5c32 Poul Sander 2024-10-05 08:44 708
TEST(chrono_test, invalid_colons) {
47fd5c32 Poul Sander 2024-10-05 08:44 709
  EXPECT_THROW((void)fmt::format(runtime("{0}=:{0::"), std::chrono::seconds(0)),
47fd5c32 Poul Sander 2024-10-05 08:44 710
               fmt::format_error);
47fd5c32 Poul Sander 2024-10-05 08:44 711
}
47fd5c32 Poul Sander 2024-10-05 08:44 712
47fd5c32 Poul Sander 2024-10-05 08:44 713
TEST(chrono_test, negative_durations) {
47fd5c32 Poul Sander 2024-10-05 08:44 714
  EXPECT_EQ(fmt::format("{:%Q}", std::chrono::seconds(-12345)), "-12345");
47fd5c32 Poul Sander 2024-10-05 08:44 715
  EXPECT_EQ(fmt::format("{:%H:%M:%S}", std::chrono::seconds(-12345)),
47fd5c32 Poul Sander 2024-10-05 08:44 716
            "-03:25:45");
47fd5c32 Poul Sander 2024-10-05 08:44 717
  EXPECT_EQ(fmt::format("{:%M:%S}", std::chrono::duration<double>(-1)),
47fd5c32 Poul Sander 2024-10-05 08:44 718
            "-00:01");
47fd5c32 Poul Sander 2024-10-05 08:44 719
  EXPECT_EQ(fmt::format("{:%q}", std::chrono::seconds(-12345)), "s");
47fd5c32 Poul Sander 2024-10-05 08:44 720
  EXPECT_EQ(fmt::format("{:%S}",
47fd5c32 Poul Sander 2024-10-05 08:44 721
                        std::chrono::duration<signed char, std::milli>(-127)),
47fd5c32 Poul Sander 2024-10-05 08:44 722
            "-00.127");
47fd5c32 Poul Sander 2024-10-05 08:44 723
  auto min = std::numeric_limits<int>::min();
47fd5c32 Poul Sander 2024-10-05 08:44 724
  EXPECT_EQ(fmt::format("{}", min),
47fd5c32 Poul Sander 2024-10-05 08:44 725
            fmt::format("{:%Q}", std::chrono::duration<int>(min)));
47fd5c32 Poul Sander 2024-10-05 08:44 726
}
47fd5c32 Poul Sander 2024-10-05 08:44 727
47fd5c32 Poul Sander 2024-10-05 08:44 728
TEST(chrono_test, special_durations) {
47fd5c32 Poul Sander 2024-10-05 08:44 729
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::duration<double>(1e20)), "40");
47fd5c32 Poul Sander 2024-10-05 08:44 730
  auto nan = std::numeric_limits<double>::quiet_NaN();
47fd5c32 Poul Sander 2024-10-05 08:44 731
  EXPECT_EQ(
47fd5c32 Poul Sander 2024-10-05 08:44 732
      fmt::format("{:%I %H %M %S %R %r}", std::chrono::duration<double>(nan)),
47fd5c32 Poul Sander 2024-10-05 08:44 733
      "nan nan nan nan nan:nan nan");
47fd5c32 Poul Sander 2024-10-05 08:44 734
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::exa>(1)),
47fd5c32 Poul Sander 2024-10-05 08:44 735
            "1Es");
47fd5c32 Poul Sander 2024-10-05 08:44 736
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<float, std::atto>(1)),
47fd5c32 Poul Sander 2024-10-05 08:44 737
            "1as");
47fd5c32 Poul Sander 2024-10-05 08:44 738
  EXPECT_EQ(fmt::format("{:%R}", std::chrono::duration<char, std::mega>{2}),
47fd5c32 Poul Sander 2024-10-05 08:44 739
            "03:33");
47fd5c32 Poul Sander 2024-10-05 08:44 740
  EXPECT_EQ(fmt::format("{:%T}", std::chrono::duration<char, std::mega>{2}),
47fd5c32 Poul Sander 2024-10-05 08:44 741
            "03:33:20");
47fd5c32 Poul Sander 2024-10-05 08:44 742
  EXPECT_EQ(
47fd5c32 Poul Sander 2024-10-05 08:44 743
      fmt::format("{:.3%S}", std::chrono::duration<float, std::pico>(1.234e12)),
47fd5c32 Poul Sander 2024-10-05 08:44 744
      "01.234");
47fd5c32 Poul Sander 2024-10-05 08:44 745
}
47fd5c32 Poul Sander 2024-10-05 08:44 746
47fd5c32 Poul Sander 2024-10-05 08:44 747
TEST(chrono_test, unsigned_duration) {
47fd5c32 Poul Sander 2024-10-05 08:44 748
  EXPECT_EQ(fmt::format("{}", std::chrono::duration<unsigned>(42)), "42s");
47fd5c32 Poul Sander 2024-10-05 08:44 749
}
47fd5c32 Poul Sander 2024-10-05 08:44 750
47fd5c32 Poul Sander 2024-10-05 08:44 751
TEST(chrono_test, weekday) {
47fd5c32 Poul Sander 2024-10-05 08:44 752
  auto loc = get_locale("es_ES.UTF-8");
47fd5c32 Poul Sander 2024-10-05 08:44 753
  std::locale::global(loc);
47fd5c32 Poul Sander 2024-10-05 08:44 754
47fd5c32 Poul Sander 2024-10-05 08:44 755
  auto sat = fmt::weekday(6);
47fd5c32 Poul Sander 2024-10-05 08:44 756
  
47fd5c32 Poul Sander 2024-10-05 08:44 757
  auto tm = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 758
  tm.tm_wday = static_cast<int>(sat.c_encoding());
47fd5c32 Poul Sander 2024-10-05 08:44 759
47fd5c32 Poul Sander 2024-10-05 08:44 760
  EXPECT_EQ(fmt::format("{}", sat), "Sat");
47fd5c32 Poul Sander 2024-10-05 08:44 761
  EXPECT_EQ(fmt::format("{:%a}", sat), "Sat");
47fd5c32 Poul Sander 2024-10-05 08:44 762
  EXPECT_EQ(fmt::format("{:%A}", sat), "Saturday");
47fd5c32 Poul Sander 2024-10-05 08:44 763
  EXPECT_EQ(fmt::format("{:%a}", tm), "Sat");
47fd5c32 Poul Sander 2024-10-05 08:44 764
47fd5c32 Poul Sander 2024-10-05 08:44 765
  if (loc != std::locale::classic()) {
47fd5c32 Poul Sander 2024-10-05 08:44 766
    auto saturdays = std::vector<std::string>{"sáb", "sá."};
47fd5c32 Poul Sander 2024-10-05 08:44 767
    EXPECT_THAT(saturdays, Contains(fmt::format(loc, "{:L}", sat)));
47fd5c32 Poul Sander 2024-10-05 08:44 768
    EXPECT_THAT(saturdays, Contains(fmt::format(loc, "{:%a}", sat)));
47fd5c32 Poul Sander 2024-10-05 08:44 769
    EXPECT_THAT(saturdays, Contains(fmt::format(loc, "{:%a}", tm)));
47fd5c32 Poul Sander 2024-10-05 08:44 770
  }
47fd5c32 Poul Sander 2024-10-05 08:44 771
}
47fd5c32 Poul Sander 2024-10-05 08:44 772
47fd5c32 Poul Sander 2024-10-05 08:44 773
TEST(chrono_test, cpp20_duration_subsecond_support) {
47fd5c32 Poul Sander 2024-10-05 08:44 774
  using attoseconds = std::chrono::duration<long long, std::atto>;
47fd5c32 Poul Sander 2024-10-05 08:44 775
  // Check that 18 digits of subsecond precision are supported.
47fd5c32 Poul Sander 2024-10-05 08:44 776
  EXPECT_EQ(fmt::format("{:%S}", attoseconds{999999999999999999}),
47fd5c32 Poul Sander 2024-10-05 08:44 777
            "00.999999999999999999");
47fd5c32 Poul Sander 2024-10-05 08:44 778
  EXPECT_EQ(fmt::format("{:%S}", attoseconds{673231113420148734}),
47fd5c32 Poul Sander 2024-10-05 08:44 779
            "00.673231113420148734");
47fd5c32 Poul Sander 2024-10-05 08:44 780
  EXPECT_EQ(fmt::format("{:%S}", attoseconds{-673231113420148734}),
47fd5c32 Poul Sander 2024-10-05 08:44 781
            "-00.673231113420148734");
47fd5c32 Poul Sander 2024-10-05 08:44 782
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::nanoseconds{13420148734}),
47fd5c32 Poul Sander 2024-10-05 08:44 783
            "13.420148734");
47fd5c32 Poul Sander 2024-10-05 08:44 784
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::nanoseconds{-13420148734}),
47fd5c32 Poul Sander 2024-10-05 08:44 785
            "-13.420148734");
47fd5c32 Poul Sander 2024-10-05 08:44 786
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::milliseconds{1234}), "01.234");
47fd5c32 Poul Sander 2024-10-05 08:44 787
  // Check subsecond presision modifier.
47fd5c32 Poul Sander 2024-10-05 08:44 788
  EXPECT_EQ(fmt::format("{:.6%S}", std::chrono::nanoseconds{1234}),
47fd5c32 Poul Sander 2024-10-05 08:44 789
            "00.000001");
47fd5c32 Poul Sander 2024-10-05 08:44 790
  EXPECT_EQ(fmt::format("{:.18%S}", std::chrono::nanoseconds{1234}),
47fd5c32 Poul Sander 2024-10-05 08:44 791
            "00.000001234000000000");
47fd5c32 Poul Sander 2024-10-05 08:44 792
  EXPECT_EQ(fmt::format("{:.{}%S}", std::chrono::nanoseconds{1234}, 6),
47fd5c32 Poul Sander 2024-10-05 08:44 793
            "00.000001");
47fd5c32 Poul Sander 2024-10-05 08:44 794
  EXPECT_EQ(fmt::format("{:.6%S}", std::chrono::milliseconds{1234}),
47fd5c32 Poul Sander 2024-10-05 08:44 795
            "01.234000");
47fd5c32 Poul Sander 2024-10-05 08:44 796
  EXPECT_EQ(fmt::format("{:.6%S}", std::chrono::milliseconds{-1234}),
47fd5c32 Poul Sander 2024-10-05 08:44 797
            "-01.234000");
47fd5c32 Poul Sander 2024-10-05 08:44 798
  EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12345}),
47fd5c32 Poul Sander 2024-10-05 08:44 799
            "12.34");
47fd5c32 Poul Sander 2024-10-05 08:44 800
  EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{12375}),
47fd5c32 Poul Sander 2024-10-05 08:44 801
            "12.37");
47fd5c32 Poul Sander 2024-10-05 08:44 802
  EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{-12375}),
47fd5c32 Poul Sander 2024-10-05 08:44 803
            "-12.37");
47fd5c32 Poul Sander 2024-10-05 08:44 804
  EXPECT_EQ(fmt::format("{:.0%S}", std::chrono::milliseconds{12054}),
47fd5c32 Poul Sander 2024-10-05 08:44 805
            "12");
47fd5c32 Poul Sander 2024-10-05 08:44 806
  EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{99999}),
47fd5c32 Poul Sander 2024-10-05 08:44 807
            "39.99");
47fd5c32 Poul Sander 2024-10-05 08:44 808
  EXPECT_EQ(fmt::format("{:.2%S}", std::chrono::milliseconds{1000}),
47fd5c32 Poul Sander 2024-10-05 08:44 809
            "01.00");
47fd5c32 Poul Sander 2024-10-05 08:44 810
  EXPECT_EQ(fmt::format("{:.3%S}", std::chrono::milliseconds{1}),
47fd5c32 Poul Sander 2024-10-05 08:44 811
            "00.001");
47fd5c32 Poul Sander 2024-10-05 08:44 812
  EXPECT_EQ(fmt::format("{:.3%S}", std::chrono::seconds{1234}), "34.000");
47fd5c32 Poul Sander 2024-10-05 08:44 813
  EXPECT_EQ(fmt::format("{:.3%S}", std::chrono::hours{1234}), "00.000");
47fd5c32 Poul Sander 2024-10-05 08:44 814
  EXPECT_EQ(fmt::format("{:.5%S}", dms(1.234)), "00.00123");
47fd5c32 Poul Sander 2024-10-05 08:44 815
  EXPECT_EQ(fmt::format("{:.8%S}", dms(1.234)), "00.00123400");
47fd5c32 Poul Sander 2024-10-05 08:44 816
  {
47fd5c32 Poul Sander 2024-10-05 08:44 817
    // Check that {:%H:%M:%S} is equivalent to {:%T}.
47fd5c32 Poul Sander 2024-10-05 08:44 818
    auto dur = std::chrono::milliseconds{3601234};
47fd5c32 Poul Sander 2024-10-05 08:44 819
    auto formatted_dur = fmt::format("{:%T}", dur);
47fd5c32 Poul Sander 2024-10-05 08:44 820
    EXPECT_EQ(formatted_dur, "01:00:01.234");
47fd5c32 Poul Sander 2024-10-05 08:44 821
    EXPECT_EQ(fmt::format("{:%H:%M:%S}", dur), formatted_dur);
47fd5c32 Poul Sander 2024-10-05 08:44 822
    EXPECT_EQ(fmt::format("{:.6%H:%M:%S}", dur), "01:00:01.234000");
47fd5c32 Poul Sander 2024-10-05 08:44 823
  }
47fd5c32 Poul Sander 2024-10-05 08:44 824
  using nanoseconds_dbl = std::chrono::duration<double, std::nano>;
47fd5c32 Poul Sander 2024-10-05 08:44 825
  EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{-123456789}), "-00.123456789");
47fd5c32 Poul Sander 2024-10-05 08:44 826
  EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{9123456789}), "09.123456789");
47fd5c32 Poul Sander 2024-10-05 08:44 827
  // Verify that only the seconds part is extracted and printed.
47fd5c32 Poul Sander 2024-10-05 08:44 828
  EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{99123456789}), "39.123456789");
47fd5c32 Poul Sander 2024-10-05 08:44 829
  EXPECT_EQ(fmt::format("{:%S}", nanoseconds_dbl{99123000000}), "39.123000000");
47fd5c32 Poul Sander 2024-10-05 08:44 830
  {
47fd5c32 Poul Sander 2024-10-05 08:44 831
    // Now the hour is printed, and we also test if negative doubles work.
47fd5c32 Poul Sander 2024-10-05 08:44 832
    auto dur = nanoseconds_dbl{-99123456789};
47fd5c32 Poul Sander 2024-10-05 08:44 833
    auto formatted_dur = fmt::format("{:%T}", dur);
47fd5c32 Poul Sander 2024-10-05 08:44 834
    EXPECT_EQ(formatted_dur, "-00:01:39.123456789");
47fd5c32 Poul Sander 2024-10-05 08:44 835
    EXPECT_EQ(fmt::format("{:%H:%M:%S}", dur), formatted_dur);
47fd5c32 Poul Sander 2024-10-05 08:44 836
    EXPECT_EQ(fmt::format("{:.3%H:%M:%S}", dur), "-00:01:39.123");
47fd5c32 Poul Sander 2024-10-05 08:44 837
  }
47fd5c32 Poul Sander 2024-10-05 08:44 838
  // Check that durations with precision greater than std::chrono::seconds have
47fd5c32 Poul Sander 2024-10-05 08:44 839
  // fixed precision, and print zeros even if there is no fractional part.
47fd5c32 Poul Sander 2024-10-05 08:44 840
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::microseconds{7000000}),
47fd5c32 Poul Sander 2024-10-05 08:44 841
            "07.000000");
47fd5c32 Poul Sander 2024-10-05 08:44 842
  EXPECT_EQ(fmt::format("{:%S}",
47fd5c32 Poul Sander 2024-10-05 08:44 843
                        std::chrono::duration<long long, std::ratio<1, 3>>(1)),
47fd5c32 Poul Sander 2024-10-05 08:44 844
            "00.333333");
47fd5c32 Poul Sander 2024-10-05 08:44 845
  EXPECT_EQ(fmt::format("{:%S}",
47fd5c32 Poul Sander 2024-10-05 08:44 846
                        std::chrono::duration<long long, std::ratio<1, 7>>(1)),
47fd5c32 Poul Sander 2024-10-05 08:44 847
            "00.142857");
47fd5c32 Poul Sander 2024-10-05 08:44 848
47fd5c32 Poul Sander 2024-10-05 08:44 849
  EXPECT_EQ(
47fd5c32 Poul Sander 2024-10-05 08:44 850
      fmt::format("{:%S}",
47fd5c32 Poul Sander 2024-10-05 08:44 851
                  std::chrono::duration<signed char, std::ratio<1, 100>>(0x80)),
47fd5c32 Poul Sander 2024-10-05 08:44 852
      "-01.28");
47fd5c32 Poul Sander 2024-10-05 08:44 853
47fd5c32 Poul Sander 2024-10-05 08:44 854
  EXPECT_EQ(
47fd5c32 Poul Sander 2024-10-05 08:44 855
      fmt::format("{:%M:%S}",
47fd5c32 Poul Sander 2024-10-05 08:44 856
                  std::chrono::duration<short, std::ratio<1, 100>>(0x8000)),
47fd5c32 Poul Sander 2024-10-05 08:44 857
      "-05:27.68");
47fd5c32 Poul Sander 2024-10-05 08:44 858
47fd5c32 Poul Sander 2024-10-05 08:44 859
  // Check that floating point seconds with ratio<1,1> are printed.
47fd5c32 Poul Sander 2024-10-05 08:44 860
  EXPECT_EQ(fmt::format("{:%S}", std::chrono::duration<double>{1.5}),
47fd5c32 Poul Sander 2024-10-05 08:44 861
            "01.500000");
47fd5c32 Poul Sander 2024-10-05 08:44 862
  EXPECT_EQ(fmt::format("{:%M:%S}", std::chrono::duration<double>{-61.25}),
47fd5c32 Poul Sander 2024-10-05 08:44 863
            "-01:01.250000");
47fd5c32 Poul Sander 2024-10-05 08:44 864
}
47fd5c32 Poul Sander 2024-10-05 08:44 865
47fd5c32 Poul Sander 2024-10-05 08:44 866
#endif  // FMT_STATIC_THOUSANDS_SEPARATOR
47fd5c32 Poul Sander 2024-10-05 08:44 867
47fd5c32 Poul Sander 2024-10-05 08:44 868
// Disable the utc_clock test for windows, as the icu.dll used for tzdb
47fd5c32 Poul Sander 2024-10-05 08:44 869
// (time zone database) is not shipped with many windows versions.
47fd5c32 Poul Sander 2024-10-05 08:44 870
#if FMT_USE_UTC_TIME && !defined(_WIN32)
47fd5c32 Poul Sander 2024-10-05 08:44 871
TEST(chrono_test, utc_clock) {
47fd5c32 Poul Sander 2024-10-05 08:44 872
  auto t1 = std::chrono::system_clock::now();
47fd5c32 Poul Sander 2024-10-05 08:44 873
  auto t1_utc = std::chrono::utc_clock::from_sys(t1);
47fd5c32 Poul Sander 2024-10-05 08:44 874
  EXPECT_EQ(fmt::format("{:%Y-%m-%d %H:%M:%S}", t1),
47fd5c32 Poul Sander 2024-10-05 08:44 875
            fmt::format("{:%Y-%m-%d %H:%M:%S}", t1_utc));
47fd5c32 Poul Sander 2024-10-05 08:44 876
}
47fd5c32 Poul Sander 2024-10-05 08:44 877
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 878
47fd5c32 Poul Sander 2024-10-05 08:44 879
TEST(chrono_test, timestamp_ratios) {
47fd5c32 Poul Sander 2024-10-05 08:44 880
  auto t1 =
47fd5c32 Poul Sander 2024-10-05 08:44 881
      sys_time<std::chrono::milliseconds>(std::chrono::milliseconds(67890));
47fd5c32 Poul Sander 2024-10-05 08:44 882
  EXPECT_EQ(fmt::format("{:%M:%S}", t1), "01:07.890");
47fd5c32 Poul Sander 2024-10-05 08:44 883
47fd5c32 Poul Sander 2024-10-05 08:44 884
  auto t2 = sys_time<std::chrono::minutes>(std::chrono::minutes(7));
47fd5c32 Poul Sander 2024-10-05 08:44 885
  EXPECT_EQ(fmt::format("{:%M:%S}", t2), "07:00");
47fd5c32 Poul Sander 2024-10-05 08:44 886
47fd5c32 Poul Sander 2024-10-05 08:44 887
  auto t3 = sys_time<std::chrono::duration<int, std::ratio<9>>>(
47fd5c32 Poul Sander 2024-10-05 08:44 888
      std::chrono::duration<int, std::ratio<9>>(7));
47fd5c32 Poul Sander 2024-10-05 08:44 889
  EXPECT_EQ(fmt::format("{:%M:%S}", t3), "01:03");
47fd5c32 Poul Sander 2024-10-05 08:44 890
47fd5c32 Poul Sander 2024-10-05 08:44 891
  auto t4 = sys_time<std::chrono::duration<int, std::ratio<63>>>(
47fd5c32 Poul Sander 2024-10-05 08:44 892
      std::chrono::duration<int, std::ratio<63>>(1));
47fd5c32 Poul Sander 2024-10-05 08:44 893
  EXPECT_EQ(fmt::format("{:%M:%S}", t4), "01:03");
47fd5c32 Poul Sander 2024-10-05 08:44 894
47fd5c32 Poul Sander 2024-10-05 08:44 895
  if (sizeof(time_t) > 4) {
47fd5c32 Poul Sander 2024-10-05 08:44 896
    auto tp =
47fd5c32 Poul Sander 2024-10-05 08:44 897
        sys_time<std::chrono::milliseconds>(std::chrono::seconds(32503680000));
47fd5c32 Poul Sander 2024-10-05 08:44 898
    EXPECT_EQ(fmt::format("{:%Y-%m-%d}", tp), "3000-01-01");
47fd5c32 Poul Sander 2024-10-05 08:44 899
  }
47fd5c32 Poul Sander 2024-10-05 08:44 900
47fd5c32 Poul Sander 2024-10-05 08:44 901
  if (FMT_SAFE_DURATION_CAST) {
47fd5c32 Poul Sander 2024-10-05 08:44 902
    using years = std::chrono::duration<std::int64_t, std::ratio<31556952>>;
47fd5c32 Poul Sander 2024-10-05 08:44 903
    auto tp = sys_time<years>(years(std::numeric_limits<std::int64_t>::max()));
47fd5c32 Poul Sander 2024-10-05 08:44 904
    EXPECT_THROW_MSG((void)fmt::format("{:%Y-%m-%d}", tp), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 905
                     "cannot format duration");
47fd5c32 Poul Sander 2024-10-05 08:44 906
  }
47fd5c32 Poul Sander 2024-10-05 08:44 907
}
47fd5c32 Poul Sander 2024-10-05 08:44 908
47fd5c32 Poul Sander 2024-10-05 08:44 909
TEST(chrono_test, timestamp_sub_seconds) {
47fd5c32 Poul Sander 2024-10-05 08:44 910
  auto t1 = sys_time<std::chrono::duration<long long, std::ratio<1, 3>>>(
47fd5c32 Poul Sander 2024-10-05 08:44 911
      std::chrono::duration<long long, std::ratio<1, 3>>(4));
47fd5c32 Poul Sander 2024-10-05 08:44 912
  EXPECT_EQ(fmt::format("{:%S}", t1), "01.333333");
47fd5c32 Poul Sander 2024-10-05 08:44 913
47fd5c32 Poul Sander 2024-10-05 08:44 914
  auto t2 = sys_time<std::chrono::duration<double, std::ratio<1, 3>>>(
47fd5c32 Poul Sander 2024-10-05 08:44 915
      std::chrono::duration<double, std::ratio<1, 3>>(4));
47fd5c32 Poul Sander 2024-10-05 08:44 916
  EXPECT_EQ(fmt::format("{:%S}", t2), "01.333333");
47fd5c32 Poul Sander 2024-10-05 08:44 917
47fd5c32 Poul Sander 2024-10-05 08:44 918
  auto t3 = sys_time<std::chrono::seconds>(std::chrono::seconds(2));
47fd5c32 Poul Sander 2024-10-05 08:44 919
  EXPECT_EQ(fmt::format("{:%S}", t3), "02");
47fd5c32 Poul Sander 2024-10-05 08:44 920
47fd5c32 Poul Sander 2024-10-05 08:44 921
  auto t4 = sys_time<std::chrono::duration<double>>(
47fd5c32 Poul Sander 2024-10-05 08:44 922
      std::chrono::duration<double, std::ratio<1, 1>>(9.5));
47fd5c32 Poul Sander 2024-10-05 08:44 923
  EXPECT_EQ(fmt::format("{:%S}", t4), "09.500000");
47fd5c32 Poul Sander 2024-10-05 08:44 924
47fd5c32 Poul Sander 2024-10-05 08:44 925
  auto t5 = sys_time<std::chrono::duration<double>>(
47fd5c32 Poul Sander 2024-10-05 08:44 926
      std::chrono::duration<double, std::ratio<1, 1>>(9));
47fd5c32 Poul Sander 2024-10-05 08:44 927
  EXPECT_EQ(fmt::format("{:%S}", t5), "09");
47fd5c32 Poul Sander 2024-10-05 08:44 928
47fd5c32 Poul Sander 2024-10-05 08:44 929
  auto t6 = sys_time<std::chrono::milliseconds>(std::chrono::seconds(1) +
47fd5c32 Poul Sander 2024-10-05 08:44 930
                                                std::chrono::milliseconds(120));
47fd5c32 Poul Sander 2024-10-05 08:44 931
  EXPECT_EQ(fmt::format("{:%S}", t6), "01.120");
47fd5c32 Poul Sander 2024-10-05 08:44 932
47fd5c32 Poul Sander 2024-10-05 08:44 933
  auto t7 =
47fd5c32 Poul Sander 2024-10-05 08:44 934
      sys_time<std::chrono::microseconds>(std::chrono::microseconds(1234567));
47fd5c32 Poul Sander 2024-10-05 08:44 935
  EXPECT_EQ(fmt::format("{:%S}", t7), "01.234567");
47fd5c32 Poul Sander 2024-10-05 08:44 936
47fd5c32 Poul Sander 2024-10-05 08:44 937
  auto t8 =
47fd5c32 Poul Sander 2024-10-05 08:44 938
      sys_time<std::chrono::nanoseconds>(std::chrono::nanoseconds(123456789));
47fd5c32 Poul Sander 2024-10-05 08:44 939
  EXPECT_EQ(fmt::format("{:%S}", t8), "00.123456789");
47fd5c32 Poul Sander 2024-10-05 08:44 940
47fd5c32 Poul Sander 2024-10-05 08:44 941
  auto t9 = std::chrono::time_point_cast<std::chrono::nanoseconds>(
47fd5c32 Poul Sander 2024-10-05 08:44 942
      std::chrono::system_clock::now());
47fd5c32 Poul Sander 2024-10-05 08:44 943
  auto t9_sec = std::chrono::time_point_cast<std::chrono::seconds>(t9);
47fd5c32 Poul Sander 2024-10-05 08:44 944
  auto t9_sub_sec_part = fmt::format("{0:09}", (t9 - t9_sec).count());
47fd5c32 Poul Sander 2024-10-05 08:44 945
  EXPECT_EQ(fmt::format("{}.{}", strftime_full_utc(t9_sec), t9_sub_sec_part),
47fd5c32 Poul Sander 2024-10-05 08:44 946
            fmt::format("{:%Y-%m-%d %H:%M:%S}", t9));
47fd5c32 Poul Sander 2024-10-05 08:44 947
  EXPECT_EQ(fmt::format("{}.{}", strftime_full_utc(t9_sec), t9_sub_sec_part),
47fd5c32 Poul Sander 2024-10-05 08:44 948
            fmt::format("{:%Y-%m-%d %T}", t9));
47fd5c32 Poul Sander 2024-10-05 08:44 949
47fd5c32 Poul Sander 2024-10-05 08:44 950
  auto t10 =
47fd5c32 Poul Sander 2024-10-05 08:44 951
      sys_time<std::chrono::milliseconds>(std::chrono::milliseconds(2000));
47fd5c32 Poul Sander 2024-10-05 08:44 952
  EXPECT_EQ(fmt::format("{:%S}", t10), "02.000");
47fd5c32 Poul Sander 2024-10-05 08:44 953
47fd5c32 Poul Sander 2024-10-05 08:44 954
  auto epoch = sys_time<std::chrono::milliseconds>();
47fd5c32 Poul Sander 2024-10-05 08:44 955
  auto d = std::chrono::milliseconds(250);
47fd5c32 Poul Sander 2024-10-05 08:44 956
  EXPECT_EQ(fmt::format("{:%S}", epoch - d), "59.750");
47fd5c32 Poul Sander 2024-10-05 08:44 957
  EXPECT_EQ(fmt::format("{:%S}", epoch), "00.000");
47fd5c32 Poul Sander 2024-10-05 08:44 958
  EXPECT_EQ(fmt::format("{:%S}", epoch + d), "00.250");
47fd5c32 Poul Sander 2024-10-05 08:44 959
}
47fd5c32 Poul Sander 2024-10-05 08:44 960
47fd5c32 Poul Sander 2024-10-05 08:44 961
TEST(chrono_test, glibc_extensions) {
47fd5c32 Poul Sander 2024-10-05 08:44 962
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%0}"), std::chrono::seconds()),
47fd5c32 Poul Sander 2024-10-05 08:44 963
                   fmt::format_error, "invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 964
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%_}"), std::chrono::seconds()),
47fd5c32 Poul Sander 2024-10-05 08:44 965
                   fmt::format_error, "invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 966
  EXPECT_THROW_MSG((void)fmt::format(runtime("{:%-}"), std::chrono::seconds()),
47fd5c32 Poul Sander 2024-10-05 08:44 967
                   fmt::format_error, "invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 968
47fd5c32 Poul Sander 2024-10-05 08:44 969
  {
47fd5c32 Poul Sander 2024-10-05 08:44 970
    const auto d = std::chrono::hours(1) + std::chrono::minutes(2) +
47fd5c32 Poul Sander 2024-10-05 08:44 971
                   std::chrono::seconds(3);
47fd5c32 Poul Sander 2024-10-05 08:44 972
47fd5c32 Poul Sander 2024-10-05 08:44 973
    EXPECT_EQ(fmt::format("{:%I,%H,%M,%S}", d), "01,01,02,03");
47fd5c32 Poul Sander 2024-10-05 08:44 974
    EXPECT_EQ(fmt::format("{:%_I,%_H,%_M,%_S}", d), " 1, 1, 2, 3");
47fd5c32 Poul Sander 2024-10-05 08:44 975
    EXPECT_EQ(fmt::format("{:%-I,%-H,%-M,%-S}", d), "1,1,2,3");
47fd5c32 Poul Sander 2024-10-05 08:44 976
    EXPECT_EQ(fmt::format("{:%-I,%H,%M,%S}", d), "1,01,02,03");
47fd5c32 Poul Sander 2024-10-05 08:44 977
47fd5c32 Poul Sander 2024-10-05 08:44 978
    EXPECT_EQ(fmt::format("{:%OI,%OH,%OM,%OS}", d), "01,01,02,03");
47fd5c32 Poul Sander 2024-10-05 08:44 979
    EXPECT_EQ(fmt::format("{:%_OI,%_OH,%_OM,%_OS}", d), " 1, 1, 2, 3");
47fd5c32 Poul Sander 2024-10-05 08:44 980
    EXPECT_EQ(fmt::format("{:%-OI,%-OH,%-OM,%-OS}", d), "1,1,2,3");
47fd5c32 Poul Sander 2024-10-05 08:44 981
  }
47fd5c32 Poul Sander 2024-10-05 08:44 982
47fd5c32 Poul Sander 2024-10-05 08:44 983
  {
47fd5c32 Poul Sander 2024-10-05 08:44 984
    const auto tm = make_tm(1970, 1, 1, 1, 2, 3);
47fd5c32 Poul Sander 2024-10-05 08:44 985
    EXPECT_EQ(fmt::format("{:%I,%H,%M,%S}", tm), "01,01,02,03");
47fd5c32 Poul Sander 2024-10-05 08:44 986
    EXPECT_EQ(fmt::format("{:%_I,%_H,%_M,%_S}", tm), " 1, 1, 2, 3");
47fd5c32 Poul Sander 2024-10-05 08:44 987
    EXPECT_EQ(fmt::format("{:%-I,%-H,%-M,%-S}", tm), "1,1,2,3");
47fd5c32 Poul Sander 2024-10-05 08:44 988
47fd5c32 Poul Sander 2024-10-05 08:44 989
    EXPECT_EQ(fmt::format("{:%OI,%OH,%OM,%OS}", tm), "01,01,02,03");
47fd5c32 Poul Sander 2024-10-05 08:44 990
    EXPECT_EQ(fmt::format("{:%_OI,%_OH,%_OM,%_OS}", tm), " 1, 1, 2, 3");
47fd5c32 Poul Sander 2024-10-05 08:44 991
    EXPECT_EQ(fmt::format("{:%-OI,%-OH,%-OM,%-OS}", tm), "1,1,2,3");
47fd5c32 Poul Sander 2024-10-05 08:44 992
  }
47fd5c32 Poul Sander 2024-10-05 08:44 993
47fd5c32 Poul Sander 2024-10-05 08:44 994
  {
47fd5c32 Poul Sander 2024-10-05 08:44 995
    const auto d = std::chrono::seconds(3) + std::chrono::milliseconds(140);
47fd5c32 Poul Sander 2024-10-05 08:44 996
    EXPECT_EQ(fmt::format("{:%S}", d), "03.140");
47fd5c32 Poul Sander 2024-10-05 08:44 997
    EXPECT_EQ(fmt::format("{:%_S}", d), " 3.140");
47fd5c32 Poul Sander 2024-10-05 08:44 998
    EXPECT_EQ(fmt::format("{:%-S}", d), "3.140");
47fd5c32 Poul Sander 2024-10-05 08:44 999
  }
47fd5c32 Poul Sander 2024-10-05 08:44 1000
47fd5c32 Poul Sander 2024-10-05 08:44 1001
  {
47fd5c32 Poul Sander 2024-10-05 08:44 1002
    auto d = std::chrono::duration<double>(3.14);
47fd5c32 Poul Sander 2024-10-05 08:44 1003
    EXPECT_EQ(fmt::format("{:%S}", d), "03.140000");
47fd5c32 Poul Sander 2024-10-05 08:44 1004
    EXPECT_EQ(fmt::format("{:%_S}", d), " 3.140000");
47fd5c32 Poul Sander 2024-10-05 08:44 1005
    EXPECT_EQ(fmt::format("{:%-S}", d), "3.140000");
47fd5c32 Poul Sander 2024-10-05 08:44 1006
  }
47fd5c32 Poul Sander 2024-10-05 08:44 1007
47fd5c32 Poul Sander 2024-10-05 08:44 1008
  {
47fd5c32 Poul Sander 2024-10-05 08:44 1009
    auto t = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 1010
    t.tm_yday = 7;
47fd5c32 Poul Sander 2024-10-05 08:44 1011
    EXPECT_EQ(fmt::format("{:%U,%W,%V}", t), "02,01,01");
47fd5c32 Poul Sander 2024-10-05 08:44 1012
    EXPECT_EQ(fmt::format("{:%_U,%_W,%_V}", t), " 2, 1, 1");
47fd5c32 Poul Sander 2024-10-05 08:44 1013
    EXPECT_EQ(fmt::format("{:%-U,%-W,%-V}", t), "2,1,1");
47fd5c32 Poul Sander 2024-10-05 08:44 1014
  }
47fd5c32 Poul Sander 2024-10-05 08:44 1015
47fd5c32 Poul Sander 2024-10-05 08:44 1016
  {
47fd5c32 Poul Sander 2024-10-05 08:44 1017
    auto t = std::tm();
47fd5c32 Poul Sander 2024-10-05 08:44 1018
    t.tm_mday = 7;
47fd5c32 Poul Sander 2024-10-05 08:44 1019
    EXPECT_EQ(fmt::format("{:%d}", t), "07");
47fd5c32 Poul Sander 2024-10-05 08:44 1020
    EXPECT_EQ(fmt::format("{:%_d}", t), " 7");
47fd5c32 Poul Sander 2024-10-05 08:44 1021
    EXPECT_EQ(fmt::format("{:%-d}", t), "7");
47fd5c32 Poul Sander 2024-10-05 08:44 1022
47fd5c32 Poul Sander 2024-10-05 08:44 1023
    EXPECT_EQ(fmt::format("{:%e}", t), " 7");
47fd5c32 Poul Sander 2024-10-05 08:44 1024
  }
47fd5c32 Poul Sander 2024-10-05 08:44 1025
}
47fd5c32 Poul Sander 2024-10-05 08:44 1026
47fd5c32 Poul Sander 2024-10-05 08:44 1027
TEST(chrono_test, out_of_range) {
47fd5c32 Poul Sander 2024-10-05 08:44 1028
  auto d = std::chrono::duration<unsigned long, std::giga>(538976288);
47fd5c32 Poul Sander 2024-10-05 08:44 1029
  EXPECT_THROW((void)fmt::format("{:%j}", d), fmt::format_error);
47fd5c32 Poul Sander 2024-10-05 08:44 1030
}
47fd5c32 Poul Sander 2024-10-05 08:44 1031
47fd5c32 Poul Sander 2024-10-05 08:44 1032
TEST(chrono_test, year_month_day) {
47fd5c32 Poul Sander 2024-10-05 08:44 1033
  auto loc = get_locale("es_ES.UTF-8");
47fd5c32 Poul Sander 2024-10-05 08:44 1034
  std::locale::global(loc);
47fd5c32 Poul Sander 2024-10-05 08:44 1035
  
47fd5c32 Poul Sander 2024-10-05 08:44 1036
  auto year = fmt::year(2024);
47fd5c32 Poul Sander 2024-10-05 08:44 1037
  auto month = fmt::month(1);
47fd5c32 Poul Sander 2024-10-05 08:44 1038
  auto day = fmt::day(1);
47fd5c32 Poul Sander 2024-10-05 08:44 1039
  auto ymd = fmt::year_month_day(year, month, day);
47fd5c32 Poul Sander 2024-10-05 08:44 1040
47fd5c32 Poul Sander 2024-10-05 08:44 1041
  EXPECT_EQ(fmt::format("{}", year), "2024");
47fd5c32 Poul Sander 2024-10-05 08:44 1042
  EXPECT_EQ(fmt::format("{:%Y}", year), "2024");
47fd5c32 Poul Sander 2024-10-05 08:44 1043
  EXPECT_EQ(fmt::format("{:%y}", year), "24");
47fd5c32 Poul Sander 2024-10-05 08:44 1044
47fd5c32 Poul Sander 2024-10-05 08:44 1045
  EXPECT_EQ(fmt::format("{}", month), "Jan");
47fd5c32 Poul Sander 2024-10-05 08:44 1046
  EXPECT_EQ(fmt::format("{:%m}", month), "01");
47fd5c32 Poul Sander 2024-10-05 08:44 1047
  EXPECT_EQ(fmt::format("{:%b}", month), "Jan");
47fd5c32 Poul Sander 2024-10-05 08:44 1048
  EXPECT_EQ(fmt::format("{:%B}", month), "January");
47fd5c32 Poul Sander 2024-10-05 08:44 1049
47fd5c32 Poul Sander 2024-10-05 08:44 1050
  EXPECT_EQ(fmt::format("{}", day), "01");
47fd5c32 Poul Sander 2024-10-05 08:44 1051
  EXPECT_EQ(fmt::format("{:%d}", day), "01");
47fd5c32 Poul Sander 2024-10-05 08:44 1052
47fd5c32 Poul Sander 2024-10-05 08:44 1053
  EXPECT_EQ(fmt::format("{}", ymd), "2024-01-01");
47fd5c32 Poul Sander 2024-10-05 08:44 1054
  EXPECT_EQ(fmt::format("{:%Y-%m-%d}", ymd), "2024-01-01");
47fd5c32 Poul Sander 2024-10-05 08:44 1055
  EXPECT_EQ(fmt::format("{:%Y-%b-%d}", ymd), "2024-Jan-01");
47fd5c32 Poul Sander 2024-10-05 08:44 1056
  EXPECT_EQ(fmt::format("{:%Y-%B-%d}", ymd), "2024-January-01");
47fd5c32 Poul Sander 2024-10-05 08:44 1057
47fd5c32 Poul Sander 2024-10-05 08:44 1058
  if (loc != std::locale::classic()) {
47fd5c32 Poul Sander 2024-10-05 08:44 1059
    auto months = std::vector<std::string>{"ene.", "ene"};
47fd5c32 Poul Sander 2024-10-05 08:44 1060
    EXPECT_THAT(months, Contains(fmt::format(loc, "{:L}", month)));
47fd5c32 Poul Sander 2024-10-05 08:44 1061
    EXPECT_THAT(months, Contains(fmt::format(loc, "{:%b}", month)));
47fd5c32 Poul Sander 2024-10-05 08:44 1062
  }
47fd5c32 Poul Sander 2024-10-05 08:44 1063
}
1970-01-01 00:00 1064