mirror of https://github.com/chriskiehl/Gooey.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
189 lines
7.1 KiB
189 lines
7.1 KiB
import unittest
|
|
|
|
from gooey import GooeyParser
|
|
from gooey.tests import *
|
|
from tests.harness import instrumentGooey
|
|
|
|
|
|
class TestRadioGroupBehavior(unittest.TestCase):
|
|
|
|
|
|
def mutext_group(self, options):
|
|
"""
|
|
Basic radio group consisting of two options.
|
|
"""
|
|
parser = GooeyParser()
|
|
group = parser.add_mutually_exclusive_group(**options)
|
|
group.add_argument("-b", type=str)
|
|
group.add_argument("-d", type=str, widget="DateChooser")
|
|
return parser
|
|
|
|
|
|
def test_initial_selection_options(self):
|
|
"""
|
|
Ensure that the initial_selection GooeyOption behaves as expected.
|
|
"""
|
|
# each pair in the below datastructure represents input/output
|
|
# First position: kwargs which will be supplied to the parser
|
|
# Second position: expected indices which buttons/widgets should be enabled/disabled
|
|
testCases = [
|
|
[{'required': True, 'gooey_options': {}},
|
|
{'selected': None, 'enabled': [], 'disabled': [0, 1]}],
|
|
|
|
# Issue #517 - initial section with required=True was not enabling
|
|
# the inner widget
|
|
[{'required': True, 'gooey_options': {"initial_selection": 0}},
|
|
{'selected': 0, 'enabled': [0], 'disabled': [1]}],
|
|
|
|
[{'required': True, 'gooey_options': {"initial_selection": 1}},
|
|
{'selected': 1, 'enabled': [1], 'disabled': [0]}],
|
|
|
|
[{'required': False, 'gooey_options': {}},
|
|
{'selected': None, 'enabled': [], 'disabled': [0, 1]}],
|
|
|
|
[{'required': False, 'gooey_options': {"initial_selection": 0}},
|
|
{'selected': 0, 'enabled': [0], 'disabled': [1]}],
|
|
|
|
[{'required': False, 'gooey_options': {"initial_selection": 1}},
|
|
{'selected': 1, 'enabled': [1], 'disabled': [0]}],
|
|
]
|
|
for options, expected in testCases:
|
|
parser = self.mutext_group(options)
|
|
with self.subTest(options):
|
|
with instrumentGooey(parser) as (app, gooeyApp):
|
|
radioGroup = gooeyApp.configs[0].reifiedWidgets[0]
|
|
|
|
# verify that the checkboxes themselves are correct
|
|
if expected['selected'] is not None:
|
|
self.assertEqual(
|
|
radioGroup.selected,
|
|
radioGroup.radioButtons[expected['selected']])
|
|
else:
|
|
self.assertEqual(radioGroup.selected, None)
|
|
|
|
# verify the widgets contained in the radio group
|
|
# are in the correct state
|
|
for enabled in expected['enabled']:
|
|
# The widget contained within the group should be enabled
|
|
self.assertTrue(radioGroup.widgets[enabled].IsEnabled())
|
|
|
|
# make sure all widgets other than the selected
|
|
# are disabled
|
|
for enabled in expected['disabled']:
|
|
self.assertFalse(radioGroup.widgets[enabled].IsEnabled())
|
|
|
|
|
|
def test_optional_radiogroup_click_behavior(self):
|
|
"""
|
|
Testing that select/deselect behaves as expected
|
|
"""
|
|
testcases = [
|
|
self.click_scenarios_optional_widget(),
|
|
self.click_scenarios_required_widget(),
|
|
self.click_scenarios_initial_selection()
|
|
]
|
|
|
|
for testcase in testcases:
|
|
with self.subTest(testcase['name']):
|
|
# wire up the parse with our test case options
|
|
parser = self.mutext_group(testcase['input'])
|
|
|
|
with instrumentGooey(parser) as (app, gooeyApp):
|
|
radioGroup = gooeyApp.configs[0].reifiedWidgets[0]
|
|
|
|
for scenario in testcase['scenario']:
|
|
targetButton = scenario['clickButton']
|
|
|
|
event = wx.CommandEvent(wx.wxEVT_LEFT_DOWN, wx.Window.NewControlId())
|
|
event.SetEventObject(radioGroup.radioButtons[targetButton])
|
|
|
|
radioGroup.radioButtons[targetButton].ProcessEvent(event)
|
|
|
|
expectedEnabled, expectedDisabled = scenario['postState']
|
|
|
|
for index in expectedEnabled:
|
|
self.assertEqual(radioGroup.selected, radioGroup.radioButtons[index])
|
|
self.assertTrue(radioGroup.widgets[index].IsEnabled())
|
|
|
|
for index in expectedDisabled:
|
|
self.assertNotEqual(radioGroup.selected, radioGroup.radioButtons[index])
|
|
self.assertFalse(radioGroup.widgets[index].IsEnabled())
|
|
|
|
|
|
def click_scenarios_optional_widget(self):
|
|
return {
|
|
'name': 'click_scenarios_optional_widget',
|
|
'input': {'required': False},
|
|
'scenario': [
|
|
# clicking enabled the button
|
|
{'clickButton': 0,
|
|
'postState': [[0], [1]]},
|
|
|
|
# clicking again disables the button (*when not required*)
|
|
{'clickButton': 0,
|
|
'postState': [[], [0, 1]]},
|
|
|
|
# clicking group 2 enabled it
|
|
{'clickButton': 1,
|
|
'postState': [[1], [0]]},
|
|
|
|
# and similarly clicking group 2 again disables it
|
|
{'clickButton': 1,
|
|
'postState': [[], [0, 1]]},
|
|
|
|
# enable second group
|
|
{'clickButton': 1,
|
|
'postState': [[1], [0]]},
|
|
|
|
# can switch to group one
|
|
{'clickButton': 0,
|
|
'postState': [[0], [1]]},
|
|
]
|
|
}
|
|
|
|
def click_scenarios_required_widget(self):
|
|
return {
|
|
'name': 'click_scenarios_required_widget',
|
|
'input': {'required': True},
|
|
'scenario': [
|
|
# clicking enables the button
|
|
{'clickButton': 0,
|
|
'postState': [[0], [1]]},
|
|
|
|
# unlike the the optional case, this
|
|
# has no effect. You cannot _not_ select something
|
|
# when it is required.
|
|
{'clickButton': 0,
|
|
'postState': [[0], [1]]},
|
|
|
|
# we can select a different button
|
|
{'clickButton': 1,
|
|
'postState': [[1], [0]]},
|
|
|
|
# again, if we click it again, we cannot deselect it
|
|
{'clickButton': 1,
|
|
'postState': [[1], [0]]},
|
|
|
|
# we can click back to the other group
|
|
{'clickButton': 0,
|
|
'postState': [[0], [1]]},
|
|
]}
|
|
|
|
def click_scenarios_initial_selection(self):
|
|
return {
|
|
'name': 'click_scenarios_initial_selection',
|
|
'input': {'required': False, 'gooey_options': {'initial_selection': 0}},
|
|
'scenario': [
|
|
# we start already selected via GooeyOptions. As such,
|
|
# clicking on the radiobutton should deselect it
|
|
{'clickButton': 0,
|
|
'postState': [[], [0, 1]]},
|
|
# clicking again reselected it
|
|
{'clickButton': 0,
|
|
'postState': [[0], [1]]},
|
|
]}
|
|
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|