test_number.py 3.3 KB

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