• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include "util_test.h"
2 
3 #include "flatbuffers/util.h"
4 #include "test_assert.h"
5 
6 namespace flatbuffers {
7 namespace tests {
8 namespace {
9 
10 template<typename T>
NumericUtilsTestInteger(const char * lower,const char * upper)11 void 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 
24 template<typename T>
NumericUtilsTestFloat(const char * lower,const char * upper)25 void 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 
NumericUtilsTest()37 void 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 
IsAsciiUtilsTest()47 void 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 
UtilConvertCase()61 void 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
176