/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to tests/test_commit.py

  • Committer: Curtis Hovey
  • Date: 2011-09-04 03:53:20 UTC
  • mfrom: (738 trunk)
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110904035320-5abg7as2ki1r8w88
Merged trunk

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 John Arbash Meinel <john@arbash-meinel.com>
 
1
# Copyright (C) 2007, 2008 John Arbash Meinel <john@arbash-meinel.com>
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
18
18
 
19
19
import os
20
20
 
21
 
import gtk
 
21
from gi.repository import Gtk
22
22
 
23
23
from bzrlib import (
 
24
    branch,
24
25
    tests,
25
 
    revision,
 
26
    uncommit,
26
27
    )
27
 
from bzrlib.util import bencode
 
28
try:
 
29
    from bzrlib.tests.features import UnicodeFilenameFeature
 
30
except ImportError: # bzr < 2.5
 
31
    from bzrlib.tests import UnicodeFilenameFeature
 
32
try:
 
33
    from bzrlib import bencode
 
34
except ImportError:
 
35
    from bzrlib.util import bencode
28
36
 
29
37
from bzrlib.plugins.gtk import commit
30
38
 
86
94
        rev_id4 = tree3.commit('four')
87
95
        rev_id5 = tree3.commit('five')
88
96
        tree.merge_from_branch(tree2.branch)
89
 
        tree.merge_from_branch(tree3.branch)
 
97
        tree.merge_from_branch(tree3.branch, force=True)
90
98
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
91
99
 
92
100
        pending_revisions = commit.pending_revisions(tree)
207
215
 
208
216
        commit_col = dlg._treeview_files.get_column(0)
209
217
        self.assertEqual('Commit', commit_col.get_title())
210
 
        renderer = commit_col.get_cell_renderers()[0]
 
218
        renderer = commit_col.get_cells()[0]
211
219
        self.assertTrue(renderer.get_property('activatable'))
212
220
 
213
221
        self.assertEqual('Commit all changes',
232
240
 
233
241
        commit_col = dlg._treeview_files.get_column(0)
234
242
        self.assertEqual('Commit*', commit_col.get_title())
235
 
        renderer = commit_col.get_cell_renderers()[0]
 
243
        renderer = commit_col.get_cells()[0]
236
244
        self.assertFalse(renderer.get_property('activatable'))
237
245
 
238
246
        values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
266
274
                               committer='Jerry Foo <jerry@foo.com>',
267
275
                               timestamp=1191372278.05,
268
276
                               timezone=+7200)
269
 
        tree.merge_from_branch(tree3.branch)
 
277
        tree.merge_from_branch(tree3.branch, force=True)
270
278
 
271
279
        dlg = commit.CommitDialog(tree)
272
280
        # TODO: assert that the pending box is set to show
380
388
                          ('b-id', 'b', True, 'b/', 'removed'),
381
389
                         ], values)
382
390
        # All Files should be selected
383
 
        self.assertEqual(((0,), None), dlg._treeview_files.get_cursor())
 
391
        self.assertEqual(
 
392
            (Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
384
393
 
385
394
    def test_filelist_with_selected(self):
386
395
        tree = self.make_branch_and_tree('tree')
395
404
                         ], values)
396
405
        # This file should also be selected in the file list, rather than the
397
406
        # 'All Files' selection
398
 
        self.assertEqual(((1,), None), dlg._treeview_files.get_cursor())
 
