Advertisement
kirbyfan64sos

tst.c

Feb 12th, 2016
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 26.45 KB | None | 0 0
  1. /* Any copyright is dedicated to the Public Domain.
  2.    http://creativecommons.org/publicdomain/zero/1.0/ */
  3.  
  4. #include <libcut.h>
  5. #include "rejit.h"
  6.  
  7. LIBCUT_TEST(test_tokenize) {
  8.     rejit_parse_error err;
  9.     err.kind = RJ_PE_NONE;
  10.     err.pos = 0;
  11.     char s[] = "A(bC)*+?[abc]d\\+|e\\2";
  12.     rejit_token_list tokens = rejit_tokenize(s, &err);
  13.     LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  14.  
  15.     LIBCUT_TEST_EQ(tokens.len, 12);
  16.  
  17.     LIBCUT_TEST_EQ(tokens.tokens[0].kind, RJ_TWORD);
  18.     LIBCUT_TEST_EQ(tokens.tokens[0].pos, (char*)s);
  19.     LIBCUT_TEST_EQ(tokens.tokens[0].len, 1);
  20.  
  21.     LIBCUT_TEST_EQ(tokens.tokens[1].kind, RJ_TLP);
  22.     LIBCUT_TEST_EQ(tokens.tokens[1].pos, s+1);
  23.     LIBCUT_TEST_EQ(tokens.tokens[1].len, 1);
  24.  
  25.     LIBCUT_TEST_EQ(tokens.tokens[2].kind, RJ_TWORD);
  26.     LIBCUT_TEST_EQ(tokens.tokens[2].pos, s+2);
  27.     LIBCUT_TEST_EQ(tokens.tokens[2].len, 2);
  28.  
  29.     LIBCUT_TEST_EQ(tokens.tokens[3].kind, RJ_TRP);
  30.     LIBCUT_TEST_EQ(tokens.tokens[3].pos, s+4);
  31.     LIBCUT_TEST_EQ(tokens.tokens[3].len, 1);
  32.  
  33.     LIBCUT_TEST_EQ(tokens.tokens[4].kind, RJ_TSTAR);
  34.     LIBCUT_TEST_EQ(tokens.tokens[4].pos, s+5);
  35.     LIBCUT_TEST_EQ(tokens.tokens[4].len, 1);
  36.  
  37.     LIBCUT_TEST_EQ(tokens.tokens[5].kind, RJ_TPLUS);
  38.     LIBCUT_TEST_EQ(tokens.tokens[5].pos, s+6);
  39.     LIBCUT_TEST_EQ(tokens.tokens[5].len, 1);
  40.  
  41.     LIBCUT_TEST_EQ(tokens.tokens[6].kind, RJ_TQ);
  42.     LIBCUT_TEST_EQ(tokens.tokens[6].pos, s+7);
  43.     LIBCUT_TEST_EQ(tokens.tokens[6].len, 1);
  44.  
  45.     LIBCUT_TEST_EQ(tokens.tokens[7].kind, RJ_TSET);
  46.     LIBCUT_TEST_EQ(tokens.tokens[7].pos, s+8);
  47.     LIBCUT_TEST_EQ(tokens.tokens[7].len, 5);
  48.  
  49.     LIBCUT_TEST_EQ(tokens.tokens[8].kind, RJ_TWORD);
  50.     LIBCUT_TEST_EQ(tokens.tokens[8].pos, s+13);
  51.     LIBCUT_TEST_EQ(tokens.tokens[8].len, 3);
  52.  
  53.     LIBCUT_TEST_EQ(tokens.tokens[9].kind, RJ_TP);
  54.     LIBCUT_TEST_EQ(tokens.tokens[9].pos, s+16);
  55.     LIBCUT_TEST_EQ(tokens.tokens[9].len, 1);
  56.  
  57.     LIBCUT_TEST_EQ(tokens.tokens[10].kind, RJ_TWORD);
  58.     LIBCUT_TEST_EQ(tokens.tokens[10].pos, s+17);
  59.     LIBCUT_TEST_EQ(tokens.tokens[10].len, 1);
  60.  
  61.     LIBCUT_TEST_EQ(tokens.tokens[11].kind, RJ_TBACK);
  62.     LIBCUT_TEST_EQ(tokens.tokens[11].pos, s+18);
  63.     LIBCUT_TEST_EQ(tokens.tokens[11].len, 2);
  64. }
  65.  
  66. #define PARSE(s) res = rejit_parse(s, &err); LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  67.  
  68. LIBCUT_TEST(test_parse_word) {
  69.     rejit_parse_error err;
  70.     rejit_parse_result res;
  71.     PARSE("ab")
  72.  
  73.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IWORD);
  74.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value, "ab");
  75.  
  76.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_INULL);
  77. }
  78.  
  79. LIBCUT_TEST(test_parse_suffix) {
  80.     rejit_parse_error err;
  81.     rejit_parse_result res;
  82.     PARSE("ab+")
  83.  
  84.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IPLUS);
  85.  
  86.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IWORD);
  87.     LIBCUT_TEST_STREQ((char*)res.instrs[1].value, "ab");
  88.  
  89.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_INULL);
  90.  
  91.     PARSE("ab+?")
  92.  
  93.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IMPLUS);
  94.  
  95.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IWORD);
  96.     LIBCUT_TEST_STREQ((char*)res.instrs[1].value, "ab");
  97.  
  98.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_INULL);
  99.  
  100.     PARSE("a(?:b?)")
  101.  
  102.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IWORD);
  103.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value, "a");
  104.  
  105.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IGROUP);
  106.     LIBCUT_TEST_EQ((void*)res.instrs[1].value, (void*)&res.instrs[4]);
  107.  
  108.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_IOPT);
  109.  
  110.     LIBCUT_TEST_EQ(res.instrs[3].kind, RJ_IWORD);
  111.     LIBCUT_TEST_STREQ((char*)res.instrs[3].value, "b");
  112.  
  113.     LIBCUT_TEST_EQ(res.instrs[4].kind, RJ_INULL);
  114.  
  115.     rejit_parse("+", &err);
  116.     LIBCUT_TEST_EQ(err.kind, RJ_PE_SYNTAX);
  117.     LIBCUT_TEST_EQ(err.pos, 0);
  118. }
  119.  
  120. LIBCUT_TEST(test_parse_group) {
  121.     rejit_parse_error err;
  122.     rejit_parse_result res;
  123.     PARSE("(ab?)")
  124.  
  125.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_ICGROUP);
  126.     LIBCUT_TEST_EQ((void*)res.instrs[0].value, (void*)&res.instrs[3]);
  127.  
  128.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IOPT);
  129.  
  130.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_IWORD);
  131.     LIBCUT_TEST_STREQ((char*)res.instrs[2].value, "ab");
  132.  
  133.     LIBCUT_TEST_EQ(res.instrs[3].kind, RJ_INULL);
  134.  
  135.     PARSE("(?:ab?)")
  136.  
  137.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IGROUP);
  138.     LIBCUT_TEST_EQ((void*)res.instrs[0].value, (void*)&res.instrs[3]);
  139.  
  140.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IOPT);
  141.  
  142.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_IWORD);
  143.     LIBCUT_TEST_STREQ((char*)res.instrs[2].value, "ab");
  144.  
  145.     LIBCUT_TEST_EQ(res.instrs[3].kind, RJ_INULL);
  146.  
  147.     rejit_parse("((a)", &err);
  148.     LIBCUT_TEST_EQ(err.kind, RJ_PE_UBOUND);
  149.     LIBCUT_TEST_EQ(err.pos, 4);
  150.  
  151.     rejit_parse("(a))b", &err);
  152.     LIBCUT_TEST_EQ(err.kind, RJ_PE_UBOUND);
  153.     LIBCUT_TEST_EQ(err.pos, 3);
  154. }
  155.  
  156. LIBCUT_TEST(test_parse_set) {
  157.     rejit_parse_error err;
  158.     rejit_parse_result res;
  159.  
  160.     PARSE("[abc]")
  161.  
  162.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_ISET);
  163.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value, "abc");
  164.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value+4, "   ");
  165.  
  166.     PARSE("[^abc]")
  167.  
  168.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_INSET);
  169.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value, "abc");
  170.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value+4, "   ");
  171.  
  172.     PARSE("[a-z0-9]")
  173.  
  174.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_ISET);
  175.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value,
  176.                       "abcdefghijklmnopqrstuvwxyz0123456789");
  177.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value+37,
  178.                       "                                    ");
  179.  
  180.     PARSE("[^a-z0-9]")
  181.  
  182.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_INSET);
  183.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value,
  184.                       "abcdefghijklmnopqrstuvwxyz0123456789");
  185.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value+37,
  186.                       "                                    ");
  187.  
  188.     rejit_parse("[abc", &err);
  189.     LIBCUT_TEST_EQ(err.kind, RJ_PE_UBOUND);
  190.     LIBCUT_TEST_EQ(err.pos, 0);
  191.  
  192.     rejit_parse("[z-a]", &err);
  193.     LIBCUT_TEST_EQ(err.kind, RJ_PE_RANGE);
  194.     LIBCUT_TEST_EQ(err.pos, 2);
  195. }
  196.  
  197. LIBCUT_TEST(test_parse_pipe) {
  198.     rejit_parse_error err;
  199.     rejit_parse_result res;
  200.  
  201.     PARSE("a|b")
  202.  
  203.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IOR);
  204.     LIBCUT_TEST_EQ(res.instrs[0].value, (intptr_t)&res.instrs[2]);
  205.     LIBCUT_TEST_EQ(res.instrs[0].value2, (intptr_t)&res.instrs[3]);
  206.  
  207.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IWORD);
  208.     LIBCUT_TEST_STREQ((char*)res.instrs[1].value, "a");
  209.  
  210.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_IWORD);
  211.     LIBCUT_TEST_STREQ((char*)res.instrs[2].value, "b");
  212.  
  213.     LIBCUT_TEST_EQ(res.instrs[3].kind, RJ_INULL);
  214.  
  215.     PARSE("a|(b|c)")
  216.  
  217.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IOR);
  218.     LIBCUT_TEST_EQ((void*)res.instrs[0].value, (void*)&res.instrs[2]);
  219.     LIBCUT_TEST_EQ((void*)res.instrs[0].value2, (void*)&res.instrs[6]);
  220.  
  221.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IWORD);
  222.     LIBCUT_TEST_STREQ((char*)res.instrs[1].value, "a");
  223.  
  224.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_ICGROUP);
  225.     LIBCUT_TEST_EQ((void*)res.instrs[2].value, (void*)&res.instrs[6]);
  226.  
  227.     LIBCUT_TEST_EQ(res.instrs[3].kind, RJ_IOR);
  228.     LIBCUT_TEST_EQ((void*)res.instrs[3].value, (void*)&res.instrs[5]);
  229.     LIBCUT_TEST_EQ((void*)res.instrs[3].value2, (void*)&res.instrs[6]);
  230.  
  231.     LIBCUT_TEST_EQ(res.instrs[4].kind, RJ_IWORD);
  232.     LIBCUT_TEST_STREQ((char*)res.instrs[4].value, "b");
  233.  
  234.     LIBCUT_TEST_EQ(res.instrs[5].kind, RJ_IWORD);
  235.     LIBCUT_TEST_STREQ((char*)res.instrs[5].value, "c");
  236.  
  237.     LIBCUT_TEST_EQ(res.instrs[6].kind, RJ_INULL);
  238. }
  239.  
  240. LIBCUT_TEST(test_parse_lookahead) {
  241.     rejit_parse_error err;
  242.     rejit_parse_result res;
  243.  
  244.     PARSE("(?=ab)")
  245.  
  246.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_ILAHEAD);
  247.     LIBCUT_TEST_EQ((void*)res.instrs[0].value, (void*)&res.instrs[2]);
  248.  
  249.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IWORD);
  250.     LIBCUT_TEST_STREQ((char*)res.instrs[1].value, "ab");
  251.  
  252.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_INULL);
  253.  
  254.     PARSE("(?!ab)")
  255.  
  256.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_INLAHEAD);
  257.     LIBCUT_TEST_EQ((void*)res.instrs[0].value, (void*)&res.instrs[2]);
  258.  
  259.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IWORD);
  260.     LIBCUT_TEST_STREQ((char*)res.instrs[1].value, "ab");
  261.  
  262.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_INULL);
  263. }
  264.  
  265. LIBCUT_TEST(test_parse_other) {
  266.     rejit_parse_error err;
  267.     rejit_parse_result res;
  268.  
  269.     PARSE("^a.b$")
  270.  
  271.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IBEGIN);
  272.  
  273.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IWORD);
  274.     LIBCUT_TEST_STREQ((char*)res.instrs[1].value, "a");
  275.  
  276.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_IDOT);
  277.  
  278.     LIBCUT_TEST_EQ(res.instrs[3].kind, RJ_IWORD);
  279.     LIBCUT_TEST_STREQ((char*)res.instrs[3].value, "b");
  280.  
  281.     LIBCUT_TEST_EQ(res.instrs[4].kind, RJ_IEND);
  282.  
  283.     LIBCUT_TEST_EQ(res.instrs[5].kind, RJ_INULL);
  284.  
  285.     PARSE("a\\1\\5b")
  286.  
  287.     LIBCUT_TEST_EQ(res.instrs[0].kind, RJ_IWORD);
  288.     LIBCUT_TEST_STREQ((char*)res.instrs[0].value, "a");
  289.  
  290.     LIBCUT_TEST_EQ(res.instrs[1].kind, RJ_IBACK);
  291.     LIBCUT_TEST_EQ(res.instrs[1].value, 0);
  292.  
  293.     LIBCUT_TEST_EQ(res.instrs[2].kind, RJ_IBACK);
  294.     LIBCUT_TEST_EQ(res.instrs[2].value, 4);
  295.  
  296.     LIBCUT_TEST_EQ(res.instrs[3].kind, RJ_IWORD);
  297.     LIBCUT_TEST_STREQ((char*)res.instrs[3].value, "b");
  298.  
  299.     LIBCUT_TEST_EQ(res.instrs[4].kind, RJ_INULL);
  300. }
  301.  
  302. LIBCUT_TEST(test_chr) {
  303.     // ca
  304.     rejit_instruction instrs[] = {{RJ_IWORD, (intptr_t)"ca"}, {RJ_INULL}};
  305.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  306.     LIBCUT_TEST_EQ(rejit_match(m, "ca", NULL), 2);
  307.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  308.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), -1);
  309.     LIBCUT_TEST_EQ(rejit_match(m, "cb", NULL), -1);
  310.     LIBCUT_TEST_EQ(rejit_match(m, "ab", NULL), -1);
  311. }
  312.  
  313. LIBCUT_TEST(test_dot) {
  314.     // .
  315.     rejit_instruction instrs[] = {{RJ_IDOT}, {RJ_INULL}};
  316.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  317.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), 1);
  318.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  319.     LIBCUT_TEST_EQ(rejit_match(m, "\n", NULL), -1);
  320.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  321. }
  322.  
  323. LIBCUT_TEST(test_plus) {
  324.     // c+
  325.     rejit_instruction instrs[] = {{RJ_IPLUS}, {RJ_IWORD, (intptr_t)"c"},
  326.                                   {RJ_INULL}};
  327.     instrs[0].value = (intptr_t)&instrs[1];
  328.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  329.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), 1);
  330.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), -1);
  331.     LIBCUT_TEST_EQ(rejit_match(m, "cc", NULL), 2);
  332. }
  333.  
  334. LIBCUT_TEST(test_star) {
  335.     // c*
  336.     rejit_instruction instrs[] = {{RJ_ISTAR}, {RJ_IWORD, (intptr_t)"c"},
  337.                                   {RJ_INULL}};
  338.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  339.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), 1);
  340.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 0);
  341.     LIBCUT_TEST_EQ(rejit_match(m, "cc", NULL), 2);
  342.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  343. }
  344.  
  345. LIBCUT_TEST(test_opt) {
  346.     // ac?$
  347.     rejit_instruction instrs[] = {{RJ_IWORD, (intptr_t)"a"}, {RJ_IOPT},
  348.                                   {RJ_IWORD, (intptr_t)"c"}, {RJ_IEND},
  349.                                   {RJ_INULL}};
  350.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  351.     LIBCUT_TEST_EQ(rejit_match(m, "ac", NULL), 2);
  352.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  353.     LIBCUT_TEST_EQ(rejit_match(m, "g", NULL), -1);
  354.     LIBCUT_TEST_EQ(rejit_match(m, "acc", NULL), -1);
  355. }
  356.  
  357. LIBCUT_TEST(test_begin) {
  358.     // c*^
  359.     rejit_instruction instrs[] = {{RJ_ISTAR}, {RJ_IWORD, (intptr_t)"c"},
  360.                                   {RJ_IBEGIN}, {RJ_INULL}};
  361.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  362.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  363.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), -1);
  364. }
  365.  
  366. LIBCUT_TEST(test_end) {
  367.     // $
  368.     rejit_instruction instrs[] = {{RJ_IEND}, {RJ_INULL}};
  369.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  370.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  371.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), -1);
  372. }
  373.  
  374. LIBCUT_TEST(test_set) {
  375.     // [xyz]
  376.     char s[] = "\txyz\0    ";
  377.     rejit_instruction instrs[] = {{RJ_ISET, (intptr_t)s}, {RJ_INULL}};
  378.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  379.     LIBCUT_TEST_EQ(rejit_match(m, "\t", NULL), 1);
  380.     LIBCUT_TEST_EQ(rejit_match(m, "x", NULL), 1);
  381.     LIBCUT_TEST_EQ(rejit_match(m, "y", NULL), 1);
  382.     LIBCUT_TEST_EQ(rejit_match(m, "z", NULL), 1);
  383.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), -1);
  384.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  385. }
  386.  
  387. LIBCUT_TEST(test_nset) {
  388.     // [^xyz]
  389.     char s[] = "\txyz\0    ";
  390.     rejit_instruction instrs[] = {{RJ_INSET, (intptr_t)s}, {RJ_INULL}};
  391.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  392.     LIBCUT_TEST_EQ(rejit_match(m, "\t", NULL), -1);
  393.     LIBCUT_TEST_EQ(rejit_match(m, "x", NULL), -1);
  394.     LIBCUT_TEST_EQ(rejit_match(m, "y", NULL), -1);
  395.     LIBCUT_TEST_EQ(rejit_match(m, "z", NULL), -1);
  396.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  397.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  398. }
  399.  
  400. LIBCUT_TEST(test_or) {
  401.     // a|b
  402.     rejit_instruction instrs[] = {{RJ_IOR}, {RJ_IWORD, (intptr_t)"a"},
  403.                                   {RJ_IWORD, (intptr_t)"b"}, {RJ_INULL}};
  404.     instrs[0].value = (intptr_t)&instrs[2];
  405.     instrs[0].value2 = (intptr_t)&instrs[3];
  406.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  407.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  408.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), 1);
  409.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  410. }
  411.  
  412. LIBCUT_TEST(test_group) {
  413.     // (a)
  414.     rejit_instruction instrs[] = {{RJ_IGROUP}, {RJ_IWORD, (intptr_t)"a"},
  415.                                   {RJ_INULL}};
  416.     instrs[0].value = (intptr_t)&instrs[2];
  417.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  418.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  419.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  420. }
  421.  
  422. LIBCUT_TEST(test_cgroup) {
  423.     // (a(b)?)
  424.     rejit_group groups[2];
  425.     const char str1[] = "a", str2[] = "ab";
  426.     rejit_instruction instrs[] = {{RJ_ICGROUP, 0, 0}, {RJ_IWORD, (intptr_t)"a"},
  427.                                   {RJ_IOPT}, {RJ_ICGROUP, 0, 1},
  428.                                   {RJ_IWORD, (intptr_t)"b"}, {RJ_INULL}};
  429.     instrs[0].value = instrs[3].value = (intptr_t)&instrs[5];
  430.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  431.  
  432.     memset(groups, 0, sizeof(groups));
  433.     LIBCUT_TEST_EQ(rejit_match(m, str1, groups), 1);
  434.     LIBCUT_TEST_EQ(groups[0].begin, (char*)str1);
  435.     LIBCUT_TEST_EQ(groups[0].end, str1+1);
  436.     LIBCUT_TEST_EQ(groups[1].begin, NULL);
  437.     LIBCUT_TEST_EQ(groups[1].end, NULL);
  438.  
  439.     memset(groups, 0, sizeof(groups));
  440.     LIBCUT_TEST_EQ(rejit_match(m, str2, groups), 2);
  441.     LIBCUT_TEST_EQ(groups[0].begin, (char*)str2);
  442.     LIBCUT_TEST_EQ(groups[0].end, str2+2);
  443.     LIBCUT_TEST_EQ(groups[1].begin, str2+1);
  444.     LIBCUT_TEST_EQ(groups[1].end, str2+2);
  445.  
  446.     memset(groups, 0, sizeof(groups));
  447.     LIBCUT_TEST_EQ(rejit_match(m, "", groups), -1);
  448.     LIBCUT_TEST_EQ(groups[0].begin, NULL);
  449.     LIBCUT_TEST_EQ(groups[0].end, NULL);
  450.     LIBCUT_TEST_EQ(groups[1].begin, NULL);
  451.     LIBCUT_TEST_EQ(groups[1].end, NULL);
  452. }
  453.  
  454. LIBCUT_TEST(test_opt_group) {
  455.     // (ab)?
  456.     rejit_instruction instrs[] = {{RJ_IOPT}, {RJ_IGROUP},
  457.                                   {RJ_IWORD, (intptr_t)"ab"}, {RJ_INULL}};
  458.     instrs[1].value = (intptr_t)&instrs[3];
  459.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  460.     LIBCUT_TEST_EQ(rejit_match(m, "ab", NULL), 2);
  461.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 0);
  462.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), 0);
  463.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  464. }
  465.  
  466. LIBCUT_TEST(test_star_group) {
  467.      // (ab)*
  468.     rejit_instruction instrs[] = {{RJ_ISTAR}, {RJ_IGROUP},
  469.                                   {RJ_IWORD, (intptr_t)"ab"}, {RJ_INULL}};
  470.     instrs[1].value = (intptr_t)&instrs[3];
  471.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  472.     LIBCUT_TEST_EQ(rejit_match(m, "ab", NULL), 2);
  473.     LIBCUT_TEST_EQ(rejit_match(m, "abab", NULL), 4);
  474.     LIBCUT_TEST_EQ(rejit_match(m, "ababab", NULL), 6);
  475.     LIBCUT_TEST_EQ(rejit_match(m, "ababa", NULL), 4);
  476.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 0);
  477.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  478. }
  479.  
  480. LIBCUT_TEST(test_plus_group) {
  481.     // (ab)+
  482.     rejit_instruction instrs[] = {{RJ_IPLUS}, {RJ_IGROUP},
  483.                                   {RJ_IWORD, (intptr_t)"ab"}, {RJ_INULL}};
  484.     instrs[1].value = (intptr_t)&instrs[3];
  485.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  486.     LIBCUT_TEST_EQ(rejit_match(m, "ab", NULL), 2);
  487.     LIBCUT_TEST_EQ(rejit_match(m, "abab", NULL), 4);
  488.     LIBCUT_TEST_EQ(rejit_match(m, "ababab", NULL), 6);
  489.     LIBCUT_TEST_EQ(rejit_match(m, "ababa", NULL), 4);
  490.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), -1);
  491.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  492. }
  493.  
  494. LIBCUT_TEST(test_lookahead) {
  495.     // (?=ab)a(bc)?
  496.     rejit_instruction instrs[] = {{RJ_ILAHEAD}, {RJ_IWORD, (intptr_t)"ab"},
  497.                                   {RJ_IWORD, (intptr_t)"a"}, {RJ_IOPT},
  498.                                   {RJ_IGROUP}, {RJ_IWORD, (intptr_t)"bc"},
  499.                                   {RJ_INULL}};
  500.     instrs[0].value = (intptr_t)&instrs[2];
  501.     instrs[4].value = (intptr_t)&instrs[6];
  502.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  503.     LIBCUT_TEST_EQ(rejit_match(m, "ab", NULL), 1);
  504.     LIBCUT_TEST_EQ(rejit_match(m, "abc", NULL), 3);
  505.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), -1);
  506.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  507. }
  508.  
  509. LIBCUT_TEST(test_negative_lookahead) {
  510.     // (?!ab)[ab]*
  511.     const char s[] = "ab\0  ";
  512.     rejit_instruction instrs[] = {{RJ_INLAHEAD}, {RJ_IWORD, (intptr_t)"ab"},
  513.                                   {RJ_ISTAR}, {RJ_ISET, (intptr_t)s}, {RJ_INULL}};
  514.     instrs[0].value = (intptr_t)&instrs[2];
  515.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  516.     LIBCUT_TEST_EQ(rejit_match(m, "bb", NULL), 2);
  517.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  518.     LIBCUT_TEST_EQ(rejit_match(m, "aa", NULL), 2);
  519.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  520.     LIBCUT_TEST_EQ(rejit_match(m, "ab", NULL), -1);
  521. }
  522.  
  523. LIBCUT_TEST(test_mplus) {
  524.     // .+?b
  525.     rejit_instruction instrs[] = {{RJ_IMPLUS}, {RJ_IDOT},
  526.                                   {RJ_IWORD, (intptr_t)"b"}, {RJ_INULL}};
  527.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  528.     LIBCUT_TEST_EQ(rejit_match(m, "abcb", NULL), 2);
  529.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), -1);
  530.     LIBCUT_TEST_EQ(rejit_match(m, "abb", NULL), 2);
  531.     LIBCUT_TEST_EQ(rejit_match(m, "bb", NULL), 2);
  532. }
  533.  
  534. LIBCUT_TEST(test_mstar) {
  535.     // .*?b
  536.     rejit_instruction instrs[] = {{RJ_IMSTAR}, {RJ_IDOT},
  537.                                   {RJ_IWORD, (intptr_t)"b"}, {RJ_INULL}};
  538.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  539.     LIBCUT_TEST_EQ(rejit_match(m, "abcb", NULL), 2);
  540.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), 1);
  541.     LIBCUT_TEST_EQ(rejit_match(m, "abb", NULL), 2);
  542.     LIBCUT_TEST_EQ(rejit_match(m, "bb", NULL), 1);
  543. }
  544.  
  545. LIBCUT_TEST(test_or_mixed) {
  546.     // (b|a*)
  547.     rejit_instruction instrs[] = {{RJ_IOR}, {RJ_IWORD, (intptr_t)"b"}, {RJ_ISTAR},
  548.                                   {RJ_IWORD, (intptr_t)"a"}, {RJ_INULL}};
  549.     instrs[0].value = (intptr_t)&instrs[2];
  550.     instrs[0].value2 = (intptr_t)&instrs[4];
  551.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  552.     LIBCUT_TEST_EQ(rejit_match(m, "aaaa", NULL), 4);
  553.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), 1);
  554.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), 0);
  555. }
  556.  
  557. LIBCUT_TEST(test_search) {
  558.     // a
  559.     rejit_instruction instrs[] = {{RJ_IWORD, (intptr_t)"a"}, {RJ_INULL}};
  560.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  561.     const char* tgt;
  562.     LIBCUT_TEST_EQ(rejit_search(m, "abc", &tgt, NULL), 1);
  563.     LIBCUT_TEST_EQ(*tgt, 'c');
  564.     LIBCUT_TEST_EQ(rejit_search(m, "babc", &tgt, NULL), 1);
  565.     LIBCUT_TEST_EQ(*tgt, 'c');
  566.     tgt = NULL;
  567.     LIBCUT_TEST_EQ(rejit_search(m, "b", &tgt, NULL), -1);
  568.     LIBCUT_TEST_EQ((void*)tgt, NULL);
  569. }
  570.  
  571. LIBCUT_TEST(test_set_and_dot) {
  572.     // [abc].
  573.     char s[] = "abc\0   ";
  574.     rejit_instruction instrs[] = {{RJ_ISET, (intptr_t)s}, {RJ_IDOT},
  575.                                   {RJ_INULL}};
  576.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  577.     LIBCUT_TEST_EQ(rejit_match(m, "ad", NULL), 2);
  578.     LIBCUT_TEST_EQ(rejit_match(m, "bd", NULL), 2);
  579.     LIBCUT_TEST_EQ(rejit_match(m, "cd", NULL), 2);
  580.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), -1);
  581.     LIBCUT_TEST_EQ(rejit_match(m, "c\n", NULL), -1);
  582.     LIBCUT_TEST_EQ(rejit_match(m, "\n", NULL), -1);
  583.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  584. }
  585.  
  586. LIBCUT_TEST(test_or_group) {
  587.     // (ab)|c
  588.     rejit_instruction instrs[] = {{RJ_IOR}, {RJ_IGROUP},
  589.                                   {RJ_IWORD, (intptr_t)"ab"},
  590.                                   {RJ_IWORD, (intptr_t)"c"}, {RJ_INULL}};
  591.     instrs[0].value = instrs[1].value = (intptr_t)&instrs[3];
  592.     instrs[0].value2 = (intptr_t)&instrs[4];
  593.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  594.     LIBCUT_TEST_EQ(rejit_match(m, "ab", NULL), 2);
  595.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), 1);
  596.     LIBCUT_TEST_EQ(rejit_match(m, "ac", NULL), -1);
  597.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), -1);
  598.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), -1);
  599. }
  600.  
  601. LIBCUT_TEST(test_back) {
  602.     // (abc)d\1e
  603.     rejit_instruction instrs[] = {{RJ_ICGROUP}, {RJ_IWORD, (intptr_t)"abc"},
  604.                                   {RJ_IWORD, (intptr_t)"d"}, {RJ_IBACK, 0},
  605.                                   {RJ_IWORD, (intptr_t)"e"}};
  606.     rejit_group group;
  607.     instrs[0].value = (intptr_t)&instrs[2];
  608.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FNONE);
  609.     LIBCUT_TEST_EQ(rejit_match(m, "abcdabce", &group), 8);
  610.     LIBCUT_TEST_EQ(rejit_match(m, "abcdabe", &group), -1);
  611.     LIBCUT_TEST_EQ(rejit_match(m, "abdabe", &group), -1);
  612.     LIBCUT_TEST_EQ(rejit_match(m, "abdabce", &group), -1);
  613.     LIBCUT_TEST_EQ(rejit_match(m, "abcdabc", &group), -1);
  614. }
  615.  
  616. LIBCUT_TEST(test_dotall) {
  617.     rejit_instruction instrs[] = {{RJ_IDOT}, {RJ_INULL}};
  618.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FDOTALL);
  619.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  620.     LIBCUT_TEST_EQ(rejit_match(m, "\n", NULL), 1);
  621.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  622. }
  623.  
  624. LIBCUT_TEST(test_icase_word) {
  625.     rejit_instruction instrs[] = {{RJ_IWORD, (intptr_t)"aBCd"}, {RJ_INULL}};
  626.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FICASE);
  627.     LIBCUT_TEST_EQ(rejit_match(m, "abcd", NULL), 4);
  628.     LIBCUT_TEST_EQ(rejit_match(m, "Abcd", NULL), 4);
  629.     LIBCUT_TEST_EQ(rejit_match(m, "aBcd", NULL), 4);
  630.     LIBCUT_TEST_EQ(rejit_match(m, "abCd", NULL), 4);
  631.     LIBCUT_TEST_EQ(rejit_match(m, "abcD", NULL), 4);
  632.     LIBCUT_TEST_EQ(rejit_match(m, "ABCD", NULL), 4);
  633.     LIBCUT_TEST_EQ(rejit_match(m, "AbCd", NULL), 4);
  634.     LIBCUT_TEST_EQ(rejit_match(m, "aBcD", NULL), 4);
  635.     LIBCUT_TEST_EQ(rejit_match(m, "ABCd", NULL), 4);
  636.     LIBCUT_TEST_EQ(rejit_match(m, "abcD", NULL), 4);
  637.     LIBCUT_TEST_EQ(rejit_match(m, "abcf", NULL), -1);
  638.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  639. }
  640.  
  641. LIBCUT_TEST(test_icase_set) {
  642.     char s[] = "abcd\0    ";
  643.     rejit_instruction instrs[] = {{RJ_ISET, (intptr_t)s}, {RJ_INULL}};
  644.     rejit_matcher m = rejit_compile_instrs(instrs, 0, RJ_FICASE);
  645.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  646.     LIBCUT_TEST_EQ(rejit_match(m, "A", NULL), 1);
  647.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), 1);
  648.     LIBCUT_TEST_EQ(rejit_match(m, "B", NULL), 1);
  649.     LIBCUT_TEST_EQ(rejit_match(m, "c", NULL), 1);
  650.     LIBCUT_TEST_EQ(rejit_match(m, "C", NULL), 1);
  651.     LIBCUT_TEST_EQ(rejit_match(m, "d", NULL), 1);
  652.     LIBCUT_TEST_EQ(rejit_match(m, "D", NULL), 1);
  653. }
  654.  
  655. LIBCUT_TEST(test_misc) {
  656.     rejit_matcher m;
  657.     rejit_parse_error err;
  658.     rejit_group group;
  659.  
  660.     group.begin = group.end = NULL;
  661.  
  662.     m = rejit_parse_compile("[Oo]rgani[sz]ation", &err, RJ_FNONE);
  663.     LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  664.     LIBCUT_TEST_EQ(rejit_match(m, "Organization", NULL), 12);
  665.     LIBCUT_TEST_EQ(rejit_match(m, "Organisation", NULL), 12);
  666.     LIBCUT_TEST_EQ(rejit_match(m, "organization", NULL), 12);
  667.     LIBCUT_TEST_EQ(rejit_match(m, "organisation", NULL), 12);
  668.     LIBCUT_TEST_EQ(rejit_match(m, "organizatio", NULL), -1);
  669.  
  670.     m = rejit_parse_compile("hono(?:u)?r(?:able)?", &err, RJ_FNONE);
  671.     LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  672.     LIBCUT_TEST_EQ(rejit_match(m, "honor", NULL), 5);
  673.     LIBCUT_TEST_EQ(rejit_match(m, "honour", NULL), 6);
  674.     LIBCUT_TEST_EQ(rejit_match(m, "honorable", NULL), 9);
  675.     LIBCUT_TEST_EQ(rejit_match(m, "honourable", NULL), 10);
  676.  
  677.     m = rejit_parse_compile("a(b)?c", &err, RJ_FNONE);
  678.     LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  679.     LIBCUT_TEST_EQ(m->groups, 1);
  680.     LIBCUT_TEST_EQ(rejit_match(m, "abc", &group), 3);
  681.     LIBCUT_TEST_STREQ(group.begin, "bc");
  682.     LIBCUT_TEST_STREQ(group.end, "c");
  683.     group.begin = group.end = NULL;
  684.     LIBCUT_TEST_EQ(rejit_match(m, "ac", &group), 2);
  685.     LIBCUT_TEST_EQ(group.begin, NULL);
  686.     LIBCUT_TEST_EQ(group.end, NULL);
  687.  
  688.     m = rejit_parse_compile("[ÁÃa]b", &err, RJ_FNONE);
  689.     LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  690.     LIBCUT_TEST_EQ(m->groups, 0);
  691.     LIBCUT_TEST_NE(rejit_match(m, "Áb", NULL), -1);
  692.     LIBCUT_TEST_NE(rejit_match(m, "Ãb", NULL), -1);
  693.     LIBCUT_TEST_NE(rejit_match(m, "ab", NULL), -1);
  694.     LIBCUT_TEST_EQ(rejit_match(m, "Âb", NULL), -1);
  695.     LIBCUT_TEST_EQ(rejit_match(m, "b", NULL), -1);
  696.  
  697.     m = rejit_parse_compile("(?i)a", &err, RJ_FNONE);
  698.     LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  699.     LIBCUT_TEST_EQ(m->groups, 0);
  700.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  701.     LIBCUT_TEST_EQ(rejit_match(m, "A", NULL), 1);
  702.  
  703.     m = rejit_parse_compile("(?s).", &err, RJ_FNONE);
  704.     LIBCUT_TEST_EQ(err.kind, RJ_PE_NONE);
  705.     LIBCUT_TEST_EQ(m->groups, 0);
  706.     LIBCUT_TEST_EQ(rejit_match(m, "a", NULL), 1);
  707.     LIBCUT_TEST_EQ(rejit_match(m, "\n", NULL), 1);
  708.     LIBCUT_TEST_EQ(rejit_match(m, "", NULL), -1);
  709. }
  710.  
  711. LIBCUT_MAIN(
  712.     test_tokenize,
  713.  
  714.     test_parse_word, test_parse_suffix, test_parse_group, test_parse_set,
  715.     test_parse_pipe, test_parse_lookahead, test_parse_other,
  716.  
  717.     test_chr, test_dot, test_plus, test_star, test_opt, test_begin, test_end,
  718.     test_set, test_nset, test_or, test_group, test_cgroup, test_opt_group,
  719.     test_star_group, test_plus_group, test_lookahead, test_negative_lookahead,
  720.     test_mplus, test_mstar, test_or_mixed, test_set_and_dot, test_or_group,
  721.     test_back, test_dotall, test_icase_word, test_icase_set,
  722.  
  723.     test_search,
  724.  
  725.     test_misc)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement