##// END OF EJS Templates
Add test that numpy, IPython.parallel and IPython.zmq aren't imported on startup.
Thomas Kluyver -
Show More
@@ -1,407 +1,420 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 """Tests for the key interactiveshell module.
2 """Tests for the key interactiveshell module.
3
3
4 Historically the main classes in interactiveshell have been under-tested. This
4 Historically the main classes in interactiveshell have been under-tested. This
5 module should grow as many single-method tests as possible to trap many of the
5 module should grow as many single-method tests as possible to trap many of the
6 recurring bugs we seem to encounter with high-level interaction.
6 recurring bugs we seem to encounter with high-level interaction.
7
7
8 Authors
8 Authors
9 -------
9 -------
10 * Fernando Perez
10 * Fernando Perez
11 """
11 """
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13 # Copyright (C) 2011 The IPython Development Team
13 # Copyright (C) 2011 The IPython Development Team
14 #
14 #
15 # Distributed under the terms of the BSD License. The full license is in
15 # Distributed under the terms of the BSD License. The full license is in
16 # the file COPYING, distributed as part of this software.
16 # the file COPYING, distributed as part of this software.
17 #-----------------------------------------------------------------------------
17 #-----------------------------------------------------------------------------
18
18
19 #-----------------------------------------------------------------------------
19 #-----------------------------------------------------------------------------
20 # Imports
20 # Imports
21 #-----------------------------------------------------------------------------
21 #-----------------------------------------------------------------------------
22 # stdlib
22 # stdlib
23 import os
23 import os
24 import shutil
24 import shutil
25 import sys
25 import sys
26 import tempfile
26 import tempfile
27 import unittest
27 import unittest
28 from os.path import join
28 from os.path import join
29 from StringIO import StringIO
29 from StringIO import StringIO
30
30
31 # third-party
31 # third-party
32 import nose.tools as nt
32 import nose.tools as nt
33
33
34 # Our own
34 # Our own
35 from IPython.testing.decorators import skipif
35 from IPython.testing.decorators import skipif
36 from IPython.testing import tools as tt
36 from IPython.utils import io
37 from IPython.utils import io
37
38
38 #-----------------------------------------------------------------------------
39 #-----------------------------------------------------------------------------
39 # Globals
40 # Globals
40 #-----------------------------------------------------------------------------
41 #-----------------------------------------------------------------------------
41 # This is used by every single test, no point repeating it ad nauseam
42 # This is used by every single test, no point repeating it ad nauseam
42 ip = get_ipython()
43 ip = get_ipython()
43
44
44 #-----------------------------------------------------------------------------
45 #-----------------------------------------------------------------------------
45 # Tests
46 # Tests
46 #-----------------------------------------------------------------------------
47 #-----------------------------------------------------------------------------
47
48
48 class InteractiveShellTestCase(unittest.TestCase):
49 class InteractiveShellTestCase(unittest.TestCase):
49 def test_naked_string_cells(self):
50 def test_naked_string_cells(self):
50 """Test that cells with only naked strings are fully executed"""
51 """Test that cells with only naked strings are fully executed"""
51 # First, single-line inputs
52 # First, single-line inputs
52 ip.run_cell('"a"\n')
53 ip.run_cell('"a"\n')
53 self.assertEqual(ip.user_ns['_'], 'a')
54 self.assertEqual(ip.user_ns['_'], 'a')
54 # And also multi-line cells
55 # And also multi-line cells
55 ip.run_cell('"""a\nb"""\n')
56 ip.run_cell('"""a\nb"""\n')
56 self.assertEqual(ip.user_ns['_'], 'a\nb')
57 self.assertEqual(ip.user_ns['_'], 'a\nb')
57
58
58 def test_run_empty_cell(self):
59 def test_run_empty_cell(self):
59 """Just make sure we don't get a horrible error with a blank
60 """Just make sure we don't get a horrible error with a blank
60 cell of input. Yes, I did overlook that."""
61 cell of input. Yes, I did overlook that."""
61 old_xc = ip.execution_count
62 old_xc = ip.execution_count
62 ip.run_cell('')
63 ip.run_cell('')
63 self.assertEqual(ip.execution_count, old_xc)
64 self.assertEqual(ip.execution_count, old_xc)
64
65
65 def test_run_cell_multiline(self):
66 def test_run_cell_multiline(self):
66 """Multi-block, multi-line cells must execute correctly.
67 """Multi-block, multi-line cells must execute correctly.
67 """
68 """
68 src = '\n'.join(["x=1",
69 src = '\n'.join(["x=1",
69 "y=2",
70 "y=2",
70 "if 1:",
71 "if 1:",
71 " x += 1",
72 " x += 1",
72 " y += 1",])
73 " y += 1",])
73 ip.run_cell(src)
74 ip.run_cell(src)
74 self.assertEqual(ip.user_ns['x'], 2)
75 self.assertEqual(ip.user_ns['x'], 2)
75 self.assertEqual(ip.user_ns['y'], 3)
76 self.assertEqual(ip.user_ns['y'], 3)
76
77
77 def test_multiline_string_cells(self):
78 def test_multiline_string_cells(self):
78 "Code sprinkled with multiline strings should execute (GH-306)"
79 "Code sprinkled with multiline strings should execute (GH-306)"
79 ip.run_cell('tmp=0')
80 ip.run_cell('tmp=0')
80 self.assertEqual(ip.user_ns['tmp'], 0)
81 self.assertEqual(ip.user_ns['tmp'], 0)
81 ip.run_cell('tmp=1;"""a\nb"""\n')
82 ip.run_cell('tmp=1;"""a\nb"""\n')
82 self.assertEqual(ip.user_ns['tmp'], 1)
83 self.assertEqual(ip.user_ns['tmp'], 1)
83
84
84 def test_dont_cache_with_semicolon(self):
85 def test_dont_cache_with_semicolon(self):
85 "Ending a line with semicolon should not cache the returned object (GH-307)"
86 "Ending a line with semicolon should not cache the returned object (GH-307)"
86 oldlen = len(ip.user_ns['Out'])
87 oldlen = len(ip.user_ns['Out'])
87 a = ip.run_cell('1;', store_history=True)
88 a = ip.run_cell('1;', store_history=True)
88 newlen = len(ip.user_ns['Out'])
89 newlen = len(ip.user_ns['Out'])
89 self.assertEqual(oldlen, newlen)
90 self.assertEqual(oldlen, newlen)
90 #also test the default caching behavior
91 #also test the default caching behavior
91 ip.run_cell('1', store_history=True)
92 ip.run_cell('1', store_history=True)
92 newlen = len(ip.user_ns['Out'])
93 newlen = len(ip.user_ns['Out'])
93 self.assertEqual(oldlen+1, newlen)
94 self.assertEqual(oldlen+1, newlen)
94
95
95 def test_In_variable(self):
96 def test_In_variable(self):
96 "Verify that In variable grows with user input (GH-284)"
97 "Verify that In variable grows with user input (GH-284)"
97 oldlen = len(ip.user_ns['In'])
98 oldlen = len(ip.user_ns['In'])
98 ip.run_cell('1;', store_history=True)
99 ip.run_cell('1;', store_history=True)
99 newlen = len(ip.user_ns['In'])
100 newlen = len(ip.user_ns['In'])
100 self.assertEqual(oldlen+1, newlen)
101 self.assertEqual(oldlen+1, newlen)
101 self.assertEqual(ip.user_ns['In'][-1],'1;')
102 self.assertEqual(ip.user_ns['In'][-1],'1;')
102
103
103 def test_magic_names_in_string(self):
104 def test_magic_names_in_string(self):
104 ip.run_cell('a = """\n%exit\n"""')
105 ip.run_cell('a = """\n%exit\n"""')
105 self.assertEqual(ip.user_ns['a'], '\n%exit\n')
106 self.assertEqual(ip.user_ns['a'], '\n%exit\n')
106
107
107 def test_alias_crash(self):
108 def test_alias_crash(self):
108 """Errors in prefilter can't crash IPython"""
109 """Errors in prefilter can't crash IPython"""
109 ip.run_cell('%alias parts echo first %s second %s')
110 ip.run_cell('%alias parts echo first %s second %s')
110 # capture stderr:
111 # capture stderr:
111 save_err = io.stderr
112 save_err = io.stderr
112 io.stderr = StringIO()
113 io.stderr = StringIO()
113 ip.run_cell('parts 1')
114 ip.run_cell('parts 1')
114 err = io.stderr.getvalue()
115 err = io.stderr.getvalue()
115 io.stderr = save_err
116 io.stderr = save_err
116 self.assertEqual(err.split(':')[0], 'ERROR')
117 self.assertEqual(err.split(':')[0], 'ERROR')
117
118
118 def test_trailing_newline(self):
119 def test_trailing_newline(self):
119 """test that running !(command) does not raise a SyntaxError"""
120 """test that running !(command) does not raise a SyntaxError"""
120 ip.run_cell('!(true)\n', False)
121 ip.run_cell('!(true)\n', False)
121 ip.run_cell('!(true)\n\n\n', False)
122 ip.run_cell('!(true)\n\n\n', False)
122
123
123 def test_gh_597(self):
124 def test_gh_597(self):
124 """Pretty-printing lists of objects with non-ascii reprs may cause
125 """Pretty-printing lists of objects with non-ascii reprs may cause
125 problems."""
126 problems."""
126 class Spam(object):
127 class Spam(object):
127 def __repr__(self):
128 def __repr__(self):
128 return "\xe9"*50
129 return "\xe9"*50
129 import IPython.core.formatters
130 import IPython.core.formatters
130 f = IPython.core.formatters.PlainTextFormatter()
131 f = IPython.core.formatters.PlainTextFormatter()
131 f([Spam(),Spam()])
132 f([Spam(),Spam()])
132
133
133
134
134 def test_future_flags(self):
135 def test_future_flags(self):
135 """Check that future flags are used for parsing code (gh-777)"""
136 """Check that future flags are used for parsing code (gh-777)"""
136 ip.run_cell('from __future__ import print_function')
137 ip.run_cell('from __future__ import print_function')
137 try:
138 try:
138 ip.run_cell('prfunc_return_val = print(1,2, sep=" ")')
139 ip.run_cell('prfunc_return_val = print(1,2, sep=" ")')
139 assert 'prfunc_return_val' in ip.user_ns
140 assert 'prfunc_return_val' in ip.user_ns
140 finally:
141 finally:
141 # Reset compiler flags so we don't mess up other tests.
142 # Reset compiler flags so we don't mess up other tests.
142 ip.compile.reset_compiler_flags()
143 ip.compile.reset_compiler_flags()
143
144
144 def test_future_unicode(self):
145 def test_future_unicode(self):
145 """Check that unicode_literals is imported from __future__ (gh #786)"""
146 """Check that unicode_literals is imported from __future__ (gh #786)"""
146 try:
147 try:
147 ip.run_cell(u'byte_str = "a"')
148 ip.run_cell(u'byte_str = "a"')
148 assert isinstance(ip.user_ns['byte_str'], str) # string literals are byte strings by default
149 assert isinstance(ip.user_ns['byte_str'], str) # string literals are byte strings by default
149 ip.run_cell('from __future__ import unicode_literals')
150 ip.run_cell('from __future__ import unicode_literals')
150 ip.run_cell(u'unicode_str = "a"')
151 ip.run_cell(u'unicode_str = "a"')
151 assert isinstance(ip.user_ns['unicode_str'], unicode) # strings literals are now unicode
152 assert isinstance(ip.user_ns['unicode_str'], unicode) # strings literals are now unicode
152 finally:
153 finally:
153 # Reset compiler flags so we don't mess up other tests.
154 # Reset compiler flags so we don't mess up other tests.
154 ip.compile.reset_compiler_flags()
155 ip.compile.reset_compiler_flags()
155
156
156 def test_can_pickle(self):
157 def test_can_pickle(self):
157 "Can we pickle objects defined interactively (GH-29)"
158 "Can we pickle objects defined interactively (GH-29)"
158 ip = get_ipython()
159 ip = get_ipython()
159 ip.reset()
160 ip.reset()
160 ip.run_cell(("class Mylist(list):\n"
161 ip.run_cell(("class Mylist(list):\n"
161 " def __init__(self,x=[]):\n"
162 " def __init__(self,x=[]):\n"
162 " list.__init__(self,x)"))
163 " list.__init__(self,x)"))
163 ip.run_cell("w=Mylist([1,2,3])")
164 ip.run_cell("w=Mylist([1,2,3])")
164
165
165 from cPickle import dumps
166 from cPickle import dumps
166
167
167 # We need to swap in our main module - this is only necessary
168 # We need to swap in our main module - this is only necessary
168 # inside the test framework, because IPython puts the interactive module
169 # inside the test framework, because IPython puts the interactive module
169 # in place (but the test framework undoes this).
170 # in place (but the test framework undoes this).
170 _main = sys.modules['__main__']
171 _main = sys.modules['__main__']
171 sys.modules['__main__'] = ip.user_module
172 sys.modules['__main__'] = ip.user_module
172 try:
173 try:
173 res = dumps(ip.user_ns["w"])
174 res = dumps(ip.user_ns["w"])
174 finally:
175 finally:
175 sys.modules['__main__'] = _main
176 sys.modules['__main__'] = _main
176 self.assertTrue(isinstance(res, bytes))
177 self.assertTrue(isinstance(res, bytes))
177
178
178 def test_global_ns(self):
179 def test_global_ns(self):
179 "Code in functions must be able to access variables outside them."
180 "Code in functions must be able to access variables outside them."
180 ip = get_ipython()
181 ip = get_ipython()
181 ip.run_cell("a = 10")
182 ip.run_cell("a = 10")
182 ip.run_cell(("def f(x):\n"
183 ip.run_cell(("def f(x):\n"
183 " return x + a"))
184 " return x + a"))
184 ip.run_cell("b = f(12)")
185 ip.run_cell("b = f(12)")
185 self.assertEqual(ip.user_ns["b"], 22)
186 self.assertEqual(ip.user_ns["b"], 22)
186
187
187 def test_bad_custom_tb(self):
188 def test_bad_custom_tb(self):
188 """Check that InteractiveShell is protected from bad custom exception handlers"""
189 """Check that InteractiveShell is protected from bad custom exception handlers"""
189 from IPython.utils import io
190 from IPython.utils import io
190 save_stderr = io.stderr
191 save_stderr = io.stderr
191 try:
192 try:
192 # capture stderr
193 # capture stderr
193 io.stderr = StringIO()
194 io.stderr = StringIO()
194 ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0)
195 ip.set_custom_exc((IOError,), lambda etype,value,tb: 1/0)
195 self.assertEqual(ip.custom_exceptions, (IOError,))
196 self.assertEqual(ip.custom_exceptions, (IOError,))
196 ip.run_cell(u'raise IOError("foo")')
197 ip.run_cell(u'raise IOError("foo")')
197 self.assertEqual(ip.custom_exceptions, ())
198 self.assertEqual(ip.custom_exceptions, ())
198 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
199 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
199 finally:
200 finally:
200 io.stderr = save_stderr
201 io.stderr = save_stderr
201
202
202 def test_bad_custom_tb_return(self):
203 def test_bad_custom_tb_return(self):
203 """Check that InteractiveShell is protected from bad return types in custom exception handlers"""
204 """Check that InteractiveShell is protected from bad return types in custom exception handlers"""
204 from IPython.utils import io
205 from IPython.utils import io
205 save_stderr = io.stderr
206 save_stderr = io.stderr
206 try:
207 try:
207 # capture stderr
208 # capture stderr
208 io.stderr = StringIO()
209 io.stderr = StringIO()
209 ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1)
210 ip.set_custom_exc((NameError,),lambda etype,value,tb, tb_offset=None: 1)
210 self.assertEqual(ip.custom_exceptions, (NameError,))
211 self.assertEqual(ip.custom_exceptions, (NameError,))
211 ip.run_cell(u'a=abracadabra')
212 ip.run_cell(u'a=abracadabra')
212 self.assertEqual(ip.custom_exceptions, ())
213 self.assertEqual(ip.custom_exceptions, ())
213 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
214 self.assertTrue("Custom TB Handler failed" in io.stderr.getvalue())
214 finally:
215 finally:
215 io.stderr = save_stderr
216 io.stderr = save_stderr
216
217
217 def test_drop_by_id(self):
218 def test_drop_by_id(self):
218 myvars = {"a":object(), "b":object(), "c": object()}
219 myvars = {"a":object(), "b":object(), "c": object()}
219 ip.push(myvars, interactive=False)
220 ip.push(myvars, interactive=False)
220 for name in myvars:
221 for name in myvars:
221 assert name in ip.user_ns, name
222 assert name in ip.user_ns, name
222 assert name in ip.user_ns_hidden, name
223 assert name in ip.user_ns_hidden, name
223 ip.user_ns['b'] = 12
224 ip.user_ns['b'] = 12
224 ip.drop_by_id(myvars)
225 ip.drop_by_id(myvars)
225 for name in ["a", "c"]:
226 for name in ["a", "c"]:
226 assert name not in ip.user_ns, name
227 assert name not in ip.user_ns, name
227 assert name not in ip.user_ns_hidden, name
228 assert name not in ip.user_ns_hidden, name
228 assert ip.user_ns['b'] == 12
229 assert ip.user_ns['b'] == 12
229 ip.reset()
230 ip.reset()
230
231
231 def test_var_expand(self):
232 def test_var_expand(self):
232 ip.user_ns['f'] = u'Ca\xf1o'
233 ip.user_ns['f'] = u'Ca\xf1o'
233 self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o')
234 self.assertEqual(ip.var_expand(u'echo $f'), u'echo Ca\xf1o')
234 self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o')
235 self.assertEqual(ip.var_expand(u'echo {f}'), u'echo Ca\xf1o')
235 self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1')
236 self.assertEqual(ip.var_expand(u'echo {f[:-1]}'), u'echo Ca\xf1')
236 self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2')
237 self.assertEqual(ip.var_expand(u'echo {1*2}'), u'echo 2')
237
238
238 ip.user_ns['f'] = b'Ca\xc3\xb1o'
239 ip.user_ns['f'] = b'Ca\xc3\xb1o'
239 # This should not raise any exception:
240 # This should not raise any exception:
240 ip.var_expand(u'echo $f')
241 ip.var_expand(u'echo $f')
241
242
242 def test_var_expand_local(self):
243 def test_var_expand_local(self):
243 """Test local variable expansion in !system and %magic calls"""
244 """Test local variable expansion in !system and %magic calls"""
244 # !system
245 # !system
245 ip.run_cell('def test():\n'
246 ip.run_cell('def test():\n'
246 ' lvar = "ttt"\n'
247 ' lvar = "ttt"\n'
247 ' ret = !echo {lvar}\n'
248 ' ret = !echo {lvar}\n'
248 ' return ret[0]\n')
249 ' return ret[0]\n')
249 res = ip.user_ns['test']()
250 res = ip.user_ns['test']()
250 nt.assert_in('ttt', res)
251 nt.assert_in('ttt', res)
251
252
252 # %magic
253 # %magic
253 ip.run_cell('def makemacro():\n'
254 ip.run_cell('def makemacro():\n'
254 ' macroname = "macro_var_expand_locals"\n'
255 ' macroname = "macro_var_expand_locals"\n'
255 ' %macro {macroname} codestr\n')
256 ' %macro {macroname} codestr\n')
256 ip.user_ns['codestr'] = "str(12)"
257 ip.user_ns['codestr'] = "str(12)"
257 ip.run_cell('makemacro()')
258 ip.run_cell('makemacro()')
258 nt.assert_in('macro_var_expand_locals', ip.user_ns)
259 nt.assert_in('macro_var_expand_locals', ip.user_ns)
259
260
260 def test_bad_var_expand(self):
261 def test_bad_var_expand(self):
261 """var_expand on invalid formats shouldn't raise"""
262 """var_expand on invalid formats shouldn't raise"""
262 # SyntaxError
263 # SyntaxError
263 self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}")
264 self.assertEqual(ip.var_expand(u"{'a':5}"), u"{'a':5}")
264 # NameError
265 # NameError
265 self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}")
266 self.assertEqual(ip.var_expand(u"{asdf}"), u"{asdf}")
266 # ZeroDivisionError
267 # ZeroDivisionError
267 self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}")
268 self.assertEqual(ip.var_expand(u"{1/0}"), u"{1/0}")
268
269
269 def test_silent_nopostexec(self):
270 def test_silent_nopostexec(self):
270 """run_cell(silent=True) doesn't invoke post-exec funcs"""
271 """run_cell(silent=True) doesn't invoke post-exec funcs"""
271 d = dict(called=False)
272 d = dict(called=False)
272 def set_called():
273 def set_called():
273 d['called'] = True
274 d['called'] = True
274
275
275 ip.register_post_execute(set_called)
276 ip.register_post_execute(set_called)
276 ip.run_cell("1", silent=True)
277 ip.run_cell("1", silent=True)
277 self.assertFalse(d['called'])
278 self.assertFalse(d['called'])
278 # double-check that non-silent exec did what we expected
279 # double-check that non-silent exec did what we expected
279 # silent to avoid
280 # silent to avoid
280 ip.run_cell("1")
281 ip.run_cell("1")
281 self.assertTrue(d['called'])
282 self.assertTrue(d['called'])
282 # remove post-exec
283 # remove post-exec
283 ip._post_execute.pop(set_called)
284 ip._post_execute.pop(set_called)
284
285
285 def test_silent_noadvance(self):
286 def test_silent_noadvance(self):
286 """run_cell(silent=True) doesn't advance execution_count"""
287 """run_cell(silent=True) doesn't advance execution_count"""
287 ec = ip.execution_count
288 ec = ip.execution_count
288 # silent should force store_history=False
289 # silent should force store_history=False
289 ip.run_cell("1", store_history=True, silent=True)
290 ip.run_cell("1", store_history=True, silent=True)
290
291
291 self.assertEqual(ec, ip.execution_count)
292 self.assertEqual(ec, ip.execution_count)
292 # double-check that non-silent exec did what we expected
293 # double-check that non-silent exec did what we expected
293 # silent to avoid
294 # silent to avoid
294 ip.run_cell("1", store_history=True)
295 ip.run_cell("1", store_history=True)
295 self.assertEqual(ec+1, ip.execution_count)
296 self.assertEqual(ec+1, ip.execution_count)
296
297
297 def test_silent_nodisplayhook(self):
298 def test_silent_nodisplayhook(self):
298 """run_cell(silent=True) doesn't trigger displayhook"""
299 """run_cell(silent=True) doesn't trigger displayhook"""
299 d = dict(called=False)
300 d = dict(called=False)
300
301
301 trap = ip.display_trap
302 trap = ip.display_trap
302 save_hook = trap.hook
303 save_hook = trap.hook
303
304
304 def failing_hook(*args, **kwargs):
305 def failing_hook(*args, **kwargs):
305 d['called'] = True
306 d['called'] = True
306
307
307 try:
308 try:
308 trap.hook = failing_hook
309 trap.hook = failing_hook
309 ip.run_cell("1", silent=True)
310 ip.run_cell("1", silent=True)
310 self.assertFalse(d['called'])
311 self.assertFalse(d['called'])
311 # double-check that non-silent exec did what we expected
312 # double-check that non-silent exec did what we expected
312 # silent to avoid
313 # silent to avoid
313 ip.run_cell("1")
314 ip.run_cell("1")
314 self.assertTrue(d['called'])
315 self.assertTrue(d['called'])
315 finally:
316 finally:
316 trap.hook = save_hook
317 trap.hook = save_hook
317
318
318 @skipif(sys.version_info[0] >= 3, "softspace removed in py3")
319 @skipif(sys.version_info[0] >= 3, "softspace removed in py3")
319 def test_print_softspace(self):
320 def test_print_softspace(self):
320 """Verify that softspace is handled correctly when executing multiple
321 """Verify that softspace is handled correctly when executing multiple
321 statements.
322 statements.
322
323
323 In [1]: print 1; print 2
324 In [1]: print 1; print 2
324 1
325 1
325 2
326 2
326
327
327 In [2]: print 1,; print 2
328 In [2]: print 1,; print 2
328 1 2
329 1 2
329 """
330 """
330
331
331 def test_ofind_line_magic(self):
332 def test_ofind_line_magic(self):
332 from IPython.core.magic import register_line_magic
333 from IPython.core.magic import register_line_magic
333
334
334 @register_line_magic
335 @register_line_magic
335 def lmagic(line):
336 def lmagic(line):
336 "A line magic"
337 "A line magic"
337
338
338 # Get info on line magic
339 # Get info on line magic
339 lfind = ip._ofind('lmagic')
340 lfind = ip._ofind('lmagic')
340 info = dict(found=True, isalias=False, ismagic=True,
341 info = dict(found=True, isalias=False, ismagic=True,
341 namespace = 'IPython internal', obj= lmagic.__wrapped__,
342 namespace = 'IPython internal', obj= lmagic.__wrapped__,
342 parent = None)
343 parent = None)
343 nt.assert_equal(lfind, info)
344 nt.assert_equal(lfind, info)
344
345
345 def test_ofind_cell_magic(self):
346 def test_ofind_cell_magic(self):
346 from IPython.core.magic import register_cell_magic
347 from IPython.core.magic import register_cell_magic
347
348
348 @register_cell_magic
349 @register_cell_magic
349 def cmagic(line, cell):
350 def cmagic(line, cell):
350 "A cell magic"
351 "A cell magic"
351
352
352 # Get info on cell magic
353 # Get info on cell magic
353 find = ip._ofind('cmagic')
354 find = ip._ofind('cmagic')
354 info = dict(found=True, isalias=False, ismagic=True,
355 info = dict(found=True, isalias=False, ismagic=True,
355 namespace = 'IPython internal', obj= cmagic.__wrapped__,
356 namespace = 'IPython internal', obj= cmagic.__wrapped__,
356 parent = None)
357 parent = None)
357 nt.assert_equal(find, info)
358 nt.assert_equal(find, info)
358
359
359 def test_custom_exception(self):
360 def test_custom_exception(self):
360 called = []
361 called = []
361 def my_handler(shell, etype, value, tb, tb_offset=None):
362 def my_handler(shell, etype, value, tb, tb_offset=None):
362 called.append(etype)
363 called.append(etype)
363 shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
364 shell.showtraceback((etype, value, tb), tb_offset=tb_offset)
364
365
365 ip.set_custom_exc((ValueError,), my_handler)
366 ip.set_custom_exc((ValueError,), my_handler)
366 try:
367 try:
367 ip.run_cell("raise ValueError('test')")
368 ip.run_cell("raise ValueError('test')")
368 # Check that this was called, and only once.
369 # Check that this was called, and only once.
369 self.assertEqual(called, [ValueError])
370 self.assertEqual(called, [ValueError])
370 finally:
371 finally:
371 # Reset the custom exception hook
372 # Reset the custom exception hook
372 ip.set_custom_exc((), None)
373 ip.set_custom_exc((), None)
373
374
374
375
375 class TestSafeExecfileNonAsciiPath(unittest.TestCase):
376 class TestSafeExecfileNonAsciiPath(unittest.TestCase):
376
377
377 def setUp(self):
378 def setUp(self):
378 self.BASETESTDIR = tempfile.mkdtemp()
379 self.BASETESTDIR = tempfile.mkdtemp()
379 self.TESTDIR = join(self.BASETESTDIR, u"åäö")
380 self.TESTDIR = join(self.BASETESTDIR, u"åäö")
380 os.mkdir(self.TESTDIR)
381 os.mkdir(self.TESTDIR)
381 with open(join(self.TESTDIR, u"åäötestscript.py"), "w") as sfile:
382 with open(join(self.TESTDIR, u"åäötestscript.py"), "w") as sfile:
382 sfile.write("pass\n")
383 sfile.write("pass\n")
383 self.oldpath = os.getcwdu()
384 self.oldpath = os.getcwdu()
384 os.chdir(self.TESTDIR)
385 os.chdir(self.TESTDIR)
385 self.fname = u"åäötestscript.py"
386 self.fname = u"åäötestscript.py"
386
387
387 def tearDown(self):
388 def tearDown(self):
388 os.chdir(self.oldpath)
389 os.chdir(self.oldpath)
389 shutil.rmtree(self.BASETESTDIR)
390 shutil.rmtree(self.BASETESTDIR)
390
391
391 def test_1(self):
392 def test_1(self):
392 """Test safe_execfile with non-ascii path
393 """Test safe_execfile with non-ascii path
393 """
394 """
394 ip.safe_execfile(self.fname, {}, raise_exceptions=True)
395 ip.safe_execfile(self.fname, {}, raise_exceptions=True)
395
396
396
397
397 class TestSystemRaw(unittest.TestCase):
398 class TestSystemRaw(unittest.TestCase):
398 def test_1(self):
399 def test_1(self):
399 """Test system_raw with non-ascii cmd
400 """Test system_raw with non-ascii cmd
400 """
401 """
401 cmd = ur'''python -c "'åäö'" '''
402 cmd = ur'''python -c "'åäö'" '''
402 ip.system_raw(cmd)
403 ip.system_raw(cmd)
403
404
405 class TestModules(unittest.TestCase, tt.TempFileMixin):
406 def test_extraneous_loads(self):
407 """Test we're not loading modules on startup that we shouldn't.
408 """
409 self.mktmp("import sys\n"
410 "print('numpy' in sys.modules)\n"
411 "print('IPython.parallel' in sys.modules)\n"
412 "print('IPython.zmq' in sys.modules)\n"
413 )
414 out = "False\nFalse\nFalse\n"
415 tt.ipexec_validate(self.fname, out)
416
404
417
405 def test__IPYTHON__():
418 def test__IPYTHON__():
406 # This shouldn't raise a NameError, that's all
419 # This shouldn't raise a NameError, that's all
407 __IPYTHON__
420 __IPYTHON__
General Comments 0
You need to be logged in to leave comments. Login now