diff --git a/src/t_parser.c b/src/t_parser.c index 4b2d5cc0fe3079b99e9fecd61e684e9d0b8cd507..666bc850be2bc3f2b7b2d1704d1cd2643de8ab29 100644 --- a/src/t_parser.c +++ b/src/t_parser.c @@ -482,6 +482,27 @@ static void test_iterative(gconstpointer backend) { g_check_parse_chunks_failed(p, be, "f",1, "uo",2); } +static void test_iterative_lookahead(gconstpointer backend) { + HParserBackend be = (HParserBackend)GPOINTER_TO_INT(backend); + HParser *p; + + // needs 2 lookahead + p = h_sequence(h_ch('f'), h_choice(h_token((uint8_t*)"oo", 2), + h_token((uint8_t*)"ou", 2), NULL), NULL); + if(h_compile(p, be, (void *)2) != 0) { + g_test_message("Compile failed"); + g_test_fail(); + return; + } + + // partial chunk consumed + g_check_parse_chunks_match_(p, "fo",2, "o",1, "(u0x66 <6f.6f>)"); + g_check_parse_chunks_match_(p, "fo",2, "u",1, "(u0x66 <6f.75>)"); + g_check_parse_chunks_failed_(p, "go",2, "o",1); + g_check_parse_chunks_failed_(p, "fa",2, "u",1); + g_check_parse_chunks_failed_(p, "fo",2, "b",1); +} + static void test_ambiguous(gconstpointer backend) { HParser *d_ = h_ch('d'); HParser *p_ = h_ch('+'); @@ -731,6 +752,7 @@ void register_parser_tests(void) { //g_test_add_data_func("/core/parser/llk/leftrec", GINT_TO_POINTER(PB_LLk), test_leftrec); g_test_add_data_func("/core/parser/llk/rightrec", GINT_TO_POINTER(PB_LLk), test_rightrec); g_test_add_data_func("/core/parser/llk/iterative", GINT_TO_POINTER(PB_LLk), test_iterative); + g_test_add_data_func("/core/parser/llk/iterative/lookahead", GINT_TO_POINTER(PB_LLk), test_iterative_lookahead); g_test_add_data_func("/core/parser/regex/token", GINT_TO_POINTER(PB_REGULAR), test_token); g_test_add_data_func("/core/parser/regex/ch", GINT_TO_POINTER(PB_REGULAR), test_ch); diff --git a/src/test_suite.h b/src/test_suite.h index 76f7e878679648cd29c3c600fa723b1291e9638e..49f13cf81c50864eb8ae03ed705f582a7dd1ca0f 100644 --- a/src/test_suite.h +++ b/src/test_suite.h @@ -155,6 +155,10 @@ g_test_fail(); \ break; \ } \ + g_check_parse_chunks_failed_(parser, chunk1, c1_len, chunk2, c2_len); \ + } while(0) + +#define g_check_parse_chunks_failed_(parser, chunk1, c1_len, chunk2, c2_len) do { \ HSuspendedParser *s = h_parse_start(parser); \ if(!s) { \ g_test_message("Chunk-wise parsing not available"); \ @@ -177,6 +181,10 @@ g_test_fail(); \ break; \ } \ + g_check_parse_chunks_match_(parser, chunk1, c1_len, chunk2, c2_len, result); \ + } while(0) + +#define g_check_parse_chunks_match_(parser, chunk1, c1_len, chunk2, c2_len, result) do { \ HSuspendedParser *s = h_parse_start(parser); \ if(!s) { \ g_test_message("Chunk-wise parsing not available"); \