1
0

test_number.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. import pytest
  2. from selenium.webdriver.common.by import By
  3. from nicegui import ui
  4. from nicegui.testing import Screen
  5. def test_number_input(screen: Screen):
  6. ui.number('Number')
  7. ui.button('Button')
  8. screen.open('/')
  9. element = screen.selenium.find_element(By.XPATH, '//*[@aria-label="Number"]')
  10. element.send_keys('42')
  11. screen.click('Button')
  12. screen.should_contain_input('42')
  13. def test_apply_format_on_blur(screen: Screen):
  14. ui.number('Number', format='%.4f', value=3.14159)
  15. ui.button('Button')
  16. screen.open('/')
  17. screen.should_contain_input('3.1416')
  18. element = screen.selenium.find_element(By.XPATH, '//*[@aria-label="Number"]')
  19. element.send_keys('789')
  20. screen.click('Button')
  21. screen.should_contain_input('3.1417')
  22. def test_max_value(screen: Screen):
  23. ui.number('Number', min=0, max=10, value=5)
  24. ui.button('Button')
  25. screen.open('/')
  26. screen.should_contain_input('5')
  27. element = screen.selenium.find_element(By.XPATH, '//*[@aria-label="Number"]')
  28. element.send_keys('6')
  29. screen.click('Button')
  30. screen.should_contain_input('10')
  31. def test_clearable_number(screen: Screen):
  32. number = ui.number(value=42).props('clearable')
  33. ui.label().bind_text_from(number, 'value', lambda value: f'value: {value}')
  34. screen.open('/')
  35. screen.should_contain('value: 42')
  36. screen.click('cancel')
  37. screen.should_contain('value: None')
  38. screen.click('value: None') # loose focus
  39. screen.wait(0.5)
  40. screen.should_contain('value: None')
  41. def test_out_of_limits(screen: Screen):
  42. number = ui.number('Number', min=0, max=10, value=5)
  43. ui.label().bind_text_from(number, 'out_of_limits', lambda value: f'out_of_limits: {value}')
  44. screen.open('/')
  45. screen.should_contain('out_of_limits: False')
  46. number.value = 11
  47. screen.should_contain('out_of_limits: True')
  48. number.max = 15
  49. screen.should_contain('out_of_limits: False')
  50. @pytest.mark.parametrize('precision', [None, 1, -1])
  51. def test_rounding(precision: int, screen: Screen):
  52. number = ui.number('Number', value=12, precision=precision)
  53. ui.label().bind_text_from(number, 'value', lambda value: f'number=_{value}_')
  54. screen.open('/')
  55. screen.should_contain('number=_12_')
  56. element = screen.selenium.find_element(By.XPATH, '//*[@aria-label="Number"]')
  57. element.send_keys('.345')
  58. screen.click('number=') # blur the number input
  59. if precision is None:
  60. screen.should_contain('number=_12.345_')
  61. elif precision == 1:
  62. screen.should_contain('number=_12.3_')
  63. elif precision == -1:
  64. screen.should_contain('number=_10.0_')