From cbed095f83b741d3ed8dd809031ed688bfe63ca0 Mon Sep 17 00:00:00 2001 From: Alexander Goscinski Date: Fri, 22 Dec 2023 17:28:22 +0100 Subject: [PATCH] CodeDemo saving and loading * saving and loading observe now paramaters * saving and loading reset each other by button click --- src/scwidgets/code/_widget_code_demo.py | 110 ++++++++++++++++-------- tests/notebooks/widget_answers.py | 12 ++- tests/test_widgets.py | 59 +++++++++++-- 3 files changed, 133 insertions(+), 48 deletions(-) diff --git a/src/scwidgets/code/_widget_code_demo.py b/src/scwidgets/code/_widget_code_demo.py index 6c7a78a..94bbfa6 100644 --- a/src/scwidgets/code/_widget_code_demo.py +++ b/src/scwidgets/code/_widget_code_demo.py @@ -159,46 +159,9 @@ def __init__( button_tooltip="Check the correctness of your code", ) - if self._answer_registry is None or ( - self._code is None and self._parameter_panel is None - ): - self._save_button = None - self._load_button = None - self._save_cue_box = None - else: - self._cue_code = SaveCueBox( - self._code, "function_body", self._cue_code, cued=True - ) - self._save_cue_box = self._cue_code - self._save_button = SaveResetCueButton( - self._cue_code, - self._on_click_save_action, - cued=True, - disable_on_successful_action=kwargs.pop( - "disable_save_button_on_successful_action", False - ), - disable_during_action=kwargs.pop( - "disable_save_button_during_action", True - ), - description="Save code", - button_tooltip="Loads your code and parameters from the loaded file", - ) - self._load_button = SaveResetCueButton( - self._cue_code, - self._on_click_load_action, - cued=True, - disable_on_successful_action=kwargs.pop( - "disable_load_button_on_successful_action", False - ), - disable_during_action=kwargs.pop( - "disable_load_button_during_action", True - ), - description="Load code", - button_tooltip="Saves your code and parameters to the loaded file", - ) - if self._parameter_panel is None: self._update_button = None + self._self._cue_parameter_panel = None else: # set up update button and cueing # ------------------------------- @@ -317,6 +280,77 @@ def __init__( button_tooltip=button_tooltip, ) + if self._answer_registry is None or ( + self._code is None and self._parameter_panel is None + ): + self._save_button = None + self._load_button = None + self._save_cue_box = None + else: + save_widgets_to_observe = [self._code] + save_traits_to_observe = ["function_body"] + if self._parameter_panel is not None: + save_widgets_to_observe.extend(self._parameter_panel.parameters_widget) + save_traits_to_observe.extend(self._parameter_panel.parameters_trait) + self._cue_code = SaveCueBox( + save_widgets_to_observe, + save_traits_to_observe, + self._cue_code, + cued=True, + ) + + self._save_cue_box = self._cue_code + self._save_button = SaveResetCueButton( + self._cue_code, + self._on_click_save_action, + cued=True, + disable_on_successful_action=kwargs.pop( + "disable_save_button_on_successful_action", False + ), + disable_during_action=kwargs.pop( + "disable_save_button_during_action", True + ), + description="Save code", + button_tooltip="Loads your code and parameters from the loaded file", + ) + self._load_button = SaveResetCueButton( + self._cue_code, + self._on_click_load_action, + cued=True, + disable_on_successful_action=kwargs.pop( + "disable_load_button_on_successful_action", False + ), + disable_during_action=kwargs.pop( + "disable_load_button_during_action", True + ), + description="Load code", + button_tooltip="Saves your code and parameters to the loaded file", + ) + + # click on load button resets cue of save buton and vise-versa + self._save_button.set_cue_widgets( + [ + widget + for widget in [ + self._cue_code, + self._cue_parameter_panel, + self._load_button, + ] + if widget is not None + ] + ) + self._load_button.set_cue_widgets( + [ + widget + for widget in [ + self._cue_code, + self._cue_parameter_panel, + self._save_button, + ] + if widget is not None + ] + ) + demo_children = [] if self._code is not None: demo_children.append(self._cue_code) diff --git a/tests/notebooks/widget_answers.py b/tests/notebooks/widget_answers.py index ead514d..23ff6b5 100644 --- a/tests/notebooks/widget_answers.py +++ b/tests/notebooks/widget_answers.py @@ -50,10 +50,16 @@ # + -def foo(): - return +def foo(x): + return x -code_demo = CodeDemo(foo, answer_registry=answer_registry, answer_key="exercise_2") +code_demo = CodeDemo( + foo, + parameters={"x": (0, 2, 1)}, + update_mode="manual", + answer_registry=answer_registry, + answer_key="exercise_2", +) code_demo # - diff --git a/tests/test_widgets.py b/tests/test_widgets.py index 977f4d6..2983c8a 100644 --- a/tests/test_widgets.py +++ b/tests/test_widgets.py @@ -294,12 +294,18 @@ def test_widget_answer(self, selenium_driver): expected_conditions.element_to_be_clickable(save_button) ).click() # wait for uncued box - nb_cell.find_element(By.CLASS_NAME, cue_box_class_name("save", False)) + cue_box = nb_cell.find_element(By.CLASS_NAME, cue_box_class_name("save", False)) + assert "--cued" not in cue_box.get_attribute("class") # check if there are two buttons are uncued reset_cue_buttons = nb_cell.find_elements( By.CLASS_NAME, reset_cue_button_class_name("save", False) ) - assert len(reset_cue_buttons) == 2 + assert all( + [ + "--cued" not in button.get_attribute("class") + for button in reset_cue_buttons + ] + ) assert text_input.get_attribute("value") == input_answer output = nb_cell.find_element(By.CLASS_NAME, OUTPUT_CLASS_NAME) assert ( @@ -325,11 +331,18 @@ def test_widget_answer(self, selenium_driver): expected_conditions.element_to_be_clickable(load_button) ).click() # wait for uncued box - nb_cell.find_element(By.CLASS_NAME, cue_box_class_name("save", False)) + cue_box = nb_cell.find_element(By.CLASS_NAME, cue_box_class_name("save", False)) + assert "--cued" not in cue_box.get_attribute("class") # check if there are two buttons are uncued reset_cue_buttons = nb_cell.find_elements( By.CLASS_NAME, reset_cue_button_class_name("save", False) ) + assert all( + [ + "--cued" not in button.get_attribute("class") + for button in reset_cue_buttons + ] + ) # test if last test has been loaded WebDriverWait(driver, 5).until( expected_conditions.invisibility_of_element_located(output) @@ -356,10 +369,6 @@ def test_widget_answer(self, selenium_driver): assert answer_buttons[1].text == "Load code" load_button = answer_buttons[1] - reset_cue_buttons = nb_cell.find_elements( - By.CLASS_NAME, reset_cue_button_class_name("save", False) - ) - assert len(reset_cue_buttons) == 2 WebDriverWait(driver, 1).until( expected_conditions.element_to_be_clickable(save_button) ).click() @@ -368,7 +377,30 @@ def test_widget_answer(self, selenium_driver): assert ( output.text == "Answer has been saved in file 'pytest-test-answers.json'." ) + # not cued + cue_box = nb_cell.find_element(By.CLASS_NAME, cue_box_class_name("save", False)) + assert "--cued" not in cue_box.get_attribute("class") + reset_cue_buttons = nb_cell.find_elements( + By.CLASS_NAME, reset_cue_button_class_name("save", False) + ) + assert all( + [ + "--cued" not in button.get_attribute("class") + for button in reset_cue_buttons + ] + ) + slider_input_box = nb_cell.find_element(By.CLASS_NAME, "widget-readout") + slider_input_box.send_keys(Keys.BACKSPACE) + slider_input_box.send_keys(Keys.BACKSPACE) + slider_input_box.send_keys(0) + slider_input_box.send_keys(Keys.ENTER) + time.sleep(0.2) + + reset_cue_buttons = nb_cell.find_elements( + By.CLASS_NAME, reset_cue_button_class_name("save", True) + ) + assert len(reset_cue_buttons) == 2 WebDriverWait(driver, 1).until( expected_conditions.element_to_be_clickable(load_button) ).click() @@ -380,6 +412,19 @@ def test_widget_answer(self, selenium_driver): output.text == "Answer has been loaded from file 'pytest-test-answers.json'." ) + # not cued + cue_box = nb_cell.find_element(By.CLASS_NAME, cue_box_class_name("save", False)) + assert "--cued" not in cue_box.get_attribute("class") + reset_cue_buttons = nb_cell.find_elements( + By.CLASS_NAME, reset_cue_button_class_name("save", False) + ) + assert all( + [ + "--cued" not in button.get_attribute("class") + for button in reset_cue_buttons + ] + ) + # Issue #22 # Please add tests using send_keys works once it works with code input