407
        self.assertEqual(
 
408
            (Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
399
409
 
400
410
    def test_diff_view(self):
401
411
        tree = self.make_branch_and_tree('tree')
409
419
        dlg = commit.CommitDialog(tree)
410
420
        diff_buffer = dlg._diff_view.buffer
411
421
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
412
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
422
                                    diff_buffer.get_end_iter(),
 
423
                                    True).splitlines(True)
413
424
 
414
425
        self.assertEqual("=== modified file 'a'\n", text[0])
415
426
        self.assertContainsRe(text[1],
460
471
        self.assertFalse(dlg._file_message_expander.get_expanded())
461
472
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
462
473
 
463
 
        dlg._treeview_files.set_cursor((1,))
 
474
        dlg._treeview_files.set_cursor(
 
475
            Gtk.TreePath(path=1), None, False)
464
476
        self.assertEqual('Diff for a', dlg._diff_label.get_text())
465
477
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
466
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
478
                                    diff_buffer.get_end_iter(),
 
479
                                    True).splitlines(True)
467
480
        self.assertEqual("=== added file 'a'\n", text[0])
468
481
        self.assertContainsRe(text[1],
469
482
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
477
490
        self.assertTrue(dlg._file_message_expander.get_expanded())
478
491
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
479
492
 
480
 
        dlg._treeview_files.set_cursor((2,))
 
493
        dlg._treeview_files.set_cursor(
 
494
            Gtk.TreePath(path=2), None, False)
481
495
        self.assertEqual('Diff for b', dlg._diff_label.get_text())
482
496
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
483
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
497
                                    diff_buffer.get_end_iter(),
 
498
                                    True).splitlines(True)
484
499
        self.assertEqual("=== added file 'b'\n", text[0])
485
500
        self.assertContainsRe(text[1],
486
501
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
494
509
        self.assertTrue(dlg._file_message_expander.get_expanded())
495
510
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
496
511
 
497
 
        dlg._treeview_files.set_cursor((0,))
 
512
        dlg._treeview_files.set_cursor(
 
513
            Gtk.TreePath(path=0), None, False)
498
514
        self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
499
515
        self.assertEqual('File commit message',
500
516
                         dlg._file_message_expander.get_label())
510
526
 
511
527
        def get_file_text():
512
528
            buf = dlg._file_message_text_view.get_buffer()
513
 
            return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
 
529
            return buf.get_text(
 
530
                buf.get_start_iter(), buf.get_end_iter(), True)
514
531
 
515
532
        def get_saved_text(path):
516
533
            """Get the saved text for a given record."""
523
540
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
524
541
        self.assertEqual('', get_file_text())
525
542
 
526
 
        dlg._treeview_files.set_cursor((1,))
 
543
        dlg._treeview_files.set_cursor(
 
544
            Gtk.TreePath(path=1), None, False)
527
545
        self.assertEqual('Commit message for a',
528
546
                         dlg._file_message_expander.get_label())
529
547
        self.assertTrue(dlg._file_message_expander.get_expanded())
536
554
        # We should have updated the ListStore with the new file commit info
537
555
        self.assertEqual('Some text\nfor a\n', get_saved_text(1))
538
556
 
539
 
        dlg._treeview_files.set_cursor((2,))
 
557
        dlg._treeview_files.set_cursor(
 
558
            Gtk.TreePath(path=2), None, False)
540
559
        self.assertEqual('Commit message for b/',
541
560
                         dlg._file_message_expander.get_label())
542
561
        self.assertTrue(dlg._file_message_expander.get_expanded())
547
566
        dlg._set_file_commit_message('More text\nfor b\n')
548
567
        # Now switch back to 'a'. The message should be saved, and the buffer
549
568
        # should be updated with the other text
550
 
        dlg._treeview_files.set_cursor((1,))
 
569
        dlg._treeview_files.set_cursor(
 
570
            Gtk.TreePath(path=1), None, False)
551
571
        self.assertEqual('More text\nfor b\n', get_saved_text(2))
552
572
        self.assertEqual('Commit message for a',
553
573
                         dlg._file_message_expander.get_label())
573
593
        #       do with. So instead, we just call toggle directly, and assume
574
594
        #       that toggle is hooked in correctly
575
595
        # column = dlg._treeview_files.get_column(0)
576
 
        # renderer = column.get_cell_renderers()[0]
 
596
        # renderer = column.get_cells()[0]
577
597
 
578
598
        # Toggle a single entry should set just that entry to False
579
599
        dlg._toggle_commit(None, 1, dlg._files_store)
626
646
        dlg._commit_selected_radio.set_active(True)
627
647
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
628
648
 
629
 
        dlg._treeview_files.set_cursor((1,))
 
649
        dlg._treeview_files.set_cursor(
 
650
            Gtk.TreePath(path=1), None, False)
630
651
        dlg._set_file_commit_message('Test\nmessage\nfor a_file\n')
631
 
        dlg._treeview_files.set_cursor((2,))
 
652
        dlg._treeview_files.set_cursor(
 
653
            Gtk.TreePath(path=2), None, False)
632
654
        dlg._set_file_commit_message('message\nfor b_dir\n')
633
655
 
634
656
        self.assertEqual((['a_file', 'b_dir'],
644
666
                            'message':'message\nfor b_dir\n'},
645
667
                          ]), dlg._get_specific_files())
