##// END OF EJS Templates
separate %reset tests for finer granularity
Paul Ivanov -
Show More
@@ -1,387 +1,390 b''
1 1 """Tests for various magic functions.
2 2
3 3 Needs to be run by nose (to make ipython session available).
4 4 """
5 5 from __future__ import absolute_import
6 6
7 7 #-----------------------------------------------------------------------------
8 8 # Imports
9 9 #-----------------------------------------------------------------------------
10 10
11 11 import os
12 12
13 13 import nose.tools as nt
14 14
15 15 from IPython.testing import decorators as dec
16 16 from IPython.testing import tools as tt
17 17 from IPython.utils import py3compat
18 18
19 19 #-----------------------------------------------------------------------------
20 20 # Test functions begin
21 21 #-----------------------------------------------------------------------------
22 22
23 23 def test_rehashx():
24 24 # clear up everything
25 25 _ip = get_ipython()
26 26 _ip.alias_manager.alias_table.clear()
27 27 del _ip.db['syscmdlist']
28 28
29 29 _ip.magic('rehashx')
30 30 # Practically ALL ipython development systems will have more than 10 aliases
31 31
32 32 yield (nt.assert_true, len(_ip.alias_manager.alias_table) > 10)
33 33 for key, val in _ip.alias_manager.alias_table.iteritems():
34 34 # we must strip dots from alias names
35 35 nt.assert_true('.' not in key)
36 36
37 37 # rehashx must fill up syscmdlist
38 38 scoms = _ip.db['syscmdlist']
39 39 yield (nt.assert_true, len(scoms) > 10)
40 40
41 41
42 42 def test_magic_parse_options():
43 43 """Test that we don't mangle paths when parsing magic options."""
44 44 ip = get_ipython()
45 45 path = 'c:\\x'
46 46 opts = ip.parse_options('-f %s' % path,'f:')[0]
47 47 # argv splitting is os-dependent
48 48 if os.name == 'posix':
49 49 expected = 'c:x'
50 50 else:
51 51 expected = path
52 52 nt.assert_equals(opts['f'], expected)
53 53
54 54
55 55 @dec.skip_without('sqlite3')
56 56 def doctest_hist_f():
57 57 """Test %hist -f with temporary filename.
58 58
59 59 In [9]: import tempfile
60 60
61 61 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
62 62
63 63 In [11]: %hist -nl -f $tfile 3
64 64
65 65 In [13]: import os; os.unlink(tfile)
66 66 """
67 67
68 68
69 69 @dec.skip_without('sqlite3')
70 70 def doctest_hist_r():
71 71 """Test %hist -r
72 72
73 73 XXX - This test is not recording the output correctly. For some reason, in
74 74 testing mode the raw history isn't getting populated. No idea why.
75 75 Disabling the output checking for now, though at least we do run it.
76 76
77 77 In [1]: 'hist' in _ip.lsmagic()
78 78 Out[1]: True
79 79
80 80 In [2]: x=1
81 81
82 82 In [3]: %hist -rl 2
83 83 x=1 # random
84 84 %hist -r 2
85 85 """
86 86
87 87
88 88 @dec.skip_without('sqlite3')
89 89 def doctest_hist_op():
90 90 """Test %hist -op
91 91
92 92 In [1]: class b(float):
93 93 ...: pass
94 94 ...:
95 95
96 96 In [2]: class s(object):
97 97 ...: def __str__(self):
98 98 ...: return 's'
99 99 ...:
100 100
101 101 In [3]:
102 102
103 103 In [4]: class r(b):
104 104 ...: def __repr__(self):
105 105 ...: return 'r'
106 106 ...:
107 107
108 108 In [5]: class sr(s,r): pass
109 109 ...:
110 110
111 111 In [6]:
112 112
113 113 In [7]: bb=b()
114 114
115 115 In [8]: ss=s()
116 116
117 117 In [9]: rr=r()
118 118
119 119 In [10]: ssrr=sr()
120 120
121 121 In [11]: 4.5
122 122 Out[11]: 4.5
123 123
124 124 In [12]: str(ss)
125 125 Out[12]: 's'
126 126
127 127 In [13]:
128 128
129 129 In [14]: %hist -op
130 130 >>> class b:
131 131 ... pass
132 132 ...
133 133 >>> class s(b):
134 134 ... def __str__(self):
135 135 ... return 's'
136 136 ...
137 137 >>>
138 138 >>> class r(b):
139 139 ... def __repr__(self):
140 140 ... return 'r'
141 141 ...
142 142 >>> class sr(s,r): pass
143 143 >>>
144 144 >>> bb=b()
145 145 >>> ss=s()
146 146 >>> rr=r()
147 147 >>> ssrr=sr()
148 148 >>> 4.5
149 149 4.5
150 150 >>> str(ss)
151 151 's'
152 152 >>>
153 153 """
154 154
155 155
156 156 @dec.skip_without('sqlite3')
157 157 def test_macro():
158 158 ip = get_ipython()
159 159 ip.history_manager.reset() # Clear any existing history.
160 160 cmds = ["a=1", "def b():\n return a**2", "print(a,b())"]
161 161 for i, cmd in enumerate(cmds, start=1):
162 162 ip.history_manager.store_inputs(i, cmd)
163 163 ip.magic("macro test 1-3")
164 164 nt.assert_equal(ip.user_ns["test"].value, "\n".join(cmds)+"\n")
165 165
166 166 # List macros.
167 167 assert "test" in ip.magic("macro")
168 168
169 169
170 170 @dec.skip_without('sqlite3')
171 171 def test_macro_run():
172 172 """Test that we can run a multi-line macro successfully."""
173 173 ip = get_ipython()
174 174 ip.history_manager.reset()
175 175 cmds = ["a=10", "a+=1", py3compat.doctest_refactor_print("print a"),
176 176 "%macro test 2-3"]
177 177 for cmd in cmds:
178 178 ip.run_cell(cmd, store_history=True)
179 179 nt.assert_equal(ip.user_ns["test"].value,
180 180 py3compat.doctest_refactor_print("a+=1\nprint a\n"))
181 181 with tt.AssertPrints("12"):
182 182 ip.run_cell("test")
183 183 with tt.AssertPrints("13"):
184 184 ip.run_cell("test")
185 185
186 186
187 187 @dec.skipif_not_numpy
188 188 def test_numpy_reset_array_undec():
189 189 "Test '%reset array' functionality"
190 190 _ip.ex('import numpy as np')
191 191 _ip.ex('a = np.empty(2)')
192 192 yield (nt.assert_true, 'a' in _ip.user_ns)
193 193 _ip.magic('reset -f array')
194 194 yield (nt.assert_false, 'a' in _ip.user_ns)
195 195
196 def test_reset_args():
197 "Test '%reset' magic with args which used to be extensions.clearcmd"
198 _ip = get_ipython()
196 def test_reset_out():
197 "Test '%reset out' magic"
199 198 _ip.run_cell("parrot = 'dead'", store_history=True)
200 199 # test '%reset -f out', make an Out prompt
201 200 _ip.run_cell("parrot", store_history=True)
202 201 nt.assert_true('dead' in [_ip.user_ns[x] for x in '_','__','___'])
203 202 _ip.magic('reset -f out')
204 203 nt.assert_false('dead' in [_ip.user_ns[x] for x in '_','__','___'])
205 204 nt.assert_true(len(_ip.user_ns['Out']) == 0)
206 205
206 def test_reset_in():
207 "Test '%reset in' magic"
207 208 # test '%reset -f in'
208 209 _ip.run_cell("parrot", store_history=True)
209 210 nt.assert_true('parrot' in [_ip.user_ns[x] for x in '_i','_ii','_iii'])
210 211 _ip.magic('%reset -f in')
211 212 nt.assert_false('parrot' in [_ip.user_ns[x] for x in '_i','_ii','_iii'])
212 213 nt.assert_true(len(set(_ip.user_ns['In'])) == 1)
213 214
214 # test '%reset -f dhist'
215 def test_reset_dhist():
216 "Test '%reset dhist' magic"
215 217 _ip.run_cell("tmp = [d for d in _dh]") # copy before clearing
216 _ip.magic('cd')
218 _ip.magic('cd ' + os.path.dirname(nt.__file__))
217 219 _ip.magic('cd -')
218 220 nt.assert_true(len(_ip.user_ns['_dh']) > 0)
219 221 _ip.magic('reset -f dhist')
220 222 nt.assert_true(len(_ip.user_ns['_dh']) == 0)
221 223 _ip.run_cell("_dh = [d for d in tmp]") #restore
222 224
223 # test that In length is preserved for %macro
225 def test_reset_in_length():
226 "Test that '%reset in' preserves In[] length"
224 227 _ip.run_cell("print 'foo'")
225 228 _ip.run_cell("reset -f in")
226 229 nt.assert_true(len(_ip.user_ns['In']) == _ip.displayhook.prompt_count+1)
227 230
228 231 def test_time():
229 232 _ip.magic('time None')
230 233
231 234
232 235 @py3compat.doctest_refactor_print
233 236 def doctest_time():
234 237 """
235 238 In [10]: %time None
236 239 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
237 240 Wall time: 0.00 s
238 241
239 242 In [11]: def f(kmjy):
240 243 ....: %time print 2*kmjy
241 244
242 245 In [12]: f(3)
243 246 6
244 247 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
245 248 Wall time: 0.00 s
246 249 """
247 250
248 251
249 252 def test_doctest_mode():
250 253 "Toggle doctest_mode twice, it should be a no-op and run without error"
251 254 _ip.magic('doctest_mode')
252 255 _ip.magic('doctest_mode')
253 256
254 257
255 258 def test_parse_options():
256 259 """Tests for basic options parsing in magics."""
257 260 # These are only the most minimal of tests, more should be added later. At
258 261 # the very least we check that basic text/unicode calls work OK.
259 262 nt.assert_equal(_ip.parse_options('foo', '')[1], 'foo')
260 263 nt.assert_equal(_ip.parse_options(u'foo', '')[1], u'foo')
261 264
262 265
263 266 def test_dirops():
264 267 """Test various directory handling operations."""
265 268 # curpath = lambda :os.path.splitdrive(os.getcwdu())[1].replace('\\','/')
266 269 curpath = os.getcwdu
267 270 startdir = os.getcwdu()
268 271 ipdir = os.path.realpath(_ip.ipython_dir)
269 272 try:
270 273 _ip.magic('cd "%s"' % ipdir)
271 274 nt.assert_equal(curpath(), ipdir)
272 275 _ip.magic('cd -')
273 276 nt.assert_equal(curpath(), startdir)
274 277 _ip.magic('pushd "%s"' % ipdir)
275 278 nt.assert_equal(curpath(), ipdir)
276 279 _ip.magic('popd')
277 280 nt.assert_equal(curpath(), startdir)
278 281 finally:
279 282 os.chdir(startdir)
280 283
281 284
282 285 def test_xmode():
283 286 # Calling xmode three times should be a no-op
284 287 xmode = _ip.InteractiveTB.mode
285 288 for i in range(3):
286 289 _ip.magic("xmode")
287 290 nt.assert_equal(_ip.InteractiveTB.mode, xmode)
288 291
289 292 def test_reset_hard():
290 293 monitor = []
291 294 class A(object):
292 295 def __del__(self):
293 296 monitor.append(1)
294 297 def __repr__(self):
295 298 return "<A instance>"
296 299
297 300 _ip.user_ns["a"] = A()
298 301 _ip.run_cell("a")
299 302
300 303 nt.assert_equal(monitor, [])
301 304 _ip.magic_reset("-f")
302 305 nt.assert_equal(monitor, [1])
303 306
304 307 class TestXdel(tt.TempFileMixin):
305 308 def test_xdel(self):
306 309 """Test that references from %run are cleared by xdel."""
307 310 src = ("class A(object):\n"
308 311 " monitor = []\n"
309 312 " def __del__(self):\n"
310 313 " self.monitor.append(1)\n"
311 314 "a = A()\n")
312 315 self.mktmp(src)
313 316 # %run creates some hidden references...
314 317 _ip.magic("run %s" % self.fname)
315 318 # ... as does the displayhook.
316 319 _ip.run_cell("a")
317 320
318 321 monitor = _ip.user_ns["A"].monitor
319 322 nt.assert_equal(monitor, [])
320 323
321 324 _ip.magic("xdel a")
322 325
323 326 # Check that a's __del__ method has been called.
324 327 nt.assert_equal(monitor, [1])
325 328
326 329 def doctest_who():
327 330 """doctest for %who
328 331
329 332 In [1]: %reset -f
330 333
331 334 In [2]: alpha = 123
332 335
333 336 In [3]: beta = 'beta'
334 337
335 338 In [4]: %who int
336 339 alpha
337 340
338 341 In [5]: %who str
339 342 beta
340 343
341 344 In [6]: %whos
342 345 Variable Type Data/Info
343 346 ----------------------------
344 347 alpha int 123
345 348 beta str beta
346 349
347 350 In [7]: %who_ls
348 351 Out[7]: ['alpha', 'beta']
349 352 """
350 353
351 354 @py3compat.u_format
352 355 def doctest_precision():
353 356 """doctest for %precision
354 357
355 358 In [1]: f = get_ipython().shell.display_formatter.formatters['text/plain']
356 359
357 360 In [2]: %precision 5
358 361 Out[2]: {u}'%.5f'
359 362
360 363 In [3]: f.float_format
361 364 Out[3]: {u}'%.5f'
362 365
363 366 In [4]: %precision %e
364 367 Out[4]: {u}'%e'
365 368
366 369 In [5]: f(3.1415927)
367 370 Out[5]: {u}'3.141593e+00'
368 371 """
369 372
370 373 def test_psearch():
371 374 with tt.AssertPrints("dict.fromkeys"):
372 375 _ip.run_cell("dict.fr*?")
373 376
374 377 def test_timeit_shlex():
375 378 """test shlex issues with timeit (#1109)"""
376 379 _ip.ex("def f(*a,**kw): pass")
377 380 _ip.magic('timeit -n1 "this is a bug".count(" ")')
378 381 _ip.magic('timeit -r1 -n1 f(" ", 1)')
379 382 _ip.magic('timeit -r1 -n1 f(" ", 1, " ", 2, " ")')
380 383 _ip.magic('timeit -r1 -n1 ("a " + "b")')
381 384 _ip.magic('timeit -r1 -n1 f("a " + "b")')
382 385 _ip.magic('timeit -r1 -n1 f("a " + "b ")')
383 386
384 387
385 388 def test_timeit_arguments():
386 389 "Test valid timeit arguments, should not cause SyntaxError (GH #1269)"
387 390 _ip.magic("timeit ('#')")
General Comments 0
You need to be logged in to leave comments. Login now