summaryrefslogtreecommitdiff
path: root/Lib/idlelib/idle_test
diff options
context:
space:
mode:
authorCheryl Sabella <cheryl.sabella@gmail.com>2019-07-17 09:44:44 -0400
committerTerry Jan Reedy <tjreedy@udel.edu>2019-07-17 09:44:44 -0400
commit82494aa6d947c4a320c09c58fe0f100cdcf7af0b (patch)
tree703900861289f38a37b1a2020ebf3c9bc37bd2ea /Lib/idlelib/idle_test
parentfb26504d14a08fcd61bb92bb989b6d2b12188535 (diff)
downloadcpython-git-82494aa6d947c4a320c09c58fe0f100cdcf7af0b.tar.gz
bpo-36390: IDLE: Combine region formatting methods. (GH-12481)
Rename paragraph.py to format.py and add region formatting methods from editor.py. Add tests for the latter.
Diffstat (limited to 'Lib/idlelib/idle_test')
-rw-r--r--Lib/idlelib/idle_test/test_format.py (renamed from Lib/idlelib/idle_test/test_paragraph.py)238
1 files changed, 218 insertions, 20 deletions
diff --git a/Lib/idlelib/idle_test/test_paragraph.py b/Lib/idlelib/idle_test/test_format.py
index 0cb966fb96..a2d27ed69d 100644
--- a/Lib/idlelib/idle_test/test_paragraph.py
+++ b/Lib/idlelib/idle_test/test_format.py
@@ -1,7 +1,8 @@
-"Test paragraph, coverage 76%."
+"Test format, coverage 99%."
-from idlelib import paragraph as pg
+from idlelib import format as ft
import unittest
+from unittest import mock
from test.support import requires
from tkinter import Tk, Text
from idlelib.editor import EditorWindow
@@ -16,26 +17,26 @@ class Is_Get_Test(unittest.TestCase):
leadingws_nocomment = ' This is not a comment'
def test_is_all_white(self):
- self.assertTrue(pg.is_all_white(''))
- self.assertTrue(pg.is_all_white('\t\n\r\f\v'))
- self.assertFalse(pg.is_all_white(self.test_comment))
+ self.assertTrue(ft.is_all_white(''))
+ self.assertTrue(ft.is_all_white('\t\n\r\f\v'))
+ self.assertFalse(ft.is_all_white(self.test_comment))
def test_get_indent(self):
Equal = self.assertEqual
- Equal(pg.get_indent(self.test_comment), '')
- Equal(pg.get_indent(self.trailingws_comment), '')
- Equal(pg.get_indent(self.leadingws_comment), ' ')
- Equal(pg.get_indent(self.leadingws_nocomment), ' ')
+ Equal(ft.get_indent(self.test_comment), '')
+ Equal(ft.get_indent(self.trailingws_comment), '')
+ Equal(ft.get_indent(self.leadingws_comment), ' ')
+ Equal(ft.get_indent(self.leadingws_nocomment), ' ')
def test_get_comment_header(self):
Equal = self.assertEqual
# Test comment strings
- Equal(pg.get_comment_header(self.test_comment), '#')
- Equal(pg.get_comment_header(self.trailingws_comment), '#')
- Equal(pg.get_comment_header(self.leadingws_comment), ' #')
+ Equal(ft.get_comment_header(self.test_comment), '#')
+ Equal(ft.get_comment_header(self.trailingws_comment), '#')
+ Equal(ft.get_comment_header(self.leadingws_comment), ' #')
# Test non-comment strings
- Equal(pg.get_comment_header(self.leadingws_nocomment), ' ')
- Equal(pg.get_comment_header(self.test_nocomment), '')
+ Equal(ft.get_comment_header(self.leadingws_nocomment), ' ')
+ Equal(ft.get_comment_header(self.test_nocomment), '')
class FindTest(unittest.TestCase):
@@ -63,7 +64,7 @@ class FindTest(unittest.TestCase):
linelength = int(text.index("%d.end" % line).split('.')[1])
for col in (0, linelength//2, linelength):
tempindex = "%d.%d" % (line, col)
- self.assertEqual(pg.find_paragraph(text, tempindex), expected)
+ self.assertEqual(ft.find_paragraph(text, tempindex), expected)
text.delete('1.0', 'end')
def test_find_comment(self):
@@ -162,7 +163,7 @@ class ReformatFunctionTest(unittest.TestCase):
def test_reformat_paragraph(self):
Equal = self.assertEqual
- reform = pg.reformat_paragraph
+ reform = ft.reformat_paragraph
hw = "O hello world"
Equal(reform(' ', 1), ' ')
Equal(reform("Hello world", 20), "Hello world")
@@ -193,7 +194,7 @@ class ReformatCommentTest(unittest.TestCase):
test_string = (
" \"\"\"this is a test of a reformat for a triple quoted string"
" will it reformat to less than 70 characters for me?\"\"\"")
- result = pg.reformat_comment(test_string, 70, " ")
+ result = ft.reformat_comment(test_string, 70, " ")
expected = (
" \"\"\"this is a test of a reformat for a triple quoted string will it\n"
" reformat to less than 70 characters for me?\"\"\"")
@@ -202,7 +203,7 @@ class ReformatCommentTest(unittest.TestCase):
test_comment = (
"# this is a test of a reformat for a triple quoted string will "
"it reformat to less than 70 characters for me?")
- result = pg.reformat_comment(test_comment, 70, "#")
+ result = ft.reformat_comment(test_comment, 70, "#")
expected = (
"# this is a test of a reformat for a triple quoted string will it\n"
"# reformat to less than 70 characters for me?")
@@ -211,7 +212,7 @@ class ReformatCommentTest(unittest.TestCase):
class FormatClassTest(unittest.TestCase):
def test_init_close(self):
- instance = pg.FormatParagraph('editor')
+ instance = ft.FormatParagraph('editor')
self.assertEqual(instance.editwin, 'editor')
instance.close()
self.assertEqual(instance.editwin, None)
@@ -273,7 +274,7 @@ class FormatEventTest(unittest.TestCase):
cls.root.withdraw()
editor = Editor(root=cls.root)
cls.text = editor.text.text # Test code does not need the wrapper.
- cls.formatter = pg.FormatParagraph(editor).format_paragraph_event
+ cls.formatter = ft.FormatParagraph(editor).format_paragraph_event
# Sets the insert mark just after the re-wrapped and inserted text.
@classmethod
@@ -375,5 +376,202 @@ class FormatEventTest(unittest.TestCase):
## text.delete('1.0', 'end')
+class DummyEditwin:
+ def __init__(self, root, text):
+ self.root = root
+ self.text = text
+ self.indentwidth = 4
+ self.tabwidth = 4
+ self.usetabs = False
+ self.context_use_ps1 = True
+
+ _make_blanks = EditorWindow._make_blanks
+ get_selection_indices = EditorWindow.get_selection_indices
+
+
+class FormatRegionTest(unittest.TestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ requires('gui')
+ cls.root = Tk()
+ cls.root.withdraw()
+ cls.text = Text(cls.root)
+ cls.text.undo_block_start = mock.Mock()
+ cls.text.undo_block_stop = mock.Mock()
+ cls.editor = DummyEditwin(cls.root, cls.text)
+ cls.formatter = ft.FormatRegion(cls.editor)
+
+ @classmethod
+ def tearDownClass(cls):
+ del cls.text, cls.formatter, cls.editor
+ cls.root.update_idletasks()
+ cls.root.destroy()
+ del cls.root
+
+ def setUp(self):
+ self.text.insert('1.0', self.code_sample)
+
+ def tearDown(self):
+ self.text.delete('1.0', 'end')
+
+ code_sample = """\
+
+class C1():
+ # Class comment.
+ def __init__(self, a, b):
+ self.a = a
+ self.b = b
+
+ def compare(self):
+ if a > b:
+ return a
+ elif a < b:
+ return b
+ else:
+ return None
+"""
+
+ def test_get_region(self):
+ get = self.formatter.get_region
+ text = self.text
+ eq = self.assertEqual
+
+ # Add selection.
+ text.tag_add('sel', '7.0', '10.0')
+ expected_lines = ['',
+ ' def compare(self):',
+ ' if a > b:',
+ '']
+ eq(get(), ('7.0', '10.0', '\n'.join(expected_lines), expected_lines))
+
+ # Remove selection.
+ text.tag_remove('sel', '1.0', 'end')
+ eq(get(), ('15.0', '16.0', '\n', ['', '']))
+
+ def test_set_region(self):
+ set_ = self.formatter.set_region
+ text = self.text
+ eq = self.assertEqual
+
+ save_bell = text.bell
+ text.bell = mock.Mock()
+ line6 = self.code_sample.splitlines()[5]
+ line10 = self.code_sample.splitlines()[9]
+
+ text.tag_add('sel', '6.0', '11.0')
+ head, tail, chars, lines = self.formatter.get_region()
+
+ # No changes.
+ set_(head, tail, chars, lines)
+ text.bell.assert_called_once()
+ eq(text.get('6.0', '11.0'), chars)
+ eq(text.get('sel.first', 'sel.last'), chars)
+ text.tag_remove('sel', '1.0', 'end')
+
+ # Alter selected lines by changing lines and adding a newline.
+ newstring = 'added line 1\n\n\n\n'
+ newlines = newstring.split('\n')
+ set_('7.0', '10.0', chars, newlines)
+ # Selection changed.
+ eq(text.get('sel.first', 'sel.last'), newstring)
+ # Additional line added, so last index is changed.
+ eq(text.get('7.0', '11.0'), newstring)
+ # Before and after lines unchanged.
+ eq(text.get('6.0', '7.0-1c'), line6)
+ eq(text.get('11.0', '12.0-1c'), line10)
+ text.tag_remove('sel', '1.0', 'end')
+
+ text.bell = save_bell
+
+ def test_indent_region_event(self):
+ indent = self.formatter.indent_region_event
+ text = self.text
+ eq = self.assertEqual
+
+ text.tag_add('sel', '7.0', '10.0')
+ indent()
+ # Blank lines aren't affected by indent.
+ eq(text.get('7.0', '10.0'), ('\n def compare(self):\n if a > b:\n'))
+
+ def test_dedent_region_event(self):
+ dedent = self.formatter.dedent_region_event
+ text = self.text
+ eq = self.assertEqual
+
+ text.tag_add('sel', '7.0', '10.0')
+ dedent()
+ # Blank lines aren't affected by dedent.
+ eq(text.get('7.0', '10.0'), ('\ndef compare(self):\n if a > b:\n'))
+
+ def test_comment_region_event(self):
+ comment = self.formatter.comment_region_event
+ text = self.text
+ eq = self.assertEqual
+
+ text.tag_add('sel', '7.0', '10.0')
+ comment()
+ eq(text.get('7.0', '10.0'), ('##\n## def compare(self):\n## if a > b:\n'))
+
+ def test_uncomment_region_event(self):
+ comment = self.formatter.comment_region_event
+ uncomment = self.formatter.uncomment_region_event
+ text = self.text
+ eq = self.assertEqual
+
+ text.tag_add('sel', '7.0', '10.0')
+ comment()
+ uncomment()
+ eq(text.get('7.0', '10.0'), ('\n def compare(self):\n if a > b:\n'))
+
+ # Only remove comments at the beginning of a line.
+ text.tag_remove('sel', '1.0', 'end')
+ text.tag_add('sel', '3.0', '4.0')
+ uncomment()
+ eq(text.get('3.0', '3.end'), (' # Class comment.'))
+
+ self.formatter.set_region('3.0', '4.0', '', ['# Class comment.', ''])
+ uncomment()
+ eq(text.get('3.0', '3.end'), (' Class comment.'))
+
+ @mock.patch.object(ft.FormatRegion, "_asktabwidth")
+ def test_tabify_region_event(self, _asktabwidth):
+ tabify = self.formatter.tabify_region_event
+ text = self.text
+ eq = self.assertEqual
+
+ text.tag_add('sel', '7.0', '10.0')
+ # No tabwidth selected.
+ _asktabwidth.return_value = None
+ self.assertIsNone(tabify())
+
+ _asktabwidth.return_value = 3
+ self.assertIsNotNone(tabify())
+ eq(text.get('7.0', '10.0'), ('\n\t def compare(self):\n\t\t if a > b:\n'))
+
+ @mock.patch.object(ft.FormatRegion, "_asktabwidth")
+ def test_untabify_region_event(self, _asktabwidth):
+ untabify = self.formatter.untabify_region_event
+ text = self.text
+ eq = self.assertEqual
+
+ text.tag_add('sel', '7.0', '10.0')
+ # No tabwidth selected.
+ _asktabwidth.return_value = None
+ self.assertIsNone(untabify())
+
+ _asktabwidth.return_value = 2
+ self.formatter.tabify_region_event()
+ _asktabwidth.return_value = 3
+ self.assertIsNotNone(untabify())
+ eq(text.get('7.0', '10.0'), ('\n def compare(self):\n if a > b:\n'))
+
+ @mock.patch.object(ft, "askinteger")
+ def test_ask_tabwidth(self, askinteger):
+ ask = self.formatter._asktabwidth
+ askinteger.return_value = 10
+ self.assertEqual(ask(), 10)
+
+
if __name__ == '__main__':
unittest.main(verbosity=2, exit=2)