646
668
 
647
 
 
648
 
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
649
 
    """Tests on the actual 'commit' button being pushed."""
 
669
    def test_specific_files_sanitizes_messages(self):
 
670
        tree = self.make_branch_and_tree('tree')
 
671
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
 
672
        self.build_tree(['tree/a_file', 'tree/b_dir/'])
 
673
        tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
 
674
 
 
675
        dlg = commit.CommitDialog(tree)
 
676
        dlg._commit_selected_radio.set_active(True)
 
677
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
 
678
 
 
679
        dlg._treeview_files.set_cursor(
 
680
            Gtk.TreePath(path=1), None, False)
 
681
        dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
 
682
        dlg._treeview_files.set_cursor(
 
683
            Gtk.TreePath(path=2), None, False)
 
684
        dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
 
685
 
 
686
        self.assertEqual((['a_file', 'b_dir'],
 
687
                          [{'path':'a_file', 'file_id':'1a-id',
 
688
                            'message':'Test\nmessage\nfor a_file\n'},
 
689
                           {'path':'b_dir', 'file_id':'0b-id',
 
690
                            'message':'message\nfor\nb_dir\n'},
 
691
                          ]), dlg._get_specific_files())
 
692
 
 
693
 
 
694
class QuestionHelpers(object):
650
695
 
651
696
    def _set_question_yes(self, dlg):
652
697
        """Set the dialog to answer YES to any questions."""
653
698
        self.questions = []
654
 
        def _question_yes(*args):
 
699
        def _question_yes(*args, **kwargs):
655
700
            self.questions.append(args)
656
701
            self.questions.append('YES')
657
 
            return gtk.RESPONSE_YES
 
702
            return Gtk.ResponseType.YES
658
703
        dlg._question_dialog = _question_yes
659
704
 
660
705
    def _set_question_no(self, dlg):
661
706
        """Set the dialog to answer NO to any questions."""
662
707
        self.questions = []
663
 
        def _question_no(*args):
 
708
        def _question_no(*args, **kwargs):
664
709
            self.questions.append(args)
665
710
            self.questions.append('NO')
666
 
            return gtk.RESPONSE_NO
 
711
            return Gtk.ResponseType.NO
667
712
        dlg._question_dialog = _question_no
668
713
 
 
714
 
 
715
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
 
716
    """Tests on the actual 'commit' button being pushed."""
 
717
 
669
718
    def test_bound_commit_local(self):
670
719
        tree = self.make_branch_and_tree('tree')
671
720
        self.build_tree(['tree/a'])
687
736
        self.assertEqual(last_rev, dlg.committed_revision_id)
688
737
        self.assertEqual(rev_id1, tree.branch.last_revision())
689
738
 
 
739
    def test_commit_global_sanitizes_message(self):
 
740
        tree = self.make_branch_and_tree('tree')
 
741
        self.build_tree(['tree/a'])
 
742
        tree.add(['a'], ['a-id'])
 
743
        rev_id1 = tree.commit('one')
 
744
 
 
745
        self.build_tree(['tree/b'])
 
746
        tree.add(['b'], ['b-id'])
 
747
        dlg = commit.CommitDialog(tree)
 
748
        # With the check box set, it should only effect the local branch
 
749
        dlg._set_global_commit_message('Commit\r\nmessage\rfoo\n')
 
750
        dlg._do_commit()
 
751
        rev = tree.branch.repository.get_revision(tree.last_revision())
 
