81 lines
2.4 KiB
Python
81 lines
2.4 KiB
Python
#! /usr/bin/env python
|
|
# ______________________________________________________________________
|
|
|
|
from __future__ import absolute_import
|
|
|
|
import unittest
|
|
|
|
from llpython import byte_control
|
|
|
|
# ______________________________________________________________________
|
|
# Global data
|
|
|
|
got_done = 0
|
|
|
|
# ______________________________________________________________________
|
|
# Utility function definitions
|
|
|
|
def do_something():
|
|
global got_done
|
|
got_done += 1
|
|
print("Something good got done.")
|
|
|
|
# ____________________________________________________________
|
|
|
|
def do_something_else():
|
|
raise Exception("Something bad got done, and I don't like it")
|
|
|
|
# ______________________________________________________________________
|
|
# Test function definitions
|
|
|
|
def try_finally_0(m, n): # why == WHY_RETURN
|
|
try:
|
|
return n - m
|
|
finally:
|
|
do_something()
|
|
return do_something_else()
|
|
|
|
# ____________________________________________________________
|
|
|
|
def try_finally_1(m, n): # why == WHY_BREAK
|
|
i = -1
|
|
for i in range(m, n):
|
|
try:
|
|
if i == 101:
|
|
break
|
|
finally:
|
|
do_something()
|
|
return i
|
|
|
|
# ______________________________________________________________________
|
|
# Class (test case) definition(s)
|
|
|
|
class TestByteControl(unittest.TestCase):
|
|
def fail_unless_cfg_match(self, test_cfg, block_count, edges):
|
|
assert len(test_cfg.blocks) == block_count
|
|
block_keys = list(test_cfg.blocks.keys())
|
|
block_keys.sort()
|
|
# TODO: Ensure unexpected edges cause error.
|
|
for from_block_ofs, to_block_ofs in edges:
|
|
from_block = block_keys[from_block_ofs]
|
|
to_block = block_keys[to_block_ofs]
|
|
assert from_block in test_cfg.blocks_in[to_block]
|
|
assert to_block in test_cfg.blocks_out[from_block]
|
|
|
|
def test_try_finally_0(self):
|
|
cfg = byte_control.build_cfg(try_finally_0)
|
|
self.fail_unless_cfg_match(cfg, 5, ((0, 1), (0, 3), (1, 3), (2, 3),
|
|
(3, 4)))
|
|
|
|
def test_try_finally_1(self):
|
|
cfg = byte_control.build_cfg(try_finally_1)
|
|
# TODO: Translate known graph to offsets...
|
|
self.fail_unless_cfg_match(cfg, 12, ())
|
|
|
|
# ______________________________________________________________________
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|
|
|
|
# ______________________________________________________________________
|
|
# End of test_byte_control.py
|