code: def test_server_on_change_round_trip(
      self, bokeh_server_page: BokehServerPage
  ) -> None:
      spinner = Spinner(
          low=-1, high=10, step=0.1, value=4, format="0[.]0"
      )
      page = bokeh_server_page(mk_modify_doc(spinner))
  
      input_el = find_element_for(page.driver, spinner, "input")
  
      # same value
      enter_text_in_element(page.driver, input_el, "4", click=2)
      page.eval_custom_action()
      results = page.results
      assert results["data"]["val"] == ["a", "b"]
  
      # new valid value
      enter_text_in_element(page.driver, input_el, "5", click=2)
      page.eval_custom_action()
      results = page.results
      assert results["data"]["val"] == [4, 5]
  
      # new overflow value
      enter_text_in_element(page.driver, input_el, "11", click=2)
      page.eval_custom_action()
      results = page.results
      assert results["data"]["val"] == [5, 10]
  
      # new underflow value
      enter_text_in_element(page.driver, input_el, "-2", click=2)
      page.eval_custom_action()
      results = page.results
      assert results["data"]["val"] == [10, -1]
  
      # new decimal value
      input_el.clear()  # negative previous values needs a triple click to be selected
      enter_text_in_element(page.driver, input_el, "5.1")
      page.eval_custom_action()
      results = page.results
      assert results["data"]["val"] == [None, 5.1]
  
      # new decimal value test rounding
      enter_text_in_element(page.driver, input_el, "5.19", click=2)
      page.eval_custom_action()
      results = page.results
      assert results["data"]["val"] == [5.1, 5.19]
      assert input_el.get_attribute("value") == "5.2"
  
file_path: bokeh/tests/integration/widgets/test_spinner.py
imports: from __future__ import annotations
  import pytest
  from bokeh.layouts import column
  from bokeh.models import Circle, ColumnDataSource, CustomJS, Plot, Range1d, Spinner
  from tests.support.plugins.project import BokehModelPage, BokehServerPage
  from tests.support.util.selenium import RECORD, ActionChains, Keys, enter_text_in_element, find_element_for
label_desc: Use image node_id 6 for calling the Test_Spinner obj's underlying member method code with example usage: obj.test_server_on_change_round_trip(bokeh_server_page) without return types