1#include "util_test.h"
2
3#include "flatbuffers/util.h"
4#include "test_assert.h"
5
6namespace flatbuffers {
7namespace tests {
8namespace {
9
10template<typename T>
11void NumericUtilsTestInteger(const char *lower, const char *upper) {
12 T x;
13 TEST_EQ(flatbuffers::StringToNumber("1q", &x), false);
14 TEST_EQ(x, 0);
15 TEST_EQ(flatbuffers::StringToNumber(upper, &x), false);
16 TEST_EQ(x, flatbuffers::numeric_limits<T>::max());
17 TEST_EQ(flatbuffers::StringToNumber(lower, &x), false);
18 auto expval = flatbuffers::is_unsigned<T>::value
19 ? flatbuffers::numeric_limits<T>::max()
20 : flatbuffers::numeric_limits<T>::lowest();
21 TEST_EQ(x, expval);
22}
23
24template<typename T>
25void NumericUtilsTestFloat(const char *lower, const char *upper) {
26 T f;
27 TEST_EQ(flatbuffers::StringToNumber("", &f), false);
28 TEST_EQ(flatbuffers::StringToNumber("1q", &f), false);
29 TEST_EQ(f, 0);
30 TEST_EQ(flatbuffers::StringToNumber(upper, &f), true);
31 TEST_EQ(f, +flatbuffers::numeric_limits<T>::infinity());
32 TEST_EQ(flatbuffers::StringToNumber(lower, &f), true);
33 TEST_EQ(f, -flatbuffers::numeric_limits<T>::infinity());
34}
35} // namespace
36
37void NumericUtilsTest() {
38 NumericUtilsTestInteger<uint64_t>("-1", "18446744073709551616");
39 NumericUtilsTestInteger<uint8_t>("-1", "256");
40 NumericUtilsTestInteger<int64_t>("-9223372036854775809",
41 "9223372036854775808");
42 NumericUtilsTestInteger<int8_t>("-129", "128");
43 NumericUtilsTestFloat<float>("-3.4029e+38", "+3.4029e+38");
44 NumericUtilsTestFloat<float>("-1.7977e+308", "+1.7977e+308");
45}
46
47void IsAsciiUtilsTest() {
48 char c = -128;
49 for (int cnt = 0; cnt < 256; cnt++) {
50 auto alpha = (('a' <= c) && (c <= 'z')) || (('A' <= c) && (c <= 'Z'));
51 auto dec = (('0' <= c) && (c <= '9'));
52 auto hex = (('a' <= c) && (c <= 'f')) || (('A' <= c) && (c <= 'F'));
53 TEST_EQ(flatbuffers::is_alpha(c), alpha);
54 TEST_EQ(flatbuffers::is_alnum(c), alpha || dec);
55 TEST_EQ(flatbuffers::is_digit(c), dec);
56 TEST_EQ(flatbuffers::is_xdigit(c), dec || hex);
57 c += 1;
58 }
59}
60
61void UtilConvertCase() {
62 {
63 struct TestCase {
64 std::string input;
65 flatbuffers::Case output_case;
66 std::string expected_output;
67 };
68
69 std::vector<TestCase> cases;
70
71 // Tests for the common cases
72 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kUpperCamel,
73 "TheQuickBrownFox" });
74 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kLowerCamel,
75 "theQuickBrownFox" });
76 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kSnake,
77 "the_quick_brown_fox" });
78 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kScreamingSnake,
79 "THE_QUICK_BROWN_FOX" });
80 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kAllLower,
81 "the_quick_brown_fox" });
82 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kAllUpper,
83 "THE_QUICK_BROWN_FOX" });
84 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kUnknown,
85 "the_quick_brown_fox" });
86 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kKeep,
87 "the_quick_brown_fox" });
88 cases.push_back({ "the_quick_brown_fox", flatbuffers::Case::kSnake2,
89 "the_quick_brown_fox" });
90
91 // Tests for some snake_cases where the _ is oddly placed or
92 // missing.
93 cases.push_back({ "single", flatbuffers::Case::kUpperCamel, "Single" });
94 cases.push_back({ "Single", flatbuffers::Case::kUpperCamel, "Single" });
95 cases.push_back({ "_leading", flatbuffers::Case::kUpperCamel, "_Leading" });
96 cases.push_back(
97 { "trailing_", flatbuffers::Case::kUpperCamel, "Trailing_" });
98 cases.push_back({ "double__underscore", flatbuffers::Case::kUpperCamel,
99 "Double_underscore" });
100 cases.push_back({ "single", flatbuffers::Case::kLowerCamel, "single" });
101 cases.push_back({ "Single", flatbuffers::Case::kLowerCamel, "single" });
102 cases.push_back({ "_leading", flatbuffers::Case::kLowerCamel, "_Leading" });
103 cases.push_back(
104 { "trailing_", flatbuffers::Case::kLowerCamel, "trailing_" });
105 cases.push_back({ "double__underscore", flatbuffers::Case::kLowerCamel,
106 "double_underscore" });
107
108 // Tests for some output snake_cases
109 cases.push_back({ "single", flatbuffers::Case::kSnake, "single" });
110 cases.push_back({ "single", flatbuffers::Case::kScreamingSnake, "SINGLE" });
111 cases.push_back(
112 { "_leading", flatbuffers::Case::kScreamingSnake, "_LEADING" });
113 cases.push_back(
114 { "trailing_", flatbuffers::Case::kScreamingSnake, "TRAILING_" });
115 cases.push_back({ "double__underscore", flatbuffers::Case::kScreamingSnake,
116 "DOUBLE__UNDERSCORE" });
117
118 for (auto &test_case : cases) {
119 TEST_EQ(test_case.expected_output,
120 flatbuffers::ConvertCase(test_case.input, test_case.output_case));
121 }
122 }
123
124 // Tests for the non snake_case inputs.
125 {
126 struct TestCase {
127 flatbuffers::Case input_case;
128 std::string input;
129 flatbuffers::Case output_case;
130 std::string expected_output;
131 };
132
133 std::vector<TestCase> cases;
134
135 cases.push_back({ flatbuffers::Case::kUpperCamel, "TheQuickBrownFox",
136 flatbuffers::Case::kSnake, "the_quick_brown_fox" });
137 cases.push_back({ flatbuffers::Case::kLowerCamel, "theQuickBrownFox",
138 flatbuffers::Case::kSnake, "the_quick_brown_fox" });
139 cases.push_back({ flatbuffers::Case::kSnake, "the_quick_brown_fox",
140 flatbuffers::Case::kSnake, "the_quick_brown_fox" });
141 cases.push_back({ flatbuffers::Case::kScreamingSnake, "THE_QUICK_BROWN_FOX",
142 flatbuffers::Case::kSnake, "THE_QUICK_BROWN_FOX" });
143 cases.push_back({ flatbuffers::Case::kAllUpper, "SINGLE",
144 flatbuffers::Case::kSnake, "SINGLE" });
145 cases.push_back({ flatbuffers::Case::kAllLower, "single",
146 flatbuffers::Case::kSnake, "single" });
147 cases.push_back({ flatbuffers::Case::kUpperCamel, "ABCtest",
148 flatbuffers::Case::kSnake, "abctest" });
149 cases.push_back({ flatbuffers::Case::kUpperCamel, "tHe_qUiCk_BrOwN_fOx",
150 flatbuffers::Case::kKeep, "tHe_qUiCk_BrOwN_fOx" });
151 cases.push_back({ flatbuffers::Case::kLowerCamel, "theQuick12345Fox",
152 flatbuffers::Case::kSnake, "the_quick_12345_fox" });
153 cases.push_back({ flatbuffers::Case::kLowerCamel, "a12b34c45",
154 flatbuffers::Case::kSnake, "a_12b_34c_45" });
155 cases.push_back({ flatbuffers::Case::kLowerCamel, "a12b34c45",
156 flatbuffers::Case::kSnake2, "a12_b34_c45" });
157 cases.push_back({ flatbuffers::Case::kUpperCamel, "Int32Stamped",
158 flatbuffers::Case::kSnake, "int_32_stamped" });
159 cases.push_back({ flatbuffers::Case::kUpperCamel, "101DogsTest",
160 flatbuffers::Case::kSnake, "101_dogs_test" });
161 cases.push_back({ flatbuffers::Case::kUpperCamel, "Int32Stamped",
162 flatbuffers::Case::kScreamingSnake, "INT_32_STAMPED" });
163 cases.push_back({ flatbuffers::Case::kUpperCamel, "101DogsTest",
164 flatbuffers::Case::kScreamingSnake, "101_DOGS_TEST" });
165
166 for (auto &test_case : cases) {
167 TEST_EQ(test_case.expected_output,
168 flatbuffers::ConvertCase(test_case.input, test_case.output_case,
169 test_case.input_case));
170 }
171 }
172}
173
174} // namespace tests
175} // namespace flatbuffers
View as plain text