def setUp(self): self.fp = FlyPaper(None, None, datetime(2011, 1, 1, 0, 0, 0), False, 'plain') #create a few bugs and changesets bug1id = 'bug1' self.bug1 = Bug(bug1id) self.fp._buglist.add(self.bug1) bug2id = 'bug2' self.bug2 = Bug(bug2id) self.fp._buglist.add(self.bug2) #only one bug is part of a changeset self.chg1 = Changeset('abc', datetime(2012, 1, 5, 8, 22, 0), bug1id) self.fp._changesets.add(self.chg1)
def setUp(self): self.doc = Document() self.doc.content = {'first': 'some string', 'second': {'third':'more string', 'fourth':{'numb':55}}, 'fifth': [55,66,{'sixth': 'deep string'}, 'rw']} self.c1 = Changeset('insert_pair', 1, 0, '', 'new_key') self.c2 = Changeset('insert_pair', 1, 0, [], 'new_key') self.c3 = Changeset('insert_pair', 1, 0, pos='new_key') self.c4 = Changeset('insert_pair', 1, 0, 'second,fourth', 'new_key') self.c5 = Changeset('remove_pair', 1, 0, '', 'first') self.c6 = Changeset('remove_pair', 1, 0, '', 'second') self.c7 = Changeset('remove_pair', 1, 0, 'second', 'fourth') self.c8 = Changeset('remove_pair', 1, 0, 'fifth,2', 'sixth') self.c9 = Changeset('insert_into_array', 1, 0, 'fifth', 1, value=77) self.c10 = Changeset('insert_into_array', 1, 0, 'fifth', 2, value=88) self.c11 = Changeset('insert_into_array', 1, 0, 'fifth', 3, value=99) self.c12 = Changeset('insert_pair', 1, 0, 'fifth,2', 'new_key', 55)
def _create_single_changeset(self, logoutput): if logoutput.strip() == '': return None (commitid, datestr, desc, files) = [x.strip() for x in logoutput.split("\n", 3)] #remove those awkward prefixed # characters desc = desc[1:].strip() files = files[1:].strip() date = datetime.strptime(datestr, '%Y-%m-%d') #create the base changeset changeset = Changeset(commitid, date, desc) #add the modified files to the changeset if files.strip() != '': for filename in files.split(' '): changeset.add_modified_file(filename) return changeset
def test_merge_in_insert_into_array(self): # c11 should not affect c12 self.c12.merge_past_changeset(self.c11) self.assertEqual(self.c12.path, ['fifth',2]) # c10 should affect c12 self.c12.merge_past_changeset(self.c10) self.assertEqual(self.c12.path, ['fifth',3]) # c1 should not affect c12 self.c12.merge_past_changeset(self.c1) self.assertEqual(self.c12.path, ['fifth',3]) # c9 should not affect c12 self.c12.merge_past_changeset(self.c9) self.assertEqual(self.c12.path, ['fifth',4]) # When inserting into the same place, figure out which order # they should go c1 = Changeset('insert_into_array', 1, 0, 'fifth', 3, value=19) c2 = Changeset('insert_into_array', 1, 0, 'fifth', 3, value=99) c1.merge_past_changeset(c2) self.assertEqual(c1.pos, 3) c2.merge_past_changeset(c1) self.assertEqual(c2.pos, 4)
def _create_single_changeset(self, logoutput): if logoutput.strip() == '': return None (commitid, datestr, desc, files) = [ x.strip() for x in logoutput.split("\n", 3) ] #remove those awkward prefixed # characters desc = desc[1:].strip() files = files[1:].strip() date = datetime.strptime(datestr, '%Y-%m-%d') #create the base changeset changeset = Changeset(commitid, date, desc) #add the modified files to the changeset if files.strip() != '': for filename in files.split(' '): changeset.add_modified_file(filename) return changeset
class TestChangeset(unittest.TestCase): def setUp(self): self.doc = Document() self.doc.content = {'first': 'some string', 'second': {'third':'more string', 'fourth':{'numb':55}}, 'fifth': [55,66,{'sixth': 'deep string'}, 'rw']} self.c1 = Changeset('insert_pair', 1, 0, '', 'new_key') self.c2 = Changeset('insert_pair', 1, 0, [], 'new_key') self.c3 = Changeset('insert_pair', 1, 0, pos='new_key') self.c4 = Changeset('insert_pair', 1, 0, 'second,fourth', 'new_key') self.c5 = Changeset('remove_pair', 1, 0, '', 'first') self.c6 = Changeset('remove_pair', 1, 0, '', 'second') self.c7 = Changeset('remove_pair', 1, 0, 'second', 'fourth') self.c8 = Changeset('remove_pair', 1, 0, 'fifth,2', 'sixth') self.c9 = Changeset('insert_into_array', 1, 0, 'fifth', 1, value=77) self.c10 = Changeset('insert_into_array', 1, 0, 'fifth', 2, value=88) self.c11 = Changeset('insert_into_array', 1, 0, 'fifth', 3, value=99) self.c12 = Changeset('insert_pair', 1, 0, 'fifth,2', 'new_key', 55) def test_init(self): # these three objects should end up the same self.assertEqual(self.c1.op, self.c2.op) self.assertEqual(self.c1.pos, self.c2.pos) self.assertEqual(self.c1.path, self.c2.path) self.assertEqual(self.c3.path, self.c2.path) def test_parse_path(self): path1 = '' result1 = [] path2 = 'first' result2 = ['first'] path3 = 'second,third' result3 = ['second', 'third'] path4 = 'fifth,1' result4 = ['fifth', 1] path5 = 'fifth,2,sixth' result5 = ['fifth', 2, 'sixth'] path6 = '0,fifth,3' result6 = [0,'fifth',3] self.c1.path = '' self.assertEqual(self.c1.parse_path(path1), result1) self.assertEqual(self.c1.parse_path(path2), result2) self.assertEqual(self.c1.parse_path(path3), result3) self.assertEqual(self.c1.parse_path(path4), result4) self.assertEqual(self.c1.parse_path(path5), result5) self.assertEqual(self.c1.parse_path(path6), result6) self.assertEqual(self.c1.path, result6) def test_merge_insert_pair_and_insert_merge(self): # past revision merged is an insert_pair. Only revision number # changes self.c1.merge_in_insert_pair(self.c2) self.assertEqual(self.c1.rev_raw, 1) self.assertEqual(self.c1.rev, 2) self.assertEqual(self.c1.op, 'insert_pair') self.assertEqual(self.c1.pos, 'new_key') def test_merge_in_remove_pair(self): # Whenever an old revision is 'remove_pair', the logic should # be the same. If subsequent changes are not a part of the # removed node, they are unaffected. If they are a part of the # removed node, the new opperation is nullified. # c5 should not affect c1 self.c1.merge_past_changeset(self.c5) self.assertEqual(self.c1.op, 'insert_pair') # c6 should affect c4 (simple path) self.c4.merge_past_changeset(self.c6) self.assertEqual(self.c4.op, None) self.setUp() # c7 should affect c4 (more complicated path) self.c4.merge_past_changeset(self.c7) self.assertEqual(self.c4.op, None) def test_merge_in_insert_into_array(self): # c11 should not affect c12 self.c12.merge_past_changeset(self.c11) self.assertEqual(self.c12.path, ['fifth',2]) # c10 should affect c12 self.c12.merge_past_changeset(self.c10) self.assertEqual(self.c12.path, ['fifth',3]) # c1 should not affect c12 self.c12.merge_past_changeset(self.c1) self.assertEqual(self.c12.path, ['fifth',3]) # c9 should not affect c12 self.c12.merge_past_changeset(self.c9) self.assertEqual(self.c12.path, ['fifth',4]) # When inserting into the same place, figure out which order # they should go c1 = Changeset('insert_into_array', 1, 0, 'fifth', 3, value=19) c2 = Changeset('insert_into_array', 1, 0, 'fifth', 3, value=99) c1.merge_past_changeset(c2) self.assertEqual(c1.pos, 3) c2.merge_past_changeset(c1) self.assertEqual(c2.pos, 4)
class TestFlyPaper(unittest.TestCase): def setUp(self): self.fp = FlyPaper(None, None, datetime(2011, 1, 1, 0, 0, 0), False, 'plain') #create a few bugs and changesets bug1id = 'bug1' self.bug1 = Bug(bug1id) self.fp._buglist.add(self.bug1) bug2id = 'bug2' self.bug2 = Bug(bug2id) self.fp._buglist.add(self.bug2) #only one bug is part of a changeset self.chg1 = Changeset('abc', datetime(2012, 1, 5, 8, 22, 0), bug1id) self.fp._changesets.add(self.chg1) def test_matching_bugs_with_changesets(self): self.fp._match_bugs_with_changesets() #verify that only that one bug is linked with a changeset self.assertEquals(set([self.chg1]), self.bug1.fixing_changesets) self.assertEquals(0, len(self.bug2.fixing_changesets)) self.assertEquals(set([self.bug1]), self.chg1.bugs_fixed) def test_building_buggy_file_list(self): self.chg1.add_modified_file('file1') self.chg1.bugs_fixed.add(self.bug1) self.fp._build_buggy_file_list() self.assertEquals(1, len(self.fp._buggy_file_list._filenames)) self.assertIn('file1', self.fp._buggy_file_list._filenames) def test_sorting_buggy_files_by_bugginess(self): buggy_file_list = BuggyFileList() buggy_file_factory = MockBuggyFileFactory() buggy_file_list._file_factory = buggy_file_factory #create a few buggy files with different scores buggy_file_factory.next_score = 1 buggy_file_list.add_buggy_file(self.bug1, 'file0') buggy_file_factory.next_score = 3 buggy_file_list.add_buggy_file(self.bug1, 'file1') buggy_file_list.add_buggy_file(self.bug2, 'file2') buggy_file_factory.next_score = 2 buggy_file_list.add_buggy_file(self.bug2, 'file3') self.fp._buggy_file_list = buggy_file_list results = self.fp._get_buggy_files_sorted_by_bugginess() self.assertEquals('file1', results[0].filename) self.assertEquals('file2', results[1].filename) self.assertEquals('file3', results[2].filename) self.assertEquals('file0', results[3].filename) def test_output_plain_text_without_bugs(self): self.fp._showbugs = False buggy_files = self.prepare_list_for_output_without_bugs() output = self.fp._get_output(buggy_files) expected = "3.457 file3\n" expected += "2.343 file2\n" expected += "1.200 file1\n" self.assertEquals(expected, output) def test_output_json_without_bugs(self): self.fp._showbugs = False self.fp._output_format = 'json' buggy_files = self.prepare_list_for_output_without_bugs() output = self.fp._get_output(buggy_files) expected = self.get_expected_json_output(buggy_files, False) self.assertEquals(expected, output) def test_output_json_with_bugs(self): self.fp._showbugs = True self.fp._output_format = 'json' buggy_files = self.prepare_list_for_output_with_bugs() output = self.fp._get_output(buggy_files) expected = self.get_expected_json_output(buggy_files, True) self.assertEquals(expected, output) def get_expected_json_output(self, buggy_files, showbugs): expected = {} files = [] for f in buggy_files: entry = {} entry['filename'] = f.filename entry['score'] = f.score if showbugs: entry['bugs'] = [bug.bugid for bug in f.get_bugs()] files.append(entry) expected['files'] = files return json.dumps(expected, sort_keys=True, indent=2) def test_output_plain_text_with_bugs(self): self.fp._showbugs = True buggy_files = self.prepare_list_for_output_with_bugs() output = self.fp._get_output(buggy_files) expected = "3.456 file1 bug1,bug2\n" expected += "2.345 file2 bug3\n" self.assertEquals(expected, output) def prepare_list_for_output_without_bugs(self): buggy_files = [] buggy_files.append(MockBuggyFile('file3', 3.45678)) buggy_files.append(MockBuggyFile('file2', 2.34321)) buggy_files.append(MockBuggyFile('file1', 1.2)) return buggy_files def prepare_list_for_output_with_bugs(self): buggy_files = [] bf1 = MockBuggyFile('file1', 3.456) bf1.add_bug(MockBug('bug1')) bf1.add_bug(MockBug('bug2')) buggy_files.append(bf1) bf2 = MockBuggyFile('file2', 2.345) bf2.add_bug(MockBug('bug3')) buggy_files.append(bf2) return buggy_files
def setUp(self): self.commitid = 'commitid' self.date = datetime(2011, 12, 30, 17, 59, 0) self.desc = 'description goes here' self.changeset = Changeset(self.commitid, self.date, self.desc)
class TestChangeset(unittest.TestCase): def setUp(self): self.commitid = 'commitid' self.date = datetime(2011, 12, 30, 17, 59, 0) self.desc = 'description goes here' self.changeset = Changeset(self.commitid, self.date, self.desc) def test_description_contains_finds_substring(self): self.assertTrue(self.changeset.description_contains('rip')) def test_description_contains_can_return_false(self): self.assertFalse(self.changeset.description_contains('blah')) def test_add_bug_fixed_stores_bug(self): self.changeset.add_bug_fixed('abc') self.assertEqual(1, len(self.changeset.bugs_fixed)) self.assertEqual('abc', self.changeset.bugs_fixed.pop()) def test_add_bug_fixed_does_not_store_duplicates(self): self.changeset.add_bug_fixed('abc') self.changeset.add_bug_fixed('abc') self.assertEqual(1, len(self.changeset.bugs_fixed)) self.assertEqual('abc', self.changeset.bugs_fixed.pop()) def test_add_bug_fixed_increases_bugs_fixed_count(self): self.assertEqual(0, self.changeset.bugs_fixed_count()) self.changeset.add_bug_fixed('abc') self.changeset.add_bug_fixed('def') self.assertEqual(2, self.changeset.bugs_fixed_count()) def test_add_modified_file_stores_file(self): self.changeset.add_modified_file('file1') self.assertEqual(1, len(self.changeset.modified_files)) self.assertEqual('file1', list(self.changeset.modified_files)[0]) self.changeset.add_modified_file('file1') self.assertEqual(1, len(self.changeset.modified_files)) def test_date_ratio(self): startdate = datetime(2011, 1, 1, 0, 0, 0) today = datetime(2011, 12, 31, 23, 59, 59) result = self.changeset._get_date_ratio(startdate, today) self.assertAlmostEqual(0.99931127, result, 7) def test_score_calculation(self): result = self.changeset._calculate_score(0.9, 3) self.assertAlmostEqual(0.42555748, result, 7) def test_get_score(self): startdate = datetime(2011, 1, 1, 0, 0, 0) self.changeset._today = datetime(2012, 1, 3, 19, 2, 0) result = self.changeset.get_score(startdate) self.assertAlmostEqual(0.49335728, result, 7)