test_observables.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import asyncio
  2. import sys
  3. from nicegui import ui
  4. from nicegui.observables import make_observable
  5. from .screen import Screen
  6. count = 0
  7. def reset_counter():
  8. global count
  9. count = 0
  10. def increment_counter():
  11. global count
  12. count += 1
  13. async def increment_counter_slowly(_):
  14. global count
  15. await asyncio.sleep(0.1)
  16. count += 1
  17. def test_observable_dict():
  18. reset_counter()
  19. data = make_observable({}, increment_counter)
  20. data['a'] = 1
  21. assert count == 1
  22. del data['a']
  23. assert count == 2
  24. data.update({'b': 2, 'c': 3})
  25. assert count == 3
  26. data.pop('b')
  27. assert count == 4
  28. data.popitem()
  29. assert count == 5
  30. data.clear()
  31. assert count == 6
  32. data.setdefault('a', 1)
  33. assert count == 7
  34. if sys.version_info >= (3, 9):
  35. data |= {'b': 2}
  36. assert count == 8
  37. def test_observable_list():
  38. reset_counter()
  39. data = make_observable([], increment_counter)
  40. data.append(1)
  41. assert count == 1
  42. data.extend([2, 3, 4])
  43. assert count == 2
  44. data.insert(0, 0)
  45. assert count == 3
  46. data.remove(1)
  47. assert count == 4
  48. data.pop()
  49. assert count == 5
  50. data.sort()
  51. assert count == 6
  52. data.reverse()
  53. assert count == 7
  54. data[0] = 1
  55. assert count == 8
  56. data[0:2] = [1, 2, 3]
  57. assert count == 9
  58. del data[0]
  59. assert count == 10
  60. del data[0:1]
  61. assert count == 11
  62. data.clear()
  63. assert count == 12
  64. data += [1, 2, 3]
  65. assert count == 13
  66. def test_observable_set():
  67. reset_counter()
  68. data = make_observable({1, 2, 3, 4, 5}, increment_counter)
  69. data.add(1)
  70. assert count == 1
  71. data.remove(1)
  72. assert count == 2
  73. data.discard(2)
  74. assert count == 3
  75. data.pop()
  76. assert count == 4
  77. data.clear()
  78. assert count == 5
  79. data.update({1, 2, 3})
  80. assert count == 6
  81. data.intersection_update({1, 2})
  82. assert count == 7
  83. data.difference_update({1})
  84. assert count == 8
  85. data.symmetric_difference_update({1, 2})
  86. assert count == 9
  87. data |= {1, 2, 3}
  88. assert count == 10
  89. data &= {1, 2}
  90. assert count == 11
  91. data -= {1}
  92. assert count == 12
  93. data ^= {1, 2}
  94. assert count == 13
  95. def test_nested_observables():
  96. reset_counter()
  97. data = make_observable({
  98. 'a': 1,
  99. 'b': [1, 2, 3, {'x': 1, 'y': 2, 'z': 3}],
  100. 'c': {'x': 1, 'y': 2, 'z': 3, 't': [1, 2, 3]},
  101. 'd': {1, 2, 3},
  102. }, increment_counter)
  103. data['a'] = 42
  104. assert count == 1
  105. data['b'].append(4)
  106. assert count == 2
  107. data['b'][3].update(t=4)
  108. assert count == 3
  109. data['c']['x'] = 2
  110. assert count == 4
  111. data['c']['t'].append(4)
  112. assert count == 5
  113. data['d'].add(4)
  114. assert count == 6
  115. def test_async_handler(screen: Screen):
  116. reset_counter()
  117. data = make_observable([], increment_counter_slowly)
  118. ui.button('Append 42', on_click=lambda: data.append(42))
  119. screen.open('/')
  120. assert count == 0
  121. screen.click('Append 42')
  122. screen.wait(0.5)
  123. assert count == 1