752
        self.assertEqual('Commit\nmessage\nfoo\n', rev.message)
 
753
 
690
754
    def test_bound_commit_both(self):
691
755
        tree = self.make_branch_and_tree('tree')
692
756
        self.build_tree(['tree/a'])
708
772
        self.assertEqual(last_rev, dlg.committed_revision_id)
709
773
        self.assertEqual(last_rev, tree.branch.last_revision())
710
774
 
711
 
    def test_commit_no_message(self):
 
775
    def test_commit_empty_message(self):
712
776
        tree = self.make_branch_and_tree('tree')
713
777
        self.build_tree(['tree/a', 'tree/b'])
714
778
        tree.add(['a'], ['a-id'])
929
993
 
930
994
        dlg = commit.CommitDialog(tree)
931
995
        dlg._commit_selected_radio.set_active(True) # enable partial
932
 
        dlg._treeview_files.set_cursor((1,))
 
996
        dlg._treeview_files.set_cursor(
 
997
            Gtk.TreePath(path=1), None, False)
933
998
        dlg._set_file_commit_message('Message for A\n')
934
 
        dlg._treeview_files.set_cursor((2,))
 
999
        dlg._treeview_files.set_cursor(
 
1000
            Gtk.TreePath(path=2), None, False)
935
1001
        dlg._set_file_commit_message('Message for B\n')
936
1002
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
937
1003
        dlg._set_global_commit_message('Commit just "a"')
943
1009
        rev = tree.branch.repository.get_revision(rev_id2)
944
1010
        self.assertEqual('Commit just "a"', rev.message)
945
1011
        file_info = rev.properties['file-info']
946
 
        self.assertEqual('ld7:file_id4:a-id'
947
 
                           '7:message14:Message for A\n'
948
 
                           '4:path1:a'
949
 
                         'ee', file_info)
 
1012
        self.assertEqual(u'ld7:file_id4:a-id'
 
1013
                         '7:message14:Message for A\n'
 
1014
                         '4:path1:a'
 
1015
                         'ee',
 
1016
                         file_info)
950
1017
        self.assertEqual([{'path':'a', 'file_id':'a-id',
951
 
                           'message':'Message for A\n'},
952
 
                         ], bencode.bdecode(file_info))
 
1018
                           'message':'Message for A\n'},],
 
1019
                         bencode.bdecode(file_info.encode('UTF-8')))
953
1020
 
954
1021
    def test_commit_messages_after_merge(self):
955
1022
        tree = self.make_branch_and_tree('tree')
963
1030
        tree.merge_from_branch(tree2.branch)
964
1031
 
965
1032
        dlg = commit.CommitDialog(tree)
966
 
        dlg._treeview_files.set_cursor((1,)) # 'a'
 
1033
        dlg._treeview_files.set_cursor(
 
1034
            Gtk.TreePath(path=1), None, False) # 'a'
967
1035
        dlg._set_file_commit_message('Message for A\n')
968
1036
        # No message for 'B'
969
1037
        dlg._set_global_commit_message('Merging from "tree2"\n')
976
1044
        self.assertEqual('Merging from "tree2"\n', rev.message)
977
1045
        self.assertEqual([rev_id1, rev_id2], rev.parent_ids)
978
1046
        file_info = rev.properties['file-info']
979
 
        self.assertEqual('ld7:file_id4:a-id'
980
 
                           '7:message14:Message for A\n'
981
 
                           '4:path1:a'
982
 
                         'ee', file_info)
 
1047
        self.assertEqual(u'ld7:file_id4:a-id'
 
1048
                         '7:message14:Message for A\n'
 
1049
                         '4:path1:a'
 
1050
                         'ee',
 
1051
                         file_info)
983
1052
        self.assertEqual([{'path':'a', 'file_id':'a-id',
984
 
                           'message':'Message for A\n'},
985
 
                         ], bencode.bdecode(file_info))
 
1053
                           'message':'Message for A\n'},],
 
1054
                         bencode.bdecode(file_info.encode('UTF-8')))
986
1055
 
