##// END OF EJS Templates
Fixed unused %cpaste test and moved into proper test suite.
Fernando Perez -
Show More
@@ -1,301 +1,357 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 import sys
13 13 import tempfile
14 14 import types
15 15 from cStringIO import StringIO
16 16
17 17 import nose.tools as nt
18 18
19 19 from IPython.utils.path import get_long_path_name
20 20 from IPython.testing import decorators as dec
21 21 from IPython.testing import tools as tt
22 22
23 23 #-----------------------------------------------------------------------------
24 24 # Test functions begin
25 25 #-----------------------------------------------------------------------------
26 26 def test_rehashx():
27 27 # clear up everything
28 28 _ip = get_ipython()
29 29 _ip.alias_manager.alias_table.clear()
30 30 del _ip.db['syscmdlist']
31 31
32 32 _ip.magic('rehashx')
33 33 # Practically ALL ipython development systems will have more than 10 aliases
34 34
35 35 yield (nt.assert_true, len(_ip.alias_manager.alias_table) > 10)
36 36 for key, val in _ip.alias_manager.alias_table.items():
37 37 # we must strip dots from alias names
38 38 nt.assert_true('.' not in key)
39 39
40 40 # rehashx must fill up syscmdlist
41 41 scoms = _ip.db['syscmdlist']
42 42 yield (nt.assert_true, len(scoms) > 10)
43 43
44 44
45 45 def test_magic_parse_options():
46 46 """Test that we don't mangle paths when parsing magic options."""
47 47 ip = get_ipython()
48 48 path = 'c:\\x'
49 49 opts = ip.parse_options('-f %s' % path,'f:')[0]
50 50 # argv splitting is os-dependent
51 51 if os.name == 'posix':
52 52 expected = 'c:x'
53 53 else:
54 54 expected = path
55 55 nt.assert_equals(opts['f'], expected)
56 56
57 57
58 58 def doctest_hist_f():
59 59 """Test %hist -f with temporary filename.
60 60
61 61 In [9]: import tempfile
62 62
63 63 In [10]: tfile = tempfile.mktemp('.py','tmp-ipython-')
64 64
65 65 In [11]: %hist -n -f $tfile 3
66 66
67 67 In [13]: import os; os.unlink(tfile)
68 68 """
69 69
70 70
71 71 def doctest_hist_r():
72 72 """Test %hist -r
73 73
74 74 XXX - This test is not recording the output correctly. For some reason, in
75 75 testing mode the raw history isn't getting populated. No idea why.
76 76 Disabling the output checking for now, though at least we do run it.
77 77
78 78 In [1]: 'hist' in _ip.lsmagic()
79 79 Out[1]: True
80 80
81 81 In [2]: x=1
82 82
83 83 In [3]: %hist -r 2
84 84 x=1 # random
85 85 %hist -r 2
86 86 """
87 87
88 88 def doctest_hist_op():
89 89 """Test %hist -op
90 90
91 91 In [1]: class b:
92 92 ...: pass
93 93 ...:
94 94
95 95 In [2]: class s(b):
96 96 ...: def __str__(self):
97 97 ...: return 's'
98 98 ...:
99 99
100 100 In [3]:
101 101
102 102 In [4]: class r(b):
103 103 ...: def __repr__(self):
104 104 ...: return 'r'
105 105 ...:
106 106
107 107 In [5]: class sr(s,r): pass
108 108 ...:
109 109
110 110 In [6]:
111 111
112 112 In [7]: bb=b()
113 113
114 114 In [8]: ss=s()
115 115
116 116 In [9]: rr=r()
117 117
118 118 In [10]: ssrr=sr()
119 119
120 120 In [11]: bb
121 121 Out[11]: <...b instance at ...>
122 122
123 123 In [12]: ss
124 124 Out[12]: <...s instance at ...>
125 125
126 126 In [13]:
127 127
128 128 In [14]: %hist -op
129 129 >>> class b:
130 130 ... pass
131 131 ...
132 132 >>> class s(b):
133 133 ... def __str__(self):
134 134 ... return 's'
135 135 ...
136 136 >>>
137 137 >>> class r(b):
138 138 ... def __repr__(self):
139 139 ... return 'r'
140 140 ...
141 141 >>> class sr(s,r): pass
142 142 >>>
143 143 >>> bb=b()
144 144 >>> ss=s()
145 145 >>> rr=r()
146 146 >>> ssrr=sr()
147 147 >>> bb
148 148 <...b instance at ...>
149 149 >>> ss
150 150 <...s instance at ...>
151 151 >>>
152 152 """
153 153
154 154 def test_shist():
155 155 # Simple tests of ShadowHist class - test generator.
156 156 import os, shutil, tempfile
157 157
158 158 from IPython.utils import pickleshare
159 159 from IPython.core.history import ShadowHist
160 160
161 161 tfile = tempfile.mktemp('','tmp-ipython-')
162 162
163 163 db = pickleshare.PickleShareDB(tfile)
164 164 s = ShadowHist(db)
165 165 s.add('hello')
166 166 s.add('world')
167 167 s.add('hello')
168 168 s.add('hello')
169 169 s.add('karhu')
170 170
171 171 yield nt.assert_equals,s.all(),[(1, 'hello'), (2, 'world'), (3, 'karhu')]
172 172
173 173 yield nt.assert_equal,s.get(2),'world'
174 174
175 175 shutil.rmtree(tfile)
176 176
177 177
178 178 # XXX failing for now, until we get clearcmd out of quarantine. But we should
179 179 # fix this and revert the skip to happen only if numpy is not around.
180 180 #@dec.skipif_not_numpy
181 181 @dec.skipknownfailure
182 182 def test_numpy_clear_array_undec():
183 183 from IPython.extensions import clearcmd
184 184
185 185 _ip.ex('import numpy as np')
186 186 _ip.ex('a = np.empty(2)')
187 187 yield (nt.assert_true, 'a' in _ip.user_ns)
188 188 _ip.magic('clear array')
189 189 yield (nt.assert_false, 'a' in _ip.user_ns)
190 190
191 191
192 192 # Multiple tests for clipboard pasting
193 193 @dec.parametric
194 194 def test_paste():
195 195 _ip = get_ipython()
196 196 def paste(txt, flags='-q'):
197 197 """Paste input text, by default in quiet mode"""
198 198 hooks.clipboard_get = lambda : txt
199 199 _ip.magic('paste '+flags)
200 200
201 201 # Inject fake clipboard hook but save original so we can restore it later
202 202 hooks = _ip.hooks
203 203 user_ns = _ip.user_ns
204 204 original_clip = hooks.clipboard_get
205 205
206 206 try:
207 207 # This try/except with an emtpy except clause is here only because
208 208 # try/yield/finally is invalid syntax in Python 2.4. This will be
209 209 # removed when we drop 2.4-compatibility, and the emtpy except below
210 210 # will be changed to a finally.
211 211
212 212 # Run tests with fake clipboard function
213 213 user_ns.pop('x', None)
214 214 paste('x=1')
215 215 yield nt.assert_equal(user_ns['x'], 1)
216 216
217 217 user_ns.pop('x', None)
218 218 paste('>>> x=2')
219 219 yield nt.assert_equal(user_ns['x'], 2)
220 220
221 221 paste("""
222 222 >>> x = [1,2,3]
223 223 >>> y = []
224 224 >>> for i in x:
225 225 ... y.append(i**2)
226 226 ...
227 227 """)
228 228 yield nt.assert_equal(user_ns['x'], [1,2,3])
229 229 yield nt.assert_equal(user_ns['y'], [1,4,9])
230 230
231 231 # Now, test that paste -r works
232 232 user_ns.pop('x', None)
233 233 yield nt.assert_false('x' in user_ns)
234 234 _ip.magic('paste -r')
235 235 yield nt.assert_equal(user_ns['x'], [1,2,3])
236 236
237 237 # Also test paste echoing, by temporarily faking the writer
238 238 w = StringIO()
239 239 writer = _ip.write
240 240 _ip.write = w.write
241 241 code = """
242 242 a = 100
243 243 b = 200"""
244 244 try:
245 245 paste(code,'')
246 246 out = w.getvalue()
247 247 finally:
248 248 _ip.write = writer
249 249 yield nt.assert_equal(user_ns['a'], 100)
250 250 yield nt.assert_equal(user_ns['b'], 200)
251 251 yield nt.assert_equal(out, code+"\n## -- End pasted text --\n")
252 252
253 253 finally:
254 254 # This should be in a finally clause, instead of the bare except above.
255 255 # Restore original hook
256 256 hooks.clipboard_get = original_clip
257 257
258 258
259 259 def test_time():
260 260 _ip.magic('time None')
261 261
262 262
263 263 def doctest_time():
264 264 """
265 265 In [10]: %time None
266 266 CPU times: user 0.00 s, sys: 0.00 s, total: 0.00 s
267 267 Wall time: 0.00 s
268 268 """
269 269
270 270
271 271 def test_doctest_mode():
272 272 "Toggle doctest_mode twice, it should be a no-op and run without error"
273 273 _ip.magic('doctest_mode')
274 274 _ip.magic('doctest_mode')
275 275
276 276
277 277 def test_parse_options():
278 278 """Tests for basic options parsing in magics."""
279 279 # These are only the most minimal of tests, more should be added later. At
280 280 # the very least we check that basic text/unicode calls work OK.
281 281 nt.assert_equal(_ip.parse_options('foo', '')[1], 'foo')
282 282 nt.assert_equal(_ip.parse_options(u'foo', '')[1], u'foo')
283 283
284 284
285 285 def test_dirops():
286 286 """Test various directory handling operations."""
287 287 curpath = lambda :os.path.splitdrive(os.getcwd())[1].replace('\\','/')
288 288
289 289 startdir = os.getcwd()
290 290 ipdir = _ip.ipython_dir
291 291 try:
292 292 _ip.magic('cd "%s"' % ipdir)
293 293 nt.assert_equal(curpath(), ipdir)
294 294 _ip.magic('cd -')
295 295 nt.assert_equal(curpath(), startdir)
296 296 _ip.magic('pushd "%s"' % ipdir)
297 297 nt.assert_equal(curpath(), ipdir)
298 298 _ip.magic('popd')
299 299 nt.assert_equal(curpath(), startdir)
300 300 finally:
301 301 os.chdir(startdir)
302
303
304 def check_cpaste(code, should_fail=False):
305 """Execute code via 'cpaste' and ensure it was executed, unless
306 should_fail is set.
307 """
308 _ip.user_ns['code_ran'] = False
309
310 src = StringIO()
311 src.write('\n')
312 src.write(code)
313 src.write('\n--\n')
314 src.seek(0)
315
316 stdin_save = sys.stdin
317 sys.stdin = src
318
319 try:
320 _ip.magic('cpaste')
321 except:
322 if not should_fail:
323 raise AssertionError("Failure not expected : '%s'" %
324 code)
325 else:
326 assert _ip.user_ns['code_ran']
327 if should_fail:
328 raise AssertionError("Failure expected : '%s'" % code)
329 finally:
330 sys.stdin = stdin_save
331
332
333 def test_cpaste():
334 """Test cpaste magic"""
335
336 def run():
337 """Marker function: sets a flag when executed.
338 """
339 _ip.user_ns['code_ran'] = True
340 return 'run' # return string so '+ run()' doesn't result in success
341
342 tests = {'pass': ["> > > run()",
343 ">>> > run()",
344 "+++ run()",
345 "++ run()",
346 " >>> run()"],
347
348 'fail': ["+ + run()",
349 " ++ run()"]}
350
351 _ip.user_ns['run'] = run
352
353 for code in tests['pass']:
354 check_cpaste(code)
355
356 for code in tests['fail']:
357 check_cpaste(code, should_fail=True)
1 NO CONTENT: file was removed
General Comments 0
You need to be logged in to leave comments. Login now