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