#!/usr/bin/env python # encoding: utf-8 # pylint: skip-file import unittest from _diff import diff, guess_edit from position import Position def transform(a, cmds): buf = a.split('\n') for cmd in cmds: ctype, line, col, char = cmd if ctype == 'D': if char != '\n': buf[line] = buf[line][:col] + buf[line][col + len(char):] else: buf[line] = buf[line] + buf[line + 1] del buf[line + 1] elif ctype == 'I': buf[line] = buf[line][:col] + char + buf[line][col:] buf = '\n'.join(buf).split('\n') return '\n'.join(buf) import unittest # Test Guessing {{{ class _BaseGuessing(object): def runTest(self): rv, es = guess_edit( self.initial_line, self.a, self.b, Position(*self.ppos), Position(*self.pos)) self.assertEqual(rv, True) self.assertEqual(self.wanted, es) class TestGuessing_Noop0(_BaseGuessing, unittest.TestCase): a, b = [], [] initial_line = 0 ppos, pos = (0, 6), (0, 7) wanted = () class TestGuessing_InsertOneChar(_BaseGuessing, unittest.TestCase): a, b = ['Hello World'], ['Hello World'] initial_line = 0 ppos, pos = (0, 6), (0, 7) wanted = ( ('I', 0, 6, ' '), ) class TestGuessing_InsertOneChar1(_BaseGuessing, unittest.TestCase): a, b = ['Hello World'], ['Hello World'] initial_line = 0 ppos, pos = (0, 7), (0, 8) wanted = ( ('I', 0, 7, ' '), ) class TestGuessing_BackspaceOneChar(_BaseGuessing, unittest.TestCase): a, b = ['Hello World'], ['Hello World'] initial_line = 0 ppos, pos = (0, 7), (0, 6) wanted = ( ('D', 0, 6, ' '), ) class TestGuessing_DeleteOneChar(_BaseGuessing, unittest.TestCase): a, b = ['Hello World'], ['Hello World'] initial_line = 0 ppos, pos = (0, 5), (0, 5) wanted = ( ('D', 0, 5, ' '), ) # End: Test Guessing }}} class _Base(object): def runTest(self): es = diff(self.a, self.b) tr = transform(self.a, es) self.assertEqual(self.b, tr) self.assertEqual(self.wanted, es) class TestEmptyString(_Base, unittest.TestCase): a, b = '', '' wanted = () class TestAllMatch(_Base, unittest.TestCase): a, b = 'abcdef', 'abcdef' wanted = () class TestLotsaNewlines(_Base, unittest.TestCase): a, b = 'Hello', 'Hello\nWorld\nWorld\nWorld' wanted = ( ('I', 0, 5, '\n'), ('I', 1, 0, 'World'), ('I', 1, 5, '\n'), ('I', 2, 0, 'World'), ('I', 2, 5, '\n'), ('I', 3, 0, 'World'), ) class TestCrash(_Base, unittest.TestCase): a = 'hallo Blah mitte=sdfdsfsd\nhallo kjsdhfjksdhfkjhsdfkh mittekjshdkfhkhsdfdsf' b = 'hallo Blah mitte=sdfdsfsd\nhallo b mittekjshdkfhkhsdfdsf' wanted = ( ('D', 1, 6, 'kjsdhfjksdhfkjhsdfkh'), ('I', 1, 6, 'b'), ) class TestRealLife(_Base, unittest.TestCase): a = 'hallo End Beginning' b = 'hallo End t' wanted = ( ('D', 0, 10, 'Beginning'), ('I', 0, 10, 't'), ) class TestRealLife1(_Base, unittest.TestCase): a = 'Vorne hallo Hinten' b = 'Vorne hallo Hinten' wanted = ( ('I', 0, 11, ' '), ) class TestWithNewline(_Base, unittest.TestCase): a = 'First Line\nSecond Line' b = 'n' wanted = ( ('D', 0, 0, 'First Line'), ('D', 0, 0, '\n'), ('D', 0, 0, 'Second Line'), ('I', 0, 0, 'n'), ) class TestCheapDelete(_Base, unittest.TestCase): a = 'Vorne hallo Hinten' b = 'Vorne Hinten' wanted = ( ('D', 0, 5, ' hallo'), ) class TestNoSubstring(_Base, unittest.TestCase): a, b = 'abc', 'def' wanted = ( ('D', 0, 0, 'abc'), ('I', 0, 0, 'def'), ) class TestCommonCharacters(_Base, unittest.TestCase): a, b = 'hasomelongertextbl', 'hol' wanted = ( ('D', 0, 1, 'asomelongertextb'), ('I', 0, 1, 'o'), ) class TestUltiSnipsProblem(_Base, unittest.TestCase): a = 'this is it this is it this is it' b = 'this is it a this is it' wanted = ( ('D', 0, 11, 'this is it'), ('I', 0, 11, 'a'), ) class MatchIsTooCheap(_Base, unittest.TestCase): a = 'stdin.h' b = 's' wanted = ( ('D', 0, 1, 'tdin.h'), ) class MultiLine(_Base, unittest.TestCase): a = 'hi first line\nsecond line first line\nsecond line world' b = 'hi first line\nsecond line k world' wanted = ( ('D', 1, 12, 'first line'), ('D', 1, 12, '\n'), ('D', 1, 12, 'second line'), ('I', 1, 12, 'k'), ) if __name__ == '__main__': unittest.main() # k = TestEditScript() # unittest.TextTestRunner().run(k)