git repos / blockattack-game

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

normal view · raw

f8deb5b9 Poul Sander 2022-01-15 13:55 1
// Formatting library for C++ - scanning API test
f8deb5b9 Poul Sander 2022-01-15 13:55 2
//
f8deb5b9 Poul Sander 2022-01-15 13:55 3
// Copyright (c) 2019 - 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 "scan.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 9
f8deb5b9 Poul Sander 2022-01-15 13:55 10
#include <time.h>
f8deb5b9 Poul Sander 2022-01-15 13:55 11
f8deb5b9 Poul Sander 2022-01-15 13:55 12
#include <climits>
f8deb5b9 Poul Sander 2022-01-15 13:55 13
f8deb5b9 Poul Sander 2022-01-15 13:55 14
#include "gmock/gmock.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 15
#include "gtest-extra.h"
f8deb5b9 Poul Sander 2022-01-15 13:55 16
f8deb5b9 Poul Sander 2022-01-15 13:55 17
TEST(scan_test, read_text) {
f8deb5b9 Poul Sander 2022-01-15 13:55 18
  auto s = fmt::string_view("foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 19
  auto end = fmt::scan(s, "foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 20
  EXPECT_EQ(end, s.end());
f8deb5b9 Poul Sander 2022-01-15 13:55 21
  EXPECT_THROW_MSG(fmt::scan("fob", "foo"), fmt::format_error, "invalid input");
f8deb5b9 Poul Sander 2022-01-15 13:55 22
}
f8deb5b9 Poul Sander 2022-01-15 13:55 23
f8deb5b9 Poul Sander 2022-01-15 13:55 24
TEST(scan_test, read_int) {
f8deb5b9 Poul Sander 2022-01-15 13:55 25
  auto n = int();
f8deb5b9 Poul Sander 2022-01-15 13:55 26
  fmt::scan("42", "{}", n);
f8deb5b9 Poul Sander 2022-01-15 13:55 27
  EXPECT_EQ(n, 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 28
  fmt::scan("-42", "{}", n);
f8deb5b9 Poul Sander 2022-01-15 13:55 29
  EXPECT_EQ(n, -42);
f8deb5b9 Poul Sander 2022-01-15 13:55 30
}
f8deb5b9 Poul Sander 2022-01-15 13:55 31
f8deb5b9 Poul Sander 2022-01-15 13:55 32
TEST(scan_test, read_longlong) {
f8deb5b9 Poul Sander 2022-01-15 13:55 33
  long long n = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 34
  fmt::scan("42", "{}", n);
f8deb5b9 Poul Sander 2022-01-15 13:55 35
  EXPECT_EQ(n, 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 36
  fmt::scan("-42", "{}", n);
f8deb5b9 Poul Sander 2022-01-15 13:55 37
  EXPECT_EQ(n, -42);
f8deb5b9 Poul Sander 2022-01-15 13:55 38
}
f8deb5b9 Poul Sander 2022-01-15 13:55 39
f8deb5b9 Poul Sander 2022-01-15 13:55 40
TEST(scan_test, read_uint) {
f8deb5b9 Poul Sander 2022-01-15 13:55 41
  auto n = unsigned();
f8deb5b9 Poul Sander 2022-01-15 13:55 42
  fmt::scan("42", "{}", n);
f8deb5b9 Poul Sander 2022-01-15 13:55 43
  EXPECT_EQ(n, 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 44
  EXPECT_THROW_MSG(fmt::scan("-42", "{}", n), fmt::format_error,
f8deb5b9 Poul Sander 2022-01-15 13:55 45
                   "invalid input");
f8deb5b9 Poul Sander 2022-01-15 13:55 46
}
f8deb5b9 Poul Sander 2022-01-15 13:55 47
f8deb5b9 Poul Sander 2022-01-15 13:55 48
TEST(scan_test, read_ulonglong) {
f8deb5b9 Poul Sander 2022-01-15 13:55 49
  unsigned long long n = 0;
f8deb5b9 Poul Sander 2022-01-15 13:55 50
  fmt::scan("42", "{}", n);
f8deb5b9 Poul Sander 2022-01-15 13:55 51
  EXPECT_EQ(n, 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 52
  EXPECT_THROW_MSG(fmt::scan("-42", "{}", n), fmt::format_error,
f8deb5b9 Poul Sander 2022-01-15 13:55 53
                   "invalid input");
f8deb5b9 Poul Sander 2022-01-15 13:55 54
}
f8deb5b9 Poul Sander 2022-01-15 13:55 55
f8deb5b9 Poul Sander 2022-01-15 13:55 56
TEST(scan_test, read_string) {
f8deb5b9 Poul Sander 2022-01-15 13:55 57
  auto s = std::string();
f8deb5b9 Poul Sander 2022-01-15 13:55 58
  fmt::scan("foo", "{}", s);
f8deb5b9 Poul Sander 2022-01-15 13:55 59
  EXPECT_EQ(s, "foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 60
}
f8deb5b9 Poul Sander 2022-01-15 13:55 61
f8deb5b9 Poul Sander 2022-01-15 13:55 62
TEST(scan_test, read_string_view) {
f8deb5b9 Poul Sander 2022-01-15 13:55 63
  auto s = fmt::string_view();
f8deb5b9 Poul Sander 2022-01-15 13:55 64
  fmt::scan("foo", "{}", s);
f8deb5b9 Poul Sander 2022-01-15 13:55 65
  EXPECT_EQ(s, "foo");
f8deb5b9 Poul Sander 2022-01-15 13:55 66
}
f8deb5b9 Poul Sander 2022-01-15 13:55 67
f8deb5b9 Poul Sander 2022-01-15 13:55 68
#ifndef _WIN32
f8deb5b9 Poul Sander 2022-01-15 13:55 69
namespace fmt {
f8deb5b9 Poul Sander 2022-01-15 13:55 70
template <> struct scanner<tm> {
f8deb5b9 Poul Sander 2022-01-15 13:55 71
  std::string format;
f8deb5b9 Poul Sander 2022-01-15 13:55 72
f8deb5b9 Poul Sander 2022-01-15 13:55 73
  scan_parse_context::iterator parse(scan_parse_context& ctx) {
f8deb5b9 Poul Sander 2022-01-15 13:55 74
    auto it = ctx.begin();
f8deb5b9 Poul Sander 2022-01-15 13:55 75
    if (it != ctx.end() && *it == ':') ++it;
f8deb5b9 Poul Sander 2022-01-15 13:55 76
    auto end = it;
f8deb5b9 Poul Sander 2022-01-15 13:55 77
    while (end != ctx.end() && *end != '}') ++end;
f8deb5b9 Poul Sander 2022-01-15 13:55 78
    format.reserve(detail::to_unsigned(end - it + 1));
f8deb5b9 Poul Sander 2022-01-15 13:55 79
    format.append(it, end);
f8deb5b9 Poul Sander 2022-01-15 13:55 80
    format.push_back('\0');
f8deb5b9 Poul Sander 2022-01-15 13:55 81
    return end;
f8deb5b9 Poul Sander 2022-01-15 13:55 82
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 83
f8deb5b9 Poul Sander 2022-01-15 13:55 84
  template <class ScanContext>
f8deb5b9 Poul Sander 2022-01-15 13:55 85
  typename ScanContext::iterator scan(tm& t, ScanContext& ctx) {
f8deb5b9 Poul Sander 2022-01-15 13:55 86
    auto result = strptime(ctx.begin(), format.c_str(), &t);
f8deb5b9 Poul Sander 2022-01-15 13:55 87
    if (!result) throw format_error("failed to parse time");
f8deb5b9 Poul Sander 2022-01-15 13:55 88
    return result;
f8deb5b9 Poul Sander 2022-01-15 13:55 89
  }
f8deb5b9 Poul Sander 2022-01-15 13:55 90
};
f8deb5b9 Poul Sander 2022-01-15 13:55 91
}  // namespace fmt
f8deb5b9 Poul Sander 2022-01-15 13:55 92
f8deb5b9 Poul Sander 2022-01-15 13:55 93
TEST(scan_test, read_custom) {
f8deb5b9 Poul Sander 2022-01-15 13:55 94
  auto input = "Date: 1985-10-25";
f8deb5b9 Poul Sander 2022-01-15 13:55 95
  auto t = tm();
f8deb5b9 Poul Sander 2022-01-15 13:55 96
  fmt::scan(input, "Date: {0:%Y-%m-%d}", t);
f8deb5b9 Poul Sander 2022-01-15 13:55 97
  EXPECT_EQ(t.tm_year, 85);
f8deb5b9 Poul Sander 2022-01-15 13:55 98
  EXPECT_EQ(t.tm_mon, 9);
f8deb5b9 Poul Sander 2022-01-15 13:55 99
  EXPECT_EQ(t.tm_mday, 25);
f8deb5b9 Poul Sander 2022-01-15 13:55 100
}
f8deb5b9 Poul Sander 2022-01-15 13:55 101
#endif
f8deb5b9 Poul Sander 2022-01-15 13:55 102
f8deb5b9 Poul Sander 2022-01-15 13:55 103
TEST(scan_test, invalid_format) {
f8deb5b9 Poul Sander 2022-01-15 13:55 104
  EXPECT_THROW_MSG(fmt::scan("", "{}"), fmt::format_error,
f8deb5b9 Poul Sander 2022-01-15 13:55 105
                   "argument index out of range");
f8deb5b9 Poul Sander 2022-01-15 13:55 106
  EXPECT_THROW_MSG(fmt::scan("", "{"), fmt::format_error,
f8deb5b9 Poul Sander 2022-01-15 13:55 107
                   "invalid format string");
f8deb5b9 Poul Sander 2022-01-15 13:55 108
}
f8deb5b9 Poul Sander 2022-01-15 13:55 109
f8deb5b9 Poul Sander 2022-01-15 13:55 110
TEST(scan_test, example) {
f8deb5b9 Poul Sander 2022-01-15 13:55 111
  auto key = std::string();
f8deb5b9 Poul Sander 2022-01-15 13:55 112
  auto value = int();
f8deb5b9 Poul Sander 2022-01-15 13:55 113
  fmt::scan("answer = 42", "{} = {}", key, value);
f8deb5b9 Poul Sander 2022-01-15 13:55 114
  EXPECT_EQ(key, "answer");
f8deb5b9 Poul Sander 2022-01-15 13:55 115
  EXPECT_EQ(value, 42);
f8deb5b9 Poul Sander 2022-01-15 13:55 116
}
1970-01-01 00:00 117