987
1056
    def test_commit_unicode_messages(self):
988
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
1057
        self.requireFeature(UnicodeFilenameFeature)
989
1058
 
990
1059
        tree = self.make_branch_and_tree('tree')
991
1060
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
993
1062
        tree.add(['a', u'\u03a9'], ['a-id', 'omega-id'])
994
1063
 
995
1064
        dlg = commit.CommitDialog(tree)
996
 
        dlg._treeview_files.set_cursor((1,)) # 'a'
 
1065
        dlg._treeview_files.set_cursor(
 
1066
            Gtk.TreePath(path=1), None, False) # 'a'
997
1067
        dlg._set_file_commit_message(u'Test \xfan\xecc\xf6de\n')
998
 
        dlg._treeview_files.set_cursor((2,)) # omega
 
1068
        dlg._treeview_files.set_cursor(
 
1069
            Gtk.TreePath(path=2), None, False) # omega
999
1070
        dlg._set_file_commit_message(u'\u03a9 is the end of all things.\n')
1000
1071
        dlg._set_global_commit_message(u'\u03a9 and \xfan\xecc\xf6de\n')
1001
1072
 
1030
1101
                          {'path':u'\u03a9', 'file_id':'omega-id',
1031
1102
                           'message':u'\u03a9 is the end of all things.\n'},
1032
1103
                         ], file_info_decoded)
 
1104
 
 
1105
 
 
1106
class TestSanitizeMessage(tests.TestCase):
 
1107
 
 
1108
    def assertSanitize(self, expected, original):
 
1109
        self.assertEqual(expected,
 
1110
                         commit._sanitize_and_decode_message(original))
 
1111
 
 
1112
    def test_untouched(self):
 
1113
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
 
1114
 
 
1115
    def test_converts_cr_to_lf(self):
 
1116
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
 
1117
 
 
1118
    def test_converts_crlf_to_lf(self):
 
1119
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
 
1120
 
 
1121
    def test_converts_mixed_to_lf(self):
 
1122
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
 
1123
 
 
1124
 
 
1125
class TestSavedCommitMessages(tests.TestCaseWithTransport):
 
1126
 
 
1127
    def setUp(self):
 
1128
        super(TestSavedCommitMessages, self).setUp()
 
1129
        # Install our hook
 
1130
        branch.Branch.hooks.install_named_hook(
 
1131
            'post_uncommit', commit.save_commit_messages, None)
 
1132
 
 
1133
    def _get_file_info_dict(self, rank):
 
1134
        file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
 
1135
                     dict(path='b', file_id='b-id', message='b msg %d' % rank)]
 
1136
        return file_info
 
1137
 
 
1138
    def _get_file_info_revprops(self, rank):
 
1139
        file_info_prop = self._get_file_info_dict(rank)
 
1140
        return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
 
1141
 
 
1142
    def _get_commit_message(self):
 
1143
        return self.config.get_user_option('gtk_global_commit_message')
 
1144
 
 
1145
    def _get_file_commit_messages(self):
 
1146
        return self.config.get_user_option('gtk_file_commit_messages')
 
1147
 
 
1148
 
 
1149
class TestUncommitHook(TestSavedCommitMessages):
 
1150
 
 
1151
    def setUp(self):
 
1152
        super(TestUncommitHook, self).setUp()
 
1153
        self.tree = self.make_branch_and_tree('tree')
 
1154
        self.config = self.tree.branch.get_config()
 
1155
        self.build_tree(['tree/a', 'tree/b'])
 
1156
        self.tree.add(['a'], ['a-id'])
 
1157
        self.tree.add(['b'], ['b-id'])
 
1158
        rev1 = self.tree.commit('one', rev_id='one-id',
 
1159
                                revprops=self._get_file_info_revprops(1))
 
1160
        rev2 = self.tree.commit('two', rev_id='two-id',
 
1161
                                revprops=self._get_file_info_revprops(2))
 
1162
        rev3 = self.tree.commit('three', rev_id='three-id',
 
1163
                                revprops=self._get_file_info_revprops(3))
 
