test_attribute_descriptor.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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