Skip to content

Commit

Permalink
CodeDemo saving and loading
Browse files Browse the repository at this point in the history
* saving and loading observe now paramaters
* saving and loading reset each other by button click
  • Loading branch information
agoscinski committed Dec 22, 2023
1 parent d361980 commit cbed095
Show file tree
Hide file tree
Showing 3 changed files with 133 additions and 48 deletions.
110 changes: 72 additions & 38 deletions src/scwidgets/code/_widget_code_demo.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
# -------------------------------
Expand Down Expand Up @@ -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)
Expand Down
12 changes: 9 additions & 3 deletions tests/notebooks/widget_answers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
# -
59 changes: 52 additions & 7 deletions tests/test_widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -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 (
Expand All @@ -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)
Expand All @@ -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()
Expand All @@ -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()
Expand All @@ -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

Expand Down

0 comments on commit cbed095

Please sign in to comment.