##// END OF EJS Templates
test positional args in HasTraits
MinRK -
Show More
@@ -1,920 +1,932 b''
1 1 # encoding: utf-8
2 2 """
3 3 Tests for IPython.utils.traitlets.
4 4
5 5 Authors:
6 6
7 7 * Brian Granger
8 8 * Enthought, Inc. Some of the code in this file comes from enthought.traits
9 9 and is licensed under the BSD license. Also, many of the ideas also come
10 10 from enthought.traits even though our implementation is very different.
11 11 """
12 12
13 13 #-----------------------------------------------------------------------------
14 14 # Copyright (C) 2008-2011 The IPython Development Team
15 15 #
16 16 # Distributed under the terms of the BSD License. The full license is in
17 17 # the file COPYING, distributed as part of this software.
18 18 #-----------------------------------------------------------------------------
19 19
20 20 #-----------------------------------------------------------------------------
21 21 # Imports
22 22 #-----------------------------------------------------------------------------
23 23
24 24 import re
25 25 import sys
26 26 from unittest import TestCase
27 27
28 28 import nose.tools as nt
29 29 from nose import SkipTest
30 30
31 31 from IPython.utils.traitlets import (
32 32 HasTraits, MetaHasTraits, TraitType, Any, CBytes, Dict,
33 33 Int, Long, Integer, Float, Complex, Bytes, Unicode, TraitError,
34 34 Undefined, Type, This, Instance, TCPAddress, List, Tuple,
35 35 ObjectName, DottedObjectName, CRegExp
36 36 )
37 37 from IPython.utils import py3compat
38 38 from IPython.testing.decorators import skipif
39 39
40 40 #-----------------------------------------------------------------------------
41 41 # Helper classes for testing
42 42 #-----------------------------------------------------------------------------
43 43
44 44
45 45 class HasTraitsStub(HasTraits):
46 46
47 47 def _notify_trait(self, name, old, new):
48 48 self._notify_name = name
49 49 self._notify_old = old
50 50 self._notify_new = new
51 51
52 52
53 53 #-----------------------------------------------------------------------------
54 54 # Test classes
55 55 #-----------------------------------------------------------------------------
56 56
57 57
58 58 class TestTraitType(TestCase):
59 59
60 60 def test_get_undefined(self):
61 61 class A(HasTraits):
62 62 a = TraitType
63 63 a = A()
64 64 self.assertEqual(a.a, Undefined)
65 65
66 66 def test_set(self):
67 67 class A(HasTraitsStub):
68 68 a = TraitType
69 69
70 70 a = A()
71 71 a.a = 10
72 72 self.assertEqual(a.a, 10)
73 73 self.assertEqual(a._notify_name, 'a')
74 74 self.assertEqual(a._notify_old, Undefined)
75 75 self.assertEqual(a._notify_new, 10)
76 76
77 77 def test_validate(self):
78 78 class MyTT(TraitType):
79 79 def validate(self, inst, value):
80 80 return -1
81 81 class A(HasTraitsStub):
82 82 tt = MyTT
83 83
84 84 a = A()
85 85 a.tt = 10
86 86 self.assertEqual(a.tt, -1)
87 87
88 88 def test_default_validate(self):
89 89 class MyIntTT(TraitType):
90 90 def validate(self, obj, value):
91 91 if isinstance(value, int):
92 92 return value
93 93 self.error(obj, value)
94 94 class A(HasTraits):
95 95 tt = MyIntTT(10)
96 96 a = A()
97 97 self.assertEqual(a.tt, 10)
98 98
99 99 # Defaults are validated when the HasTraits is instantiated
100 100 class B(HasTraits):
101 101 tt = MyIntTT('bad default')
102 102 self.assertRaises(TraitError, B)
103 103
104 104 def test_is_valid_for(self):
105 105 class MyTT(TraitType):
106 106 def is_valid_for(self, value):
107 107 return True
108 108 class A(HasTraits):
109 109 tt = MyTT
110 110
111 111 a = A()
112 112 a.tt = 10
113 113 self.assertEqual(a.tt, 10)
114 114
115 115 def test_value_for(self):
116 116 class MyTT(TraitType):
117 117 def value_for(self, value):
118 118 return 20
119 119 class A(HasTraits):
120 120 tt = MyTT
121 121
122 122 a = A()
123 123 a.tt = 10
124 124 self.assertEqual(a.tt, 20)
125 125
126 126 def test_info(self):
127 127 class A(HasTraits):
128 128 tt = TraitType
129 129 a = A()
130 130 self.assertEqual(A.tt.info(), 'any value')
131 131
132 132 def test_error(self):
133 133 class A(HasTraits):
134 134 tt = TraitType
135 135 a = A()
136 136 self.assertRaises(TraitError, A.tt.error, a, 10)
137 137
138 138 def test_dynamic_initializer(self):
139 139 class A(HasTraits):
140 140 x = Int(10)
141 141 def _x_default(self):
142 142 return 11
143 143 class B(A):
144 144 x = Int(20)
145 145 class C(A):
146 146 def _x_default(self):
147 147 return 21
148 148
149 149 a = A()
150 150 self.assertEqual(a._trait_values, {})
151 151 self.assertEqual(a._trait_dyn_inits.keys(), ['x'])
152 152 self.assertEqual(a.x, 11)
153 153 self.assertEqual(a._trait_values, {'x': 11})
154 154 b = B()
155 155 self.assertEqual(b._trait_values, {'x': 20})
156 156 self.assertEqual(a._trait_dyn_inits.keys(), ['x'])
157 157 self.assertEqual(b.x, 20)
158 158 c = C()
159 159 self.assertEqual(c._trait_values, {})
160 160 self.assertEqual(a._trait_dyn_inits.keys(), ['x'])
161 161 self.assertEqual(c.x, 21)
162 162 self.assertEqual(c._trait_values, {'x': 21})
163 163 # Ensure that the base class remains unmolested when the _default
164 164 # initializer gets overridden in a subclass.
165 165 a = A()
166 166 c = C()
167 167 self.assertEqual(a._trait_values, {})
168 168 self.assertEqual(a._trait_dyn_inits.keys(), ['x'])
169 169 self.assertEqual(a.x, 11)
170 170 self.assertEqual(a._trait_values, {'x': 11})
171 171
172 172
173 173
174 174 class TestHasTraitsMeta(TestCase):
175 175
176 176 def test_metaclass(self):
177 177 self.assertEqual(type(HasTraits), MetaHasTraits)
178 178
179 179 class A(HasTraits):
180 180 a = Int
181 181
182 182 a = A()
183 183 self.assertEqual(type(a.__class__), MetaHasTraits)
184 184 self.assertEqual(a.a,0)
185 185 a.a = 10
186 186 self.assertEqual(a.a,10)
187 187
188 188 class B(HasTraits):
189 189 b = Int()
190 190
191 191 b = B()
192 192 self.assertEqual(b.b,0)
193 193 b.b = 10
194 194 self.assertEqual(b.b,10)
195 195
196 196 class C(HasTraits):
197 197 c = Int(30)
198 198
199 199 c = C()
200 200 self.assertEqual(c.c,30)
201 201 c.c = 10
202 202 self.assertEqual(c.c,10)
203 203
204 204 def test_this_class(self):
205 205 class A(HasTraits):
206 206 t = This()
207 207 tt = This()
208 208 class B(A):
209 209 tt = This()
210 210 ttt = This()
211 211 self.assertEqual(A.t.this_class, A)
212 212 self.assertEqual(B.t.this_class, A)
213 213 self.assertEqual(B.tt.this_class, B)
214 214 self.assertEqual(B.ttt.this_class, B)
215 215
216 216 class TestHasTraitsNotify(TestCase):
217 217
218 218 def setUp(self):
219 219 self._notify1 = []
220 220 self._notify2 = []
221 221
222 222 def notify1(self, name, old, new):
223 223 self._notify1.append((name, old, new))
224 224
225 225 def notify2(self, name, old, new):
226 226 self._notify2.append((name, old, new))
227 227
228 228 def test_notify_all(self):
229 229
230 230 class A(HasTraits):
231 231 a = Int
232 232 b = Float
233 233
234 234 a = A()
235 235 a.on_trait_change(self.notify1)
236 236 a.a = 0
237 237 self.assertEqual(len(self._notify1),0)
238 238 a.b = 0.0
239 239 self.assertEqual(len(self._notify1),0)
240 240 a.a = 10
241 241 self.assertTrue(('a',0,10) in self._notify1)
242 242 a.b = 10.0
243 243 self.assertTrue(('b',0.0,10.0) in self._notify1)
244 244 self.assertRaises(TraitError,setattr,a,'a','bad string')
245 245 self.assertRaises(TraitError,setattr,a,'b','bad string')
246 246 self._notify1 = []
247 247 a.on_trait_change(self.notify1,remove=True)
248 248 a.a = 20
249 249 a.b = 20.0
250 250 self.assertEqual(len(self._notify1),0)
251 251
252 252 def test_notify_one(self):
253 253
254 254 class A(HasTraits):
255 255 a = Int
256 256 b = Float
257 257
258 258 a = A()
259 259 a.on_trait_change(self.notify1, 'a')
260 260 a.a = 0
261 261 self.assertEqual(len(self._notify1),0)
262 262 a.a = 10
263 263 self.assertTrue(('a',0,10) in self._notify1)
264 264 self.assertRaises(TraitError,setattr,a,'a','bad string')
265 265
266 266 def test_subclass(self):
267 267
268 268 class A(HasTraits):
269 269 a = Int
270 270
271 271 class B(A):
272 272 b = Float
273 273
274 274 b = B()
275 275 self.assertEqual(b.a,0)
276 276 self.assertEqual(b.b,0.0)
277 277 b.a = 100
278 278 b.b = 100.0
279 279 self.assertEqual(b.a,100)
280 280 self.assertEqual(b.b,100.0)
281 281
282 282 def test_notify_subclass(self):
283 283
284 284 class A(HasTraits):
285 285 a = Int
286 286
287 287 class B(A):
288 288 b = Float
289 289
290 290 b = B()
291 291 b.on_trait_change(self.notify1, 'a')
292 292 b.on_trait_change(self.notify2, 'b')
293 293 b.a = 0
294 294 b.b = 0.0
295 295 self.assertEqual(len(self._notify1),0)
296 296 self.assertEqual(len(self._notify2),0)
297 297 b.a = 10
298 298 b.b = 10.0
299 299 self.assertTrue(('a',0,10) in self._notify1)
300 300 self.assertTrue(('b',0.0,10.0) in self._notify2)
301 301
302 302 def test_static_notify(self):
303 303
304 304 class A(HasTraits):
305 305 a = Int
306 306 _notify1 = []
307 307 def _a_changed(self, name, old, new):
308 308 self._notify1.append((name, old, new))
309 309
310 310 a = A()
311 311 a.a = 0
312 312 # This is broken!!!
313 313 self.assertEqual(len(a._notify1),0)
314 314 a.a = 10
315 315 self.assertTrue(('a',0,10) in a._notify1)
316 316
317 317 class B(A):
318 318 b = Float
319 319 _notify2 = []
320 320 def _b_changed(self, name, old, new):
321 321 self._notify2.append((name, old, new))
322 322
323 323 b = B()
324 324 b.a = 10
325 325 b.b = 10.0
326 326 self.assertTrue(('a',0,10) in b._notify1)
327 327 self.assertTrue(('b',0.0,10.0) in b._notify2)
328 328
329 329 def test_notify_args(self):
330 330
331 331 def callback0():
332 332 self.cb = ()
333 333 def callback1(name):
334 334 self.cb = (name,)
335 335 def callback2(name, new):
336 336 self.cb = (name, new)
337 337 def callback3(name, old, new):
338 338 self.cb = (name, old, new)
339 339
340 340 class A(HasTraits):
341 341 a = Int
342 342
343 343 a = A()
344 344 a.on_trait_change(callback0, 'a')
345 345 a.a = 10
346 346 self.assertEqual(self.cb,())
347 347 a.on_trait_change(callback0, 'a', remove=True)
348 348
349 349 a.on_trait_change(callback1, 'a')
350 350 a.a = 100
351 351 self.assertEqual(self.cb,('a',))
352 352 a.on_trait_change(callback1, 'a', remove=True)
353 353
354 354 a.on_trait_change(callback2, 'a')
355 355 a.a = 1000
356 356 self.assertEqual(self.cb,('a',1000))
357 357 a.on_trait_change(callback2, 'a', remove=True)
358 358
359 359 a.on_trait_change(callback3, 'a')
360 360 a.a = 10000
361 361 self.assertEqual(self.cb,('a',1000,10000))
362 362 a.on_trait_change(callback3, 'a', remove=True)
363 363
364 364 self.assertEqual(len(a._trait_notifiers['a']),0)
365 365
366 366
367 367 class TestHasTraits(TestCase):
368 368
369 369 def test_trait_names(self):
370 370 class A(HasTraits):
371 371 i = Int
372 372 f = Float
373 373 a = A()
374 374 self.assertEqual(sorted(a.trait_names()),['f','i'])
375 375 self.assertEqual(sorted(A.class_trait_names()),['f','i'])
376 376
377 377 def test_trait_metadata(self):
378 378 class A(HasTraits):
379 379 i = Int(config_key='MY_VALUE')
380 380 a = A()
381 381 self.assertEqual(a.trait_metadata('i','config_key'), 'MY_VALUE')
382 382
383 383 def test_traits(self):
384 384 class A(HasTraits):
385 385 i = Int
386 386 f = Float
387 387 a = A()
388 388 self.assertEqual(a.traits(), dict(i=A.i, f=A.f))
389 389 self.assertEqual(A.class_traits(), dict(i=A.i, f=A.f))
390 390
391 391 def test_traits_metadata(self):
392 392 class A(HasTraits):
393 393 i = Int(config_key='VALUE1', other_thing='VALUE2')
394 394 f = Float(config_key='VALUE3', other_thing='VALUE2')
395 395 j = Int(0)
396 396 a = A()
397 397 self.assertEqual(a.traits(), dict(i=A.i, f=A.f, j=A.j))
398 398 traits = a.traits(config_key='VALUE1', other_thing='VALUE2')
399 399 self.assertEqual(traits, dict(i=A.i))
400 400
401 401 # This passes, but it shouldn't because I am replicating a bug in
402 402 # traits.
403 403 traits = a.traits(config_key=lambda v: True)
404 404 self.assertEqual(traits, dict(i=A.i, f=A.f, j=A.j))
405 405
406 406 def test_init(self):
407 407 class A(HasTraits):
408 408 i = Int()
409 409 x = Float()
410 410 a = A(i=1, x=10.0)
411 411 self.assertEqual(a.i, 1)
412 412 self.assertEqual(a.x, 10.0)
413 413
414 def test_positional_args(self):
415 class A(HasTraits):
416 i = Int(0)
417 def __init__(self, i):
418 super(A, self).__init__()
419 self.i = i
420
421 a = A(5)
422 self.assertEqual(a.i, 5)
423 # should raise TypeError if no positional arg given
424 self.assertRaises(TypeError, A)
425
414 426 #-----------------------------------------------------------------------------
415 427 # Tests for specific trait types
416 428 #-----------------------------------------------------------------------------
417 429
418 430
419 431 class TestType(TestCase):
420 432
421 433 def test_default(self):
422 434
423 435 class B(object): pass
424 436 class A(HasTraits):
425 437 klass = Type
426 438
427 439 a = A()
428 440 self.assertEqual(a.klass, None)
429 441
430 442 a.klass = B
431 443 self.assertEqual(a.klass, B)
432 444 self.assertRaises(TraitError, setattr, a, 'klass', 10)
433 445
434 446 def test_value(self):
435 447
436 448 class B(object): pass
437 449 class C(object): pass
438 450 class A(HasTraits):
439 451 klass = Type(B)
440 452
441 453 a = A()
442 454 self.assertEqual(a.klass, B)
443 455 self.assertRaises(TraitError, setattr, a, 'klass', C)
444 456 self.assertRaises(TraitError, setattr, a, 'klass', object)
445 457 a.klass = B
446 458
447 459 def test_allow_none(self):
448 460
449 461 class B(object): pass
450 462 class C(B): pass
451 463 class A(HasTraits):
452 464 klass = Type(B, allow_none=False)
453 465
454 466 a = A()
455 467 self.assertEqual(a.klass, B)
456 468 self.assertRaises(TraitError, setattr, a, 'klass', None)
457 469 a.klass = C
458 470 self.assertEqual(a.klass, C)
459 471
460 472 def test_validate_klass(self):
461 473
462 474 class A(HasTraits):
463 475 klass = Type('no strings allowed')
464 476
465 477 self.assertRaises(ImportError, A)
466 478
467 479 class A(HasTraits):
468 480 klass = Type('rub.adub.Duck')
469 481
470 482 self.assertRaises(ImportError, A)
471 483
472 484 def test_validate_default(self):
473 485
474 486 class B(object): pass
475 487 class A(HasTraits):
476 488 klass = Type('bad default', B)
477 489
478 490 self.assertRaises(ImportError, A)
479 491
480 492 class C(HasTraits):
481 493 klass = Type(None, B, allow_none=False)
482 494
483 495 self.assertRaises(TraitError, C)
484 496
485 497 def test_str_klass(self):
486 498
487 499 class A(HasTraits):
488 500 klass = Type('IPython.utils.ipstruct.Struct')
489 501
490 502 from IPython.utils.ipstruct import Struct
491 503 a = A()
492 504 a.klass = Struct
493 505 self.assertEqual(a.klass, Struct)
494 506
495 507 self.assertRaises(TraitError, setattr, a, 'klass', 10)
496 508
497 509 class TestInstance(TestCase):
498 510
499 511 def test_basic(self):
500 512 class Foo(object): pass
501 513 class Bar(Foo): pass
502 514 class Bah(object): pass
503 515
504 516 class A(HasTraits):
505 517 inst = Instance(Foo)
506 518
507 519 a = A()
508 520 self.assertTrue(a.inst is None)
509 521 a.inst = Foo()
510 522 self.assertTrue(isinstance(a.inst, Foo))
511 523 a.inst = Bar()
512 524 self.assertTrue(isinstance(a.inst, Foo))
513 525 self.assertRaises(TraitError, setattr, a, 'inst', Foo)
514 526 self.assertRaises(TraitError, setattr, a, 'inst', Bar)
515 527 self.assertRaises(TraitError, setattr, a, 'inst', Bah())
516 528
517 529 def test_unique_default_value(self):
518 530 class Foo(object): pass
519 531 class A(HasTraits):
520 532 inst = Instance(Foo,(),{})
521 533
522 534 a = A()
523 535 b = A()
524 536 self.assertTrue(a.inst is not b.inst)
525 537
526 538 def test_args_kw(self):
527 539 class Foo(object):
528 540 def __init__(self, c): self.c = c
529 541 class Bar(object): pass
530 542 class Bah(object):
531 543 def __init__(self, c, d):
532 544 self.c = c; self.d = d
533 545
534 546 class A(HasTraits):
535 547 inst = Instance(Foo, (10,))
536 548 a = A()
537 549 self.assertEqual(a.inst.c, 10)
538 550
539 551 class B(HasTraits):
540 552 inst = Instance(Bah, args=(10,), kw=dict(d=20))
541 553 b = B()
542 554 self.assertEqual(b.inst.c, 10)
543 555 self.assertEqual(b.inst.d, 20)
544 556
545 557 class C(HasTraits):
546 558 inst = Instance(Foo)
547 559 c = C()
548 560 self.assertTrue(c.inst is None)
549 561
550 562 def test_bad_default(self):
551 563 class Foo(object): pass
552 564
553 565 class A(HasTraits):
554 566 inst = Instance(Foo, allow_none=False)
555 567
556 568 self.assertRaises(TraitError, A)
557 569
558 570 def test_instance(self):
559 571 class Foo(object): pass
560 572
561 573 def inner():
562 574 class A(HasTraits):
563 575 inst = Instance(Foo())
564 576
565 577 self.assertRaises(TraitError, inner)
566 578
567 579
568 580 class TestThis(TestCase):
569 581
570 582 def test_this_class(self):
571 583 class Foo(HasTraits):
572 584 this = This
573 585
574 586 f = Foo()
575 587 self.assertEqual(f.this, None)
576 588 g = Foo()
577 589 f.this = g
578 590 self.assertEqual(f.this, g)
579 591 self.assertRaises(TraitError, setattr, f, 'this', 10)
580 592
581 593 def test_this_inst(self):
582 594 class Foo(HasTraits):
583 595 this = This()
584 596
585 597 f = Foo()
586 598 f.this = Foo()
587 599 self.assertTrue(isinstance(f.this, Foo))
588 600
589 601 def test_subclass(self):
590 602 class Foo(HasTraits):
591 603 t = This()
592 604 class Bar(Foo):
593 605 pass
594 606 f = Foo()
595 607 b = Bar()
596 608 f.t = b
597 609 b.t = f
598 610 self.assertEqual(f.t, b)
599 611 self.assertEqual(b.t, f)
600 612
601 613 def test_subclass_override(self):
602 614 class Foo(HasTraits):
603 615 t = This()
604 616 class Bar(Foo):
605 617 t = This()
606 618 f = Foo()
607 619 b = Bar()
608 620 f.t = b
609 621 self.assertEqual(f.t, b)
610 622 self.assertRaises(TraitError, setattr, b, 't', f)
611 623
612 624 class TraitTestBase(TestCase):
613 625 """A best testing class for basic trait types."""
614 626
615 627 def assign(self, value):
616 628 self.obj.value = value
617 629
618 630 def coerce(self, value):
619 631 return value
620 632
621 633 def test_good_values(self):
622 634 if hasattr(self, '_good_values'):
623 635 for value in self._good_values:
624 636 self.assign(value)
625 637 self.assertEqual(self.obj.value, self.coerce(value))
626 638
627 639 def test_bad_values(self):
628 640 if hasattr(self, '_bad_values'):
629 641 for value in self._bad_values:
630 642 try:
631 643 self.assertRaises(TraitError, self.assign, value)
632 644 except AssertionError:
633 645 assert False, value
634 646
635 647 def test_default_value(self):
636 648 if hasattr(self, '_default_value'):
637 649 self.assertEqual(self._default_value, self.obj.value)
638 650
639 651 def tearDown(self):
640 652 # restore default value after tests, if set
641 653 if hasattr(self, '_default_value'):
642 654 self.obj.value = self._default_value
643 655
644 656
645 657 class AnyTrait(HasTraits):
646 658
647 659 value = Any
648 660
649 661 class AnyTraitTest(TraitTestBase):
650 662
651 663 obj = AnyTrait()
652 664
653 665 _default_value = None
654 666 _good_values = [10.0, 'ten', u'ten', [10], {'ten': 10},(10,), None, 1j]
655 667 _bad_values = []
656 668
657 669
658 670 class IntTrait(HasTraits):
659 671
660 672 value = Int(99)
661 673
662 674 class TestInt(TraitTestBase):
663 675
664 676 obj = IntTrait()
665 677 _default_value = 99
666 678 _good_values = [10, -10]
667 679 _bad_values = ['ten', u'ten', [10], {'ten': 10},(10,), None, 1j,
668 680 10.1, -10.1, '10L', '-10L', '10.1', '-10.1', u'10L',
669 681 u'-10L', u'10.1', u'-10.1', '10', '-10', u'10', u'-10']
670 682 if not py3compat.PY3:
671 683 _bad_values.extend([10L, -10L, 10*sys.maxint, -10*sys.maxint])
672 684
673 685
674 686 class LongTrait(HasTraits):
675 687
676 688 value = Long(99L)
677 689
678 690 class TestLong(TraitTestBase):
679 691
680 692 obj = LongTrait()
681 693
682 694 _default_value = 99L
683 695 _good_values = [10, -10, 10L, -10L]
684 696 _bad_values = ['ten', u'ten', [10], [10l], {'ten': 10},(10,),(10L,),
685 697 None, 1j, 10.1, -10.1, '10', '-10', '10L', '-10L', '10.1',
686 698 '-10.1', u'10', u'-10', u'10L', u'-10L', u'10.1',
687 699 u'-10.1']
688 700 if not py3compat.PY3:
689 701 # maxint undefined on py3, because int == long
690 702 _good_values.extend([10*sys.maxint, -10*sys.maxint])
691 703
692 704 @skipif(py3compat.PY3, "not relevant on py3")
693 705 def test_cast_small(self):
694 706 """Long casts ints to long"""
695 707 self.obj.value = 10
696 708 self.assertEqual(type(self.obj.value), long)
697 709
698 710
699 711 class IntegerTrait(HasTraits):
700 712 value = Integer(1)
701 713
702 714 class TestInteger(TestLong):
703 715 obj = IntegerTrait()
704 716 _default_value = 1
705 717
706 718 def coerce(self, n):
707 719 return int(n)
708 720
709 721 @skipif(py3compat.PY3, "not relevant on py3")
710 722 def test_cast_small(self):
711 723 """Integer casts small longs to int"""
712 724 if py3compat.PY3:
713 725 raise SkipTest("not relevant on py3")
714 726
715 727 self.obj.value = 100L
716 728 self.assertEqual(type(self.obj.value), int)
717 729
718 730
719 731 class FloatTrait(HasTraits):
720 732
721 733 value = Float(99.0)
722 734
723 735 class TestFloat(TraitTestBase):
724 736
725 737 obj = FloatTrait()
726 738
727 739 _default_value = 99.0
728 740 _good_values = [10, -10, 10.1, -10.1]
729 741 _bad_values = ['ten', u'ten', [10], {'ten': 10},(10,), None,
730 742 1j, '10', '-10', '10L', '-10L', '10.1', '-10.1', u'10',
731 743 u'-10', u'10L', u'-10L', u'10.1', u'-10.1']
732 744 if not py3compat.PY3:
733 745 _bad_values.extend([10L, -10L])
734 746
735 747
736 748 class ComplexTrait(HasTraits):
737 749
738 750 value = Complex(99.0-99.0j)
739 751
740 752 class TestComplex(TraitTestBase):
741 753
742 754 obj = ComplexTrait()
743 755
744 756 _default_value = 99.0-99.0j
745 757 _good_values = [10, -10, 10.1, -10.1, 10j, 10+10j, 10-10j,
746 758 10.1j, 10.1+10.1j, 10.1-10.1j]
747 759 _bad_values = [u'10L', u'-10L', 'ten', [10], {'ten': 10},(10,), None]
748 760 if not py3compat.PY3:
749 761 _bad_values.extend([10L, -10L])
750 762
751 763
752 764 class BytesTrait(HasTraits):
753 765
754 766 value = Bytes(b'string')
755 767
756 768 class TestBytes(TraitTestBase):
757 769
758 770 obj = BytesTrait()
759 771
760 772 _default_value = b'string'
761 773 _good_values = [b'10', b'-10', b'10L',
762 774 b'-10L', b'10.1', b'-10.1', b'string']
763 775 _bad_values = [10, -10, 10L, -10L, 10.1, -10.1, 1j, [10],
764 776 ['ten'],{'ten': 10},(10,), None, u'string']
765 777
766 778
767 779 class UnicodeTrait(HasTraits):
768 780
769 781 value = Unicode(u'unicode')
770 782
771 783 class TestUnicode(TraitTestBase):
772 784
773 785 obj = UnicodeTrait()
774 786
775 787 _default_value = u'unicode'
776 788 _good_values = ['10', '-10', '10L', '-10L', '10.1',
777 789 '-10.1', '', u'', 'string', u'string', u"€"]
778 790 _bad_values = [10, -10, 10L, -10L, 10.1, -10.1, 1j,
779 791 [10], ['ten'], [u'ten'], {'ten': 10},(10,), None]
780 792
781 793
782 794 class ObjectNameTrait(HasTraits):
783 795 value = ObjectName("abc")
784 796
785 797 class TestObjectName(TraitTestBase):
786 798 obj = ObjectNameTrait()
787 799
788 800 _default_value = "abc"
789 801 _good_values = ["a", "gh", "g9", "g_", "_G", u"a345_"]
790 802 _bad_values = [1, "", u"€", "9g", "!", "#abc", "aj@", "a.b", "a()", "a[0]",
791 803 object(), object]
792 804 if sys.version_info[0] < 3:
793 805 _bad_values.append(u"ΓΎ")
794 806 else:
795 807 _good_values.append(u"ΓΎ") # ΓΎ=1 is valid in Python 3 (PEP 3131).
796 808
797 809
798 810 class DottedObjectNameTrait(HasTraits):
799 811 value = DottedObjectName("a.b")
800 812
801 813 class TestDottedObjectName(TraitTestBase):
802 814 obj = DottedObjectNameTrait()
803 815
804 816 _default_value = "a.b"
805 817 _good_values = ["A", "y.t", "y765.__repr__", "os.path.join", u"os.path.join"]
806 818 _bad_values = [1, u"abc.€", "_.@", ".", ".abc", "abc.", ".abc."]
807 819 if sys.version_info[0] < 3:
808 820 _bad_values.append(u"t.ΓΎ")
809 821 else:
810 822 _good_values.append(u"t.ΓΎ")
811 823
812 824
813 825 class TCPAddressTrait(HasTraits):
814 826
815 827 value = TCPAddress()
816 828
817 829 class TestTCPAddress(TraitTestBase):
818 830
819 831 obj = TCPAddressTrait()
820 832
821 833 _default_value = ('127.0.0.1',0)
822 834 _good_values = [('localhost',0),('192.168.0.1',1000),('www.google.com',80)]
823 835 _bad_values = [(0,0),('localhost',10.0),('localhost',-1)]
824 836
825 837 class ListTrait(HasTraits):
826 838
827 839 value = List(Int)
828 840
829 841 class TestList(TraitTestBase):
830 842
831 843 obj = ListTrait()
832 844
833 845 _default_value = []
834 846 _good_values = [[], [1], range(10)]
835 847 _bad_values = [10, [1,'a'], 'a', (1,2)]
836 848
837 849 class LenListTrait(HasTraits):
838 850
839 851 value = List(Int, [0], minlen=1, maxlen=2)
840 852
841 853 class TestLenList(TraitTestBase):
842 854
843 855 obj = LenListTrait()
844 856
845 857 _default_value = [0]
846 858 _good_values = [[1], range(2)]
847 859 _bad_values = [10, [1,'a'], 'a', (1,2), [], range(3)]
848 860
849 861 class TupleTrait(HasTraits):
850 862
851 863 value = Tuple(Int)
852 864
853 865 class TestTupleTrait(TraitTestBase):
854 866
855 867 obj = TupleTrait()
856 868
857 869 _default_value = None
858 870 _good_values = [(1,), None,(0,)]
859 871 _bad_values = [10, (1,2), [1],('a'), ()]
860 872
861 873 def test_invalid_args(self):
862 874 self.assertRaises(TypeError, Tuple, 5)
863 875 self.assertRaises(TypeError, Tuple, default_value='hello')
864 876 t = Tuple(Int, CBytes, default_value=(1,5))
865 877
866 878 class LooseTupleTrait(HasTraits):
867 879
868 880 value = Tuple((1,2,3))
869 881
870 882 class TestLooseTupleTrait(TraitTestBase):
871 883
872 884 obj = LooseTupleTrait()
873 885
874 886 _default_value = (1,2,3)
875 887 _good_values = [(1,), None, (0,), tuple(range(5)), tuple('hello'), ('a',5), ()]
876 888 _bad_values = [10, 'hello', [1], []]
877 889
878 890 def test_invalid_args(self):
879 891 self.assertRaises(TypeError, Tuple, 5)
880 892 self.assertRaises(TypeError, Tuple, default_value='hello')
881 893 t = Tuple(Int, CBytes, default_value=(1,5))
882 894
883 895
884 896 class MultiTupleTrait(HasTraits):
885 897
886 898 value = Tuple(Int, Bytes, default_value=[99,b'bottles'])
887 899
888 900 class TestMultiTuple(TraitTestBase):
889 901
890 902 obj = MultiTupleTrait()
891 903
892 904 _default_value = (99,b'bottles')
893 905 _good_values = [(1,b'a'), (2,b'b')]
894 906 _bad_values = ((),10, b'a', (1,b'a',3), (b'a',1), (1, u'a'))
895 907
896 908 class CRegExpTrait(HasTraits):
897 909
898 910 value = CRegExp(r'')
899 911
900 912 class TestCRegExp(TraitTestBase):
901 913
902 914 def coerce(self, value):
903 915 return re.compile(value)
904 916
905 917 obj = CRegExpTrait()
906 918
907 919 _default_value = re.compile(r'')
908 920 _good_values = [r'\d+', re.compile(r'\d+')]
909 921 _bad_values = [r'(', None, ()]
910 922
911 923 class DictTrait(HasTraits):
912 924 value = Dict()
913 925
914 926 def test_dict_assignment():
915 927 d = dict()
916 928 c = DictTrait()
917 929 c.value = d
918 930 d['a'] = 5
919 931 nt.assert_equal(d, c.value)
920 932 nt.assert_true(c.value is d)
General Comments 0
You need to be logged in to leave comments. Login now