Skip to content

Commit

Permalink
bpo-32100: IDLE: Fix pathbrowser errors; improve tests. (#4484)
Browse files Browse the repository at this point in the history
Patch mostly by Cheryl Sabella
  • Loading branch information
csabella authored and terryjreedy committed Nov 23, 2017
1 parent d434110 commit 20d48a4
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 27 deletions.
12 changes: 6 additions & 6 deletions Lib/idlelib/browser.py
Expand Up @@ -79,9 +79,6 @@ def __init__(self, master, path, *, _htest=False, _utest=False):
creating ModuleBrowserTreeItem as the rootnode for
the tree and subsequently in the children.
"""
global file_open
if not (_htest or _utest):
file_open = pyshell.flist.open
self.master = master
self.path = path
self._htest = _htest
Expand All @@ -95,9 +92,13 @@ def close(self, event=None):

def init(self):
"Create browser tkinter widgets, including the tree."
global file_open
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()

# create top
self.top = top = ListedToplevel(root)
top.protocol("WM_DELETE_WINDOW", self.close)
Expand All @@ -107,6 +108,7 @@ def init(self):
(root.winfo_rootx(), root.winfo_rooty() + 200))
self.settitle()
top.focus_set()

# create scrolled canvas
theme = idleConf.CurrentTheme()
background = idleConf.GetHighlight(theme, 'normal')['background']
Expand Down Expand Up @@ -236,8 +238,6 @@ class Nested_in_func(TreeNode):
def nested_in_class(): pass
def closure():
class Nested_in_closure: pass
global file_open
file_open = pyshell.PyShellFileList(parent).open
ModuleBrowser(parent, file, _htest=True)

if __name__ == "__main__":
Expand Down
2 changes: 1 addition & 1 deletion Lib/idlelib/editor.py
Expand Up @@ -668,7 +668,7 @@ def open_module_browser(self, event=None):

def open_path_browser(self, event=None):
from idlelib import pathbrowser
pathbrowser.PathBrowser(self.flist)
pathbrowser.PathBrowser(self.root)
return "break"

def open_turtle_demo(self, event = None):
Expand Down
26 changes: 13 additions & 13 deletions Lib/idlelib/idle_test/test_browser.py
Expand Up @@ -4,17 +4,19 @@
(Higher, because should exclude 3 lines that .coveragerc won't exclude.)
"""

from collections import deque
import os.path
import unittest
import pyclbr
from tkinter import Tk

from idlelib import browser, filelist
from idlelib.tree import TreeNode
from test.support import requires
import unittest
from unittest import mock
from tkinter import Tk
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):
Expand All @@ -29,6 +31,7 @@ def setUpClass(cls):
@classmethod
def tearDownClass(cls):
cls.mb.close()
cls.root.update_idletasks()
cls.root.destroy()
del cls.root, cls.mb

Expand All @@ -38,6 +41,7 @@ def test_init(self):
eq(mb.path, __file__)
eq(pyclbr._modules, {})
self.assertIsInstance(mb.node, TreeNode)
self.assertIsNotNone(browser.file_open)

def test_settitle(self):
mb = self.mb
Expand Down Expand Up @@ -151,10 +155,9 @@ def test_getsublist(self):
self.assertEqual(sub0.name, 'f0')
self.assertEqual(sub1.name, 'C0(base)')


def test_ondoubleclick(self):
@mock.patch('idlelib.browser.file_open')
def test_ondoubleclick(self, fopen):
mbt = self.mbt
fopen = browser.file_open = mock.Mock()

with mock.patch('os.path.exists', return_value=False):
mbt.OnDoubleClick()
Expand All @@ -165,8 +168,6 @@ def test_ondoubleclick(self):
fopen.assert_called()
fopen.called_with(fname)

del browser.file_open


class ChildBrowserTreeItemTest(unittest.TestCase):

Expand Down Expand Up @@ -212,14 +213,13 @@ def test_getsublist(self):

eq(self.cbt_F1.GetSubList(), [])

def test_ondoubleclick(self):
fopen = browser.file_open = mock.Mock()
@mock.patch('idlelib.browser.file_open')
def test_ondoubleclick(self, fopen):
goto = fopen.return_value.gotoline = mock.Mock()
self.cbt_F1.OnDoubleClick()
fopen.assert_called()
goto.assert_called()
goto.assert_called_with(self.cbt_F1.obj.lineno)
del browser.file_open
# Failure test would have to raise OSError or AttributeError.


Expand Down
67 changes: 64 additions & 3 deletions Lib/idlelib/idle_test/test_pathbrowser.py
@@ -1,11 +1,68 @@
""" 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 os
import sys
import idlelib
from idlelib.idle_test.mock_idle import Func

import idlelib # for __file__
from idlelib import browser
from idlelib import pathbrowser
from idlelib.tree import TreeNode


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):
# Issue16226 - make sure that getting a sublist works
d = pathbrowser.DirBrowserTreeItem('')
Expand All @@ -16,12 +73,16 @@ def test_DirBrowserTreeItem(self):
self.assertEqual(d.ispackagedir(dir), True)
self.assertEqual(d.ispackagedir(dir + '/Icons'), False)


class PathBrowserTreeItemTest(unittest.TestCase):

def test_PathBrowserTreeItem(self):
p = pathbrowser.PathBrowserTreeItem()
self.assertEqual(p.GetText(), 'sys.path')
sub = p.GetSubList()
self.assertEqual(len(sub), len(sys.path))
self.assertEqual(type(sub[0]), pathbrowser.DirBrowserTreeItem)


if __name__ == '__main__':
unittest.main(verbosity=2, exit=False)
8 changes: 4 additions & 4 deletions Lib/idlelib/pathbrowser.py
Expand Up @@ -9,13 +9,14 @@

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
"""
self.master = master
self._htest = _htest
self._utest = _utest
self.init(flist)
self.init()

def settitle(self):
"Set window titles."
Expand Down Expand Up @@ -100,8 +101,7 @@ def listmodules(self, allnames):


def _path_browser(parent): # htest #
flist = PyShellFileList(parent)
PathBrowser(flist, _htest=True)
PathBrowser(parent, _htest=True)
parent.mainloop()

if __name__ == "__main__":
Expand Down
@@ -0,0 +1,2 @@
IDLE: Fix old and new bugs in pathbrowser; improve tests.
Patch mostly by Cheryl Sabella.

0 comments on commit 20d48a4

Please sign in to comment.