You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
4.7 KiB
Python
213 lines
4.7 KiB
Python
#!/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)
|