test_observables.py 3.3 KB

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