@@ -204,3 +204,90 @@ TEST_CASE(consume_escaped_code_point)
204204 test (" \\ ud83d\\ ude00" sv, 0x1f600 );
205205 test (" \\ ud83d\\ ude00" sv, 0xd83d , false );
206206}
207+
208+ TEST_CASE (consume_decimal_integer_correctly_parses)
209+ {
210+ #define CHECK_PARSES_INTEGER (test, expected, type ) \
211+ do { \
212+ GenericLexer lexer (test##sv); \
213+ auto actual = lexer.consume_decimal_integer <type>(); \
214+ VERIFY (!actual.is_error ()); \
215+ EXPECT_EQ (actual.value (), static_cast <type>(expected)); \
216+ EXPECT_EQ (lexer.tell (), test##sv.length ()); \
217+ } while (false )
218+ CHECK_PARSES_INTEGER (" 0" , 0 , u8 );
219+ CHECK_PARSES_INTEGER (" -0" , -0 , u8 );
220+ CHECK_PARSES_INTEGER (" 10" , 10 , u8 );
221+ CHECK_PARSES_INTEGER (" 255" , 255 , u8 );
222+ CHECK_PARSES_INTEGER (" 0" , 0 , u16 );
223+ CHECK_PARSES_INTEGER (" -0" , -0 , u16 );
224+ CHECK_PARSES_INTEGER (" 1234" , 1234 , u16 );
225+ CHECK_PARSES_INTEGER (" 65535" , 65535 , u16 );
226+ CHECK_PARSES_INTEGER (" 0" , 0 , u32 );
227+ CHECK_PARSES_INTEGER (" -0" , -0 , u32 );
228+ CHECK_PARSES_INTEGER (" 1234" , 1234 , u32 );
229+ CHECK_PARSES_INTEGER (" 4294967295" , 4294967295 , u32 );
230+ CHECK_PARSES_INTEGER (" 0" , 0 , u64 );
231+ CHECK_PARSES_INTEGER (" -0" , -0 , u64 );
232+ CHECK_PARSES_INTEGER (" 1234" , 1234 , u64 );
233+ CHECK_PARSES_INTEGER (" 18446744073709551615" , 18446744073709551615ULL , u64 );
234+ CHECK_PARSES_INTEGER (" 0" , 0 , i8 );
235+ CHECK_PARSES_INTEGER (" -0" , -0 , i8 );
236+ CHECK_PARSES_INTEGER (" 10" , 10 , i8 );
237+ CHECK_PARSES_INTEGER (" -10" , -10 , i8 );
238+ CHECK_PARSES_INTEGER (" 127" , 127 , i8 );
239+ CHECK_PARSES_INTEGER (" -128" , -128 , i8 );
240+ CHECK_PARSES_INTEGER (" 0" , 0 , i16 );
241+ CHECK_PARSES_INTEGER (" -0" , -0 , i16 );
242+ CHECK_PARSES_INTEGER (" 1234" , 1234 , i16 );
243+ CHECK_PARSES_INTEGER (" -1234" , -1234 , i16 );
244+ CHECK_PARSES_INTEGER (" 32767" , 32767 , i16 );
245+ CHECK_PARSES_INTEGER (" -32768" , -32768 , i16 );
246+ CHECK_PARSES_INTEGER (" 0" , 0 , i32 );
247+ CHECK_PARSES_INTEGER (" -0" , -0 , i32 );
248+ CHECK_PARSES_INTEGER (" 1234" , 1234 , i32 );
249+ CHECK_PARSES_INTEGER (" -1234" , -1234 , i32 );
250+ CHECK_PARSES_INTEGER (" 2147483647" , 2147483647 , i32 );
251+ CHECK_PARSES_INTEGER (" -2147483648" , -2147483648 , i32 );
252+ CHECK_PARSES_INTEGER (" 0" , 0 , i64 );
253+ CHECK_PARSES_INTEGER (" -0" , -0 , i64 );
254+ CHECK_PARSES_INTEGER (" 1234" , 1234 , i64 );
255+ CHECK_PARSES_INTEGER (" -1234" , -1234 , i64 );
256+ CHECK_PARSES_INTEGER (" 9223372036854775807" , 9223372036854775807 , i64 );
257+ CHECK_PARSES_INTEGER (" -9223372036854775808" , -9223372036854775808ULL , i64 );
258+ #undef CHECK_PARSES_INTEGER
259+ }
260+
261+ TEST_CASE (consume_decimal_integer_fails_with_correct_error)
262+ {
263+ #define CHECK_FAILS_WITH_ERROR (test, type, err ) \
264+ do { \
265+ GenericLexer lexer (test##sv); \
266+ auto actual = lexer.consume_decimal_integer <type>(); \
267+ VERIFY (actual.is_error () && actual.error ().is_errno ()); \
268+ EXPECT_EQ (actual.error ().code (), err); \
269+ EXPECT_EQ (lexer.tell (), static_cast <size_t >(0 )); \
270+ } while (false )
271+ CHECK_FAILS_WITH_ERROR (" Well hello GenericLexer!" , u64 , EINVAL);
272+ CHECK_FAILS_WITH_ERROR (" +" , u64 , EINVAL);
273+ CHECK_FAILS_WITH_ERROR (" +WHF" , u64 , EINVAL);
274+ CHECK_FAILS_WITH_ERROR (" -WHF" , u64 , EINVAL);
275+ CHECK_FAILS_WITH_ERROR (" -1" , u8 , ERANGE);
276+ CHECK_FAILS_WITH_ERROR (" -100" , u8 , ERANGE);
277+ CHECK_FAILS_WITH_ERROR (" -1" , u16 , ERANGE);
278+ CHECK_FAILS_WITH_ERROR (" -100" , u16 , ERANGE);
279+ CHECK_FAILS_WITH_ERROR (" -1" , u32 , ERANGE);
280+ CHECK_FAILS_WITH_ERROR (" -100" , u32 , ERANGE);
281+ CHECK_FAILS_WITH_ERROR (" -1" , u64 , ERANGE);
282+ CHECK_FAILS_WITH_ERROR (" -100" , u64 , ERANGE);
283+
284+ CHECK_FAILS_WITH_ERROR (" -129" , i8 , ERANGE);
285+ CHECK_FAILS_WITH_ERROR (" 128" , i8 , ERANGE);
286+ CHECK_FAILS_WITH_ERROR (" -32769" , i16 , ERANGE);
287+ CHECK_FAILS_WITH_ERROR (" 32768" , i16 , ERANGE);
288+ CHECK_FAILS_WITH_ERROR (" -2147483649" , i32 , ERANGE);
289+ CHECK_FAILS_WITH_ERROR (" 2147483648" , i32 , ERANGE);
290+ CHECK_FAILS_WITH_ERROR (" -9223372036854775809" , i64 , ERANGE);
291+ CHECK_FAILS_WITH_ERROR (" 9223372036854775808" , i64 , ERANGE);
292+ #undef CHECK_FAILS_WITH_ERROR
293+ }
0 commit comments