Commit 20d48a44 authored by Cheryl Sabella's avatar Cheryl Sabella Committed by Terry Jan Reedy

bpo-32100: IDLE: Fix pathbrowser errors; improve tests. (#4484)

Patch mostly by Cheryl Sabella
parent d4341109
...@@ -79,9 +79,6 @@ class ModuleBrowser: ...@@ -79,9 +79,6 @@ class ModuleBrowser:
creating ModuleBrowserTreeItem as the rootnode for creating ModuleBrowserTreeItem as the rootnode for
the tree and subsequently in the children. the tree and subsequently in the children.
""" """
global file_open
if not (_htest or _utest):
file_open = pyshell.flist.open
self.master = master self.master = master
self.path = path self.path = path
self._htest = _htest self._htest = _htest
...@@ -95,9 +92,13 @@ class ModuleBrowser: ...@@ -95,9 +92,13 @@ class ModuleBrowser:
def init(self): def init(self):
"Create browser tkinter widgets, including the tree." "Create browser tkinter widgets, including the tree."
global file_open
root = self.master root = self.master
# reset pyclbr flist = (pyshell.flist if not (self._htest or self._utest)
else pyshell.PyShellFileList(root))
file_open = flist.open
pyclbr._modules.clear() pyclbr._modules.clear()
# create top # create top
self.top = top = ListedToplevel(root) self.top = top = ListedToplevel(root)
top.protocol("WM_DELETE_WINDOW", self.close) top.protocol("WM_DELETE_WINDOW", self.close)
...@@ -107,6 +108,7 @@ class ModuleBrowser: ...@@ -107,6 +108,7 @@ class ModuleBrowser:
(root.winfo_rootx(), root.winfo_rooty() + 200)) (root.winfo_rootx(), root.winfo_rooty() + 200))
self.settitle() self.settitle()
top.focus_set() top.focus_set()
# create scrolled canvas # create scrolled canvas
theme = idleConf.CurrentTheme() theme = idleConf.CurrentTheme()
background = idleConf.GetHighlight(theme, 'normal')['background'] background = idleConf.GetHighlight(theme, 'normal')['background']
...@@ -236,8 +238,6 @@ def _module_browser(parent): # htest # ...@@ -236,8 +238,6 @@ def _module_browser(parent): # htest #
def nested_in_class(): pass def nested_in_class(): pass
def closure(): def closure():
class Nested_in_closure: pass class Nested_in_closure: pass
global file_open
file_open = pyshell.PyShellFileList(parent).open
ModuleBrowser(parent, file, _htest=True) ModuleBrowser(parent, file, _htest=True)
if __name__ == "__main__": if __name__ == "__main__":
......
...@@ -668,7 +668,7 @@ class EditorWindow(object): ...@@ -668,7 +668,7 @@ class EditorWindow(object):
def open_path_browser(self, event=None): def open_path_browser(self, event=None):
from idlelib import pathbrowser from idlelib import pathbrowser
pathbrowser.PathBrowser(self.flist) pathbrowser.PathBrowser(self.root)
return "break" return "break"
def open_turtle_demo(self, event = None): def open_turtle_demo(self, event = None):
......
...@@ -4,17 +4,19 @@ Coverage: 88% ...@@ -4,17 +4,19 @@ Coverage: 88%
(Higher, because should exclude 3 lines that .coveragerc won't exclude.) (Higher, because should exclude 3 lines that .coveragerc won't exclude.)
""" """
from collections import deque
import os.path import os.path
import unittest
import pyclbr import pyclbr
from tkinter import Tk
from idlelib import browser, filelist
from idlelib.tree import TreeNode
from test.support import requires from test.support import requires
import unittest
from unittest import mock from unittest import mock
from tkinter import Tk
from idlelib.idle_test.mock_idle import Func from idlelib.idle_test.mock_idle import Func
from collections import deque
from idlelib import browser
from idlelib import filelist
from idlelib.tree import TreeNode
class ModuleBrowserTest(unittest.TestCase): class ModuleBrowserTest(unittest.TestCase):
...@@ -29,6 +31,7 @@ class ModuleBrowserTest(unittest.TestCase): ...@@ -29,6 +31,7 @@ class ModuleBrowserTest(unittest.TestCase):
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
cls.mb.close() cls.mb.close()
cls.root.update_idletasks()
cls.root.destroy() cls.root.destroy()
del cls.root, cls.mb del cls.root, cls.mb
...@@ -38,6 +41,7 @@ class ModuleBrowserTest(unittest.TestCase): ...@@ -38,6 +41,7 @@ class ModuleBrowserTest(unittest.TestCase):
eq(mb.path, __file__) eq(mb.path, __file__)
eq(pyclbr._modules, {}) eq(pyclbr._modules, {})
self.assertIsInstance(mb.node, TreeNode) self.assertIsInstance(mb.node, TreeNode)
self.assertIsNotNone(browser.file_open)
def test_settitle(self): def test_settitle(self):
mb = self.mb mb = self.mb
...@@ -151,10 +155,9 @@ class ModuleBrowserTreeItemTest(unittest.TestCase): ...@@ -151,10 +155,9 @@ class ModuleBrowserTreeItemTest(unittest.TestCase):
self.assertEqual(sub0.name, 'f0') self.assertEqual(sub0.name, 'f0')
self.assertEqual(sub1.name, 'C0(base)') self.assertEqual(sub1.name, 'C0(base)')
@mock.patch('idlelib.browser.file_open')
def test_ondoubleclick(self): def test_ondoubleclick(self, fopen):
mbt = self.mbt mbt = self.mbt
fopen = browser.file_open = mock.Mock()
with mock.patch('os.path.exists', return_value=False): with mock.patch('os.path.exists', return_value=False):
mbt.OnDoubleClick() mbt.OnDoubleClick()
...@@ -165,8 +168,6 @@ class ModuleBrowserTreeItemTest(unittest.TestCase): ...@@ -165,8 +168,6 @@ class ModuleBrowserTreeItemTest(unittest.TestCase):
fopen.assert_called() fopen.assert_called()
fopen.called_with(fname) fopen.called_with(fname)
del browser.file_open
class ChildBrowserTreeItemTest(unittest.TestCase): class ChildBrowserTreeItemTest(unittest.TestCase):
...@@ -212,14 +213,13 @@ class ChildBrowserTreeItemTest(unittest.TestCase): ...@@ -212,14 +213,13 @@ class ChildBrowserTreeItemTest(unittest.TestCase):
eq(self.cbt_F1.GetSubList(), []) eq(self.cbt_F1.GetSubList(), [])
def test_ondoubleclick(self): @mock.patch('idlelib.browser.file_open')
fopen = browser.file_open = mock.Mock() def test_ondoubleclick(self, fopen):
goto = fopen.return_value.gotoline = mock.Mock() goto = fopen.return_value.gotoline = mock.Mock()
self.cbt_F1.OnDoubleClick() self.cbt_F1.OnDoubleClick()
fopen.assert_called() fopen.assert_called()
goto.assert_called() goto.assert_called()
goto.assert_called_with(self.cbt_F1.obj.lineno) goto.assert_called_with(self.cbt_F1.obj.lineno)
del browser.file_open
# Failure test would have to raise OSError or AttributeError. # Failure test would have to raise OSError or AttributeError.
......
""" Test idlelib.pathbrowser.
"""
import os.path
import pyclbr # for _modules
import sys # for sys.path
from tkinter import Tk
from test.support import requires
import unittest import unittest
import os from idlelib.idle_test.mock_idle import Func
import sys
import idlelib import idlelib # for __file__
from idlelib import browser
from idlelib import pathbrowser from idlelib import pathbrowser
from idlelib.tree import TreeNode
class PathBrowserTest(unittest.TestCase): class PathBrowserTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
requires('gui')
cls.root = Tk()
cls.root.withdraw()
cls.pb = pathbrowser.PathBrowser(cls.root, _utest=True)
@classmethod
def tearDownClass(cls):
cls.pb.close()
cls.root.update_idletasks()
cls.root.destroy()
del cls.root, cls.pb
def test_init(self):
pb = self.pb
eq = self.assertEqual
eq(pb.master, self.root)
eq(pyclbr._modules, {})
self.assertIsInstance(pb.node, TreeNode)
self.assertIsNotNone(browser.file_open)
def test_settitle(self):
pb = self.pb
self.assertEqual(pb.top.title(), 'Path Browser')
self.assertEqual(pb.top.iconname(), 'Path Browser')
def test_rootnode(self):
pb = self.pb
rn = pb.rootnode()
self.assertIsInstance(rn, pathbrowser.PathBrowserTreeItem)
def test_close(self):
pb = self.pb
pb.top.destroy = Func()
pb.node.destroy = Func()
pb.close()
self.assertTrue(pb.top.destroy.called)
self.assertTrue(pb.node.destroy.called)
del pb.top.destroy, pb.node.destroy
class DirBrowserTreeItemTest(unittest.TestCase):
def test_DirBrowserTreeItem(self): def test_DirBrowserTreeItem(self):
# Issue16226 - make sure that getting a sublist works # Issue16226 - make sure that getting a sublist works
d = pathbrowser.DirBrowserTreeItem('') d = pathbrowser.DirBrowserTreeItem('')
...@@ -16,6 +73,9 @@ class PathBrowserTest(unittest.TestCase): ...@@ -16,6 +73,9 @@ class PathBrowserTest(unittest.TestCase):
self.assertEqual(d.ispackagedir(dir), True) self.assertEqual(d.ispackagedir(dir), True)
self.assertEqual(d.ispackagedir(dir + '/Icons'), False) self.assertEqual(d.ispackagedir(dir + '/Icons'), False)
class PathBrowserTreeItemTest(unittest.TestCase):
def test_PathBrowserTreeItem(self): def test_PathBrowserTreeItem(self):
p = pathbrowser.PathBrowserTreeItem() p = pathbrowser.PathBrowserTreeItem()
self.assertEqual(p.GetText(), 'sys.path') self.assertEqual(p.GetText(), 'sys.path')
...@@ -23,5 +83,6 @@ class PathBrowserTest(unittest.TestCase): ...@@ -23,5 +83,6 @@ class PathBrowserTest(unittest.TestCase):
self.assertEqual(len(sub), len(sys.path)) self.assertEqual(len(sub), len(sys.path))
self.assertEqual(type(sub[0]), pathbrowser.DirBrowserTreeItem) self.assertEqual(type(sub[0]), pathbrowser.DirBrowserTreeItem)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main(verbosity=2, exit=False) unittest.main(verbosity=2, exit=False)
...@@ -9,13 +9,14 @@ from idlelib.tree import TreeItem ...@@ -9,13 +9,14 @@ from idlelib.tree import TreeItem
class PathBrowser(ModuleBrowser): class PathBrowser(ModuleBrowser):
def __init__(self, flist, *, _htest=False, _utest=False): def __init__(self, master, *, _htest=False, _utest=False):
""" """
_htest - bool, change box location when running htest _htest - bool, change box location when running htest
""" """
self.master = master
self._htest = _htest self._htest = _htest
self._utest = _utest self._utest = _utest
self.init(flist) self.init()
def settitle(self): def settitle(self):
"Set window titles." "Set window titles."
...@@ -100,8 +101,7 @@ class DirBrowserTreeItem(TreeItem): ...@@ -100,8 +101,7 @@ class DirBrowserTreeItem(TreeItem):
def _path_browser(parent): # htest # def _path_browser(parent): # htest #
flist = PyShellFileList(parent) PathBrowser(parent, _htest=True)
PathBrowser(flist, _htest=True)
parent.mainloop() parent.mainloop()
if __name__ == "__main__": if __name__ == "__main__":
......
IDLE: Fix old and new bugs in pathbrowser; improve tests.
Patch mostly by Cheryl Sabella.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment