git repos / blockattack-game

blame: source/misc/embedded_libs/fmt-8.1.1/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> {
f8deb5b9 Poul Sander 2022-01-15 13:55 41
  auto parse(format_parse_context& ctx) const -> 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>
f8deb5b9 Poul Sander 2022-01-15 13:55 46
  auto format(const custom_type& p, FormatContext& ctx) -> decltype(ctx.out()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 47
    return format_to(ctx.out(), "cust={}", p.i);
f8deb5b9 Poul Sander 2022-01-15 13:55 48
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 49
};
f8deb5b9 Poul Sander 2022-01-15 13:55 50
FMT_END_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 51
f8deb5b9 Poul Sander 2022-01-15 13:55 52
TEST(args_test, custom_format) {
f8deb5b9 Poul Sander 2022-01-15 13:55 53
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 54
  auto c = custom_type();
f8deb5b9 Poul Sander 2022-01-15 13:55 55
  store.push_back(c);
f8deb5b9 Poul Sander 2022-01-15 13:55 56
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 57
  store.push_back(c);
f8deb5b9 Poul Sander 2022-01-15 13:55 58
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 59
  store.push_back(std::cref(c));
f8deb5b9 Poul Sander 2022-01-15 13:55 60
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 61
  auto result = fmt::vformat("{} and {} and {}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 62
  EXPECT_EQ("cust=0 and cust=1 and cust=3", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 63
}
f8deb5b9 Poul Sander 2022-01-15 13:55 64
f8deb5b9 Poul Sander 2022-01-15 13:55 65
struct to_stringable {
f8deb5b9 Poul Sander 2022-01-15 13:55 66
  friend fmt::string_view to_string_view(to_stringable) { return {}; }
f8deb5b9 Poul Sander 2022-01-15 13:55 67
};
f8deb5b9 Poul Sander 2022-01-15 13:55 68
f8deb5b9 Poul Sander 2022-01-15 13:55 69
FMT_BEGIN_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 70
template <> struct formatter<to_stringable> {
f8deb5b9 Poul Sander 2022-01-15 13:55 71
  auto parse(format_parse_context& ctx) const -> decltype(ctx.begin()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 72
    return ctx.begin();
f8deb5b9 Poul Sander 2022-01-15 13:55 73
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 74
f8deb5b9 Poul Sander 2022-01-15 13:55 75
  auto format(to_stringable, format_context& ctx) -> decltype(ctx.out()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 76
    return ctx.out();
f8deb5b9 Poul Sander 2022-01-15 13:55 77
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 78
};
f8deb5b9 Poul Sander 2022-01-15 13:55 79
FMT_END_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 80
f8deb5b9 Poul Sander 2022-01-15 13:55 81
TEST(args_test, to_string_and_formatter) {
f8deb5b9 Poul Sander 2022-01-15 13:55 82
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 83
  auto s = to_stringable();
f8deb5b9 Poul Sander 2022-01-15 13:55 84
  store.push_back(s);
f8deb5b9 Poul Sander 2022-01-15 13:55 85
  store.push_back(std::cref(s));
f8deb5b9 Poul Sander 2022-01-15 13:55 86
  fmt::vformat("", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 87
}
f8deb5b9 Poul Sander 2022-01-15 13:55 88
f8deb5b9 Poul Sander 2022-01-15 13:55 89
TEST(args_test, named_int) {
f8deb5b9 Poul Sander 2022-01-15 13:55 90
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 91
  store.push_back(fmt::arg("a1", 42));
f8deb5b9 Poul Sander 2022-01-15 13:55 92
  EXPECT_EQ("42", fmt::vformat("{a1}", store));
f8deb5b9 Poul Sander 2022-01-15 13:55 93
}
f8deb5b9 Poul Sander 2022-01-15 13:55 94
f8deb5b9 Poul Sander 2022-01-15 13:55 95
TEST(args_test, named_strings) {
f8deb5b9 Poul Sander 2022-01-15 13:55 96
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 97
  char str[] = "1234567890";
f8deb5b9 Poul Sander 2022-01-15 13:55 98
  store.push_back(fmt::arg("a1", str));
f8deb5b9 Poul Sander 2022-01-15 13:55 99
  store.push_back(fmt::arg("a2", std::cref(str)));
f8deb5b9 Poul Sander 2022-01-15 13:55 100
  str[0] = 'X';
f8deb5b9 Poul Sander 2022-01-15 13:55 101
  EXPECT_EQ("1234567890 and X234567890", fmt::vformat("{a1} and {a2}", store));
f8deb5b9 Poul Sander 2022-01-15 13:55 102
}
f8deb5b9 Poul Sander 2022-01-15 13:55 103
f8deb5b9 Poul Sander 2022-01-15 13:55 104
TEST(args_test, named_arg_by_ref) {
f8deb5b9 Poul Sander 2022-01-15 13:55 105
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 106
  char band[] = "Rolling Stones";
f8deb5b9 Poul Sander 2022-01-15 13:55 107
  store.push_back(fmt::arg("band", std::cref(band)));
f8deb5b9 Poul Sander 2022-01-15 13:55 108
  band[9] = 'c';  // Changing band affects the output.
f8deb5b9 Poul Sander 2022-01-15 13:55 109
  EXPECT_EQ(fmt::vformat("{band}", store), "Rolling Scones");
f8deb5b9 Poul Sander 2022-01-15 13:55 110
}
f8deb5b9 Poul Sander 2022-01-15 13:55 111
f8deb5b9 Poul Sander 2022-01-15 13:55 112
TEST(args_test, named_custom_format) {
f8deb5b9 Poul Sander 2022-01-15 13:55 113
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 114
  auto c = custom_type();
f8deb5b9 Poul Sander 2022-01-15 13:55 115
  store.push_back(fmt::arg("c1", c));
f8deb5b9 Poul Sander 2022-01-15 13:55 116
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 117
  store.push_back(fmt::arg("c2", c));
f8deb5b9 Poul Sander 2022-01-15 13:55 118
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 119
  store.push_back(fmt::arg("c_ref", std::cref(c)));
f8deb5b9 Poul Sander 2022-01-15 13:55 120
  ++c.i;
f8deb5b9 Poul Sander 2022-01-15 13:55 121
  auto result = fmt::vformat("{c1} and {c2} and {c_ref}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 122
  EXPECT_EQ("cust=0 and cust=1 and cust=3", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 123
}
f8deb5b9 Poul Sander 2022-01-15 13:55 124
f8deb5b9 Poul Sander 2022-01-15 13:55 125
TEST(args_test, clear) {
f8deb5b9 Poul Sander 2022-01-15 13:55 126
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 127
  store.push_back(42);
f8deb5b9 Poul Sander 2022-01-15 13:55 128
f8deb5b9 Poul Sander 2022-01-15 13:55 129
  auto result = fmt::vformat("{}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 130
  EXPECT_EQ("42", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 131
f8deb5b9 Poul Sander 2022-01-15 13:55 132
  store.push_back(43);
f8deb5b9 Poul Sander 2022-01-15 13:55 133
  result = fmt::vformat("{} and {}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 134
  EXPECT_EQ("42 and 43", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 135
f8deb5b9 Poul Sander 2022-01-15 13:55 136
  store.clear();
f8deb5b9 Poul Sander 2022-01-15 13:55 137
  store.push_back(44);
f8deb5b9 Poul Sander 2022-01-15 13:55 138
  result = fmt::vformat("{}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 139
  EXPECT_EQ("44", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 140
}
f8deb5b9 Poul Sander 2022-01-15 13:55 141
f8deb5b9 Poul Sander 2022-01-15 13:55 142
TEST(args_test, reserve) {
f8deb5b9 Poul Sander 2022-01-15 13:55 143
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 144
  store.reserve(2, 1);
f8deb5b9 Poul Sander 2022-01-15 13:55 145
  store.push_back(1.5f);
f8deb5b9 Poul Sander 2022-01-15 13:55 146
  store.push_back(fmt::arg("a1", 42));
f8deb5b9 Poul Sander 2022-01-15 13:55 147
  auto result = fmt::vformat("{a1} and {}", store);
f8deb5b9 Poul Sander 2022-01-15 13:55 148
  EXPECT_EQ("42 and 1.5", result);
f8deb5b9 Poul Sander 2022-01-15 13:55 149
}
f8deb5b9 Poul Sander 2022-01-15 13:55 150
f8deb5b9 Poul Sander 2022-01-15 13:55 151
struct copy_throwable {
f8deb5b9 Poul Sander 2022-01-15 13:55 152
  copy_throwable() {}
f8deb5b9 Poul Sander 2022-01-15 13:55 153
  copy_throwable(const copy_throwable&) { throw "deal with it"; }
f8deb5b9 Poul Sander 2022-01-15 13:55 154
};
f8deb5b9 Poul Sander 2022-01-15 13:55 155
f8deb5b9 Poul Sander 2022-01-15 13:55 156
FMT_BEGIN_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 157
template <> struct formatter<copy_throwable> {
f8deb5b9 Poul Sander 2022-01-15 13:55 158
  auto parse(format_parse_context& ctx) const -> decltype(ctx.begin()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 159
    return ctx.begin();
f8deb5b9 Poul Sander 2022-01-15 13:55 160
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 161
  auto format(copy_throwable, format_context& ctx) -> decltype(ctx.out()) {
f8deb5b9 Poul Sander 2022-01-15 13:55 162
    return ctx.out();
f8deb5b9 Poul Sander 2022-01-15 13:55 163
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 164
};
f8deb5b9 Poul Sander 2022-01-15 13:55 165
FMT_END_NAMESPACE
f8deb5b9 Poul Sander 2022-01-15 13:55 166
f8deb5b9 Poul Sander 2022-01-15 13:55 167
TEST(args_test, throw_on_copy) {
f8deb5b9 Poul Sander 2022-01-15 13:55 168
  fmt::dynamic_format_arg_store<fmt::format_context> store;
f8deb5b9 Poul Sander 2022-01-15 13:55 169
  store.push_back(std::string("foo"));
f8deb5b9 Poul Sander 2022-01-15 13:55 170
  try {
f8deb5b9 Poul Sander 2022-01-15 13:55 171
    store.push_back(copy_throwable());
f8deb5b9 Poul Sander 2022-01-15 13:55 172
  } catch (...) {
f8deb5b9 Poul Sander 2022-01-15 13:55 173
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 174
  EXPECT_EQ(fmt::vformat("{}", store), "foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 175
}
f8deb5b9 Poul Sander 2022-01-15 13:55 176
f8deb5b9 Poul Sander 2022-01-15 13:55 177
TEST(args_test, move_constructor) {
f8deb5b9 Poul Sander 2022-01-15 13:55 178
  using store_type = fmt::dynamic_format_arg_store<fmt::format_context>;
f8deb5b9 Poul Sander 2022-01-15 13:55 179
  auto store = std::unique_ptr<store_type>(new store_type());
f8deb5b9 Poul Sander 2022-01-15 13:55 180
  store->push_back(42);
f8deb5b9 Poul Sander 2022-01-15 13:55 181
  store->push_back(std::string("foo"));
f8deb5b9 Poul Sander 2022-01-15 13:55 182
  store->push_back(fmt::arg("a1", "foo"));
f8deb5b9 Poul Sander 2022-01-15 13:55 183
  auto moved_store = std::move(*store);
f8deb5b9 Poul Sander 2022-01-15 13:55 184
  store.reset();
f8deb5b9 Poul Sander 2022-01-15 13:55 185
  EXPECT_EQ(fmt::vformat("{} {} {a1}", moved_store), "42 foo foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 186
}
1970-01-01 00:00 187