home *** CD-ROM | disk | FTP | other *** search
/ PC World 2005 June / PCWorld_2005-06_cd.bin / software / vyzkuste / firewally / firewally.exe / framework-2.3.exe / test_dis.py < prev    next >
Text File  |  2003-12-30  |  3KB  |  94 lines

  1. from test.test_support import verify, verbose, TestFailed, run_unittest
  2. import sys
  3. import dis
  4. import StringIO
  5.  
  6. # Minimal tests for dis module
  7.  
  8. import unittest
  9.  
  10. def _f(a):
  11.     print a
  12.     return 1
  13.  
  14. dis_f = """\
  15.  %-4d         0 LOAD_FAST                0 (a)
  16.               3 PRINT_ITEM
  17.               4 PRINT_NEWLINE
  18.  
  19.  %-4d         5 LOAD_CONST               1 (1)
  20.               8 RETURN_VALUE
  21.               9 LOAD_CONST               0 (None)
  22.              12 RETURN_VALUE
  23. """%(_f.func_code.co_firstlineno + 1,
  24.      _f.func_code.co_firstlineno + 2)
  25.  
  26.  
  27. def bug708901():
  28.     for res in range(1,
  29.                      10):
  30.         pass
  31.  
  32. dis_bug708901 = """\
  33.  %-4d         0 SETUP_LOOP              23 (to 26)
  34.               3 LOAD_GLOBAL              0 (range)
  35.               6 LOAD_CONST               1 (1)
  36.  
  37.  %-4d         9 LOAD_CONST               2 (10)
  38.              12 CALL_FUNCTION            2
  39.              15 GET_ITER
  40.         >>   16 FOR_ITER                 6 (to 25)
  41.              19 STORE_FAST               0 (res)
  42.  
  43.  %-4d        22 JUMP_ABSOLUTE           16
  44.         >>   25 POP_BLOCK
  45.         >>   26 LOAD_CONST               0 (None)
  46.              29 RETURN_VALUE
  47. """%(bug708901.func_code.co_firstlineno + 1,
  48.      bug708901.func_code.co_firstlineno + 2,
  49.      bug708901.func_code.co_firstlineno + 3)
  50.  
  51. class DisTests(unittest.TestCase):
  52.     def do_disassembly_test(self, func, expected):
  53.         s = StringIO.StringIO()
  54.         save_stdout = sys.stdout
  55.         sys.stdout = s
  56.         dis.dis(func)
  57.         sys.stdout = save_stdout
  58.         got = s.getvalue()
  59.         # Trim trailing blanks (if any).
  60.         lines = got.split('\n')
  61.         lines = [line.rstrip() for line in lines]
  62.         expected = expected.split("\n")
  63.         import difflib
  64.         if expected != lines:
  65.             self.fail(
  66.                 "events did not match expectation:\n" +
  67.                 "\n".join(difflib.ndiff(expected,
  68.                                         lines)))
  69.  
  70.     def test_opmap(self):
  71.         self.assertEqual(dis.opmap["STOP_CODE"], 0)
  72.         self.assertEqual(dis.opmap["LOAD_CONST"] in dis.hasconst, True)
  73.         self.assertEqual(dis.opmap["STORE_NAME"] in dis.hasname, True)
  74.  
  75.     def test_opname(self):
  76.         self.assertEqual(dis.opname[dis.opmap["LOAD_FAST"]], "LOAD_FAST")
  77.  
  78.     def test_boundaries(self):
  79.         self.assertEqual(dis.opmap["EXTENDED_ARG"], dis.EXTENDED_ARG)
  80.         self.assertEqual(dis.opmap["STORE_NAME"], dis.HAVE_ARGUMENT)
  81.  
  82.     def test_dis(self):
  83.         self.do_disassembly_test(_f, dis_f)
  84.  
  85.     def test_bug_708901(self):
  86.         self.do_disassembly_test(bug708901, dis_bug708901)
  87.  
  88. def test_main():
  89.     run_unittest(DisTests)
  90.  
  91.  
  92. if __name__ == "__main__":
  93.     test_main()
  94.