Skip to content

Commit 6e356cc

Browse files
miss-islingtonserhiy-storchakaclaude
authored
[3.13] gh-151678: Add tests for tkinter.Listbox (GH-151686) (GH-151714)
Cover previously-untested Listbox methods in ListboxTest: size, delete, index resolution, nearest, see, activate, and the selection methods (selection_set/clear/includes/anchor and their select_* aliases), including the errors raised for invalid indices. (cherry picked from commit cf3b3c1) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com> Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent c0c9920 commit 6e356cc

1 file changed

Lines changed: 100 additions & 0 deletions

File tree

Lib/test/test_tkinter/test_widgets.py

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1091,6 +1091,106 @@ def test_get(self):
10911091
self.assertRaises(TypeError, lb.get, 1, 2, 3)
10921092
self.assertRaises(TclError, lb.get, 2.4)
10931093

1094+
def test_size(self):
1095+
lb = self.create()
1096+
self.assertEqual(lb.size(), 0)
1097+
lb.insert(0, *('el%d' % i for i in range(8)))
1098+
self.assertEqual(lb.size(), 8)
1099+
lb.delete(0, 2)
1100+
self.assertEqual(lb.size(), 5)
1101+
self.assertRaises(TypeError, lb.size, 0)
1102+
1103+
def test_delete(self):
1104+
lb = self.create()
1105+
lb.insert(0, *('el%d' % i for i in range(8)))
1106+
lb.delete(0)
1107+
self.assertEqual(lb.get(0, 'end'),
1108+
('el1', 'el2', 'el3', 'el4', 'el5', 'el6', 'el7'))
1109+
lb.delete(2, 4)
1110+
self.assertEqual(lb.get(0, 'end'), ('el1', 'el2', 'el6', 'el7'))
1111+
lb.delete(0, 'end')
1112+
self.assertEqual(lb.size(), 0)
1113+
self.assertRaises(TclError, lb.delete, 'noindex')
1114+
self.assertRaises(TypeError, lb.delete)
1115+
1116+
def test_index(self):
1117+
lb = self.create()
1118+
lb.insert(0, *('el%d' % i for i in range(8)))
1119+
self.assertEqual(lb.index(3), 3)
1120+
self.assertEqual(lb.index('end'), 8) # the number of elements
1121+
lb.activate(4)
1122+
self.assertEqual(lb.index('active'), 4)
1123+
lb.selection_anchor(2)
1124+
self.assertEqual(lb.index('anchor'), 2)
1125+
self.assertRaisesRegex(TclError, 'bad listbox index "spam"',
1126+
lb.index, 'spam')
1127+
1128+
def test_nearest(self):
1129+
lb = self.create()
1130+
lb.insert(0, *('el%d' % i for i in range(8)))
1131+
lb.pack()
1132+
lb.wait_visibility()
1133+
lb.update()
1134+
# Derive the line height from the first item, which is always
1135+
# displayed (bbox() returns None for items that are not).
1136+
x, y, w, h = lb.bbox(0)
1137+
self.assertEqual(lb.nearest(y + h // 2), 0)
1138+
self.assertEqual(lb.nearest(y + 3 * h + h // 2), 3)
1139+
self.assertRaises(TclError, lb.nearest, 'spam')
1140+
self.assertRaises(TypeError, lb.nearest)
1141+
1142+
def test_see(self):
1143+
lb = self.create(height=5)
1144+
lb.insert(0, *('el%d' % i for i in range(20)))
1145+
lb.pack()
1146+
lb.update_idletasks()
1147+
lb.see('end')
1148+
lb.update_idletasks()
1149+
self.assertEqual(lb.yview()[1], 1.0)
1150+
lb.see(0)
1151+
lb.update_idletasks()
1152+
self.assertEqual(lb.yview()[0], 0.0)
1153+
self.assertRaises(TclError, lb.see, 'spam')
1154+
1155+
def test_activate(self):
1156+
lb = self.create()
1157+
lb.insert(0, *('el%d' % i for i in range(8)))
1158+
lb.activate(3)
1159+
self.assertEqual(lb.index('active'), 3)
1160+
lb.activate('end')
1161+
self.assertEqual(lb.index('active'), 7)
1162+
self.assertRaises(TclError, lb.activate, 'spam')
1163+
self.assertRaises(TypeError, lb.activate)
1164+
1165+
def test_selection(self):
1166+
lb = self.create()
1167+
lb.insert(0, *('el%d' % i for i in range(8)))
1168+
self.assertEqual(lb.curselection(), ())
1169+
self.assertFalse(lb.selection_includes(0))
1170+
1171+
lb.selection_set(2, 4)
1172+
lb.selection_set(6)
1173+
self.assertEqual(lb.curselection(), (2, 3, 4, 6))
1174+
self.assertTrue(lb.selection_includes(3))
1175+
self.assertFalse(lb.selection_includes(5))
1176+
1177+
lb.selection_clear(3, 4)
1178+
self.assertEqual(lb.curselection(), (2, 6))
1179+
1180+
lb.selection_anchor(5)
1181+
self.assertEqual(lb.index('anchor'), 5)
1182+
1183+
# select_* are aliases of the selection_* methods.
1184+
lb.select_clear(0, 'end')
1185+
self.assertEqual(lb.curselection(), ())
1186+
lb.select_set(1)
1187+
self.assertTrue(lb.select_includes(1))
1188+
lb.select_anchor(1)
1189+
self.assertEqual(lb.index('anchor'), 1)
1190+
1191+
self.assertRaisesRegex(TclError, 'bad listbox index "spam"',
1192+
lb.selection_includes, 'spam')
1193+
10941194

10951195
@add_standard_options(PixelSizeTests, StandardOptionsTests)
10961196
class ScaleTest(AbstractWidgetTest, unittest.TestCase):

0 commit comments

Comments
 (0)