summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib/idle_test/test_sidebar.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/idlelib/idle_test/test_sidebar.py')
-rw-r--r--Lib/idlelib/idle_test/test_sidebar.py375
1 files changed, 0 insertions, 375 deletions
diff --git a/Lib/idlelib/idle_test/test_sidebar.py b/Lib/idlelib/idle_test/test_sidebar.py
deleted file mode 100644
index 0f5b4c7..0000000
--- a/Lib/idlelib/idle_test/test_sidebar.py
+++ /dev/null
@@ -1,375 +0,0 @@
-"""Test sidebar, coverage 93%"""
-import idlelib.sidebar
-from sys import platform
-from itertools import chain
-import unittest
-import unittest.mock
-from test.support import requires
-import tkinter as tk
-
-from idlelib.delegator import Delegator
-from idlelib.percolator import Percolator
-
-
-class Dummy_editwin:
- def __init__(self, text):
- self.text = text
- self.text_frame = self.text.master
- self.per = Percolator(text)
- self.undo = Delegator()
- self.per.insertfilter(self.undo)
-
- def setvar(self, name, value):
- pass
-
- def getlineno(self, index):
- return int(float(self.text.index(index)))
-
-
-class LineNumbersTest(unittest.TestCase):
-
- @classmethod
- def setUpClass(cls):
- requires('gui')
- cls.root = tk.Tk()
-
- cls.text_frame = tk.Frame(cls.root)
- cls.text_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
- cls.text_frame.rowconfigure(1, weight=1)
- cls.text_frame.columnconfigure(1, weight=1)
-
- cls.text = tk.Text(cls.text_frame, width=80, height=24, wrap=tk.NONE)
- cls.text.grid(row=1, column=1, sticky=tk.NSEW)
-
- cls.editwin = Dummy_editwin(cls.text)
- cls.editwin.vbar = tk.Scrollbar(cls.text_frame)
-
- @classmethod
- def tearDownClass(cls):
- cls.editwin.per.close()
- cls.root.update()
- cls.root.destroy()
- del cls.text, cls.text_frame, cls.editwin, cls.root
-
- def setUp(self):
- self.linenumber = idlelib.sidebar.LineNumbers(self.editwin)
-
- self.highlight_cfg = {"background": '#abcdef',
- "foreground": '#123456'}
- orig_idleConf_GetHighlight = idlelib.sidebar.idleConf.GetHighlight
- def mock_idleconf_GetHighlight(theme, element):
- if element == 'linenumber':
- return self.highlight_cfg
- return orig_idleConf_GetHighlight(theme, element)
- GetHighlight_patcher = unittest.mock.patch.object(
- idlelib.sidebar.idleConf, 'GetHighlight', mock_idleconf_GetHighlight)
- GetHighlight_patcher.start()
- self.addCleanup(GetHighlight_patcher.stop)
-
- self.font_override = 'TkFixedFont'
- def mock_idleconf_GetFont(root, configType, section):
- return self.font_override
- GetFont_patcher = unittest.mock.patch.object(
- idlelib.sidebar.idleConf, 'GetFont', mock_idleconf_GetFont)
- GetFont_patcher.start()
- self.addCleanup(GetFont_patcher.stop)
-
- def tearDown(self):
- self.text.delete('1.0', 'end')
-
- def get_selection(self):
- return tuple(map(str, self.text.tag_ranges('sel')))
-
- def get_line_screen_position(self, line):
- bbox = self.linenumber.sidebar_text.bbox(f'{line}.end -1c')
- x = bbox[0] + 2
- y = bbox[1] + 2
- return x, y
-
- def assert_state_disabled(self):
- state = self.linenumber.sidebar_text.config()['state']
- self.assertEqual(state[-1], tk.DISABLED)
-
- def get_sidebar_text_contents(self):
- return self.linenumber.sidebar_text.get('1.0', tk.END)
-
- def assert_sidebar_n_lines(self, n_lines):
- expected = '\n'.join(chain(map(str, range(1, n_lines + 1)), ['']))
- self.assertEqual(self.get_sidebar_text_contents(), expected)
-
- def assert_text_equals(self, expected):
- return self.assertEqual(self.text.get('1.0', 'end'), expected)
-
- def test_init_empty(self):
- self.assert_sidebar_n_lines(1)
-
- def test_init_not_empty(self):
- self.text.insert('insert', 'foo bar\n'*3)
- self.assert_text_equals('foo bar\n'*3 + '\n')
- self.assert_sidebar_n_lines(4)
-
- def test_toggle_linenumbering(self):
- self.assertEqual(self.linenumber.is_shown, False)
- self.linenumber.show_sidebar()
- self.assertEqual(self.linenumber.is_shown, True)
- self.linenumber.hide_sidebar()
- self.assertEqual(self.linenumber.is_shown, False)
- self.linenumber.hide_sidebar()
- self.assertEqual(self.linenumber.is_shown, False)
- self.linenumber.show_sidebar()
- self.assertEqual(self.linenumber.is_shown, True)
- self.linenumber.show_sidebar()
- self.assertEqual(self.linenumber.is_shown, True)
-
- def test_insert(self):
- self.text.insert('insert', 'foobar')
- self.assert_text_equals('foobar\n')
- self.assert_sidebar_n_lines(1)
- self.assert_state_disabled()
-
- self.text.insert('insert', '\nfoo')
- self.assert_text_equals('foobar\nfoo\n')
- self.assert_sidebar_n_lines(2)
- self.assert_state_disabled()
-
- self.text.insert('insert', 'hello\n'*2)
- self.assert_text_equals('foobar\nfoohello\nhello\n\n')
- self.assert_sidebar_n_lines(4)
- self.assert_state_disabled()
-
- self.text.insert('insert', '\nworld')
- self.assert_text_equals('foobar\nfoohello\nhello\n\nworld\n')
- self.assert_sidebar_n_lines(5)
- self.assert_state_disabled()
-
- def test_delete(self):
- self.text.insert('insert', 'foobar')
- self.assert_text_equals('foobar\n')
- self.text.delete('1.1', '1.3')
- self.assert_text_equals('fbar\n')
- self.assert_sidebar_n_lines(1)
- self.assert_state_disabled()
-
- self.text.insert('insert', 'foo\n'*2)
- self.assert_text_equals('fbarfoo\nfoo\n\n')
- self.assert_sidebar_n_lines(3)
- self.assert_state_disabled()
-
- # Note: deleting up to "2.end" doesn't delete the final newline.
- self.text.delete('2.0', '2.end')
- self.assert_text_equals('fbarfoo\n\n\n')
- self.assert_sidebar_n_lines(3)
- self.assert_state_disabled()
-
- self.text.delete('1.3', 'end')
- self.assert_text_equals('fba\n')
- self.assert_sidebar_n_lines(1)
- self.assert_state_disabled()
-
- # Note: Text widgets always keep a single '\n' character at the end.
- self.text.delete('1.0', 'end')
- self.assert_text_equals('\n')
- self.assert_sidebar_n_lines(1)
- self.assert_state_disabled()
-
- def test_sidebar_text_width(self):
- """
- Test that linenumber text widget is always at the minimum
- width
- """
- def get_width():
- return self.linenumber.sidebar_text.config()['width'][-1]
-
- self.assert_sidebar_n_lines(1)
- self.assertEqual(get_width(), 1)
-
- self.text.insert('insert', 'foo')
- self.assert_sidebar_n_lines(1)
- self.assertEqual(get_width(), 1)
-
- self.text.insert('insert', 'foo\n'*8)
- self.assert_sidebar_n_lines(9)
- self.assertEqual(get_width(), 1)
-
- self.text.insert('insert', 'foo\n')
- self.assert_sidebar_n_lines(10)
- self.assertEqual(get_width(), 2)
-
- self.text.insert('insert', 'foo\n')
- self.assert_sidebar_n_lines(11)
- self.assertEqual(get_width(), 2)
-
- self.text.delete('insert -1l linestart', 'insert linestart')
- self.assert_sidebar_n_lines(10)
- self.assertEqual(get_width(), 2)
-
- self.text.delete('insert -1l linestart', 'insert linestart')
- self.assert_sidebar_n_lines(9)
- self.assertEqual(get_width(), 1)
-
- self.text.insert('insert', 'foo\n'*90)
- self.assert_sidebar_n_lines(99)
- self.assertEqual(get_width(), 2)
-
- self.text.insert('insert', 'foo\n')
- self.assert_sidebar_n_lines(100)
- self.assertEqual(get_width(), 3)
-
- self.text.insert('insert', 'foo\n')
- self.assert_sidebar_n_lines(101)
- self.assertEqual(get_width(), 3)
-
- self.text.delete('insert -1l linestart', 'insert linestart')
- self.assert_sidebar_n_lines(100)
- self.assertEqual(get_width(), 3)
-
- self.text.delete('insert -1l linestart', 'insert linestart')
- self.assert_sidebar_n_lines(99)
- self.assertEqual(get_width(), 2)
-
- self.text.delete('50.0 -1c', 'end -1c')
- self.assert_sidebar_n_lines(49)
- self.assertEqual(get_width(), 2)
-
- self.text.delete('5.0 -1c', 'end -1c')
- self.assert_sidebar_n_lines(4)
- self.assertEqual(get_width(), 1)
-
- # Note: Text widgets always keep a single '\n' character at the end.
- self.text.delete('1.0', 'end -1c')
- self.assert_sidebar_n_lines(1)
- self.assertEqual(get_width(), 1)
-
- def test_click_selection(self):
- self.linenumber.show_sidebar()
- self.text.insert('1.0', 'one\ntwo\nthree\nfour\n')
- self.root.update()
-
- # Click on the second line.
- x, y = self.get_line_screen_position(2)
- self.linenumber.sidebar_text.event_generate('<Button-1>', x=x, y=y)
- self.linenumber.sidebar_text.update()
- self.root.update()
-
- self.assertEqual(self.get_selection(), ('2.0', '3.0'))
-
- def simulate_drag(self, start_line, end_line):
- start_x, start_y = self.get_line_screen_position(start_line)
- end_x, end_y = self.get_line_screen_position(end_line)
-
- self.linenumber.sidebar_text.event_generate('<Button-1>',
- x=start_x, y=start_y)
- self.root.update()
-
- def lerp(a, b, steps):
- """linearly interpolate from a to b (inclusive) in equal steps"""
- last_step = steps - 1
- for i in range(steps):
- yield ((last_step - i) / last_step) * a + (i / last_step) * b
-
- for x, y in zip(
- map(int, lerp(start_x, end_x, steps=11)),
- map(int, lerp(start_y, end_y, steps=11)),
- ):
- self.linenumber.sidebar_text.event_generate('<B1-Motion>', x=x, y=y)
- self.root.update()
-
- self.linenumber.sidebar_text.event_generate('<ButtonRelease-1>',
- x=end_x, y=end_y)
- self.root.update()
-
- def test_drag_selection_down(self):
- self.linenumber.show_sidebar()
- self.text.insert('1.0', 'one\ntwo\nthree\nfour\nfive\n')
- self.root.update()
-
- # Drag from the second line to the fourth line.
- self.simulate_drag(2, 4)
- self.assertEqual(self.get_selection(), ('2.0', '5.0'))
-
- def test_drag_selection_up(self):
- self.linenumber.show_sidebar()
- self.text.insert('1.0', 'one\ntwo\nthree\nfour\nfive\n')
- self.root.update()
-
- # Drag from the fourth line to the second line.
- self.simulate_drag(4, 2)
- self.assertEqual(self.get_selection(), ('2.0', '5.0'))
-
- def test_scroll(self):
- self.linenumber.show_sidebar()
- self.text.insert('1.0', 'line\n' * 100)
- self.root.update()
-
- # Scroll down 10 lines.
- self.text.yview_scroll(10, 'unit')
- self.root.update()
- self.assertEqual(self.text.index('@0,0'), '11.0')
- self.assertEqual(self.linenumber.sidebar_text.index('@0,0'), '11.0')
-
- # Generate a mouse-wheel event and make sure it scrolled up or down.
- # The meaning of the "delta" is OS-dependant, so this just checks for
- # any change.
- self.linenumber.sidebar_text.event_generate('<MouseWheel>',
- x=0, y=0,
- delta=10)
- self.root.update()
- self.assertNotEqual(self.text.index('@0,0'), '11.0')
- self.assertNotEqual(self.linenumber.sidebar_text.index('@0,0'), '11.0')
-
- def test_font(self):
- ln = self.linenumber
-
- orig_font = ln.sidebar_text['font']
- test_font = 'TkTextFont'
- self.assertNotEqual(orig_font, test_font)
-
- # Ensure line numbers aren't shown.
- ln.hide_sidebar()
-
- self.font_override = test_font
- # Nothing breaks when line numbers aren't shown.
- ln.update_font()
-
- # Activate line numbers, previous font change is immediately effective.
- ln.show_sidebar()
- self.assertEqual(ln.sidebar_text['font'], test_font)
-
- # Call the font update with line numbers shown, change is picked up.
- self.font_override = orig_font
- ln.update_font()
- self.assertEqual(ln.sidebar_text['font'], orig_font)
-
- def test_highlight_colors(self):
- ln = self.linenumber
-
- orig_colors = dict(self.highlight_cfg)
- test_colors = {'background': '#222222', 'foreground': '#ffff00'}
-
- def assert_colors_are_equal(colors):
- self.assertEqual(ln.sidebar_text['background'], colors['background'])
- self.assertEqual(ln.sidebar_text['foreground'], colors['foreground'])
-
- # Ensure line numbers aren't shown.
- ln.hide_sidebar()
-
- self.highlight_cfg = test_colors
- # Nothing breaks with inactive code context.
- ln.update_colors()
-
- # Show line numbers, previous colors change is immediately effective.
- ln.show_sidebar()
- assert_colors_are_equal(test_colors)
-
- # Call colors update with no change to the configured colors.
- ln.update_colors()
- assert_colors_are_equal(test_colors)
-
- # Call the colors update with line numbers shown, change is picked up.
- self.highlight_cfg = orig_colors
- ln.update_colors()
- assert_colors_are_equal(orig_colors)
-
-
-if __name__ == '__main__':
- unittest.main(verbosity=2)