Skip to content

Commit 6323ab8

Browse files
committed
unconditionally remove last character, tests
1 parent 88c318c commit 6323ab8

File tree

2 files changed

+32
-11
lines changed

2 files changed

+32
-11
lines changed

Lib/idlelib/editor.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1338,23 +1338,23 @@ def set_indentation_params(self, is_py_src, guess=True):
13381338
self.usetabs = False
13391339
self.set_tk_tabwidth(self.tabwidth)
13401340

1341-
def delete_trail_whitespace(self, want, chars, tabwidth):
1341+
def delete_trail_char_and_space(self, want, chars, tabwidth):
1342+
chars = chars[:-1] # remove last character unconditionally
13421343
current_pos = 0
13431344
ncharsretained = 0
13441345
for char in chars:
13451346
if char == '\t':
13461347
current_pos = (current_pos // tabwidth + 1) * tabwidth
13471348
else:
13481349
current_pos += 1
1349-
ncharsretained += 1
13501350
if current_pos > want:
1351-
ncharsretained -= 1
13521351
break
1352+
ncharsretained += 1
13531353
for i in range(ncharsretained, len(chars)):
13541354
if chars[i] not in " \t":
13551355
ncharsretained = i + 1
13561356
chars = chars[:ncharsretained]
1357-
return len(chars) - ncharsretained, chars
1357+
return len(chars) - ncharsretained + 1, chars # removal of last
13581358

13591359
def smart_backspace_event(self, event):
13601360
text = self.text
@@ -1384,7 +1384,7 @@ def smart_backspace_event(self, event):
13841384
assert have > 0
13851385
want = ((have - 1) // self.indentwidth) * self.indentwidth
13861386
# Debug prompt is multilined....
1387-
ncharsdeleted, chars = self.delete_trail_whitespace(want, chars, tabwidth)
1387+
ncharsdeleted, chars = self.delete_trail_char_and_space(want, chars, tabwidth)
13881388
text.undo_block_start()
13891389
text.delete("insert-%dc" % ncharsdeleted, "insert")
13901390
if have < want:

Lib/idlelib/idle_test/test_editor.py

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -239,20 +239,41 @@ def test_rclick(self):
239239

240240
class DeleteWantTest(unittest.TestCase):
241241

242-
def test_delete_trail_whitespace(self):
242+
def test_delete_trail_char_and_space(self):
243243
with unittest.mock.patch.object(Editor, '__init__', return_value=None) as mock_init:
244244
ew = Editor()
245+
245246
test_str = "abcde" + 10000 * "\t" + 10000 * " "
246-
res_str = ew.delete_trail_whitespace(30000, test_str, 4)[1]
247+
res_str = ew.delete_trail_char_and_space(30000, test_str, 4)[1]
247248
self.assertEqual(res_str, "abcde" + 7499 * "\t")
248-
res_str = ew.delete_trail_whitespace(41005, test_str, 4)[1]
249+
res_str = ew.delete_trail_char_and_space(41005, test_str, 4)[1]
249250
self.assertEqual(res_str, "abcde" + 10000 * "\t" + 1001 * " ")
250-
res_str = ew.delete_trail_whitespace(3, test_str, 4)[1]
251+
res_str = ew.delete_trail_char_and_space(3, test_str, 4)[1]
251252
self.assertEqual(res_str, "abcde")
252-
res_str = ew.delete_trail_whitespace(6, test_str, 4)[1]
253+
res_str = ew.delete_trail_char_and_space(6, test_str, 4)[1]
253254
self.assertEqual(res_str, "abcde")
254-
res_str = ew.delete_trail_whitespace(30002, test_str, 4)[1]
255+
res_str = ew.delete_trail_char_and_space(30002, test_str, 4)[1]
255256
self.assertEqual(res_str, "abcde" + 7499 * "\t")
257+
258+
test_str = "abcde\tabd\t\t"
259+
res_str = ew.delete_trail_char_and_space(7, test_str, 4)[1]
260+
self.assertEqual(res_str, "abcde\tabd")
261+
res_str = ew.delete_trail_char_and_space(12, test_str, 4)[1]
262+
self.assertEqual(res_str, "abcde\tabd\t")
263+
res_str = ew.delete_trail_char_and_space(13, test_str, 4)[1]
264+
self.assertEqual(res_str, "abcde\tabd\t")
265+
res_str = ew.delete_trail_char_and_space(16, test_str, 4)[1]
266+
self.assertEqual(res_str, "abcde\tabd\t")
267+
268+
test_str = "abcde\tabd\t \ta"
269+
res_str = ew.delete_trail_char_and_space(7, test_str, 4)[1]
270+
self.assertEqual(res_str, "abcde\tabd")
271+
res_str = ew.delete_trail_char_and_space(12, test_str, 4)[1]
272+
self.assertEqual(res_str, "abcde\tabd\t")
273+
res_str = ew.delete_trail_char_and_space(13, test_str, 4)[1]
274+
self.assertEqual(res_str, "abcde\tabd\t ")
275+
res_str = ew.delete_trail_char_and_space(16, test_str, 4)[1]
276+
self.assertEqual(res_str, "abcde\tabd\t \t")
256277

257278
if __name__ == '__main__':
258279
unittest.main(verbosity=2)

0 commit comments

Comments
 (0)