14
15
# along with this program; if not, write to the Free Software
 
15
16
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 
17
 
from bzrlib.errors import BinaryFile
 
18
 
from bzrlib.patch import diff3
 
19
 
from bzrlib.tests import TestCaseInTempDir
 
 
20
from breezy.iterablefile import IterableFile
 
 
21
from breezy.errors import BinaryFile
 
 
22
from breezy.patch import diff3, PatchInvokeError, run_patch, iter_patched_from_hunks
 
 
23
from breezy.patches import parse_patch
 
 
24
from breezy.tests import TestCaseInTempDir, TestCase
 
22
27
class TestPatch(TestCaseInTempDir):
 
24
29
    def test_diff3_binaries(self):
 
25
 
        file('this', 'wb').write('a')
 
26
 
        file('other', 'wb').write('a')
 
27
 
        file('base', 'wb').write('\x00')
 
 
30
        with open('this', 'wb') as f:
 
 
32
        with open('other', 'wb') as f:
 
 
34
        with open('base', 'wb') as f:
 
28
36
        self.assertRaises(BinaryFile, diff3, 'unused', 'this', 'other', 'base')
 
 
39
class TestPatch(TestCaseInTempDir):
 
 
41
    def test_missing_patch(self):
 
 
42
        self.assertRaises(PatchInvokeError, run_patch, '.', [],
 
 
43
                          _patch_cmd='/unlikely/to/exist')
 
 
46
class PatchesTester(TestCase):
 
 
48
    def datafile(self, filename):
 
 
49
        data_path = os.path.join(os.path.dirname(__file__),
 
 
50
                                 "test_patches_data", filename)
 
 
51
        return open(data_path, "rb")
 
 
53
    def data_lines(self, filename):
 
 
54
        with self.datafile(filename) as datafile:
 
 
55
            return datafile.readlines()
 
 
57
    def test_iter_patched_from_hunks(self):
 
 
58
        """Test a few patch files, and make sure they work."""
 
 
60
            ('diff-2', 'orig-2', 'mod-2'),
 
 
61
            ('diff-3', 'orig-3', 'mod-3'),
 
 
62
            ('diff-4', 'orig-4', 'mod-4'),
 
 
63
            ('diff-5', 'orig-5', 'mod-5'),
 
 
64
            ('diff-6', 'orig-6', 'mod-6'),
 
 
65
            ('diff-7', 'orig-7', 'mod-7'),
 
 
67
        for diff, orig, mod in files:
 
 
68
            parsed = parse_patch(self.datafile(diff))
 
 
69
            orig_lines = list(self.datafile(orig))
 
 
70
            mod_lines = list(self.datafile(mod))
 
 
71
            iter_patched = iter_patched_from_hunks(orig_lines, parsed.hunks)
 
 
72
            patched_file = IterableFile(iter_patched)
 
 
74
            for patch_line in patched_file:
 
 
75
                self.assertEqual(patch_line, mod_lines[count], 'for file %s' % diff)
 
 
77
            self.assertEqual(count, len(mod_lines))