char-fork/llama.cpp
git clone https://git.t4t.associates/char-fork/llama.cpp
451ef0843
char/aliceai-t5-moe
1#include "peg-parser.h" 2#include "tests.h" 3 4void test_basic (testing & t ) { 5t .test ("chars" , [](testing & t ) { 6// Test common escape sequences - newline 7t .test ("escape_sequence_newline" , [](testing & t ) { 8auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[\\n\\t\\\\]" ); }); 9 10common_peg_parse_context ctx ; 11common_peg_parse_result result ; 12 13ctx = common_peg_parse_context ("\n" ); 14result = common_chat_combinator_parser .parse (ctx ); 15t .assert_equal ("escape_sequence_newline" , true,result .success ()); 16 }); 17 18// Test common escape sequences - tab 19t .test ("escape_sequence_tab" , [](testing & t ) { 20auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[\\n\\t\\\\]" ); }); 21 22common_peg_parse_context ctx ; 23common_peg_parse_result result ; 24 25ctx = common_peg_parse_context ("\t" ); 26result = common_chat_combinator_parser .parse (ctx ); 27t .assert_equal ("escape_sequence_tab" , true,result .success ()); 28 }); 29 30// Test common escape sequences - backslash 31t .test ("escape_sequence_backslash" , [](testing & t ) { 32auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[\\n\\t\\\\]" ); }); 33 34common_peg_parse_context ctx ; 35common_peg_parse_result result ; 36 37ctx = common_peg_parse_context ("\\" ); 38result = common_chat_combinator_parser .parse (ctx ); 39t .assert_equal ("escape_sequence_backslash" , true,result .success ()); 40 }); 41 42// Test common escape sequences - space (should ()) 43t .test ("escape_sequence_space_fail" , [](testing & t ) { 44auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[\\n\\t\\\\]" ); }); 45 46common_peg_parse_context ctx ; 47common_peg_parse_result result ; 48 49ctx = common_peg_parse_context (" " ); 50result = common_chat_combinator_parser .parse (ctx ); 51t .assert_equal ("escape_sequence_space_fail" , true,result .fail ()); 52 }); 53 54// Test escaped dash - 'a' should succeed 55t .test ("escaped_dash_a" , [](testing & t ) { 56auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[a\\-z]" ); }); 57 58common_peg_parse_context ctx ; 59common_peg_parse_result result ; 60 61ctx = common_peg_parse_context ("a" ); 62result = common_chat_combinator_parser .parse (ctx ); 63t .assert_equal ("escaped_dash_a" , true,result .success ()); 64 }); 65 66// Test escaped dash - '-' should succeed (literal dash) 67t .test ("escaped_dash_literal" , [](testing & t ) { 68auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[a\\-z]" ); }); 69 70common_peg_parse_context ctx ; 71common_peg_parse_result result ; 72 73ctx = common_peg_parse_context ("-" ); 74result = common_chat_combinator_parser .parse (ctx ); 75t .assert_equal ("escaped_dash_literal" , true,result .success ()); 76 }); 77 78// Test escaped dash - 'z' should succeed 79t .test ("escaped_dash_z" , [](testing & t ) { 80auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[a\\-z]" ); }); 81 82common_peg_parse_context ctx ; 83common_peg_parse_result result ; 84 85ctx = common_peg_parse_context ("z" ); 86result = common_chat_combinator_parser .parse (ctx ); 87t .assert_equal ("escaped_dash_z" , true,result .success ()); 88 }); 89 90// Test escaped dash - 'b' should NOT match (since \- is literal dash, not range) 91t .test ("escaped_dash_b_fail" , [](testing & t ) { 92auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("[a\\-z]" ); }); 93 94common_peg_parse_context ctx ; 95common_peg_parse_result result ; 96 97ctx = common_peg_parse_context ("b" ); 98result = common_chat_combinator_parser .parse (ctx ); 99t .assert_equal ("escaped_dash_b_fail" , true,result .fail ()); 100 }); 101 }); 102 103 104t .test ("optional" , [](testing & t ) { 105// Full match with optional part present 106t .test ("optional_present" , [](testing & t ) { 107auto parser = build_peg_parser ([](common_peg_parser_builder & p ) { 108return p .literal ("hello" )+ p .optional (p .literal (" world" )); 109 }); 110 111auto ctx = common_peg_parse_context ("hello world" ); 112auto result = parser .parse (ctx ); 113t .assert_equal ("optional_present" , true,result .success ()); 114t .assert_equal ("optional_present_end" ,11u ,result .end ); 115 }); 116 117// Full match with optional part absent 118t .test ("optional_absent" , [](testing & t ) { 119auto parser = build_peg_parser ([](common_peg_parser_builder & p ) { 120return p .literal ("hello" )+ p .optional (p .literal (" world" )); 121 }); 122 123auto ctx = common_peg_parse_context ("hello" ); 124auto result = parser .parse (ctx ); 125t .assert_equal ("optional_absent" , true,result .success ()); 126t .assert_equal ("optional_absent_end" ,5u ,result .end ); 127 }); 128 129// Partial match - waiting for more input to determine if optional matches 130t .test ("partial_match_need_more" , [](testing & t ) { 131auto parser = build_peg_parser ([](common_peg_parser_builder & p ) { 132return p .literal ("hello" )+ p .optional (p .literal (" world" )); 133 }); 134 135auto ctx = common_peg_parse_context ("hello " ,COMMON_PEG_PARSE_FLAG_LENIENT ); 136auto result = parser .parse (ctx ); 137t .assert_equal ("partial_match_need_more" , true,result .need_more_input ()); 138 }); 139 }); 140 141t .test ("partial parsing" , [](testing & t ) { 142// Literals - Basic Success 143t .test ("literal_success" , [& ](testing & t ) { 144auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("hello" ); }); 145 146common_peg_parse_context ctx ; 147common_peg_parse_result result ; 148 149ctx = common_peg_parse_context ("hello" ); 150result = parser .parse (ctx ); 151t .assert_equal ("literal_success" , true,result .success ()); 152 }); 153 154// Char Classes - Basic Lowercase Success 155t .test ("char_class_lowercase_success" , [& ](testing & t ) { 156auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("a-z" ); }); 157 158common_peg_parse_context ctx ; 159common_peg_parse_result result ; 160 161ctx = common_peg_parse_context ("a" ); 162result = parser .parse (ctx ); 163t .assert_equal ("char_class_lowercase_success" , true,result .success ()); 164 }); 165 166// Char Classes - Uppercase Fail 167t .test ("char_class_uppercase_fail" , [& ](testing & t ) { 168auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("a-z" ); }); 169 170common_peg_parse_context ctx ; 171common_peg_parse_result result ; 172 173ctx = common_peg_parse_context ("A" ); 174result = parser .parse (ctx ); 175t .assert_equal ("char_class_uppercase_fail" , true,result .fail ()); 176 }); 177 178// Char Classes with Dash - Lowercase Success 179t .test ("char_class_with_dash_lowercase" , [& ](testing & t ) { 180auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("a-z-" ); }); 181 182common_peg_parse_context ctx ; 183common_peg_parse_result result ; 184 185ctx = common_peg_parse_context ("f" ); 186result = parser .parse (ctx ); 187t .assert_equal ("char_class_with_dash_lowercase" , true,result .success ()); 188 }); 189 190// Char Classes with Dash - Literal Dash Success 191t .test ("char_class_with_dash_literal_dash" , [& ](testing & t ) { 192auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("a-z-" ); }); 193 194common_peg_parse_context ctx ; 195common_peg_parse_result result ; 196 197ctx = common_peg_parse_context ("-" ); 198result = parser .parse (ctx ); 199t .assert_equal ("char_class_with_dash_literal_dash" , true,result .success ()); 200 }); 201 202// Char Classes with Dash - Uppercase Fail 203t .test ("char_class_with_dash_uppercase_fail" , [& ](testing & t ) { 204auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .chars ("a-z-" ); }); 205 206common_peg_parse_context ctx ; 207common_peg_parse_result result ; 208 209ctx = common_peg_parse_context ("A" ); 210result = parser .parse (ctx ); 211t .assert_equal ("char_class_with_dash_uppercase_fail" , true,result .fail ()); 212 }); 213 214// Sequences - Partial Match 1 215t .test ("sequence_partial_match_1" , [& ](testing & t ) { 216auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("<think>" )+ p .literal ("</think>" ); }); 217 218auto ctx = common_peg_parse_context ("<thi" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 219auto result = parser .parse (ctx ); 220t .assert_equal ("sequence_partial_match_1" , true,result .need_more_input ()); 221 }); 222 223// Sequences - Partial Match 2 224t .test ("sequence_partial_match_2" , [& ](testing & t ) { 225auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("begin" )+ p .literal ("end" ); }); 226 227auto ctx = common_peg_parse_context ("begin" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 228auto result = parser .parse (ctx ); 229t .assert_equal ("sequence_partial_match_2" , true,result .need_more_input ()); 230 }); 231 232// Sequences - Partial Match 3 233t .test ("sequence_partial_match_3" , [& ](testing & t ) { 234auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("<think>" )+ p .literal ("</think>" ); }); 235 236auto ctx = common_peg_parse_context ("<think></" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 237auto result = parser .parse (ctx ); 238t .assert_equal ("sequence_partial_match_3" , true,result .need_more_input ()); 239 }); 240 241// Sequences - Full Match 242t .test ("sequence_full_match" , [& ](testing & t ) { 243auto common_chat_combinator_parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("hello" )+ p .literal ("world" ); }); 244 245auto ctx = common_peg_parse_context ("helloworld" ); 246auto result = common_chat_combinator_parser .parse (ctx ); 247t .assert_equal ("sequence_full_match" , true,result .success ()); 248 }); 249 250// Sequences - No Match 251t .test ("sequence_no_match" , [& ](testing & t ) { 252auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("<think>" )+ p .literal ("</think>" ); }); 253 254auto ctx = common_peg_parse_context ("<think>I am common_chat_combinator_parser" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 255auto result = parser .parse (ctx ); 256t .assert_equal ("sequence_no_match" , true,result .fail ()); 257 }); 258 259// Choices - Partial Match 1 260t .test ("choices_partial_match_1" , [& ](testing & t ) { 261auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("option1" ) |p .literal ("option2" ); }); 262 263auto ctx = common_peg_parse_context ("opt" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 264auto result = parser .parse (ctx ); 265t .assert_equal ("choices_partial_match_1" , true,result .need_more_input ()); 266 }); 267 268// Choices - Partial Match 2 269t .test ("choices_partial_match_2" , [& ](testing & t ) { 270auto parser = 271build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("choice_a" ) |p .literal ("choice_b" ); }); 272 273auto ctx = common_peg_parse_context ("choice" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 274auto result = parser .parse (ctx ); 275t .assert_equal ("choices_partial_match_2" , true,result .need_more_input ()); 276 }); 277 278// Choices - Full Match 1 279t .test ("choices_full_match_1" , [& ](testing & t ) { 280auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("first" ) |p .literal ("second" ); }); 281 282auto ctx = common_peg_parse_context ("first" ); 283auto result = parser .parse (ctx ); 284t .assert_equal ("choices_full_match_1" , true,result .success ()); 285 }); 286 287// Choices - Full Match 2 288t .test ("choices_full_match_2" , [& ](testing & t ) { 289auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("alpha" ) |p .literal ("beta" ); }); 290 291auto ctx = common_peg_parse_context ("beta" ); 292auto result = parser .parse (ctx ); 293t .assert_equal ("choices_full_match_2" , true,result .success ()); 294 }); 295 296// Choices - No Match 297t .test ("choices_no_match" , [& ](testing & t ) { 298auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .literal ("good" ) |p .literal ("better" ); }); 299 300auto ctx = common_peg_parse_context ("best" ); 301auto result = parser .parse (ctx ); 302t .assert_equal ("choices_no_match" , true,result .fail ()); 303 }); 304 305// Zero or More - Partial Match 1 306t .test ("zero_or_more_partial_match_1" , [& ](testing & t ) { 307auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .zero_or_more (p .literal ("ab" )); }); 308 309auto ctx = common_peg_parse_context ("a" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 310auto result = parser .parse (ctx ); 311t .assert_equal ("zero_or_more_partial_match_1" , true,result .need_more_input ()); 312 }); 313 314// Zero or More - Partial Match 2 315t .test ("zero_or_more_partial_match_2" , [& ](testing & t ) { 316auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .zero_or_more (p .literal ("xy" )); }); 317 318auto ctx = common_peg_parse_context ("xyx" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 319auto result = parser .parse (ctx ); 320t .assert_equal ("zero_or_more_partial_match_2" , true,result .need_more_input ()); 321 }); 322 323// Zero or More - Full Match 324t .test ("zero_or_more_full_match" , [& ](testing & t ) { 325auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .zero_or_more (p .literal ("test" )); }); 326 327auto ctx = common_peg_parse_context ("test" ); 328auto result = parser .parse (ctx ); 329t .assert_equal ("zero_or_more_full_match" , true,result .success ()); 330 }); 331 332// One or More - Partial Match 1 333t .test ("one_or_more_partial_match_1" , [& ](testing & t ) { 334auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .one_or_more (p .literal ("repeat" )); }); 335 336auto ctx = common_peg_parse_context ("rep" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 337auto result = parser .parse (ctx ); 338t .assert_equal ("one_or_more_partial_match_1" , true,result .need_more_input ()); 339 }); 340 341// One or More - Partial Match 2 342t .test ("one_or_more_partial_match_2" , [& ](testing & t ) { 343auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .one_or_more (p .literal ("ab" )); }); 344 345auto ctx = common_peg_parse_context ("aba" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 346auto result = parser .parse (ctx ); 347t .assert_equal ("one_or_more_partial_match_2" , true,result .need_more_input ()); 348 }); 349 350// One or More - Full Match 351t .test ("one_or_more_full_match" , [& ](testing & t ) { 352auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .one_or_more (p .literal ("single" )); }); 353 354auto ctx = common_peg_parse_context ("single" ); 355auto result = parser .parse (ctx ); 356t .assert_equal ("one_or_more_full_match" , true,result .success ()); 357 }); 358 359// One or More - No Match 360t .test ("one_or_more_no_match" , [& ](testing & t ) { 361auto parser = build_peg_parser ([](common_peg_parser_builder & p ) {return p .one_or_more (p .literal ("()" )); }); 362 363auto ctx = common_peg_parse_context ("success" ); 364auto result = parser .parse (ctx ); 365t .assert_equal ("one_or_more_no_match" , true,result .fail ()); 366 }); 367 }); 368 369 370t .test ("recursive rules" , [](testing & t ) { 371// Test simple number 372t .test ("simple_number" , [](testing & t ) { 373auto value_parser = build_peg_parser ([](common_peg_parser_builder & p ) { 374p .rule ("number" ,p .chars ("0-9" )); 375p .rule ("list" ,p .literal ("[" )+ p .ref ("value" )+ p .literal ("]" )); 376return p .rule ("value" ,p .ref ("number" ) |p .ref ("list" )); 377 }); 378 379common_peg_parse_context ctx ("1" ); 380auto result = value_parser .parse (ctx ); 381 382t .assert_equal ("result_is_success" , true,result .success ()); 383 }); 384 385// Test simple list 386t .test ("simple_list" , [](testing & t ) { 387auto value_parser = build_peg_parser ([](common_peg_parser_builder & p ) { 388p .rule ("number" ,p .chars ("0-9" )); 389p .rule ("list" ,p .literal ("[" )+ p .ref ("value" )+ p .literal ("]" )); 390return p .rule ("value" ,p .ref ("number" ) |p .ref ("list" )); 391 }); 392 393common_peg_parse_context ctx ("[1]" ); 394auto result = value_parser .parse (ctx ); 395 396t .assert_equal ("result_is_success" , true,result .success ()); 397 }); 398 399// Test nested list 400t .test ("nested_list" , [](testing & t ) { 401auto value_parser = build_peg_parser ([](common_peg_parser_builder & p ) { 402p .rule ("number" ,p .chars ("0-9" )); 403p .rule ("list" ,p .literal ("[" )+ p .ref ("value" )+ p .literal ("]" )); 404return p .rule ("value" ,p .ref ("number" ) |p .ref ("list" )); 405 }); 406 407common_peg_parse_context ctx ("[[2]]" ); 408auto result = value_parser .parse (ctx ); 409 410t .assert_equal ("result_is_success" , true,result .success ()); 411 }); 412 413// Test deeply nested list 414t .test ("deeply_nested_list" , [](testing & t ) { 415auto value_parser = build_peg_parser ([](common_peg_parser_builder & p ) { 416p .rule ("number" ,p .chars ("0-9" )); 417p .rule ("list" ,p .literal ("[" )+ p .ref ("value" )+ p .literal ("]" )); 418return p .rule ("value" ,p .ref ("number" ) |p .ref ("list" )); 419 }); 420 421common_peg_parse_context ctx ("[[[3]]]" ); 422auto result = value_parser .parse (ctx ); 423 424t .assert_equal ("result_is_success" , true,result .success ()); 425 }); 426 427// Test need_more_input match 428t .test ("need_more_input_match" , [](testing & t ) { 429auto value_parser = build_peg_parser ([](common_peg_parser_builder & p ) { 430p .rule ("number" ,p .chars ("0-9" )); 431p .rule ("list" ,p .literal ("[" )+ p .ref ("value" )+ p .literal ("]" )); 432return p .rule ("value" ,p .ref ("number" ) |p .ref ("list" )); 433 }); 434 435common_peg_parse_context ctx ("[[" ,COMMON_PEG_PARSE_FLAG_LENIENT ); 436auto result = value_parser .parse (ctx ); 437 438t .assert_equal ("result_is_need_more_input" , true,result .need_more_input ()); 439 }); 440 441// Test no match 442t .test ("no_match" , [](testing & t ) { 443auto value_parser = build_peg_parser ([](common_peg_parser_builder & p ) { 444p .rule ("number" ,p .chars ("0-9" )); 445p .rule ("list" ,p .literal ("[" )+ p .ref ("value" )+ p .literal ("]" )); 446return p .rule ("value" ,p .ref ("number" ) |p .ref ("list" )); 447 }); 448 449common_peg_parse_context ctx ("[a]" ); 450auto result = value_parser .parse (ctx ); 451 452t .assert_equal ("result_is_fail" , true,result .fail ()); 453 }); 454 455// Test markers 456t .test ("marker" , [](testing & t ) { 457auto bracket_parser = build_peg_parser ([](common_peg_parser_builder & p ) { 458return p .marker (); 459 }); 460 461common_peg_parse_context ctx_square ("[marker]" ); 462common_peg_parse_context ctx_sharp ("<marker>" ); 463 464auto result_square = bracket_parser .parse (ctx_square ); 465auto result_sharp = bracket_parser .parse (ctx_sharp ); 466 467t .assert_true ("result_square_is_success" ,result_square .success ()); 468t .assert_true ("result_sharp_is_success" ,result_sharp .success ()); 469 }); 470 }); 471}