Skip to content

Commit 2aa3348

Browse files
committed
Add current cw-2.py
1 parent 464ae98 commit 2aa3348

File tree

1 file changed

+115
-0
lines changed

1 file changed

+115
-0
lines changed

cw-2.py

Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
from __future__ import print_function
2+
3+
class AssertException(Exception):
4+
pass
5+
6+
def format_message(message):
7+
return message.replace("\n", "<:LF:>")
8+
9+
10+
def display(type, message, label="", mode=""):
11+
print("\n<{0}:{1}:{2}>{3}".format(type.upper(), mode.upper(), label, format_message(message)))
12+
13+
14+
def expect(passed=None, message=None, allow_raise=False):
15+
if passed:
16+
display('PASSED', 'Test Passed')
17+
else:
18+
message = message or "Value is not what was expected"
19+
display('FAILED', message)
20+
if allow_raise:
21+
raise AssertException(message)
22+
23+
24+
def assert_equals(actual, expected, message=None, allow_raise=False):
25+
equals_msg = "{0} should equal {1}".format(repr(actual), repr(expected))
26+
if message is None:
27+
message = equals_msg
28+
else:
29+
message += ": " + equals_msg
30+
31+
expect(actual == expected, message, allow_raise)
32+
33+
34+
def assert_not_equals(actual, expected, message=None, allow_raise=False):
35+
equals_msg = "{0} should not equal {1}".format(repr(actual), repr(expected))
36+
if message is None:
37+
message = equals_msg
38+
else:
39+
message += ": " + equals_msg
40+
41+
expect(not (actual == expected), message, allow_raise)
42+
43+
44+
def expect_error(message, function, exception=Exception):
45+
passed = False
46+
try: function()
47+
except exception: passed = True
48+
except: pass
49+
expect(passed, message)
50+
51+
52+
def pass_(): expect(True)
53+
def fail(message): expect(False, message)
54+
55+
56+
def assert_approx_equals(actual, expected, margin=1e-9, message=None, allow_raise=False):
57+
equals_msg = "{0} should be close to {1} with absolute or relative margin of {2}".format(
58+
repr(actual), repr(expected), repr(margin))
59+
if message is None: message = equals_msg
60+
else: message += ": " + equals_msg
61+
div = max(abs(actual), abs(expected), 1)
62+
expect(abs((actual - expected) / div) < margin, message, allow_raise)
63+
64+
65+
'''
66+
Usage:
67+
@describe('describe text')
68+
def describe1():
69+
@it('it text')
70+
def it1():
71+
# some test cases...
72+
'''
73+
def _timed_block_factory(opening_text):
74+
from timeit import default_timer as timer
75+
from traceback import format_exception
76+
from sys import exc_info
77+
78+
def _timed_block_decorator(s, before=None, after=None):
79+
display(opening_text, s)
80+
def wrapper(func):
81+
if callable(before): before()
82+
time = timer()
83+
try: func()
84+
except:
85+
fail('Unexpected exception raised')
86+
tb_str = ''.join(format_exception(*exc_info()))
87+
display('ERROR', tb_str)
88+
display('COMPLETEDIN', '{:.2f}'.format((timer() - time) * 1000))
89+
if callable(after): after()
90+
return wrapper
91+
return _timed_block_decorator
92+
93+
describe = _timed_block_factory('DESCRIBE')
94+
it = _timed_block_factory('IT')
95+
96+
97+
'''
98+
Timeout utility
99+
Usage:
100+
@timeout(sec)
101+
def some_tests():
102+
any code block...
103+
Note: Timeout value can be a float.
104+
'''
105+
def timeout(sec):
106+
def wrapper(func):
107+
from multiprocessing import Process
108+
process = Process(target=func)
109+
process.start()
110+
process.join(sec)
111+
if process.is_alive():
112+
fail('Exceeded time limit of {:.3f} seconds'.format(sec))
113+
process.terminate()
114+
process.join()
115+
return wrapper

0 commit comments

Comments
 (0)