Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. """
  2. test case for re module
  3. """
  4.  
  5. import re
  6. import testsuite
  7. SUCCEED, FAIL, SYNTAX_ERROR = range(3)
  8.  
  9. def RAISE():
  10.     raise("testing failed")
  11.  
  12. def main():
  13.     #print("begin re tests")
  14.  
  15.     assert(re.__name__ != None)
  16.     assert(re.__doc__ != None)
  17.     assert(re.__file__ != None)
  18.  
  19.     test_re_obj_search()
  20.     test_re_obj_match()
  21.     test_re_mod_search()
  22.     test_re_mod_match()
  23.     test_re_obj_split()
  24.     test_re_mod_split()
  25.     test_re_obj_findall()
  26.     test_re_mod_findall()
  27.     test_mat_obj_groups()
  28.     test_mat_obj_start()
  29.     test_mat_obj_end()
  30.     test_mat_obj_span()
  31.  
  32.     print("#OK: re tests passed")
  33.  
  34. def test_re_obj_search(verbose = None):
  35.     """
  36.    some tests borrowed from cpython
  37.    testing re.compile(), reobj.search(), and matobj.group()
  38.    """
  39.     regex_tests = testsuite.search_regex_tests
  40.     for t in regex_tests:
  41.         pattern=s=outcome=repl=expected=None
  42.         if len(t)==5:
  43.             pattern, s, outcome, repl, expected = t
  44.         elif len(t)==3:
  45.             pattern, s, outcome = t
  46.         else:
  47.             raise ('Test tuples should have 3 or 5 fields',t)
  48.  
  49.         try:
  50.             obj=re.compile(pattern)
  51.         except:
  52.             if outcome==SYNTAX_ERROR: continue    # Expected a syntax error
  53.             else:
  54.                 # Regex syntax errors aren't yet reported, so for
  55.                 # the official test suite they'll be quietly ignored.
  56.                 pass
  57.         try:
  58.             matobj=obj.search(s)
  59.         except:
  60.             print('=== Unexpected exception:', obj, matobj, pattern, s)
  61.             RAISE()
  62.  
  63.         if outcome==SYNTAX_ERROR:
  64.             # This should have been a syntax error; forget it.
  65.             pass
  66.         elif outcome==FAIL:
  67.             if matobj==None: pass   # No match, as expected
  68.             else: print('=== Succeeded incorrectly', obj, matobj, pattern, s)
  69.         elif outcome==SUCCEED:
  70.             if matobj!=None:
  71.                 # Matched, as expected, so now we compute the
  72.                 # result string and compare it to our expected result.
  73.                 found=matobj.group(0)
  74.                 repl = repl.replace("found", str(found))
  75.                 for i in range(1,11):
  76.                     if "g"+str(i) in repl:
  77.                         gi = str(matobj.group(i))
  78.                         repl = repl.replace("g"+str(i), gi)
  79.                 if len(t) == 5:
  80.                     repl = repl.replace('+', '')
  81.                     repl = repl.replace('\"', '')
  82.                     if repl!=expected:
  83.                         print( '=== grouping error', t,
  84.                                 str(repl)+' should be '+str(expected))
  85.                         RAISE()
  86.             else:
  87.                 print ('=== Failed incorrectly', t)
  88.  
  89. def test_re_obj_match(verbose = None):
  90.     """
  91.    some tests borrowed from cpython
  92.    testing re.compile(), reobj.match() and matobj.group()
  93.    """
  94.     regex_tests = testsuite.match_regex_tests
  95.     for t in regex_tests:
  96.         pattern=s=outcome=repl=expected=None
  97.         if len(t)==5:
  98.             pattern, s, outcome, repl, expected = t
  99.         elif len(t)==3:
  100.             pattern, s, outcome = t
  101.         else:
  102.             raise ('Test tuples should have 3 or 5 fields',t)
  103.  
  104.         try:
  105.             obj=re.compile(pattern)
  106.         except:
  107.             if outcome==SYNTAX_ERROR: continue    # Expected a syntax error
  108.             else:
  109.                 # Regex syntax errors aren't yet reported, so for
  110.                 # the official test suite they'll be quietly ignored.
  111.                 pass
  112.         try:
  113.             matobj=obj.match(s)
  114.         except:
  115.             print('=== Unexpected exception:', obj, matobj, pattern, s)
  116.  
  117.         if outcome==SYNTAX_ERROR:
  118.             # This should have been a syntax error; forget it.
  119.             pass
  120.         elif outcome==FAIL:
  121.             if matobj==None: pass   # No match, as expected
  122.             else: print('=== Succeeded incorrectly', obj, matobj, pattern, s)
  123.         elif outcome==SUCCEED:
  124.             if matobj!=None:
  125.                 # Matched, as expected, so now we compute the
  126.                 # result string and compare it to our expected result.
  127.                 found=matobj.group(0)
  128.                 repl = repl.replace("found", str(found))
  129.                 for i in range(1,11):
  130.                     if "g"+str(i) in repl:
  131.                         gi = str(matobj.group(i))
  132.                         repl = repl.replace("g"+str(i), gi)
  133.                 if len(t) == 5:
  134.                     repl = repl.replace('+', '')
  135.                     repl = repl.replace('\"', '')
  136.                     if repl!=expected:
  137.                         print( '=== grouping error', t,
  138.                                 str(repl)+' should be '+str(expected))
  139.                         RAISE()
  140.             else:
  141.                 print ('=== Failed incorrectly', obj, matobj, pattern, s)
  142.  
  143. def test_re_mod_search(verbose = None):
  144.     """
  145.    some tests borrowed from cpython
  146.    testing re.search(), and matobj.group()
  147.    """
  148.     regex_tests = testsuite.search_regex_tests
  149.     for t in regex_tests:
  150.         pattern=s=outcome=repl=expected=None
  151.         if len(t)==5:
  152.             pattern, s, outcome, repl, expected = t
  153.         elif len(t)==3:
  154.             pattern, s, outcome = t
  155.         else:
  156.             raise ('Test tuples should have 3 or 5 fields',t)
  157.  
  158.         try:
  159.             matobj=re.search(pattern, s)
  160.         except:
  161.             if outcome==SYNTAX_ERROR:
  162.                 # This should have been a syntax error; forget it.
  163.                 pass
  164.             else:
  165.                 print('=== Unexpected exception:', matobj, pattern, s)
  166.  
  167.         if outcome==FAIL:
  168.             if matobj==None: pass   # No match, as expected
  169.             else: print('=== Succeeded incorrectly', obj, matobj, pattern, s)
  170.         elif outcome==SUCCEED:
  171.             if matobj!=None:
  172.                 # Matched, as expected, so now we compute the
  173.                 # result string and compare it to our expected result.
  174.                 found=matobj.group(0)
  175.                 repl = repl.replace("found", str(found))
  176.                 for i in range(1,11):
  177.                     if "g"+str(i) in repl:
  178.                         gi = str(matobj.group(i))
  179.                         repl = repl.replace("g"+str(i), gi)
  180.                 if len(t) == 5:
  181.                     repl = repl.replace('+', '')
  182.                     repl = repl.replace('\"', '')
  183.                     if repl!=expected:
  184.                         print( '=== grouping error', t,
  185.                                 str(repl)+' should be '+str(expected))
  186.                         RAISE()
  187.             else:
  188.                 print ('=== Failed incorrectly', t)
  189.  
  190. def test_re_mod_match(verbose = None):
  191.     """
  192.    some tests borrowed from cpython
  193.    testing re.match(), and matobj.group()
  194.    """
  195.     regex_tests = testsuite.match_regex_tests
  196.     for t in regex_tests:
  197.         pattern=s=outcome=repl=expected=None
  198.         if len(t)==5:
  199.             pattern, s, outcome, repl, expected = t
  200.         elif len(t)==3:
  201.             pattern, s, outcome = t
  202.         else:
  203.             raise ('Test tuples should have 3 or 5 fields',t)
  204.  
  205.         try:
  206.             matobj=re.match(pattern, s)
  207.         except:
  208.             if outcome==SYNTAX_ERROR:
  209.                 # This should have been a syntax error; forget it.
  210.                 pass
  211.             else:
  212.                 print('=== Unexpected exception:', matobj, pattern, s)
  213.  
  214.         if outcome==FAIL:
  215.             if matobj==None: pass   # No match, as expected
  216.             else: print('=== Succeeded incorrectly', matobj, pattern, s)
  217.         elif outcome==SUCCEED:
  218.             if matobj!=None:
  219.                 # Matched, as expected, so now we compute the
  220.                 # result string and compare it to our expected result.
  221.                 found=matobj.group(0)
  222.                 repl = repl.replace("found", str(found))
  223.                 for i in range(1,11):
  224.                     if "g"+str(i) in repl:
  225.                         gi = str(matobj.group(i))
  226.                         repl = repl.replace("g"+str(i), gi)
  227.                 if len(t) == 5:
  228.                     repl = repl.replace('+', '')
  229.                     repl = repl.replace('\"', '')
  230.                     if repl!=expected:
  231.                         print( '=== grouping error', t,
  232.                                 str(repl)+' should be '+str(expected))
  233.                         RAISE()
  234.             else:
  235.                 print ('=== Failed incorrectly', t)
  236.  
  237. def test_re_obj_split(verbose = None):
  238.     """
  239.    test re.compile(), and reobj.split()
  240.    """
  241.     regex_tests = testsuite.split_regex_tests
  242.     for t in regex_tests:
  243.         pattern, s, outcome, maxsplit, fields = t
  244.         try:
  245.             reobj = re.compile(pattern)
  246.         except:
  247.             if outcome==SYNTAX_ERROR:
  248.                 # This should have been a syntax error; forget it.
  249.                 pass
  250.             else:
  251.                 print('=== Unexpected exception:', pattern, s,
  252.                                     outcome, maxsplit, fields)
  253.         try:
  254.             fldlst=reobj.split(s, maxsplit)
  255.         except:
  256.             if outcome == SYNTAX_ERROR:
  257.                 continue
  258.             else:
  259.                 print('=== Unexpected exception:', pattern, s,
  260.                                     outcome, maxsplit, fields)
  261.  
  262.         if outcome==FAIL:
  263.             pass    # No match, as expected
  264.         elif outcome==SUCCEED:
  265.             if fldlst:
  266.                 # Matched, as expected, so now we compute the
  267.                 # result string and compare it to our expected result.
  268.                 if verbose:
  269.                     fldstr = fieldstr = ""
  270.                     for item in fldlst:
  271.                         fldstr = fldstr + str(item) + " | "
  272.                     for item in fields:
  273.                         fieldstr = fieldstr + str(item) + " | "
  274.                     print(fldstr, "~~~", fieldstr)
  275.                 if len(fields) != len(fldlst):
  276.                     print('=== Not coherent 1')
  277.                     RAISE()
  278.  
  279.                 for i in range(len(fields)):
  280.                     if fields[i] != fldlst[i]:
  281.                         if verbose:
  282.                             print('=== Not coherent 2', pattern, s,
  283.                                     outcome, maxsplit, fields, i,
  284.                                     fields[i],'(',len(fields[i]),')', ' | ',
  285.                                     fldlst[i],'(',len(fldlst[i]),')')
  286.                         else:
  287.                             print('=== Not coherent 2')
  288.                         RAISE()
  289.             else:
  290.                 print ('=== Failed incorrectly', pattern, s,
  291.                         outcome, maxsplit, fields)
  292.  
  293. def test_re_mod_split(verbose = None):
  294.     """
  295.    test re.split()
  296.    """
  297.     regex_tests = testsuite.split_regex_tests
  298.     for t in regex_tests:
  299.         pattern, s, outcome, maxsplit, fields = t
  300.         try:
  301.             fldlst=re.split(pattern, s, maxsplit)
  302.         except:
  303.             if outcome==SYNTAX_ERROR:
  304.                 # This should have been a syntax error; forget it.
  305.                 continue
  306.             else:
  307.                 print('=== Unexpected exception:', pattern, s,
  308.                                     outcome, maxsplit, fields)
  309.  
  310.         if outcome==FAIL:
  311.             pass    # No match, as expected
  312.         elif outcome==SUCCEED:
  313.             if fldlst:
  314.                 # Matched, as expected, so now we compute the
  315.                 # result string and compare it to our expected result.
  316.                 if verbose:
  317.                     fldstr = fieldstr = ""
  318.                     for item in fldlst:
  319.                         fldstr = fldstr + str(item) + " | "
  320.                     for item in fields:
  321.                         fieldstr = fieldstr + str(item) + " | "
  322.                     print(fldstr, "~~~", fieldstr)
  323.  
  324.                 if len(fields) != len(fldlst):
  325.                     print('=== Not coherent 1')
  326.                     RAISE()
  327.  
  328.                 for i in range(len(fields)):
  329.                     if fields[i] != fldlst[i]:
  330.                         if verbose:
  331.                             print('=== Not coherent 2', pattern, s,
  332.                                     outcome, maxsplit, fields, i,
  333.                                     fields[i],'(',len(fields[i]),')', ' | ',
  334.                                     fldlst[i],'(',len(fldlst[i]),')')
  335.                         else:
  336.                             print('=== Not coherent 2')
  337.                         RAISE()
  338.             else:
  339.                 print ('=== Failed incorrectly', pattern, s,
  340.                         outcome, maxsplit, fields)
  341.  
  342. def test_re_obj_findall(verbose = None):
  343.     """
  344.    test re.compile(), and reobj.findall()
  345.    """
  346.     regex_tests = testsuite.findall_regex_tests
  347.     for t in regex_tests:
  348.         pattern, s, outcome, pos, fields = t
  349.         try:
  350.             reobj = re.compile(pattern)
  351.         except:
  352.             if outcome==SYNTAX_ERROR:
  353.                 # This should have been a syntax error; forget it.
  354.                 pass
  355.             else:
  356.                 print('=== Unexpected exception:', pattern, s,
  357.                                     outcome, pos, fields)
  358.         try:
  359.             fldlst=reobj.findall(s, pos)
  360.         except:
  361.             if outcome == SYNTAX_ERROR:
  362.                 continue
  363.             else:
  364.                 print('=== Unexpected exception:', pattern, s,
  365.                                     outcome, pos, fields)
  366.  
  367.         if outcome==FAIL:
  368.             pass    # No match, as expected
  369.         elif outcome==SUCCEED:
  370.             if fldlst:
  371.                 # Matched, as expected, so now we compute the
  372.                 # result string and compare it to our expected result.
  373.                 if verbose:
  374.                     fldstr = fieldstr = ""
  375.                     for item in fldlst:
  376.                         fldstr = fldstr + str(item) + " | "
  377.                     for item in fields:
  378.                         fieldstr = fieldstr + str(item) + " | "
  379.                     print(fldstr, "~~~", fieldstr)
  380.  
  381.                 if len(fields) != len(fldlst):
  382.                     print('=== Not coherent 1')
  383.                     RAISE()
  384.  
  385.                 for i in range(len(fields)):
  386.                     if fields[i] != fldlst[i]:
  387.                         if verbose:
  388.                             print('=== Not coherent 2', pattern, s,
  389.                                     outcome, maxsplit, fields, i,
  390.                                     fields[i],'(',len(fields[i]),')', ' | ',
  391.                                     fldlst[i],'(',len(fldlst[i]),')')
  392.                         else:
  393.                             print('=== Not coherent 2')
  394.                         RAISE()
  395.             else:
  396.                 print ('=== Failed incorrectly', pattern, s,
  397.                         outcome, pos, fields)
  398.  
  399. def test_re_mod_findall(verbose = None):
  400.     """
  401.    test re.findall()
  402.    """
  403.     regex_tests = testsuite.mod_findall_regex_tests
  404.     for t in regex_tests:
  405.         pattern, s, outcome, pos, fields = t    # pos is not used
  406.         try:
  407.             fldlst=re.findall(pattern, s)
  408.         except:
  409.             if outcome==SYNTAX_ERROR:
  410.                 # This should have been a syntax error; forget it.
  411.                 continue
  412.             else:
  413.                 print('=== Unexpected exception:', pattern, s,
  414.                                     outcome, pos, fields)
  415.  
  416.         if outcome==FAIL:
  417.             pass    # No match, as expected
  418.         elif outcome==SUCCEED:
  419.             if fldlst:
  420.                 # Matched, as expected, so now we compute the
  421.                 # result string and compare it to our expected result.
  422.                 if verbose:
  423.                     fldstr = fieldstr = ""
  424.                     for item in fldlst:
  425.                         fldstr = fldstr + str(item) + " | "
  426.                     for item in fields:
  427.                         fieldstr = fieldstr + str(item) + " | "
  428.                     print(fldstr, "~~~", fieldstr)
  429.  
  430.                 if len(fields) != len(fldlst):
  431.                     print('=== Not coherent 1')
  432.                     RAISE()
  433.  
  434.                 for i in range(len(fields)):
  435.                     if fields[i] != fldlst[i]:
  436.                         if verbose:
  437.                             print('=== Not coherent 2', pattern, s,
  438.                                     outcome, maxsplit, fields, i,
  439.                                     fields[i],'(',len(fields[i]),')', ' | ',
  440.                                     fldlst[i],'(',len(fldlst[i]),')')
  441.                         else:
  442.                             print('=== Not coherent 2')
  443.                         RAISE()
  444.             else:
  445.                 print ('=== Failed incorrectly', pattern, s,
  446.                         outcome, pos, fields)
  447.  
  448. def test_mat_obj_groups(verbose = None):
  449.     """
  450.    test re.search(), and matobj.groups()
  451.    'verbose' is for debugging, when 'verbose' is true, print extra info
  452.    """
  453.     regex_tests = testsuite.matobj_groups_regex_tests
  454.     for t in regex_tests:
  455.         pattern, s, outcome, fields, grpidx, start, end = t
  456.         try:
  457.             matobj=re.search(pattern, s)
  458.         except:
  459.             if outcome==SYNTAX_ERROR:
  460.                 # This should have been a syntax error; forget it.
  461.                 continue
  462.             else:
  463.                 print('=== Unexpected exception 1:', pattern, s,
  464.                                     outcome,fields)
  465.  
  466.         try:
  467.             if outcome==SUCCEED: assert(matobj != None)
  468.             fldlst = matobj.groups()
  469.         except:
  470.             if outcome==SYNTAX_ERROR:
  471.                 # This should have been a syntax error; forget it.
  472.                 continue
  473.             else:
  474.                 print('=== Unexpected exception 2:', pattern, s,
  475.                                     outcome,fields)
  476.            
  477.         if outcome==FAIL:
  478.             pass    # No match, as expected
  479.         elif outcome==SUCCEED:
  480.             if fldlst and fields:
  481.                 # Matched, as expected, so now we compute the
  482.                 # result string and compare it to our expected result.
  483.                 if verbose:
  484.                     fldstr = fieldstr = ""
  485.                     for item in fldlst:
  486.                         fldstr = fldstr + str(item) + " | "
  487.                     for item in fields:
  488.                         fieldstr = fieldstr + str(item) + " | "
  489.                     print(fldstr, "~~~", fieldstr)
  490.  
  491.                 if len(fields) != len(fldlst):
  492.                     print('=== Not coherent 2')
  493.                     RAISE()
  494.  
  495.                 for i in range(len(fields)):
  496.                     if fields[i] != fldlst[i]:
  497.                         if verbose:
  498.                             print('=== Not coherent', pattern, s,
  499.                                     outcome,fields, i,
  500.                                     fields[i],'(',len(fields[i]),')', ' | ',
  501.                                     fldlst[i],'(',len(fldlst[i]),')')
  502.                         else:
  503.                             print('=== Not coherent')
  504.                         RAISE()
  505.             elif not len(fldlst) and not len(fields):
  506.                 # output is empty, as expected
  507.                 if verbose:
  508.                     print("output is empty, as expected")
  509.                 continue
  510.             else:
  511.                 if verbose:
  512.                     for item in fldlst:
  513.                         print(item,)
  514.                     print()
  515.                     for item in fields:
  516.                         print(item,)
  517.                     print()
  518.                 print ('=== Failed incorrectly', pattern, s,
  519.                         outcome,fields,fldlst)
  520.  
  521. def test_mat_obj_start(verbose = None):
  522.     """
  523.    test re.search(), and matobj.start()
  524.    'verbose' is for debugging, when 'verbose' is true, print extra info
  525.    """
  526.     regex_tests = testsuite.matobj_groups_regex_tests
  527.     for t in regex_tests:
  528.         pattern, s, outcome, fields, grpidx, start, end = t
  529.         try:
  530.             matobj=re.search(pattern, s)
  531.         except:
  532.             if outcome==SYNTAX_ERROR:
  533.                 # This should have been a syntax error; forget it.
  534.                 continue
  535.             else:
  536.                 print('=== Unexpected exception 1:', pattern, s,
  537.                                     outcome,fields)
  538.  
  539.         try:
  540.             if outcome==SUCCEED: assert(matobj != None)
  541.             fldlst = matobj.groups()
  542.         except:
  543.             if outcome==SYNTAX_ERROR:
  544.                 # This should have been a syntax error; forget it.
  545.                 continue
  546.             else:
  547.                 print('=== Unexpected exception 2:', pattern, s,
  548.                                     outcome,fields)
  549.            
  550.         if outcome==FAIL:
  551.             pass    # No match, as expected
  552.         elif outcome==SUCCEED:
  553.             if grpidx > 0:
  554.                 if matobj.start(grpidx) == start:
  555.                     pass
  556.                 else:
  557.                     if verbose:
  558.                         print ('=== Failed incorrectly', pattern, s,
  559.                             outcome,fields,fldlst)
  560.                     raise("testing failed")
  561.  
  562.  
  563. def test_mat_obj_end(verbose = None):
  564.     """
  565.    test re.search(), and matobj.end()
  566.    'verbose' is for debugging, when 'verbose' is true, print extra info
  567.    """
  568.     regex_tests = testsuite.matobj_groups_regex_tests
  569.     for t in regex_tests:
  570.         pattern, s, outcome, fields, grpidx, start, end = t
  571.         try:
  572.             matobj=re.search(pattern, s)
  573.         except:
  574.             if outcome==SYNTAX_ERROR:
  575.                 # This should have been a syntax error; forget it.
  576.                 continue
  577.             else:
  578.                 print('=== Unexpected exception 1:', pattern, s,
  579.                                     outcome,fields)
  580.  
  581.         try:
  582.             if outcome==SUCCEED: assert(matobj != None)
  583.             fldlst = matobj.groups()
  584.         except:
  585.             if outcome==SYNTAX_ERROR:
  586.                 # This should have been a syntax error; forget it.
  587.                 continue
  588.             else:
  589.                 print('=== Unexpected exception 2:', pattern, s,
  590.                                     outcome,fields)
  591.            
  592.         if outcome==FAIL:
  593.             pass    # No match, as expected
  594.         elif outcome==SUCCEED:
  595.             if grpidx > 0:
  596.                 if matobj.end(grpidx) == end:
  597.                     pass
  598.                 else:
  599.                     if verbose:
  600.                         print ('=== Failed incorrectly', pattern, s,
  601.                             outcome,fields,fldlst, matobj.end(grpidx), end)
  602.                     raise("testing failed")
  603.  
  604. def test_mat_obj_span(verbose = None):
  605.     """
  606.    test re.search(), and matobj.span()
  607.    'verbose' is for debugging, when 'verbose' is true, print extra info
  608.    """
  609.     regex_tests = testsuite.matobj_groups_regex_tests
  610.     for t in regex_tests:
  611.         pattern, s, outcome, fields, grpidx, start, end = t
  612.         try:
  613.             matobj=re.search(pattern, s)
  614.         except:
  615.             if outcome==SYNTAX_ERROR:
  616.                 # This should have been a syntax error; forget it.
  617.                 continue
  618.             else:
  619.                 print('=== Unexpected exception 1:', pattern, s,
  620.                                     outcome,fields)
  621.  
  622.         try:
  623.             if outcome==SUCCEED: assert(matobj != None)
  624.             fldlst = matobj.groups()
  625.         except:
  626.             if outcome==SYNTAX_ERROR:
  627.                 # This should have been a syntax error; forget it.
  628.                 continue
  629.             else:
  630.                 print('=== Unexpected exception 2:', pattern, s,
  631.                                     outcome,fields)
  632.            
  633.         if outcome==FAIL:
  634.             pass    # No match, as expected
  635.         elif outcome==SUCCEED:
  636.             if (grpidx > 0):
  637.                 spstart, spend = matobj.span(grpidx)
  638.                 if spstart == start and spend == end:
  639.                     pass
  640.                 else:
  641.                     if verbose:
  642.                         print ('=== Failed incorrectly', pattern, s,
  643.                             outcome,fields,fldlst)
  644.                     raise("testing failed")
  645.  
  646. if __name__ == "__main__":
  647.         main()
  648.  
  649.