##// END OF EJS Templates
Remove tests for 4-5 tuples, add tests for validate logic
Gordon Ball -
Show More
@@ -1,560 +1,504 b''
1 """Test interact and interactive."""
1 """Test interact and interactive."""
2
2
3 #-----------------------------------------------------------------------------
3 #-----------------------------------------------------------------------------
4 # Copyright (C) 2014 The IPython Development Team
4 # Copyright (C) 2014 The IPython Development Team
5 #
5 #
6 # Distributed under the terms of the BSD License. The full license is in
6 # Distributed under the terms of the BSD License. The full license is in
7 # the file COPYING, distributed as part of this software.
7 # the file COPYING, distributed as part of this software.
8 #-----------------------------------------------------------------------------
8 #-----------------------------------------------------------------------------
9
9
10 #-----------------------------------------------------------------------------
10 #-----------------------------------------------------------------------------
11 # Imports
11 # Imports
12 #-----------------------------------------------------------------------------
12 #-----------------------------------------------------------------------------
13
13
14 from __future__ import print_function
14 from __future__ import print_function
15
15
16 from collections import OrderedDict
16 from collections import OrderedDict
17
17
18 import nose.tools as nt
18 import nose.tools as nt
19 import IPython.testing.tools as tt
19 import IPython.testing.tools as tt
20
20
21 # from IPython.core.getipython import get_ipython
21 # from IPython.core.getipython import get_ipython
22 from IPython.html import widgets
22 from IPython.html import widgets
23 from IPython.html.widgets import interact, interactive, Widget, interaction
23 from IPython.html.widgets import interact, interactive, Widget, interaction
24 from IPython.utils.py3compat import annotate
24 from IPython.utils.py3compat import annotate
25
25
26 #-----------------------------------------------------------------------------
26 #-----------------------------------------------------------------------------
27 # Utility stuff
27 # Utility stuff
28 #-----------------------------------------------------------------------------
28 #-----------------------------------------------------------------------------
29
29
30 class DummyComm(object):
30 class DummyComm(object):
31 comm_id = 'a-b-c-d'
31 comm_id = 'a-b-c-d'
32 def send(self, *args, **kwargs):
32 def send(self, *args, **kwargs):
33 pass
33 pass
34
34
35 def close(self, *args, **kwargs):
35 def close(self, *args, **kwargs):
36 pass
36 pass
37
37
38 _widget_attrs = {}
38 _widget_attrs = {}
39 displayed = []
39 displayed = []
40
40
41 def setup():
41 def setup():
42 _widget_attrs['comm'] = Widget.comm
42 _widget_attrs['comm'] = Widget.comm
43 Widget.comm = DummyComm()
43 Widget.comm = DummyComm()
44 _widget_attrs['_ipython_display_'] = Widget._ipython_display_
44 _widget_attrs['_ipython_display_'] = Widget._ipython_display_
45 def raise_not_implemented(*args, **kwargs):
45 def raise_not_implemented(*args, **kwargs):
46 raise NotImplementedError()
46 raise NotImplementedError()
47 Widget._ipython_display_ = raise_not_implemented
47 Widget._ipython_display_ = raise_not_implemented
48
48
49 def teardown():
49 def teardown():
50 for attr, value in _widget_attrs.items():
50 for attr, value in _widget_attrs.items():
51 setattr(Widget, attr, value)
51 setattr(Widget, attr, value)
52
52
53 def f(**kwargs):
53 def f(**kwargs):
54 pass
54 pass
55
55
56 def clear_display():
56 def clear_display():
57 global displayed
57 global displayed
58 displayed = []
58 displayed = []
59
59
60 def record_display(*args):
60 def record_display(*args):
61 displayed.extend(args)
61 displayed.extend(args)
62
62
63 #-----------------------------------------------------------------------------
63 #-----------------------------------------------------------------------------
64 # Actual tests
64 # Actual tests
65 #-----------------------------------------------------------------------------
65 #-----------------------------------------------------------------------------
66
66
67 def check_widget(w, **d):
67 def check_widget(w, **d):
68 """Check a single widget against a dict"""
68 """Check a single widget against a dict"""
69 for attr, expected in d.items():
69 for attr, expected in d.items():
70 if attr == 'cls':
70 if attr == 'cls':
71 nt.assert_is(w.__class__, expected)
71 nt.assert_is(w.__class__, expected)
72 else:
72 else:
73 value = getattr(w, attr)
73 value = getattr(w, attr)
74 nt.assert_equal(value, expected,
74 nt.assert_equal(value, expected,
75 "%s.%s = %r != %r" % (w.__class__.__name__, attr, value, expected)
75 "%s.%s = %r != %r" % (w.__class__.__name__, attr, value, expected)
76 )
76 )
77
77
78 def check_widgets(container, **to_check):
78 def check_widgets(container, **to_check):
79 """Check that widgets are created as expected"""
79 """Check that widgets are created as expected"""
80 # build a widget dictionary, so it matches
80 # build a widget dictionary, so it matches
81 widgets = {}
81 widgets = {}
82 for w in container.children:
82 for w in container.children:
83 widgets[w.description] = w
83 widgets[w.description] = w
84
84
85 for key, d in to_check.items():
85 for key, d in to_check.items():
86 nt.assert_in(key, widgets)
86 nt.assert_in(key, widgets)
87 check_widget(widgets[key], **d)
87 check_widget(widgets[key], **d)
88
88
89
89
90 def test_single_value_string():
90 def test_single_value_string():
91 a = u'hello'
91 a = u'hello'
92 c = interactive(f, a=a)
92 c = interactive(f, a=a)
93 w = c.children[0]
93 w = c.children[0]
94 check_widget(w,
94 check_widget(w,
95 cls=widgets.TextWidget,
95 cls=widgets.TextWidget,
96 description='a',
96 description='a',
97 value=a,
97 value=a,
98 )
98 )
99
99
100 def test_single_value_bool():
100 def test_single_value_bool():
101 for a in (True, False):
101 for a in (True, False):
102 c = interactive(f, a=a)
102 c = interactive(f, a=a)
103 w = c.children[0]
103 w = c.children[0]
104 check_widget(w,
104 check_widget(w,
105 cls=widgets.CheckboxWidget,
105 cls=widgets.CheckboxWidget,
106 description='a',
106 description='a',
107 value=a,
107 value=a,
108 )
108 )
109
109
110 def test_single_value_dict():
110 def test_single_value_dict():
111 for d in [
111 for d in [
112 dict(a=5),
112 dict(a=5),
113 dict(a=5, b='b', c=dict),
113 dict(a=5, b='b', c=dict),
114 ]:
114 ]:
115 c = interactive(f, d=d)
115 c = interactive(f, d=d)
116 w = c.children[0]
116 w = c.children[0]
117 check_widget(w,
117 check_widget(w,
118 cls=widgets.DropdownWidget,
118 cls=widgets.DropdownWidget,
119 description='d',
119 description='d',
120 values=d,
120 values=d,
121 value=next(iter(d.values())),
121 value=next(iter(d.values())),
122 )
122 )
123
123
124 def test_single_value_float():
124 def test_single_value_float():
125 for a in (2.25, 1.0, -3.5):
125 for a in (2.25, 1.0, -3.5):
126 c = interactive(f, a=a)
126 c = interactive(f, a=a)
127 w = c.children[0]
127 w = c.children[0]
128 check_widget(w,
128 check_widget(w,
129 cls=widgets.FloatSliderWidget,
129 cls=widgets.FloatSliderWidget,
130 description='a',
130 description='a',
131 value=a,
131 value=a,
132 min= -a if a > 0 else 3*a,
132 min= -a if a > 0 else 3*a,
133 max= 3*a if a > 0 else -a,
133 max= 3*a if a > 0 else -a,
134 step=0.1,
134 step=0.1,
135 readout=True,
135 readout=True,
136 )
136 )
137
137
138 def test_single_value_int():
138 def test_single_value_int():
139 for a in (1, 5, -3):
139 for a in (1, 5, -3):
140 c = interactive(f, a=a)
140 c = interactive(f, a=a)
141 nt.assert_equal(len(c.children), 1)
141 nt.assert_equal(len(c.children), 1)
142 w = c.children[0]
142 w = c.children[0]
143 check_widget(w,
143 check_widget(w,
144 cls=widgets.IntSliderWidget,
144 cls=widgets.IntSliderWidget,
145 description='a',
145 description='a',
146 value=a,
146 value=a,
147 min= -a if a > 0 else 3*a,
147 min= -a if a > 0 else 3*a,
148 max= 3*a if a > 0 else -a,
148 max= 3*a if a > 0 else -a,
149 step=1,
149 step=1,
150 readout=True,
150 readout=True,
151 )
151 )
152
152
153 def test_list_tuple_2_int():
153 def test_list_tuple_2_int():
154 with nt.assert_raises(ValueError):
154 with nt.assert_raises(ValueError):
155 c = interactive(f, tup=(1,1))
155 c = interactive(f, tup=(1,1))
156 with nt.assert_raises(ValueError):
156 with nt.assert_raises(ValueError):
157 c = interactive(f, tup=(1,-1))
157 c = interactive(f, tup=(1,-1))
158 for min, max in [ (0,1), (1,10), (1,2), (-5,5), (-20,-19) ]:
158 for min, max in [ (0,1), (1,10), (1,2), (-5,5), (-20,-19) ]:
159 c = interactive(f, tup=(min, max), lis=[min, max])
159 c = interactive(f, tup=(min, max), lis=[min, max])
160 nt.assert_equal(len(c.children), 2)
160 nt.assert_equal(len(c.children), 2)
161 d = dict(
161 d = dict(
162 cls=widgets.IntSliderWidget,
162 cls=widgets.IntSliderWidget,
163 min=min,
163 min=min,
164 max=max,
164 max=max,
165 step=1,
165 step=1,
166 readout=True,
166 readout=True,
167 )
167 )
168 check_widgets(c, tup=d, lis=d)
168 check_widgets(c, tup=d, lis=d)
169
169
170 def test_list_tuple_3_int():
170 def test_list_tuple_3_int():
171 with nt.assert_raises(ValueError):
171 with nt.assert_raises(ValueError):
172 c = interactive(f, tup=(1,2,0))
172 c = interactive(f, tup=(1,2,0))
173 with nt.assert_raises(ValueError):
173 with nt.assert_raises(ValueError):
174 c = interactive(f, tup=(1,2,-1))
174 c = interactive(f, tup=(1,2,-1))
175 for min, max, step in [ (0,2,1), (1,10,2), (1,100,2), (-5,5,4), (-100,-20,4) ]:
175 for min, max, step in [ (0,2,1), (1,10,2), (1,100,2), (-5,5,4), (-100,-20,4) ]:
176 c = interactive(f, tup=(min, max, step), lis=[min, max, step])
176 c = interactive(f, tup=(min, max, step), lis=[min, max, step])
177 nt.assert_equal(len(c.children), 2)
177 nt.assert_equal(len(c.children), 2)
178 d = dict(
178 d = dict(
179 cls=widgets.IntSliderWidget,
179 cls=widgets.IntSliderWidget,
180 min=min,
180 min=min,
181 max=max,
181 max=max,
182 step=step,
182 step=step,
183 readout=True,
183 readout=True,
184 )
184 )
185 check_widgets(c, tup=d, lis=d)
185 check_widgets(c, tup=d, lis=d)
186
186
187 def test_list_tuple_2_float():
187 def test_list_tuple_2_float():
188 with nt.assert_raises(ValueError):
188 with nt.assert_raises(ValueError):
189 c = interactive(f, tup=(1.0,1.0))
189 c = interactive(f, tup=(1.0,1.0))
190 with nt.assert_raises(ValueError):
190 with nt.assert_raises(ValueError):
191 c = interactive(f, tup=(0.5,-0.5))
191 c = interactive(f, tup=(0.5,-0.5))
192 for min, max in [ (0.5, 1.5), (1.1,10.2), (1,2.2), (-5.,5), (-20,-19.) ]:
192 for min, max in [ (0.5, 1.5), (1.1,10.2), (1,2.2), (-5.,5), (-20,-19.) ]:
193 c = interactive(f, tup=(min, max), lis=[min, max])
193 c = interactive(f, tup=(min, max), lis=[min, max])
194 nt.assert_equal(len(c.children), 2)
194 nt.assert_equal(len(c.children), 2)
195 d = dict(
195 d = dict(
196 cls=widgets.FloatSliderWidget,
196 cls=widgets.FloatSliderWidget,
197 min=min,
197 min=min,
198 max=max,
198 max=max,
199 step=.1,
199 step=.1,
200 readout=True,
200 readout=True,
201 )
201 )
202 check_widgets(c, tup=d, lis=d)
202 check_widgets(c, tup=d, lis=d)
203
203
204 def test_list_tuple_3_float():
204 def test_list_tuple_3_float():
205 with nt.assert_raises(ValueError):
205 with nt.assert_raises(ValueError):
206 c = interactive(f, tup=(1,2,0.0))
206 c = interactive(f, tup=(1,2,0.0))
207 with nt.assert_raises(ValueError):
207 with nt.assert_raises(ValueError):
208 c = interactive(f, tup=(-1,-2,1.))
208 c = interactive(f, tup=(-1,-2,1.))
209 with nt.assert_raises(ValueError):
209 with nt.assert_raises(ValueError):
210 c = interactive(f, tup=(1,2.,-1.))
210 c = interactive(f, tup=(1,2.,-1.))
211 for min, max, step in [ (0.,2,1), (1,10.,2), (1,100,2.), (-5.,5.,4), (-100,-20.,4.) ]:
211 for min, max, step in [ (0.,2,1), (1,10.,2), (1,100,2.), (-5.,5.,4), (-100,-20.,4.) ]:
212 c = interactive(f, tup=(min, max, step), lis=[min, max, step])
212 c = interactive(f, tup=(min, max, step), lis=[min, max, step])
213 nt.assert_equal(len(c.children), 2)
213 nt.assert_equal(len(c.children), 2)
214 d = dict(
214 d = dict(
215 cls=widgets.FloatSliderWidget,
215 cls=widgets.FloatSliderWidget,
216 min=min,
216 min=min,
217 max=max,
217 max=max,
218 step=step,
218 step=step,
219 readout=True,
219 readout=True,
220 )
220 )
221 check_widgets(c, tup=d, lis=d)
221 check_widgets(c, tup=d, lis=d)
222
222
223 def test_list_tuple_4_int():
224 with nt.assert_raises(ValueError):
225 c = interactive(f, tup=(4, 3, 2, 1))
226 with nt.assert_raises(ValueError):
227 c = interactive(f, tup=(1, 2, 3, 2))
228 with nt.assert_raises(ValueError):
229 c = interactive(f, tup=(2, 1, 3, 4))
230 for min, low, high, max in [(0, 1, 2, 3), (0, 0, 0, 0), (1, 2, 2, 3), (-2, -1, 1, 2)]:
231 c = interactive(f, tup=(min, low, high, max), lis=[min, low, high, max])
232 nt.assert_equal(len(c.children), 2)
233 d = dict(
234 cls=widgets.IntRangeSliderWidget,
235 min=min,
236 max=max,
237 value=(low, high),
238 range=True,
239 readout=True
240 )
241 check_widgets(c, tup=d, lis=d)
242
243 def test_list_tuple_5_int():
244 with nt.assert_raises(ValueError):
245 c = interactive(f, tup=(1, 2, 3, 4, 0))
246 with nt.assert_raises(ValueError):
247 c = interactive(f, tup=(1, 2, 3, 4, -1))
248 for min, low, high, max, step in [(0, 1, 2, 3, 1), (0, 0, 0, 0, 1), (1, 2, 2, 3, 2), (-2, -1, 1, 2, 3)]:
249 c = interactive(f, tup=(min, low, high, max, step), lis=[min, low, high, max, step])
250 nt.assert_equal(len(c.children), 2)
251 d = dict(
252 cls=widgets.IntRangeSliderWidget,
253 min=min,
254 max=max,
255 value=(low, high),
256 step=step,
257 range=True,
258 readout=True
259 )
260 check_widgets(c, tup=d, lis=d)
261
262 def test_list_tuple_4_float():
263 with nt.assert_raises(ValueError):
264 c = interactive(f, tup=(4, 3., 2, 1))
265 with nt.assert_raises(ValueError):
266 c = interactive(f, tup=(1, 2, 3, 2.))
267 with nt.assert_raises(ValueError):
268 c = interactive(f, tup=(2, 1., 3, 4))
269 for min, low, high, max in [(0, 1., 2, 3), (0, 0, 0., 0), (1., 2., 2., 3.1415), (-2.5, -1, 1, 2.5)]:
270 c = interactive(f, tup=(min, low, high, max), lis=[min, low, high, max])
271 nt.assert_equal(len(c.children), 2)
272 d = dict(
273 cls=widgets.FloatRangeSliderWidget,
274 min=min,
275 max=max,
276 value=(low, high),
277 range=True,
278 readout=True
279 )
280 check_widgets(c, tup=d, lis=d)
281
282 def test_list_tuple_5_float():
283 with nt.assert_raises(ValueError):
284 c = interactive(f, tup=(1, 2., 3., 4, 0))
285 with nt.assert_raises(ValueError):
286 c = interactive(f, tup=(1, 2, 3., 4., -0.5))
287 for min, low, high, max, step in [(0, 1, 2, 3, 0.01), (0, 0, 0, 0, 0.1), (1, 2, 2, 3, 2.718), (-2, -1.5, 1.5, 2, 2)]:
288 c = interactive(f, tup=(min, low, high, max, step), lis=[min, low, high, max, step])
289 nt.assert_equal(len(c.children), 2)
290 d = dict(
291 cls=widgets.FloatRangeSliderWidget,
292 min=min,
293 max=max,
294 value=(low, high),
295 step=step,
296 range=True,
297 readout=True
298 )
299 check_widgets(c, tup=d, lis=d)
300
301 def test_list_tuple_str():
223 def test_list_tuple_str():
302 values = ['hello', 'there', 'guy']
224 values = ['hello', 'there', 'guy']
303 first = values[0]
225 first = values[0]
304 dvalues = OrderedDict((v,v) for v in values)
226 dvalues = OrderedDict((v,v) for v in values)
305 c = interactive(f, tup=tuple(values), lis=list(values))
227 c = interactive(f, tup=tuple(values), lis=list(values))
306 nt.assert_equal(len(c.children), 2)
228 nt.assert_equal(len(c.children), 2)
307 d = dict(
229 d = dict(
308 cls=widgets.DropdownWidget,
230 cls=widgets.DropdownWidget,
309 value=first,
231 value=first,
310 values=dvalues
232 values=dvalues
311 )
233 )
312 check_widgets(c, tup=d, lis=d)
234 check_widgets(c, tup=d, lis=d)
313
235
314 def test_list_tuple_invalid():
236 def test_list_tuple_invalid():
315 for bad in [
237 for bad in [
316 (),
238 (),
317 (5, 'hi'),
239 (5, 'hi'),
318 ('hi', 5),
240 ('hi', 5),
319 ({},),
241 ({},),
320 (None,),
242 (None,),
321 ]:
243 ]:
322 with nt.assert_raises(ValueError):
244 with nt.assert_raises(ValueError):
323 print(bad) # because there is no custom message in assert_raises
245 print(bad) # because there is no custom message in assert_raises
324 c = interactive(f, tup=bad)
246 c = interactive(f, tup=bad)
325
247
326 def test_defaults():
248 def test_defaults():
327 @annotate(n=10)
249 @annotate(n=10)
328 def f(n, f=4.5, g=1):
250 def f(n, f=4.5, g=1):
329 pass
251 pass
330
252
331 c = interactive(f)
253 c = interactive(f)
332 check_widgets(c,
254 check_widgets(c,
333 n=dict(
255 n=dict(
334 cls=widgets.IntSliderWidget,
256 cls=widgets.IntSliderWidget,
335 value=10,
257 value=10,
336 ),
258 ),
337 f=dict(
259 f=dict(
338 cls=widgets.FloatSliderWidget,
260 cls=widgets.FloatSliderWidget,
339 value=4.5,
261 value=4.5,
340 ),
262 ),
341 g=dict(
263 g=dict(
342 cls=widgets.IntSliderWidget,
264 cls=widgets.IntSliderWidget,
343 value=1,
265 value=1,
344 ),
266 ),
345 )
267 )
346
268
347 def test_default_values():
269 def test_default_values():
348 @annotate(n=10, f=(0, 10.), g=5, h={'a': 1, 'b': 2}, j=['hi', 'there'])
270 @annotate(n=10, f=(0, 10.), g=5, h={'a': 1, 'b': 2}, j=['hi', 'there'])
349 def f(n, f=4.5, g=1, h=2, j='there'):
271 def f(n, f=4.5, g=1, h=2, j='there'):
350 pass
272 pass
351
273
352 c = interactive(f)
274 c = interactive(f)
353 check_widgets(c,
275 check_widgets(c,
354 n=dict(
276 n=dict(
355 cls=widgets.IntSliderWidget,
277 cls=widgets.IntSliderWidget,
356 value=10,
278 value=10,
357 ),
279 ),
358 f=dict(
280 f=dict(
359 cls=widgets.FloatSliderWidget,
281 cls=widgets.FloatSliderWidget,
360 value=4.5,
282 value=4.5,
361 ),
283 ),
362 g=dict(
284 g=dict(
363 cls=widgets.IntSliderWidget,
285 cls=widgets.IntSliderWidget,
364 value=5,
286 value=5,
365 ),
287 ),
366 h=dict(
288 h=dict(
367 cls=widgets.DropdownWidget,
289 cls=widgets.DropdownWidget,
368 values={'a': 1, 'b': 2},
290 values={'a': 1, 'b': 2},
369 value=2
291 value=2
370 ),
292 ),
371 j=dict(
293 j=dict(
372 cls=widgets.DropdownWidget,
294 cls=widgets.DropdownWidget,
373 values={'hi':'hi', 'there':'there'},
295 values={'hi':'hi', 'there':'there'},
374 value='there'
296 value='there'
375 ),
297 ),
376 )
298 )
377
299
378 def test_default_out_of_bounds():
300 def test_default_out_of_bounds():
379 @annotate(f=(0, 10.), h={'a': 1}, j=['hi', 'there'])
301 @annotate(f=(0, 10.), h={'a': 1}, j=['hi', 'there'])
380 def f(f='hi', h=5, j='other'):
302 def f(f='hi', h=5, j='other'):
381 pass
303 pass
382
304
383 c = interactive(f)
305 c = interactive(f)
384 check_widgets(c,
306 check_widgets(c,
385 f=dict(
307 f=dict(
386 cls=widgets.FloatSliderWidget,
308 cls=widgets.FloatSliderWidget,
387 value=5.,
309 value=5.,
388 ),
310 ),
389 h=dict(
311 h=dict(
390 cls=widgets.DropdownWidget,
312 cls=widgets.DropdownWidget,
391 values={'a': 1},
313 values={'a': 1},
392 value=1,
314 value=1,
393 ),
315 ),
394 j=dict(
316 j=dict(
395 cls=widgets.DropdownWidget,
317 cls=widgets.DropdownWidget,
396 values={'hi':'hi', 'there':'there'},
318 values={'hi':'hi', 'there':'there'},
397 value='hi',
319 value='hi',
398 ),
320 ),
399 )
321 )
400
322
401 def test_annotations():
323 def test_annotations():
402 @annotate(n=10, f=widgets.FloatTextWidget())
324 @annotate(n=10, f=widgets.FloatTextWidget())
403 def f(n, f):
325 def f(n, f):
404 pass
326 pass
405
327
406 c = interactive(f)
328 c = interactive(f)
407 check_widgets(c,
329 check_widgets(c,
408 n=dict(
330 n=dict(
409 cls=widgets.IntSliderWidget,
331 cls=widgets.IntSliderWidget,
410 value=10,
332 value=10,
411 ),
333 ),
412 f=dict(
334 f=dict(
413 cls=widgets.FloatTextWidget,
335 cls=widgets.FloatTextWidget,
414 ),
336 ),
415 )
337 )
416
338
417 def test_priority():
339 def test_priority():
418 @annotate(annotate='annotate', kwarg='annotate')
340 @annotate(annotate='annotate', kwarg='annotate')
419 def f(kwarg='default', annotate='default', default='default'):
341 def f(kwarg='default', annotate='default', default='default'):
420 pass
342 pass
421
343
422 c = interactive(f, kwarg='kwarg')
344 c = interactive(f, kwarg='kwarg')
423 check_widgets(c,
345 check_widgets(c,
424 kwarg=dict(
346 kwarg=dict(
425 cls=widgets.TextWidget,
347 cls=widgets.TextWidget,
426 value='kwarg',
348 value='kwarg',
427 ),
349 ),
428 annotate=dict(
350 annotate=dict(
429 cls=widgets.TextWidget,
351 cls=widgets.TextWidget,
430 value='annotate',
352 value='annotate',
431 ),
353 ),
432 )
354 )
433
355
434 @nt.with_setup(clear_display)
356 @nt.with_setup(clear_display)
435 def test_decorator_kwarg():
357 def test_decorator_kwarg():
436 with tt.monkeypatch(interaction, 'display', record_display):
358 with tt.monkeypatch(interaction, 'display', record_display):
437 @interact(a=5)
359 @interact(a=5)
438 def foo(a):
360 def foo(a):
439 pass
361 pass
440 nt.assert_equal(len(displayed), 1)
362 nt.assert_equal(len(displayed), 1)
441 w = displayed[0].children[0]
363 w = displayed[0].children[0]
442 check_widget(w,
364 check_widget(w,
443 cls=widgets.IntSliderWidget,
365 cls=widgets.IntSliderWidget,
444 value=5,
366 value=5,
445 )
367 )
446
368
447 @nt.with_setup(clear_display)
369 @nt.with_setup(clear_display)
448 def test_decorator_no_call():
370 def test_decorator_no_call():
449 with tt.monkeypatch(interaction, 'display', record_display):
371 with tt.monkeypatch(interaction, 'display', record_display):
450 @interact
372 @interact
451 def foo(a='default'):
373 def foo(a='default'):
452 pass
374 pass
453 nt.assert_equal(len(displayed), 1)
375 nt.assert_equal(len(displayed), 1)
454 w = displayed[0].children[0]
376 w = displayed[0].children[0]
455 check_widget(w,
377 check_widget(w,
456 cls=widgets.TextWidget,
378 cls=widgets.TextWidget,
457 value='default',
379 value='default',
458 )
380 )
459
381
460 @nt.with_setup(clear_display)
382 @nt.with_setup(clear_display)
461 def test_call_interact():
383 def test_call_interact():
462 def foo(a='default'):
384 def foo(a='default'):
463 pass
385 pass
464 with tt.monkeypatch(interaction, 'display', record_display):
386 with tt.monkeypatch(interaction, 'display', record_display):
465 ifoo = interact(foo)
387 ifoo = interact(foo)
466 nt.assert_equal(len(displayed), 1)
388 nt.assert_equal(len(displayed), 1)
467 w = displayed[0].children[0]
389 w = displayed[0].children[0]
468 check_widget(w,
390 check_widget(w,
469 cls=widgets.TextWidget,
391 cls=widgets.TextWidget,
470 value='default',
392 value='default',
471 )
393 )
472
394
473 @nt.with_setup(clear_display)
395 @nt.with_setup(clear_display)
474 def test_call_interact_kwargs():
396 def test_call_interact_kwargs():
475 def foo(a='default'):
397 def foo(a='default'):
476 pass
398 pass
477 with tt.monkeypatch(interaction, 'display', record_display):
399 with tt.monkeypatch(interaction, 'display', record_display):
478 ifoo = interact(foo, a=10)
400 ifoo = interact(foo, a=10)
479 nt.assert_equal(len(displayed), 1)
401 nt.assert_equal(len(displayed), 1)
480 w = displayed[0].children[0]
402 w = displayed[0].children[0]
481 check_widget(w,
403 check_widget(w,
482 cls=widgets.IntSliderWidget,
404 cls=widgets.IntSliderWidget,
483 value=10,
405 value=10,
484 )
406 )
485
407
486 @nt.with_setup(clear_display)
408 @nt.with_setup(clear_display)
487 def test_call_decorated_on_trait_change():
409 def test_call_decorated_on_trait_change():
488 """test calling @interact decorated functions"""
410 """test calling @interact decorated functions"""
489 d = {}
411 d = {}
490 with tt.monkeypatch(interaction, 'display', record_display):
412 with tt.monkeypatch(interaction, 'display', record_display):
491 @interact
413 @interact
492 def foo(a='default'):
414 def foo(a='default'):
493 d['a'] = a
415 d['a'] = a
494 return a
416 return a
495 nt.assert_equal(len(displayed), 1)
417 nt.assert_equal(len(displayed), 1)
496 w = displayed[0].children[0]
418 w = displayed[0].children[0]
497 check_widget(w,
419 check_widget(w,
498 cls=widgets.TextWidget,
420 cls=widgets.TextWidget,
499 value='default',
421 value='default',
500 )
422 )
501 # test calling the function directly
423 # test calling the function directly
502 a = foo('hello')
424 a = foo('hello')
503 nt.assert_equal(a, 'hello')
425 nt.assert_equal(a, 'hello')
504 nt.assert_equal(d['a'], 'hello')
426 nt.assert_equal(d['a'], 'hello')
505
427
506 # test that setting trait values calls the function
428 # test that setting trait values calls the function
507 w.value = 'called'
429 w.value = 'called'
508 nt.assert_equal(d['a'], 'called')
430 nt.assert_equal(d['a'], 'called')
509
431
510 @nt.with_setup(clear_display)
432 @nt.with_setup(clear_display)
511 def test_call_decorated_kwargs_on_trait_change():
433 def test_call_decorated_kwargs_on_trait_change():
512 """test calling @interact(foo=bar) decorated functions"""
434 """test calling @interact(foo=bar) decorated functions"""
513 d = {}
435 d = {}
514 with tt.monkeypatch(interaction, 'display', record_display):
436 with tt.monkeypatch(interaction, 'display', record_display):
515 @interact(a='kwarg')
437 @interact(a='kwarg')
516 def foo(a='default'):
438 def foo(a='default'):
517 d['a'] = a
439 d['a'] = a
518 return a
440 return a
519 nt.assert_equal(len(displayed), 1)
441 nt.assert_equal(len(displayed), 1)
520 w = displayed[0].children[0]
442 w = displayed[0].children[0]
521 check_widget(w,
443 check_widget(w,
522 cls=widgets.TextWidget,
444 cls=widgets.TextWidget,
523 value='kwarg',
445 value='kwarg',
524 )
446 )
525 # test calling the function directly
447 # test calling the function directly
526 a = foo('hello')
448 a = foo('hello')
527 nt.assert_equal(a, 'hello')
449 nt.assert_equal(a, 'hello')
528 nt.assert_equal(d['a'], 'hello')
450 nt.assert_equal(d['a'], 'hello')
529
451
530 # test that setting trait values calls the function
452 # test that setting trait values calls the function
531 w.value = 'called'
453 w.value = 'called'
532 nt.assert_equal(d['a'], 'called')
454 nt.assert_equal(d['a'], 'called')
533
455
534 def test_fixed():
456 def test_fixed():
535 c = interactive(f, a=widgets.fixed(5), b='text')
457 c = interactive(f, a=widgets.fixed(5), b='text')
536 nt.assert_equal(len(c.children), 1)
458 nt.assert_equal(len(c.children), 1)
537 w = c.children[0]
459 w = c.children[0]
538 check_widget(w,
460 check_widget(w,
539 cls=widgets.TextWidget,
461 cls=widgets.TextWidget,
540 value='text',
462 value='text',
541 description='b',
463 description='b',
542 )
464 )
543
465
544 def test_default_description():
466 def test_default_description():
545 c = interactive(f, b='text')
467 c = interactive(f, b='text')
546 w = c.children[0]
468 w = c.children[0]
547 check_widget(w,
469 check_widget(w,
548 cls=widgets.TextWidget,
470 cls=widgets.TextWidget,
549 value='text',
471 value='text',
550 description='b',
472 description='b',
551 )
473 )
552
474
553 def test_custom_description():
475 def test_custom_description():
554 c = interactive(f, b=widgets.TextWidget(value='text', description='foo'))
476 c = interactive(f, b=widgets.TextWidget(value='text', description='foo'))
555 w = c.children[0]
477 w = c.children[0]
556 check_widget(w,
478 check_widget(w,
557 cls=widgets.TextWidget,
479 cls=widgets.TextWidget,
558 value='text',
480 value='text',
559 description='foo',
481 description='foo',
560 )
482 )
483
484 def test_int_range_logic():
485 irsw = widgets.IntRangeSliderWidget
486 w = irsw(value=(2, 4), min=0, max=6)
487 check_widget(w, cls=irsw, value=(2, 4), min=0, max=6)
488 w.value = (4, 2)
489 check_widget(w, cls=irsw, value=(2, 4), min=0, max=6)
490 w.min = 3
491 check_widget(w, cls=irsw, value=(3, 4), min=3, max=6)
492 w.max = 3
493 check_widget(w, cls=irsw, value=(3, 3), min=3, max=3)
494
495 def test_float_range_logic():
496 frsw = widgets.FloatRangeSliderWidget
497 w = frsw(value=(.2, .4), min=0., max=.6)
498 check_widget(w, cls=frsw, value=(.2, .4), min=0., max=.6)
499 w.value = (.4, .2)
500 check_widget(w, cls=frsw, value=(.2, .4), min=0., max=.6)
501 w.min = .3
502 check_widget(w, cls=frsw, value=(.3, .4), min=.3, max=.6)
503 w.max = .3
504 check_widget(w, cls=frsw, value=(.3, .3), min=.3, max=.3)
General Comments 0
You need to be logged in to leave comments. Login now