Exemplo n.º 1
0
    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)
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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)
Exemplo n.º 5
0
    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
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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
Exemplo n.º 8
0
 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)
Exemplo n.º 9
0
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)