forked from python/cpython
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtest_iomenu.py
More file actions
209 lines (167 loc) · 6.45 KB
/
test_iomenu.py
File metadata and controls
209 lines (167 loc) · 6.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
"Test , coverage 17%."
from idlelib import iomenu
import unittest
import builtins
from test.support import requires
from tkinter import Tk
from idlelib.editor import EditorWindow
from idlelib import util
from idlelib.idle_test.mock_idle import Func
# Fail if either tokenize.open and t.detect_encoding does not exist.
# These are used in loadfile and encode.
# Also used in pyshell.MI.execfile and runscript.tabnanny.
from tokenize import open, detect_encoding
# Remove when we have proper tests that use both.
class IOBindingTest(unittest.TestCase):
@classmethod
def setUpClass(cls):
requires('gui')
cls.root = Tk()
cls.root.withdraw()
cls.editwin = EditorWindow(root=cls.root)
cls.io = iomenu.IOBinding(cls.editwin)
@classmethod
def tearDownClass(cls):
cls.io.close()
cls.editwin._close()
del cls.editwin
cls.root.update_idletasks()
for id in cls.root.tk.call('after', 'info'):
cls.root.after_cancel(id) # Need for EditorWindow.
cls.root.destroy()
del cls.root
def test_init(self):
self.assertIs(self.io.editwin, self.editwin)
def test_fixnewlines_end(self):
eq = self.assertEqual
io = self.io
fix = io.fixnewlines
text = io.editwin.text
# Make the editor temporarily look like Shell.
self.editwin.interp = None
shelltext = '>>> if 1'
self.editwin.get_prompt_text = Func(result=shelltext)
eq(fix(), shelltext) # Get... call and '\n' not added.
del self.editwin.interp, self.editwin.get_prompt_text
text.insert(1.0, 'a')
eq(fix(), 'a'+io.eol_convention)
eq(text.get('1.0', 'end-1c'), 'a\n')
eq(fix(), 'a'+io.eol_convention)
def test_reload_no_file(self):
# Test reload when no file is associated
import tempfile
import os
from unittest.mock import Mock
io = self.io
# Ensure no filename is set
io.filename = None
# Mock the messagebox.showinfo
orig_showinfo = iomenu.messagebox.showinfo
showinfo_called = []
def mock_showinfo(*args, **kwargs):
showinfo_called.append((args, kwargs))
iomenu.messagebox.showinfo = mock_showinfo
try:
result = io.reload(None)
self.assertEqual(result, "break")
self.assertEqual(len(showinfo_called), 1)
self.assertIn("No File", showinfo_called[0][0])
finally:
iomenu.messagebox.showinfo = orig_showinfo
def test_reload_with_file(self):
# Test reload with an actual file
import tempfile
import os
io = self.io
text = io.editwin.text
# Create a temporary file
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.py') as f:
f.write("# Original content\n")
temp_filename = f.name
try:
# Load the file
io.loadfile(temp_filename)
self.assertEqual(text.get('1.0', 'end-1c'), "# Original content\n")
# Modify the file content externally
with builtins.open(temp_filename, 'w') as f:
f.write("# Modified content\n")
# Reload should update the content
result = io.reload(None)
self.assertEqual(result, "break")
self.assertEqual(text.get('1.0', 'end-1c'), "# Modified content\n")
finally:
os.unlink(temp_filename)
def test_reload_with_unsaved_changes_cancel(self):
# Test reload with unsaved changes and user cancels
import tempfile
import os
io = self.io
text = io.editwin.text
# Create a temporary file
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.py') as f:
f.write("# Original content\n")
temp_filename = f.name
try:
# Load the file
io.loadfile(temp_filename)
# Make unsaved changes
text.insert('end-1c', "\n# Unsaved change")
io.set_saved(False)
# Mock askokcancel to return False (cancel)
orig_askokcancel = iomenu.messagebox.askokcancel
iomenu.messagebox.askokcancel = lambda *args, **kwargs: False
try:
result = io.reload(None)
self.assertEqual(result, "break")
# Content should not change
self.assertIn("# Unsaved change", text.get('1.0', 'end-1c'))
finally:
iomenu.messagebox.askokcancel = orig_askokcancel
finally:
os.unlink(temp_filename)
def test_reload_with_unsaved_changes_confirm(self):
# Test reload with unsaved changes and user confirms
import tempfile
import os
io = self.io
text = io.editwin.text
# Create a temporary file
with tempfile.NamedTemporaryFile(mode='w', delete=False, suffix='.py') as f:
f.write("# Original content\n")
temp_filename = f.name
try:
# Load the file
io.loadfile(temp_filename)
# Make unsaved changes
text.insert('end-1c', "\n# Unsaved change")
io.set_saved(False)
# Mock askokcancel to return True (confirm)
orig_askokcancel = iomenu.messagebox.askokcancel
iomenu.messagebox.askokcancel = lambda *args, **kwargs: True
try:
result = io.reload(None)
self.assertEqual(result, "break")
# Content should be reverted to original
self.assertEqual(text.get('1.0', 'end-1c'), "# Original content\n")
finally:
iomenu.messagebox.askokcancel = orig_askokcancel
finally:
os.unlink(temp_filename)
def _extension_in_filetypes(extension):
return any(
f'*{extension}' in filetype_tuple[1]
for filetype_tuple in iomenu.IOBinding.filetypes
)
class FiletypesTest(unittest.TestCase):
def test_python_source_files(self):
for extension in util.py_extensions:
with self.subTest(extension=extension):
self.assertTrue(
_extension_in_filetypes(extension)
)
def test_text_files(self):
self.assertTrue(_extension_in_filetypes('.txt'))
def test_all_files(self):
self.assertTrue(_extension_in_filetypes(''))
if __name__ == '__main__':
unittest.main(verbosity=2)