diff -r 064b29dde096 Lib/idlelib/NEWS.txt --- a/Lib/idlelib/NEWS.txt Tue Jun 21 18:41:38 2016 -0400 +++ b/Lib/idlelib/NEWS.txt Tue Jun 21 23:04:49 2016 -0400 @@ -58,7 +58,7 @@ Original patch by Saimadhav Heblikar. - Issue #18410: Add test for IDLE's search dialog. - Original patch by Westley Martínez. + Original patch by Westley Martínez. - Issue #21703: Add test for undo delegator. Patch mostly by Saimadhav Heblikar . @@ -76,7 +76,7 @@ - Issue #25507: fix incorrect change in IOBinding that prevented printing. Augment IOBinding htest to include all major IOBinding functions. -- Issue #25905: Revert unwanted conversion of ' to ’ RIGHT SINGLE QUOTATION +- Issue #25905: Revert unwanted conversion of ' to ’ RIGHT SINGLE QUOTATION MARK in README.txt and open this and NEWS.txt with 'ascii'. Re-encode CREDITS.txt to utf-8 and open it with 'utf-8'. diff -r 064b29dde096 Lib/idlelib/help_about.py --- a/Lib/idlelib/help_about.py Tue Jun 21 18:41:38 2016 -0400 +++ b/Lib/idlelib/help_about.py Tue Jun 21 23:04:49 2016 -0400 @@ -130,7 +130,7 @@ self.display_file_text('About - Readme', 'README.txt', 'ascii') def ShowIDLENEWS(self): - self.display_file_text('About - NEWS', 'NEWS.txt', 'ascii') + self.display_file_text('About - NEWS', 'NEWS.txt', 'utf-8') def display_printer_text(self, title, printer): printer._Printer__setup() diff -r 064b29dde096 Lib/idlelib/idle_test/test_help_about.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Lib/idlelib/idle_test/test_help_about.py Tue Jun 21 23:04:49 2016 -0400 @@ -0,0 +1,52 @@ +'''Test idlelib.help_about. + +Coverage: +''' +from idlelib import help_about +from idlelib import textview +from idlelib.idle_test.mock_idle import Func +from idlelib.idle_test.mock_tk import Mbox_func +import unittest + +About = help_about.AboutDialog +class Dummy_about_dialog(): + # Dummy class for testing file display functions. + idle_credits = About.ShowIDLECredits + idle_readme = About.ShowIDLEAbout + idle_news = About.ShowIDLENEWS + # Called by the above + display_file_text = About.display_file_text + + +class DisplayFileTest(unittest.TestCase): + dialog = Dummy_about_dialog() + + @classmethod + def setUpClass(cls): + cls.orig_error = textview.showerror + cls.orig_view = textview.view_text + cls.error = Mbox_func() + cls.view = Func() + textview.showerror = cls.error + textview.view_text = cls.view + cls.About = Dummy_about_dialog() + + @classmethod + def tearDownClass(cls): + textview.showerror = cls.orig_error + textview.view_text = cls.orig_view + + def test_file_isplay(self): + for handler in (self.dialog.idle_credits, + self.dialog.idle_readme, + self.dialog.idle_news): + self.error.message = '' + self.view.called = False + with self.subTest(handler=handler): + handler() + self.assertEqual(self.error.message, '') + self.assertEqual(self.view.called, True) + + +if __name__ == '__main__': + unittest.main(verbosity=2) diff -r 064b29dde096 Lib/idlelib/textview.py --- a/Lib/idlelib/textview.py Tue Jun 21 18:41:38 2016 -0400 +++ b/Lib/idlelib/textview.py Tue Jun 21 23:04:49 2016 -0400 @@ -4,7 +4,7 @@ from tkinter import * from tkinter.ttk import Scrollbar -import tkinter.messagebox as tkMessageBox +from tkinter.messagebox import showerror class TextViewer(Toplevel): """A simple text viewer dialog for IDLE @@ -74,9 +74,13 @@ with open(filename, 'r', encoding=encoding) as file: contents = file.read() except IOError: - tkMessageBox.showerror(title='File Load Error', - message='Unable to load file %r .' % filename, - parent=parent) + showerror(title='File Load Error', + message='Unable to load file %r .' % filename, + parent=parent) + except UnicodeDecodeError as err: + showerror(title='Unicode Decode Error', + message=str(err), + parent=parent) else: return view_text(parent, title, contents, modal)