1
0

test_observables.py 3.6 KB

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