git repos / blockattack-game

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

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
// Formatting library for C++ - dynamic argument store tests
f8deb5b9 Poul Sander 2022-01-15 13:55 2
//
f8deb5b9 Poul Sander 2022-01-15 13:55 3
// Copyright (c) 2012 - present, Victor Zverovich
f8deb5b9 Poul Sander 2022-01-15 13:55 4
// All rights reserved.
f8deb5b9 Poul Sander 2022-01-15 13:55 5
//
f8deb5b9 Poul Sander 2022-01-15 13:55 6
// For the license information refer to format.h.
f8deb5b9 Poul Sander 2022-01-15 13:55 7
f8deb5b9 Poul Sander 2022-01-15 13:55 8
#include "fmt/args.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 9
f8deb5b9 Poul Sander 2022-01-15 13:55 10
#include <memory>
f8deb5b9 Poul Sander 2022-01-15 13:55 11
f8deb5b9 Poul Sander 2022-01-15 13:55 12
#include "gtest/gtest.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 13
f8deb5b9 Poul Sander 2022-01-15 13:55 14
TEST(args_test, basic) {
f8deb5b9 Poul Sander 2022-01-15 13:55 15
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 16
  store.push_back(42);
f8deb5b9 Poul Sander 2022-01-15 13:55 17
  store.push_back("abc1");
f8deb5b9 Poul Sander 2022-01-15 13:55 18
  store.push_back(1.5f);
f8deb5b9 Poul Sander 2022-01-15 13:55 19
  EXPECT_EQ("42 and abc1 and 1.5", fmt::vformat("{} and {} and {}", store));
f8deb5b9 Poul Sander 2022-01-15 13:55 20
}
f8deb5b9 Poul Sander 2022-01-15 13:55 21
f8deb5b9 Poul Sander 2022-01-15 13:55 22
TEST(args_test, strings_and_refs) {
f8deb5b9 Poul Sander 2022-01-15 13:55 23
  // Unfortunately the tests are compiled with old ABI so strings use COW.
f8deb5b9 Poul Sander 2022-01-15 13:55 24
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 25
  char str[] = "1234567890";
f8deb5b9 Poul Sander 2022-01-15 13:55 26
  store.push_back(str);
f8deb5b9 Poul Sander 2022-01-15 13:55 27
  store.push_back(std::cref(str));
f8deb5b9 Poul Sander 2022-01-15 13:55 28
  store.push_back(fmt::string_view{str});
f8deb5b9 Poul Sander 2022-01-15 13:55 29
  str[0] = 'X';
f8deb5b9 Poul Sander 2022-01-15 13:55 30
f8deb5b9 Poul Sander 2022-01-15 13:55 31
  auto result = fmt::vformat("{} and {} and {}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 32
  EXPECT_EQ("1234567890 and X234567890 and X234567890", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 33
}
f8deb5b9 Poul Sander 2022-01-15 13:55 34
f8deb5b9 Poul Sander 2022-01-15 13:55 35
struct custom_type {
f8deb5b9 Poul Sander 2022-01-15 13:55 36
  int i = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 37
};
f8deb5b9 Poul Sander 2022-01-15 13:55 38
f8deb5b9 Poul Sander 2022-01-15 13:55 39
FMT_BEGIN_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 40
template <> struct formatter<custom_type> {
47fd5c32 Poul Sander 2024-10-05 08:44 41
  auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 42
    return ctx.begin();
f8deb5b9 Poul Sander 2022-01-15 13:55 43
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 44
f8deb5b9 Poul Sander 2022-01-15 13:55 45
  template <typename FormatContext>
47fd5c32 Poul Sander 2024-10-05 08:44 46
  auto format(const custom_type& p, FormatContext& ctx) const
47fd5c32 Poul Sander 2024-10-05 08:44 47
      -> decltype(ctx.out()) {
47fd5c32 Poul Sander 2024-10-05 08:44 48
    return fmt::format_to(ctx.out(), "cust={}", p.i);
f8deb5b9 Poul Sander 2022-01-15 13:55 49
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 50
};
f8deb5b9 Poul Sander 2022-01-15 13:55 51
FMT_END_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 52
f8deb5b9 Poul Sander 2022-01-15 13:55 53
TEST(args_test, custom_format) {
f8deb5b9 Poul Sander 2022-01-15 13:55 54
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 55
  auto c = custom_type();
f8deb5b9 Poul Sander 2022-01-15 13:55 56
  store.push_back(c);
f8deb5b9 Poul Sander 2022-01-15 13:55 57
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 58
  store.push_back(c);
f8deb5b9 Poul Sander 2022-01-15 13:55 59
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 60
  store.push_back(std::cref(c));
f8deb5b9 Poul Sander 2022-01-15 13:55 61
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 62
  auto result = fmt::vformat("{} and {} and {}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 63
  EXPECT_EQ("cust=0 and cust=1 and cust=3", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 64
}
f8deb5b9 Poul Sander 2022-01-15 13:55 65
f8deb5b9 Poul Sander 2022-01-15 13:55 66
struct to_stringable {
f8deb5b9 Poul Sander 2022-01-15 13:55 67
  friend fmt::string_view to_string_view(to_stringable) { return {}; }
f8deb5b9 Poul Sander 2022-01-15 13:55 68
};
f8deb5b9 Poul Sander 2022-01-15 13:55 69
f8deb5b9 Poul Sander 2022-01-15 13:55 70
FMT_BEGIN_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 71
template <> struct formatter<to_stringable> {
47fd5c32 Poul Sander 2024-10-05 08:44 72
  auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 73
    return ctx.begin();
f8deb5b9 Poul Sander 2022-01-15 13:55 74
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 75
47fd5c32 Poul Sander 2024-10-05 08:44 76
  auto format(to_stringable, format_context& ctx) const -> decltype(ctx.out()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 77
    return ctx.out();
f8deb5b9 Poul Sander 2022-01-15 13:55 78
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 79
};
f8deb5b9 Poul Sander 2022-01-15 13:55 80
FMT_END_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 81
f8deb5b9 Poul Sander 2022-01-15 13:55 82
TEST(args_test, to_string_and_formatter) {
f8deb5b9 Poul Sander 2022-01-15 13:55 83
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 84
  auto s = to_stringable();
f8deb5b9 Poul Sander 2022-01-15 13:55 85
  store.push_back(s);
f8deb5b9 Poul Sander 2022-01-15 13:55 86
  store.push_back(std::cref(s));
f8deb5b9 Poul Sander 2022-01-15 13:55 87
  fmt::vformat("", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 88
}
f8deb5b9 Poul Sander 2022-01-15 13:55 89
f8deb5b9 Poul Sander 2022-01-15 13:55 90
TEST(args_test, named_int) {
f8deb5b9 Poul Sander 2022-01-15 13:55 91
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 92
  store.push_back(fmt::arg("a1", 42));
f8deb5b9 Poul Sander 2022-01-15 13:55 93
  EXPECT_EQ("42", fmt::vformat("{a1}", store));
f8deb5b9 Poul Sander 2022-01-15 13:55 94
}
f8deb5b9 Poul Sander 2022-01-15 13:55 95
f8deb5b9 Poul Sander 2022-01-15 13:55 96
TEST(args_test, named_strings) {
f8deb5b9 Poul Sander 2022-01-15 13:55 97
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 98
  char str[] = "1234567890";
f8deb5b9 Poul Sander 2022-01-15 13:55 99
  store.push_back(fmt::arg("a1", str));
f8deb5b9 Poul Sander 2022-01-15 13:55 100
  store.push_back(fmt::arg("a2", std::cref(str)));
f8deb5b9 Poul Sander 2022-01-15 13:55 101
  str[0] = 'X';
f8deb5b9 Poul Sander 2022-01-15 13:55 102
  EXPECT_EQ("1234567890 and X234567890", fmt::vformat("{a1} and {a2}", store));
f8deb5b9 Poul Sander 2022-01-15 13:55 103
}
f8deb5b9 Poul Sander 2022-01-15 13:55 104
f8deb5b9 Poul Sander 2022-01-15 13:55 105
TEST(args_test, named_arg_by_ref) {
f8deb5b9 Poul Sander 2022-01-15 13:55 106
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 107
  char band[] = "Rolling Stones";
f8deb5b9 Poul Sander 2022-01-15 13:55 108
  store.push_back(fmt::arg("band", std::cref(band)));
f8deb5b9 Poul Sander 2022-01-15 13:55 109
  band[9] = 'c';  // Changing band affects the output.
f8deb5b9 Poul Sander 2022-01-15 13:55 110
  EXPECT_EQ(fmt::vformat("{band}", store), "Rolling Scones");
f8deb5b9 Poul Sander 2022-01-15 13:55 111
}
f8deb5b9 Poul Sander 2022-01-15 13:55 112
f8deb5b9 Poul Sander 2022-01-15 13:55 113
TEST(args_test, named_custom_format) {
f8deb5b9 Poul Sander 2022-01-15 13:55 114
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 115
  auto c = custom_type();
f8deb5b9 Poul Sander 2022-01-15 13:55 116
  store.push_back(fmt::arg("c1", c));
f8deb5b9 Poul Sander 2022-01-15 13:55 117
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 118
  store.push_back(fmt::arg("c2", c));
f8deb5b9 Poul Sander 2022-01-15 13:55 119
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 120
  store.push_back(fmt::arg("c_ref", std::cref(c)));
f8deb5b9 Poul Sander 2022-01-15 13:55 121
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 122
  auto result = fmt::vformat("{c1} and {c2} and {c_ref}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 123
  EXPECT_EQ("cust=0 and cust=1 and cust=3", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 124
}
f8deb5b9 Poul Sander 2022-01-15 13:55 125
f8deb5b9 Poul Sander 2022-01-15 13:55 126
TEST(args_test, clear) {
f8deb5b9 Poul Sander 2022-01-15 13:55 127
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 128
  store.push_back(42);
f8deb5b9 Poul Sander 2022-01-15 13:55 129
f8deb5b9 Poul Sander 2022-01-15 13:55 130
  auto result = fmt::vformat("{}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 131
  EXPECT_EQ("42", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 132
f8deb5b9 Poul Sander 2022-01-15 13:55 133
  store.push_back(43);
f8deb5b9 Poul Sander 2022-01-15 13:55 134
  result = fmt::vformat("{} and {}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 135
  EXPECT_EQ("42 and 43", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 136
f8deb5b9 Poul Sander 2022-01-15 13:55 137
  store.clear();
f8deb5b9 Poul Sander 2022-01-15 13:55 138
  store.push_back(44);
f8deb5b9 Poul Sander 2022-01-15 13:55 139
  result = fmt::vformat("{}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 140
  EXPECT_EQ("44", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 141
}
f8deb5b9 Poul Sander 2022-01-15 13:55 142
f8deb5b9 Poul Sander 2022-01-15 13:55 143
TEST(args_test, reserve) {
f8deb5b9 Poul Sander 2022-01-15 13:55 144
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 145
  store.reserve(2, 1);
f8deb5b9 Poul Sander 2022-01-15 13:55 146
  store.push_back(1.5f);
47fd5c32 Poul Sander 2024-10-05 08:44 147
  store.push_back(fmt::arg("a", 42));
47fd5c32 Poul Sander 2024-10-05 08:44 148
  auto result = fmt::vformat("{} and {a}", store);
47fd5c32 Poul Sander 2024-10-05 08:44 149
  EXPECT_EQ("1.5 and 42", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 150
}
f8deb5b9 Poul Sander 2022-01-15 13:55 151
f8deb5b9 Poul Sander 2022-01-15 13:55 152
struct copy_throwable {
f8deb5b9 Poul Sander 2022-01-15 13:55 153
  copy_throwable() {}
f8deb5b9 Poul Sander 2022-01-15 13:55 154
  copy_throwable(const copy_throwable&) { throw "deal with it"; }
f8deb5b9 Poul Sander 2022-01-15 13:55 155
};
f8deb5b9 Poul Sander 2022-01-15 13:55 156
f8deb5b9 Poul Sander 2022-01-15 13:55 157
FMT_BEGIN_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 158
template <> struct formatter<copy_throwable> {
47fd5c32 Poul Sander 2024-10-05 08:44 159
  auto parse(format_parse_context& ctx) -> decltype(ctx.begin()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 160
    return ctx.begin();
f8deb5b9 Poul Sander 2022-01-15 13:55 161
  }
47fd5c32 Poul Sander 2024-10-05 08:44 162
  auto format(copy_throwable, format_context& ctx) const
47fd5c32 Poul Sander 2024-10-05 08:44 163
      -> decltype(ctx.out()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 164
    return ctx.out();
f8deb5b9 Poul Sander 2022-01-15 13:55 165
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 166
};
f8deb5b9 Poul Sander 2022-01-15 13:55 167
FMT_END_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 168
f8deb5b9 Poul Sander 2022-01-15 13:55 169
TEST(args_test, throw_on_copy) {
f8deb5b9 Poul Sander 2022-01-15 13:55 170
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 171
  store.push_back(std::string("foo"));
f8deb5b9 Poul Sander 2022-01-15 13:55 172
  try {
f8deb5b9 Poul Sander 2022-01-15 13:55 173
    store.push_back(copy_throwable());
f8deb5b9 Poul Sander 2022-01-15 13:55 174
  } catch (...) {
f8deb5b9 Poul Sander 2022-01-15 13:55 175
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 176
  EXPECT_EQ(fmt::vformat("{}", store), "foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 177
}
f8deb5b9 Poul Sander 2022-01-15 13:55 178
f8deb5b9 Poul Sander 2022-01-15 13:55 179
TEST(args_test, move_constructor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 180
  using store_type = fmt::dynamic_format_arg_store<fmt::format_context>;
f8deb5b9 Poul Sander 2022-01-15 13:55 181
  auto store = std::unique_ptr<store_type>(new store_type());
f8deb5b9 Poul Sander 2022-01-15 13:55 182
  store->push_back(42);
f8deb5b9 Poul Sander 2022-01-15 13:55 183
  store->push_back(std::string("foo"));
f8deb5b9 Poul Sander 2022-01-15 13:55 184
  store->push_back(fmt::arg("a1", "foo"));
f8deb5b9 Poul Sander 2022-01-15 13:55 185
  auto moved_store = std::move(*store);
f8deb5b9 Poul Sander 2022-01-15 13:55 186
  store.reset();
f8deb5b9 Poul Sander 2022-01-15 13:55 187
  EXPECT_EQ(fmt::vformat("{} {} {a1}", moved_store), "42 foo foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 188
}
1970-01-01 00:00 189