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