def test_finalize(self): output = [] recorder = ListRecorder() recorder.prepare(DummyRecord) for x in range(10): recorder.finalize() self.assertSequenceEqual(recorder.records, output)
def test_record(self): record = DummyRecord(5, 'pikos', 'apikos') output = [(5, 'pikos', 'apikos')] recorder = ListRecorder() recorder.prepare(DummyRecord) recorder.record(record) self.assertSequenceEqual(recorder.records, output)
def test_prepare(self): fields = ('one', 'two','three') output = [] recorder = ListRecorder() recorder.prepare(fields) self.assertSequenceEqual(recorder.records, output) recorder.prepare(fields)
def test_record(self): fields = ('one', 'two','three') values = (5, 'pikos','apikos') output = [(5, 'pikos','apikos')] recorder = ListRecorder() recorder.prepare(fields) recorder.record(values) self.assertSequenceEqual(recorder.records, output)
def test_finalize(self): fields = ('one', 'two','three') output = [] recorder = ListRecorder() recorder.prepare(fields) for x in range(10): recorder.finalize() self.assertSequenceEqual(recorder.records, output)
def test_filter(self): fields = ('one', 'two','three') values = [(5, 'pikos','apikos'), (12, 'emilios','milo')] output = [(12, 'emilios','milo')] def not_pikos(values): return not 'pikos' in values recorder = ListRecorder(filter_=not_pikos) recorder.prepare(fields) for record in values: recorder.record(record) self.assertSequenceEqual(recorder.records, output)
def test_filter(self): records = [ DummyRecord(5, 'pikos', 'apikos'), DummyRecord(12, 'emilios', 'milo')] output = [(12, 'emilios', 'milo')] def not_pikos(values): return not ('pikos' in values) recorder = ListRecorder(filter_=not_pikos) recorder.prepare(DummyRecord) for record in records: recorder.record(record) self.assertSequenceEqual(recorder.records, output)
def test_function(self): recorder = ListRecorder() logger = FunctionMonitor(recorder) @logger.attach def gcd(x, y): while x > 0: x, y = y % x, x return y def boo(): pass boo() result = gcd(12, 3) boo() self.assertEqual(result, 3) records = recorder.records # check that the records make sense self.assertFieldValueExist(records, ('function', 'type'), ('gcd', 'call'), times=1) self.assertFieldValueExist(records, ('function', 'type'), ('gcd', 'return'), times=1) self.assertFieldValueNotExist(records, ('function', ), ('boo', )) # The wrapper of the function should not be logged self.assertFieldValueNotExist(records, ('function', ), ('wrapper', ))
def test_generator(self): recorder = ListRecorder() logger = FunctionMonitor(recorder) output = (0, 1, 1, 2, 3, 5, 8, 13, 21, 34) @logger.attach def fibonacci(items): x, y = 0, 1 for i in range(items): yield x x, y = y, x + y def boo(): pass boo() result = [value for value in fibonacci(10)] boo() self.assertSequenceEqual(result, output) records = recorder.records # check that the records make sense # The function should be called 10 + 1 times self.assertFieldValueExist(records, ('function', 'type'), ('fibonacci', 'call'), times=11) self.assertFieldValueExist(records, ('function', 'type'), ('fibonacci', 'return'), times=11) self.assertFieldValueNotExist(records, ('function', ), ('boo', )) # The wrapper of the generator should not be logged self.assertFieldValueNotExist(records, ('function', ), ('wrapper', ))
def test_issue2(self): """ Test for issue #2. The issues is reported in `https://github.com/sjagoe/pikos/issues/2`_ """ recorder = ListRecorder() logger = LineMonitor(recorder) FOO = """ def foo(): a = [] for i in range(20): a.append(i+sum(a)) foo() """ @logger.attach def boo(): code = compile(FOO, 'foo', 'exec') exec code in globals(), {} try: boo() except TypeError: msg = ("Issue #2 -- line monitor fails when exec is used" " on code compiled from a string -- exists.") self.fail(msg)
def test_prepare(self): fields = ('one', 'two', 'three') output = [] recorder = ListRecorder() recorder.prepare(fields) self.assertSequenceEqual(recorder.records, output) recorder.prepare(fields)
def test_focus_on_recursive(self): def gcd(x, y): foo() return x if y == 0 else gcd(y, (x % y)) def boo(): pass def foo(): pass recorder = ListRecorder() logger = FocusedLineMonitor(recorder, functions=[gcd]) @logger.attach def container(x, y): boo() result = gcd(x, y) boo() foo() return result boo() result = container(12, 3) boo() self.assertEqual(result, 3) records = recorder.records expected = [ LineRecord(index=0, function='gcd', lineNo=136, line=' foo()', filename=self.filename), LineRecord(index=1, function='gcd', lineNo=137, line=' return x if y == 0 else ' 'gcd(y, (x % y))', filename=self.filename), LineRecord(index=2, function='gcd', lineNo=136, line=' foo()', filename=self.filename), LineRecord(index=3, function='gcd', lineNo=137, line=' return x if y == 0 else ' 'gcd(y, (x % y))', filename=self.filename) ] self.assertEqual(records, expected)
def test_finalize(self): fields = ('one', 'two', 'three') output = [] recorder = ListRecorder() recorder.prepare(fields) for x in range(10): recorder.finalize() self.assertSequenceEqual(recorder.records, output)
def test_record(self): fields = ('one', 'two', 'three') values = (5, 'pikos', 'apikos') output = [(5, 'pikos', 'apikos')] recorder = ListRecorder() recorder.prepare(fields) recorder.record(values) self.assertSequenceEqual(recorder.records, output)
def test_filter(self): fields = ('one', 'two', 'three') values = [(5, 'pikos', 'apikos'), (12, 'emilios', 'milo')] output = [(12, 'emilios', 'milo')] def not_pikos(values): return not 'pikos' in values recorder = ListRecorder(filter_=not_pikos) recorder.prepare(fields) for record in values: recorder.record(record) self.assertSequenceEqual(recorder.records, output)
def test_recursive(self): recorder = ListRecorder() logger = FunctionMemoryMonitor(recorder) @logger.attach def gcd(x, y): return x if y == 0 else gcd(y, (x % y)) def boo(): return gcd(7, 12) result = boo() self.assertEqual(result, 1) records = recorder.records # check that the records make sense # The function should be called 6 times self.assertFieldValueExist(records, ('function', 'type'), ('gcd', 'call'), times=6) self.assertFieldValueExist(records, ('function', 'type'), ('gcd', 'return'), times=6) self.assertFieldValueNotExist(records, ('function',), ('boo',))
def test_focus_on_functions(self): def gcd(x, y): while x > 0: x, y = internal(x, y) return y def internal(x, y): return y % x, x def boo(): pass def foo(): boo() boo() recorder = ListRecorder() logger = FocusedLineMonitor(recorder, functions=[gcd, foo]) @logger.attach def container(x, y): boo() result = gcd(x, y) boo() foo() return result boo() result = container(12, 3) boo() self.assertEqual(result, 3) records = recorder.records expected = [ LineRecord(index=0, function='gcd', lineNo=77, line=' while x > 0:', filename=self.filename), LineRecord(index=1, function='gcd', lineNo=78, line=' x, y = internal(x, y)', filename=self.filename), LineRecord(index=2, function='gcd', lineNo=77, line=' while x > 0:', filename=self.filename), LineRecord(index=3, function='gcd', lineNo=78, line=' x, y = internal(x, y)', filename=self.filename), LineRecord(index=4, function='gcd', lineNo=77, line=' while x > 0:', filename=self.filename), LineRecord(index=5, function='gcd', lineNo=79, line=' return y', filename=self.filename), LineRecord(index=6, function='foo', lineNo=88, line=' boo()', filename=self.filename), LineRecord(index=7, function='foo', lineNo=89, line=' boo()', filename=self.filename) ] self.assertEqual(records, expected)
def test_focus_on_recursive(self): def gcd(x, y): foo() return x if y == 0 else gcd(y, (x % y)) def boo(): pass def foo(): pass recorder = ListRecorder() logger = FocusedFunctionMonitor(recorder, functions=[gcd]) @logger.attach def container(x, y): boo() result = gcd(x, y) boo() foo() return result boo() result = container(12, 3) boo() self.assertEqual(result, 3) records = recorder.records expected = [ FunctionRecord(index=0, type='call', function='gcd', lineNo=153, filename=self.filename), FunctionRecord(index=1, type='call', function='foo', lineNo=160, filename=self.filename), FunctionRecord(index=2, type='return', function='foo', lineNo=161, filename=self.filename), FunctionRecord(index=3, type='call', function='gcd', lineNo=153, filename=self.filename), FunctionRecord(index=4, type='call', function='foo', lineNo=160, filename=self.filename), FunctionRecord(index=5, type='return', function='foo', lineNo=161, filename=self.filename), FunctionRecord(index=6, type='return', function='gcd', lineNo=155, filename=self.filename), FunctionRecord(index=7, type='return', function='gcd', lineNo=155, filename=self.filename), ] self.assertEqual(records, expected) self.assertEqual(logger._code_trackers, {})
def test_prepare(self): output = [] recorder = ListRecorder() recorder.prepare(DummyRecord) self.assertSequenceEqual(recorder.records, output) recorder.prepare(DummyRecord)
def test_focus_on_function(self): def gcd(x, y): while x > 0: x, y = internal(x, y) return y def internal(x, y): boo() return y % x, x def boo(): pass recorder = ListRecorder() logger = FocusedFunctionMonitor(recorder, functions=[gcd]) @logger.attach def container(x, y): boo() result = gcd(x, y) boo() return result boo() result = container(12, 3) boo() self.assertEqual(result, 3) records = recorder.records expected = [ FunctionRecord(index=0, type='call', function='gcd', lineNo=27, filename=self.filename), FunctionRecord(index=1, type='call', function='internal', lineNo=32, filename=self.filename), FunctionRecord(index=2, type='call', function='boo', lineNo=36, filename=self.filename), FunctionRecord(index=3, type='return', function='boo', lineNo=37, filename=self.filename), FunctionRecord(index=4, type='return', function='internal', lineNo=34, filename=self.filename), FunctionRecord(index=5, type='call', function='internal', lineNo=32, filename=self.filename), FunctionRecord(index=6, type='call', function='boo', lineNo=36, filename=self.filename), FunctionRecord(index=7, type='return', function='boo', lineNo=37, filename=self.filename), FunctionRecord(index=8, type='return', function='internal', lineNo=34, filename=self.filename), FunctionRecord(index=9, type='return', function='gcd', lineNo=30, filename=self.filename) ] self.assertEqual(records, expected) self.assertEqual(logger._code_trackers, {})