git repos / blockattack-game

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

normal view · raw

47fd5c32 Poul Sander 2024-10-05 08:44 1
// Formatting library for C++ - scanning API test
47fd5c32 Poul Sander 2024-10-05 08:44 2
//
47fd5c32 Poul Sander 2024-10-05 08:44 3
// Copyright (c) 2019 - 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 "scan.h"
47fd5c32 Poul Sander 2024-10-05 08:44 9
47fd5c32 Poul Sander 2024-10-05 08:44 10
#include <time.h>
47fd5c32 Poul Sander 2024-10-05 08:44 11
47fd5c32 Poul Sander 2024-10-05 08:44 12
#include <climits>
47fd5c32 Poul Sander 2024-10-05 08:44 13
#include <thread>
47fd5c32 Poul Sander 2024-10-05 08:44 14
47fd5c32 Poul Sander 2024-10-05 08:44 15
#include "fmt/os.h"
47fd5c32 Poul Sander 2024-10-05 08:44 16
#include "gmock/gmock.h"
47fd5c32 Poul Sander 2024-10-05 08:44 17
#include "gtest-extra.h"
47fd5c32 Poul Sander 2024-10-05 08:44 18
47fd5c32 Poul Sander 2024-10-05 08:44 19
TEST(scan_test, read_text) {
47fd5c32 Poul Sander 2024-10-05 08:44 20
  fmt::string_view s = "foo";
47fd5c32 Poul Sander 2024-10-05 08:44 21
  auto end = fmt::scan_to(s, "foo");
47fd5c32 Poul Sander 2024-10-05 08:44 22
  EXPECT_EQ(end, s.end());
47fd5c32 Poul Sander 2024-10-05 08:44 23
  EXPECT_THROW_MSG(fmt::scan<int>("fob", "foo"), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 24
                   "invalid input");
47fd5c32 Poul Sander 2024-10-05 08:44 25
}
47fd5c32 Poul Sander 2024-10-05 08:44 26
47fd5c32 Poul Sander 2024-10-05 08:44 27
TEST(scan_test, read_int) {
47fd5c32 Poul Sander 2024-10-05 08:44 28
  EXPECT_EQ(fmt::scan<int>("42", "{}")->value(), 42);
47fd5c32 Poul Sander 2024-10-05 08:44 29
  EXPECT_EQ(fmt::scan<int>("-42", "{}")->value(), -42);
47fd5c32 Poul Sander 2024-10-05 08:44 30
  EXPECT_EQ(fmt::scan<int>("42", "{:}")->value(), 42);
47fd5c32 Poul Sander 2024-10-05 08:44 31
  EXPECT_THROW_MSG(fmt::scan<int>(std::to_string(INT_MAX + 1u), "{}"),
47fd5c32 Poul Sander 2024-10-05 08:44 32
                   fmt::format_error, "number is too big");
47fd5c32 Poul Sander 2024-10-05 08:44 33
}
47fd5c32 Poul Sander 2024-10-05 08:44 34
47fd5c32 Poul Sander 2024-10-05 08:44 35
TEST(scan_test, read_long_long) {
47fd5c32 Poul Sander 2024-10-05 08:44 36
  EXPECT_EQ(fmt::scan<long long>("42", "{}")->value(), 42);
47fd5c32 Poul Sander 2024-10-05 08:44 37
  EXPECT_EQ(fmt::scan<long long>("-42", "{}")->value(), -42);
47fd5c32 Poul Sander 2024-10-05 08:44 38
}
47fd5c32 Poul Sander 2024-10-05 08:44 39
47fd5c32 Poul Sander 2024-10-05 08:44 40
TEST(scan_test, read_uint) {
47fd5c32 Poul Sander 2024-10-05 08:44 41
  EXPECT_EQ(fmt::scan<unsigned>("42", "{}")->value(), 42);
47fd5c32 Poul Sander 2024-10-05 08:44 42
  EXPECT_THROW_MSG(fmt::scan<unsigned>("-42", "{}"), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 43
                   "invalid input");
47fd5c32 Poul Sander 2024-10-05 08:44 44
}
47fd5c32 Poul Sander 2024-10-05 08:44 45
47fd5c32 Poul Sander 2024-10-05 08:44 46
TEST(scan_test, read_ulong_long) {
47fd5c32 Poul Sander 2024-10-05 08:44 47
  EXPECT_EQ(fmt::scan<unsigned long long>("42", "{}")->value(), 42);
47fd5c32 Poul Sander 2024-10-05 08:44 48
  EXPECT_THROW_MSG(fmt::scan<unsigned long long>("-42", "{}")->value(),
47fd5c32 Poul Sander 2024-10-05 08:44 49
                   fmt::format_error, "invalid input");
47fd5c32 Poul Sander 2024-10-05 08:44 50
}
47fd5c32 Poul Sander 2024-10-05 08:44 51
47fd5c32 Poul Sander 2024-10-05 08:44 52
TEST(scan_test, read_hex) {
47fd5c32 Poul Sander 2024-10-05 08:44 53
  EXPECT_EQ(fmt::scan<unsigned>("2a", "{:x}")->value(), 42);
47fd5c32 Poul Sander 2024-10-05 08:44 54
  auto num_digits = std::numeric_limits<unsigned>::digits / 4;
47fd5c32 Poul Sander 2024-10-05 08:44 55
  EXPECT_THROW_MSG(
47fd5c32 Poul Sander 2024-10-05 08:44 56
      fmt::scan<unsigned>(fmt::format("1{:0{}}", 0, num_digits), "{:x}")
47fd5c32 Poul Sander 2024-10-05 08:44 57
          ->value(),
47fd5c32 Poul Sander 2024-10-05 08:44 58
      fmt::format_error, "number is too big");
47fd5c32 Poul Sander 2024-10-05 08:44 59
}
47fd5c32 Poul Sander 2024-10-05 08:44 60
47fd5c32 Poul Sander 2024-10-05 08:44 61
TEST(scan_test, read_string) {
47fd5c32 Poul Sander 2024-10-05 08:44 62
  EXPECT_EQ(fmt::scan<std::string>("foo", "{}")->value(), "foo");
47fd5c32 Poul Sander 2024-10-05 08:44 63
}
47fd5c32 Poul Sander 2024-10-05 08:44 64
47fd5c32 Poul Sander 2024-10-05 08:44 65
TEST(scan_test, read_string_view) {
47fd5c32 Poul Sander 2024-10-05 08:44 66
  EXPECT_EQ(fmt::scan<fmt::string_view>("foo", "{}")->value(), "foo");
47fd5c32 Poul Sander 2024-10-05 08:44 67
}
47fd5c32 Poul Sander 2024-10-05 08:44 68
47fd5c32 Poul Sander 2024-10-05 08:44 69
TEST(scan_test, separator) {
47fd5c32 Poul Sander 2024-10-05 08:44 70
  int n1 = 0, n2 = 0;
47fd5c32 Poul Sander 2024-10-05 08:44 71
  fmt::scan_to("10 20", "{} {}", n1, n2);
47fd5c32 Poul Sander 2024-10-05 08:44 72
  EXPECT_EQ(n1, 10);
47fd5c32 Poul Sander 2024-10-05 08:44 73
  EXPECT_EQ(n2, 20);
47fd5c32 Poul Sander 2024-10-05 08:44 74
}
47fd5c32 Poul Sander 2024-10-05 08:44 75
47fd5c32 Poul Sander 2024-10-05 08:44 76
struct num {
47fd5c32 Poul Sander 2024-10-05 08:44 77
  int value;
47fd5c32 Poul Sander 2024-10-05 08:44 78
};
47fd5c32 Poul Sander 2024-10-05 08:44 79
47fd5c32 Poul Sander 2024-10-05 08:44 80
namespace fmt {
47fd5c32 Poul Sander 2024-10-05 08:44 81
template <> struct scanner<num> {
47fd5c32 Poul Sander 2024-10-05 08:44 82
  bool hex = false;
47fd5c32 Poul Sander 2024-10-05 08:44 83
47fd5c32 Poul Sander 2024-10-05 08:44 84
  auto parse(scan_parse_context& ctx) -> scan_parse_context::iterator {
47fd5c32 Poul Sander 2024-10-05 08:44 85
    auto it = ctx.begin(), end = ctx.end();
47fd5c32 Poul Sander 2024-10-05 08:44 86
    if (it != end && *it == 'x') {
47fd5c32 Poul Sander 2024-10-05 08:44 87
      hex = true;
47fd5c32 Poul Sander 2024-10-05 08:44 88
      ++it;
47fd5c32 Poul Sander 2024-10-05 08:44 89
    }
47fd5c32 Poul Sander 2024-10-05 08:44 90
    if (it != end && *it != '}') report_error("invalid format");
47fd5c32 Poul Sander 2024-10-05 08:44 91
    return it;
47fd5c32 Poul Sander 2024-10-05 08:44 92
  }
47fd5c32 Poul Sander 2024-10-05 08:44 93
47fd5c32 Poul Sander 2024-10-05 08:44 94
  template <class ScanContext>
47fd5c32 Poul Sander 2024-10-05 08:44 95
  auto scan(num& n, ScanContext& ctx) const -> typename ScanContext::iterator {
47fd5c32 Poul Sander 2024-10-05 08:44 96
    return hex ? scan_to(ctx, "{:x}", n.value) : scan_to(ctx, "{}", n.value);
47fd5c32 Poul Sander 2024-10-05 08:44 97
  }
47fd5c32 Poul Sander 2024-10-05 08:44 98
};
47fd5c32 Poul Sander 2024-10-05 08:44 99
}  // namespace fmt
47fd5c32 Poul Sander 2024-10-05 08:44 100
47fd5c32 Poul Sander 2024-10-05 08:44 101
TEST(scan_test, read_custom) {
47fd5c32 Poul Sander 2024-10-05 08:44 102
  EXPECT_EQ(fmt::scan<num>("42", "{}")->value().value, 42);
47fd5c32 Poul Sander 2024-10-05 08:44 103
  EXPECT_EQ(fmt::scan<num>("2a", "{:x}")->value().value, 42);
47fd5c32 Poul Sander 2024-10-05 08:44 104
}
47fd5c32 Poul Sander 2024-10-05 08:44 105
47fd5c32 Poul Sander 2024-10-05 08:44 106
TEST(scan_test, invalid_format) {
47fd5c32 Poul Sander 2024-10-05 08:44 107
  EXPECT_THROW_MSG(fmt::scan_to("", "{}"), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 108
                   "argument index out of range");
47fd5c32 Poul Sander 2024-10-05 08:44 109
  EXPECT_THROW_MSG(fmt::scan_to("", "{"), fmt::format_error,
47fd5c32 Poul Sander 2024-10-05 08:44 110
                   "invalid format string");
47fd5c32 Poul Sander 2024-10-05 08:44 111
}
47fd5c32 Poul Sander 2024-10-05 08:44 112
47fd5c32 Poul Sander 2024-10-05 08:44 113
namespace std {
47fd5c32 Poul Sander 2024-10-05 08:44 114
  using fmt::scan;
47fd5c32 Poul Sander 2024-10-05 08:44 115
  using fmt::scan_error;
47fd5c32 Poul Sander 2024-10-05 08:44 116
}
47fd5c32 Poul Sander 2024-10-05 08:44 117
47fd5c32 Poul Sander 2024-10-05 08:44 118
TEST(scan_test, example) {
47fd5c32 Poul Sander 2024-10-05 08:44 119
  // Example from https://wg21.link/p1729r3.
47fd5c32 Poul Sander 2024-10-05 08:44 120
  if (auto result = std::scan<std::string, int>("answer = 42", "{} = {}")) {
47fd5c32 Poul Sander 2024-10-05 08:44 121
    auto range = result->range();
47fd5c32 Poul Sander 2024-10-05 08:44 122
    EXPECT_EQ(range.begin(), range.end());
47fd5c32 Poul Sander 2024-10-05 08:44 123
    EXPECT_EQ(result->begin(), result->end());
47fd5c32 Poul Sander 2024-10-05 08:44 124
#ifdef __cpp_structured_bindings
47fd5c32 Poul Sander 2024-10-05 08:44 125
    const auto& [key, value] = result->values();
47fd5c32 Poul Sander 2024-10-05 08:44 126
    EXPECT_EQ(key, "answer");
47fd5c32 Poul Sander 2024-10-05 08:44 127
    EXPECT_EQ(value, 42);
47fd5c32 Poul Sander 2024-10-05 08:44 128
#endif
47fd5c32 Poul Sander 2024-10-05 08:44 129
  } else {
47fd5c32 Poul Sander 2024-10-05 08:44 130
    std::scan_error error = result.error();
47fd5c32 Poul Sander 2024-10-05 08:44 131
    (void)error;
47fd5c32 Poul Sander 2024-10-05 08:44 132
    FAIL();
47fd5c32 Poul Sander 2024-10-05 08:44 133
  }
47fd5c32 Poul Sander 2024-10-05 08:44 134
}
47fd5c32 Poul Sander 2024-10-05 08:44 135
47fd5c32 Poul Sander 2024-10-05 08:44 136
TEST(scan_test, end_of_input) { fmt::scan<int>("", "{}"); }
47fd5c32 Poul Sander 2024-10-05 08:44 137
47fd5c32 Poul Sander 2024-10-05 08:44 138
#if FMT_USE_FCNTL
47fd5c32 Poul Sander 2024-10-05 08:44 139
TEST(scan_test, file) {
47fd5c32 Poul Sander 2024-10-05 08:44 140
  auto pipe = fmt::pipe();
47fd5c32 Poul Sander 2024-10-05 08:44 141
47fd5c32 Poul Sander 2024-10-05 08:44 142
  fmt::string_view input = "10 20";
47fd5c32 Poul Sander 2024-10-05 08:44 143
  pipe.write_end.write(input.data(), input.size());
47fd5c32 Poul Sander 2024-10-05 08:44 144
  pipe.write_end.close();
47fd5c32 Poul Sander 2024-10-05 08:44 145
47fd5c32 Poul Sander 2024-10-05 08:44 146
  int n1 = 0, n2 = 0;
47fd5c32 Poul Sander 2024-10-05 08:44 147
  fmt::buffered_file f = pipe.read_end.fdopen("r");
47fd5c32 Poul Sander 2024-10-05 08:44 148
  fmt::scan_to(f.get(), "{} {}", n1, n2);
47fd5c32 Poul Sander 2024-10-05 08:44 149
  EXPECT_EQ(n1, 10);
47fd5c32 Poul Sander 2024-10-05 08:44 150
  EXPECT_EQ(n2, 20);
47fd5c32 Poul Sander 2024-10-05 08:44 151
}
47fd5c32 Poul Sander 2024-10-05 08:44 152
47fd5c32 Poul Sander 2024-10-05 08:44 153
TEST(scan_test, lock) {
47fd5c32 Poul Sander 2024-10-05 08:44 154
  auto pipe = fmt::pipe();
47fd5c32 Poul Sander 2024-10-05 08:44 155
47fd5c32 Poul Sander 2024-10-05 08:44 156
  std::thread producer([&]() {
47fd5c32 Poul Sander 2024-10-05 08:44 157
    fmt::string_view input = "42 ";
47fd5c32 Poul Sander 2024-10-05 08:44 158
    for (int i = 0; i < 1000; ++i)
47fd5c32 Poul Sander 2024-10-05 08:44 159
      pipe.write_end.write(input.data(), input.size());
47fd5c32 Poul Sander 2024-10-05 08:44 160
    pipe.write_end.close();
47fd5c32 Poul Sander 2024-10-05 08:44 161
  });
47fd5c32 Poul Sander 2024-10-05 08:44 162
47fd5c32 Poul Sander 2024-10-05 08:44 163
  std::atomic<int> count(0);
47fd5c32 Poul Sander 2024-10-05 08:44 164
  fmt::buffered_file f = pipe.read_end.fdopen("r");
47fd5c32 Poul Sander 2024-10-05 08:44 165
  auto fun = [&]() {
47fd5c32 Poul Sander 2024-10-05 08:44 166
    int value = 0;
47fd5c32 Poul Sander 2024-10-05 08:44 167
    while (fmt::scan_to(f.get(), "{}", value)) {
47fd5c32 Poul Sander 2024-10-05 08:44 168
      if (value != 42) {
47fd5c32 Poul Sander 2024-10-05 08:44 169
        pipe.read_end.close();
47fd5c32 Poul Sander 2024-10-05 08:44 170
        EXPECT_EQ(value, 42);
47fd5c32 Poul Sander 2024-10-05 08:44 171
        break;
47fd5c32 Poul Sander 2024-10-05 08:44 172
      }
47fd5c32 Poul Sander 2024-10-05 08:44 173
      ++count;
47fd5c32 Poul Sander 2024-10-05 08:44 174
    }
47fd5c32 Poul Sander 2024-10-05 08:44 175
  };
47fd5c32 Poul Sander 2024-10-05 08:44 176
  std::thread consumer1(fun);
47fd5c32 Poul Sander 2024-10-05 08:44 177
  std::thread consumer2(fun);
47fd5c32 Poul Sander 2024-10-05 08:44 178
47fd5c32 Poul Sander 2024-10-05 08:44 179
  producer.join();
47fd5c32 Poul Sander 2024-10-05 08:44 180
  consumer1.join();
47fd5c32 Poul Sander 2024-10-05 08:44 181
  consumer2.join();
47fd5c32 Poul Sander 2024-10-05 08:44 182
  EXPECT_EQ(count, 1000);
47fd5c32 Poul Sander 2024-10-05 08:44 183
}
47fd5c32 Poul Sander 2024-10-05 08:44 184
#endif  // FMT_USE_FCNTL
1970-01-01 00:00 185