test_attribute_descriptor.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # -*- coding: utf-8 -*-
  2. import pytest
  3. from ioex.classex import AttributeDescriptor
  4. class Foo(object):
  5. desc = AttributeDescriptor('attr')
  6. def __init__(self, default):
  7. self.attr = default
  8. def test_set_get_attribute():
  9. obj = Foo(1)
  10. assert 1 == obj.attr
  11. assert 1 == obj.desc
  12. obj.attr = 2
  13. assert 2 == obj.attr
  14. assert 2 == obj.desc
  15. obj.desc = 3
  16. assert 3 == obj.attr
  17. assert 3 == obj.desc
  18. def test_multiple_instances():
  19. a = Foo('a')
  20. b = Foo('b')
  21. assert 'a' == a.desc
  22. assert 'b' == b.desc
  23. a.desc = a.desc.upper()
  24. b.desc = b.desc.upper()
  25. assert 'A' == a.desc
  26. assert 'B' == b.desc
  27. class Bar(object):
  28. a = AttributeDescriptor('_a')
  29. A = AttributeDescriptor('_a')
  30. b = AttributeDescriptor('_b')
  31. def test_multiple_attributes():
  32. obj = Bar()
  33. obj._a = 'a'
  34. obj._b = 'b'
  35. assert 'a' == obj.a
  36. assert 'a' == obj.A
  37. assert 'b' == obj.b
  38. obj.A = 'A'
  39. obj.b = 'B'
  40. assert 'A' == obj.a
  41. assert 'A' == obj.A
  42. assert 'B' == obj.b
  43. class IntAttr(AttributeDescriptor):
  44. def __set__(self, instance, value):
  45. if not isinstance(value, int):
  46. raise TypeError()
  47. else:
  48. super(IntAttr, self).__set__(instance, value)
  49. class Qux(object):
  50. desc = IntAttr('attr')
  51. def test_subclass():
  52. obj = Qux()
  53. obj.attr = 'first'
  54. assert 'first' == obj.attr
  55. assert 'first' == obj.desc
  56. obj.desc = 42
  57. assert 42 == obj.attr
  58. assert 42 == obj.desc
  59. with pytest.raises(TypeError):
  60. obj.desc = 3.14
  61. class Xyzzy(object):
  62. desc = AttributeDescriptor('attr', types=(int, float))
  63. def test_types():
  64. obj = Xyzzy()
  65. obj.desc = 1
  66. assert 1 == obj.attr
  67. assert isinstance(obj.desc, int) and 1 == obj.desc
  68. obj.desc = 1.23
  69. assert isinstance(obj.desc, float) and 1.23 == obj.desc
  70. with pytest.raises(TypeError):
  71. obj.desc = '123'
  72. assert isinstance(obj.desc, float) and 1.23 == obj.desc
  73. class MinFilter(object):
  74. desc = AttributeDescriptor('attr', types=(int,), min=2)
  75. def test_min():
  76. obj = MinFilter()
  77. obj.desc = 2
  78. assert 2 == obj.attr
  79. obj.attr = 1
  80. assert 1 == obj.desc
  81. with pytest.raises(ValueError):
  82. obj.desc = 0