1164
 
 
1165
    def test_uncommit_one_by_one(self):
 
1166
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1167
        self.assertEquals(u'three', self._get_commit_message())
 
1168
        self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
 
1169
                          self._get_file_commit_messages())
 
1170
 
 
1171
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1172
        self.assertEquals(u'two\n******\nthree', self._get_commit_message())
 
1173
        self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
 
1174
                          '4:b-id22:b msg 2\n******\nb msg 3e',
 
1175
                          self._get_file_commit_messages())
 
1176
 
 
1177
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1178
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
 
1179
                          self._get_commit_message())
 
1180
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
 
1181
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1182
                          self._get_file_commit_messages())
 
1183
 
 
1184
    def test_uncommit_all_at_once(self):
 
1185
        uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
 
1186
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
 
1187
                          self._get_commit_message())
 
1188
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
 
1189
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1190
                          self._get_file_commit_messages())
 
1191
 
 
1192
 
 
1193
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
 
1194
 
 
1195
    def setUp(self):
 
1196
        super(TestReusingSavedCommitMessages, self).setUp()
 
1197
        self.tree = self.make_branch_and_tree('tree')
 
1198
        self.config = self.tree.branch.get_config()
 
1199
        self.config.set_user_option('per_file_commits', 'true')
 
1200
        self.build_tree(['tree/a', 'tree/b'])
 
1201
        self.tree.add(['a'], ['a-id'])
 
1202
        self.tree.add(['b'], ['b-id'])
 
1203
        rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
 
1204
        rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
 
1205
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1206
        self.build_tree_contents([('tree/a', 'new a content\n'),
 
1207
                                  ('tree/b', 'new b content'),])
 
1208
 
 
1209
    def _get_commit_dialog(self, tree):
 
1210
        # Ensure we will never use a dialog that can actually prompt the user
 
1211
        # during the test suite. Test *can* and *should* override with the
 
1212
        # correct question dialog type.
 
1213
        dlg = commit.CommitDialog(tree)
 
1214
        self._set_question_no(dlg)
 
1215
        return dlg
 
1216
 
 
1217
    def test_setup_saved_messages(self):
 
1218
        # Check the initial setup
 
1219
        self.assertEquals(u'two', self._get_commit_message())
 
1220
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
 
1221
                          self._get_file_commit_messages())
 
1222
 
 
1223
    def test_messages_are_reloaded(self):
 
1224
        dlg = self._get_commit_dialog(self.tree)
 
1225
        self.assertEquals(u'two', dlg._get_global_commit_message())
 
1226
        self.assertEquals(([u'a', u'b'],
 
1227
                           [{ 'path': 'a',
 
1228
                             'file_id': 'a-id', 'message': 'a msg 2',},
 
1229
                           {'path': 'b',
 
1230
                            'file_id': 'b-id', 'message': 'b msg 2',}],),
 
1231
                          dlg._get_specific_files())
 
1232
 
 
1233
    def test_messages_are_consumed(self):
 
1234
        dlg = self._get_commit_dialog(self.tree)
 
1235
        dlg._do_commit()
 
1236
        self.assertEquals(u'', self._get_commit_message())
 
1237
        self.assertEquals(u'de', self._get_file_commit_messages())
 
1238
 
 
1239
    def test_messages_are_saved_on_cancel_if_required(self):
 
1240
        dlg = self._get_commit_dialog(self.tree)
 
1241
        self._set_question_yes(dlg) # Save messages
 
1242
        dlg._do_cancel()
 
1243
        self.assertEquals(u'two', self._get_commit_message())
 
1244
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
 
1245
                          self._get_file_commit_messages())
 
1246
 
 
1247
    def test_messages_are_cleared_on_cancel_if_required(self):
 
1248
        dlg = self._get_commit_dialog(self.tree)
 
1249
        self._set_question_no(dlg) # Don't save messages
 
1250
        dlg._do_cancel()
 
1251
        self.assertEquals(u'', self._get_commit_message())
 
1252
        self.assertEquals(u'de',
 
1253
                          self._get_file_commit_messages())