11"""Unittest for idlelib.LineNumber"""
2+ from itertools import chain
23import unittest
34from test .support import requires
45import tkinter as tk
1112class Dummy_editwin :
1213 def __init__ (self , text ):
1314 self .text = text
15+ self .text_frame = self .text .master
1416 self .per = Percolator (text )
1517 self .undo = Delegator ()
1618 self .per .insertfilter (self .undo )
@@ -34,77 +36,93 @@ def tearDownClass(cls):
3436 cls .editwin .per .close ()
3537 cls .text .destroy ()
3638 cls .root .destroy ()
37- del cls .text , cls .root
39+ del cls .text , cls .editwin , cls . root
3840
3941 def setUp (self ):
4042 self .linenumber = LineNumbers (self .editwin )
4143
4244 def tearDown (self ):
4345 self .text .delete ('1.0' , 'end' )
4446
47+ def assert_state_disabled (self ):
48+ state = self .linenumber .sidebar_text .config ()['state' ]
49+ self .assertEqual (state [- 1 ], tk .DISABLED )
50+
51+ def get_sidebar_text_contents (self ):
52+ return self .linenumber .sidebar_text .get ('1.0' , tk .END )
53+
54+ def assert_sidebar_n_lines (self , n_lines ):
55+ expected = '\n ' .join (chain (map (str , range (1 , n_lines + 1 )), ['' ]))
56+ self .assertEqual (self .get_sidebar_text_contents (), expected )
57+
58+ def assert_text_equals (self , expected ):
59+ return self .assertEqual (self .text .get ('1.0' , 'end' ), expected )
60+
4561 def test_init_empty (self ):
46- get = self .linenumber .sidebar_text .get
47- self .assertEqual (get ('1.0' , 'end' ), '1\n ' )
62+ self .assert_sidebar_n_lines (1 )
4863
4964 def test_init_not_empty (self ):
5065 self .text .insert ('insert' , 'foo bar\n ' * 3 )
51- linenumber = LineNumbers (self .editwin )
52- get = linenumber .sidebar_text .get
53- self .assertEqual (get ('1.0' , 'end' ), '1\n 2\n 3\n 4\n ' )
66+ self .assert_text_equals ('foo bar\n ' * 3 + '\n ' )
67+ self .assert_sidebar_n_lines (4 )
5468
5569 def test_toggle_linenumbering (self ):
56- self .linenumber .side = tk .LEFT
57- self .linenumber .toggle_line_numbers_event ('' )
70+ self .assertEqual ( self . linenumber .side , tk .LEFT )
71+ self .linenumber .toggle_line_numbers_event (None )
5872 self .assertEqual (self .linenumber .side , None )
59-
60- self .linenumber .side = None
61- self .linenumber .toggle_line_numbers_event ('' )
73+ self .linenumber .toggle_line_numbers_event (None )
6274 self .assertEqual (self .linenumber .side , tk .LEFT )
6375
6476 def test_insert (self ):
65- text = self .editwin . text
66- get = self .linenumber . sidebar_text . get
67- config = self .linenumber . sidebar_text . config
68-
69- text . insert ( 'insert' , 'foobar' )
70- self .assertEqual ( get ( '1.0 ' , 'end' ), '1 \n ' )
71- self .assertEqual ( config ()[ 'state' ][ - 1 ], tk . DISABLED )
72-
73- text . insert ( 'insert' , ' \n foo' )
74- self . assertEqual ( get ( '1.0' , 'end' ), '1 \n 2 \n ' )
75- self .assertEqual ( config ()[ 'state' ][ - 1 ], tk . DISABLED )
76-
77- text . insert ( 'insert' , 'hello \n ' * 2 )
78- self .assertEqual ( get ( '1.0' , 'end' ), '1 \n 2 \n 3 \n 4 \n ' )
79- self . assertEqual ( config ()[ 'state' ][ - 1 ], tk . DISABLED )
80-
81- text . insert ( 'insert' , ' \ n world' )
82- self .assertEqual ( get ( '1.0' , 'end' ), '1 \n 2 \n 3 \n 4 \n 5 \n ' )
83- self .assertEqual ( config ()[ 'state' ][ - 1 ], tk . DISABLED )
77+ self .text . insert ( 'insert' , 'foobar' )
78+ self .assert_text_equals ( 'foobar \n ' )
79+ self .assert_sidebar_n_lines ( 1 )
80+ self . assert_state_disabled ()
81+
82+ self .text . insert ( 'insert ' , '\n foo ' )
83+ self .assert_text_equals ( 'foobar \n foo \n ' )
84+ self . assert_sidebar_n_lines ( 2 )
85+ self . assert_state_disabled ( )
86+
87+ self .text . insert ( 'insert' , 'hello \n ' * 2 )
88+ self . assert_text_equals ( 'foobar \n foohello \n hello \n \n ' )
89+ self . assert_sidebar_n_lines ( 4 )
90+ self .assert_state_disabled ( )
91+
92+ self . text . insert ( 'insert' , ' \n world' )
93+ self . assert_text_equals ( 'foobar \n foohello \n hello \n \ n world\n ' )
94+ self .assert_sidebar_n_lines ( 5 )
95+ self .assert_state_disabled ( )
8496
8597 def test_delete (self ):
86- text = self .editwin .text
87- get = self .linenumber .sidebar_text .get
88- config = self .linenumber .sidebar_text .config
89-
90- text .insert ('insert' , 'foobar' )
91- text .delete ('1.1' , '1.3' )
92- self .assertEqual (get ('1.0' , 'end' ), '1\n ' )
93- self .assertEqual (config ()['state' ][- 1 ], tk .DISABLED )
94-
95- text .insert ('insert' , 'foo\n ' * 2 )
96- text .delete ('3.1' )
97- text .delete ('2.0' , '2.end' )
98- self .assertEqual (get ('1.0' , 'end' ), '1\n 2\n ' )
99- self .assertEqual (config ()['state' ][- 1 ], tk .DISABLED )
100-
101- text .delete ('1.3' , 'end' )
102- self .assertEqual (get ('1.0' , 'end' ), '1\n ' )
103- self .assertEqual (config ()['state' ][- 1 ], tk .DISABLED )
104-
105- text .delete ('1.0' , 'end' )
106- self .assertEqual (get ('1.0' , 'end' ), '1\n ' )
107- self .assertEqual (config ()['state' ][- 1 ], tk .DISABLED )
98+ self .text .insert ('insert' , 'foobar' )
99+ self .assert_text_equals ('foobar\n ' )
100+ self .text .delete ('1.1' , '1.3' )
101+ self .assert_text_equals ('fbar\n ' )
102+ self .assert_sidebar_n_lines (1 )
103+ self .assert_state_disabled ()
104+
105+ self .text .insert ('insert' , 'foo\n ' * 2 )
106+ self .assert_text_equals ('fbarfoo\n foo\n \n ' )
107+ self .assert_sidebar_n_lines (3 )
108+ self .assert_state_disabled ()
109+
110+ # note: deleting up to "2.end" doesn't delete the final newline
111+ self .text .delete ('2.0' , '2.end' )
112+ self .assert_text_equals ('fbarfoo\n \n \n ' )
113+ self .assert_sidebar_n_lines (3 )
114+ self .assert_state_disabled ()
115+
116+ self .text .delete ('1.3' , 'end' )
117+ self .assert_text_equals ('fba\n ' )
118+ self .assert_sidebar_n_lines (1 )
119+ self .assert_state_disabled ()
120+
121+ # note: Text widgets always keep a single '\n' character at the end
122+ self .text .delete ('1.0' , 'end' )
123+ self .assert_text_equals ('\n ' )
124+ self .assert_sidebar_n_lines (1 )
125+ self .assert_state_disabled ()
108126
109127 def test_sidebar_text_width (self ):
110128 """
@@ -113,26 +131,65 @@ def test_sidebar_text_width(self):
113131 """
114132 def get_width ():
115133 return self .linenumber .sidebar_text .config ()['width' ][- 1 ]
116- text = self .text
117134
135+ self .assert_sidebar_n_lines (1 )
136+ self .assertEqual (get_width (), 1 )
137+
138+ self .text .insert ('insert' , 'foo' )
139+ self .assert_sidebar_n_lines (1 )
140+ self .assertEqual (get_width (), 1 )
141+
142+ self .text .insert ('insert' , 'foo\n ' * 8 )
143+ self .assert_sidebar_n_lines (9 )
118144 self .assertEqual (get_width (), 1 )
119145
120- text .insert ('insert' , 'foo' )
146+ self .text .insert ('insert' , 'foo\n ' )
147+ self .assert_sidebar_n_lines (10 )
148+ self .assertEqual (get_width (), 2 )
149+
150+ self .text .insert ('insert' , 'foo\n ' )
151+ self .assert_sidebar_n_lines (11 )
152+ self .assertEqual (get_width (), 2 )
153+
154+ self .text .delete ('insert -1l linestart' , 'insert linestart' )
155+ self .assert_sidebar_n_lines (10 )
156+ self .assertEqual (get_width (), 2 )
157+
158+ self .text .delete ('insert -1l linestart' , 'insert linestart' )
159+ self .assert_sidebar_n_lines (9 )
121160 self .assertEqual (get_width (), 1 )
122161
123- text .insert ('insert' , 'foo\n ' * 10 )
162+ self .text .insert ('insert' , 'foo\n ' * 90 )
163+ self .assert_sidebar_n_lines (99 )
124164 self .assertEqual (get_width (), 2 )
125165
126- text .insert ('insert' , 'foo\n ' * 100 )
166+ self .text .insert ('insert' , 'foo\n ' )
167+ self .assert_sidebar_n_lines (100 )
168+ self .assertEqual (get_width (), 3 )
169+
170+ self .text .insert ('insert' , 'foo\n ' )
171+ self .assert_sidebar_n_lines (101 )
172+ self .assertEqual (get_width (), 3 )
173+
174+ self .text .delete ('insert -1l linestart' , 'insert linestart' )
175+ self .assert_sidebar_n_lines (100 )
127176 self .assertEqual (get_width (), 3 )
128177
129- text .delete ('50.0' , 'end' )
178+ self .text .delete ('insert -1l linestart' , 'insert linestart' )
179+ self .assert_sidebar_n_lines (99 )
180+ self .assertEqual (get_width (), 2 )
181+
182+ self .text .delete ('50.0' , 'end' )
183+ self .assert_sidebar_n_lines (49 )
130184 self .assertEqual (get_width (), 2 )
131185
132- text .delete ('5.0' , 'end' )
186+ self .text .delete ('5.0' , 'end' )
187+ self .assert_sidebar_n_lines (4 )
133188 self .assertEqual (get_width (), 1 )
134189
135- text .delete ('1.0' , 'end' )
190+ # note: Text widgets always keep a single '\n' character at the end
191+ self .text .delete ('1.0' , 'end' )
192+ self .assert_sidebar_n_lines (1 )
136193 self .assertEqual (get_width (), 1 )
137194
138195
0 commit comments