summaryrefslogtreecommitdiff
path: root/addons/gut/gui/gut_config_gui.gd
diff options
context:
space:
mode:
Diffstat (limited to 'addons/gut/gui/gut_config_gui.gd')
-rw-r--r--addons/gut/gui/gut_config_gui.gd408
1 files changed, 408 insertions, 0 deletions
diff --git a/addons/gut/gui/gut_config_gui.gd b/addons/gut/gui/gut_config_gui.gd
new file mode 100644
index 0000000..dc58be4
--- /dev/null
+++ b/addons/gut/gui/gut_config_gui.gd
@@ -0,0 +1,408 @@
+# ------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
+class DirectoryCtrl:
+ extends HBoxContainer
+
+ var text = '' setget set_text, get_text
+ var _txt_path = LineEdit.new()
+ var _btn_dir = Button.new()
+ var _dialog = FileDialog.new()
+
+ func _init():
+ _btn_dir.text = '...'
+ _btn_dir.connect('pressed', self, '_on_dir_button_pressed')
+
+ _txt_path.size_flags_horizontal = _txt_path.SIZE_EXPAND_FILL
+
+ _dialog.mode = _dialog.MODE_OPEN_DIR
+ _dialog.resizable = true
+ _dialog.connect("dir_selected", self, '_on_selected')
+ _dialog.connect("file_selected", self, '_on_selected')
+ _dialog.rect_size = Vector2(1000, 700)
+
+ func _on_selected(path):
+ set_text(path)
+
+
+ func _on_dir_button_pressed():
+ _dialog.current_dir = _txt_path.text
+ _dialog.popup_centered()
+
+
+ func _ready():
+ add_child(_txt_path)
+ add_child(_btn_dir)
+ add_child(_dialog)
+
+ func get_text():
+ return _txt_path.text
+
+ func set_text(t):
+ text = t
+ _txt_path.text = text
+
+ func get_line_edit():
+ return _txt_path
+
+# ------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
+class FileCtrl:
+ extends DirectoryCtrl
+
+ func _init():
+ _dialog.mode = _dialog.MODE_OPEN_FILE
+
+# ------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
+class Vector2Ctrl:
+ extends VBoxContainer
+
+ var value = Vector2(-1, -1) setget set_value, get_value
+ var disabled = false setget set_disabled, get_disabled
+ var x_spin = SpinBox.new()
+ var y_spin = SpinBox.new()
+
+ func _init():
+ add_child(_make_one('x: ', x_spin))
+ add_child(_make_one('y: ', y_spin))
+
+ func _make_one(txt, spinner):
+ var hbox = HBoxContainer.new()
+ var lbl = Label.new()
+ lbl.text = txt
+ hbox.add_child(lbl)
+ hbox.add_child(spinner)
+ spinner.min_value = -1
+ spinner.max_value = 10000
+ spinner.size_flags_horizontal = spinner.SIZE_EXPAND_FILL
+ return hbox
+
+ func set_value(v):
+ if(v != null):
+ x_spin.value = v[0]
+ y_spin.value = v[1]
+
+ # Returns array instead of vector2 b/c that is what is stored in
+ # in the dictionary and what is expected everywhere else.
+ func get_value():
+ return [x_spin.value, y_spin.value]
+
+ func set_disabled(should):
+ get_parent().visible = !should
+ x_spin.visible = !should
+ y_spin.visible = !should
+
+ func get_disabled():
+ pass
+
+
+
+# ------------------------------------------------------------------------------
+# ------------------------------------------------------------------------------
+var _base_container = null
+var _base_control = null
+const DIRS_TO_LIST = 6
+var _cfg_ctrls = {}
+var _avail_fonts = ['AnonymousPro', 'CourierPrime', 'LobsterTwo', 'Default']
+
+
+func _init(cont):
+ _base_container = cont
+
+ _base_control = HBoxContainer.new()
+ _base_control.size_flags_horizontal = _base_control.SIZE_EXPAND_FILL
+ _base_control.mouse_filter = _base_control.MOUSE_FILTER_PASS
+
+ # I don't remember what this is all about at all. Could be
+ # garbage. Decided to spend more time typing this message
+ # than figuring it out.
+ var lbl = Label.new()
+ lbl.size_flags_horizontal = lbl.SIZE_EXPAND_FILL
+ lbl.mouse_filter = lbl.MOUSE_FILTER_STOP
+ _base_control.add_child(lbl)
+
+
+# ------------------
+# Private
+# ------------------
+func _new_row(key, disp_text, value_ctrl, hint):
+ var ctrl = _base_control.duplicate()
+ var lbl = ctrl.get_node("Label")
+
+ lbl.hint_tooltip = hint
+ lbl.text = disp_text
+ _base_container.add_child(ctrl)
+
+ _cfg_ctrls[key] = value_ctrl
+ ctrl.add_child(value_ctrl)
+
+ var rpad = CenterContainer.new()
+ rpad.rect_min_size.x = 5
+ ctrl.add_child(rpad)
+
+ return ctrl
+
+
+func _add_title(text):
+ var row = _base_control.duplicate()
+ var lbl = row.get_node('Label')
+
+ lbl.text = text
+ lbl.align = Label.ALIGN_CENTER
+ _base_container.add_child(row)
+
+ row.connect('draw', self, '_on_title_cell_draw', [row])
+
+
+func _add_number(key, value, disp_text, v_min, v_max, hint=''):
+ var value_ctrl = SpinBox.new()
+ value_ctrl.value = value
+ value_ctrl.size_flags_horizontal = value_ctrl.SIZE_EXPAND_FILL
+ value_ctrl.min_value = v_min
+ value_ctrl.max_value = v_max
+ _wire_select_on_focus(value_ctrl.get_line_edit())
+
+ _new_row(key, disp_text, value_ctrl, hint)
+
+
+func _add_select(key, value, values, disp_text, hint=''):
+ var value_ctrl = OptionButton.new()
+ var select_idx = 0
+ for i in range(values.size()):
+ value_ctrl.add_item(values[i])
+ if(value == values[i]):
+ select_idx = i
+ value_ctrl.selected = select_idx
+ value_ctrl.size_flags_horizontal = value_ctrl.SIZE_EXPAND_FILL
+
+ _new_row(key, disp_text, value_ctrl, hint)
+
+
+func _add_value(key, value, disp_text, hint=''):
+ var value_ctrl = LineEdit.new()
+ value_ctrl.size_flags_horizontal = value_ctrl.SIZE_EXPAND_FILL
+ value_ctrl.text = value
+ _wire_select_on_focus(value_ctrl)
+
+ _new_row(key, disp_text, value_ctrl, hint)
+
+
+func _add_boolean(key, value, disp_text, hint=''):
+ var value_ctrl = CheckBox.new()
+ value_ctrl.pressed = value
+
+ _new_row(key, disp_text, value_ctrl, hint)
+
+
+func _add_directory(key, value, disp_text, hint=''):
+ var value_ctrl = DirectoryCtrl.new()
+ value_ctrl.size_flags_horizontal = value_ctrl.SIZE_EXPAND_FILL
+ value_ctrl.text = value
+ _wire_select_on_focus(value_ctrl.get_line_edit())
+
+ _new_row(key, disp_text, value_ctrl, hint)
+
+
+func _add_file(key, value, disp_text, hint=''):
+ var value_ctrl = FileCtrl.new()
+ value_ctrl.size_flags_horizontal = value_ctrl.SIZE_EXPAND_FILL
+ value_ctrl.text = value
+ _wire_select_on_focus(value_ctrl.get_line_edit())
+
+ _new_row(key, disp_text, value_ctrl, hint)
+
+
+func _add_color(key, value, disp_text, hint=''):
+ var value_ctrl = ColorPickerButton.new()
+ value_ctrl.size_flags_horizontal = value_ctrl.SIZE_EXPAND_FILL
+ value_ctrl.color = value
+
+ _new_row(key, disp_text, value_ctrl, hint)
+
+
+func _add_vector2(key, value, disp_text, hint=''):
+ var value_ctrl = Vector2Ctrl.new()
+ value_ctrl.size_flags_horizontal = value_ctrl.SIZE_EXPAND_FILL
+ value_ctrl.value = value
+ _wire_select_on_focus(value_ctrl.x_spin.get_line_edit())
+ _wire_select_on_focus(value_ctrl.y_spin.get_line_edit())
+
+ _new_row(key, disp_text, value_ctrl, hint)
+# -----------------------------
+
+
+# ------------------
+# Events
+# ------------------
+func _wire_select_on_focus(which):
+ which.connect('focus_entered', self, '_on_ctrl_focus_highlight', [which])
+ which.connect('focus_exited', self, '_on_ctrl_focus_unhighlight', [which])
+
+
+func _on_ctrl_focus_highlight(which):
+ if(which.has_method('select_all')):
+ which.call_deferred('select_all')
+
+
+func _on_ctrl_focus_unhighlight(which):
+ if(which.has_method('select')):
+ which.select(0, 0)
+
+
+func _on_title_cell_draw(which):
+ which.draw_rect(Rect2(Vector2(0, 0), which.rect_size), Color(0, 0, 0, .15))
+
+
+# ------------------
+# Public
+# ------------------
+func get_config_issues():
+ var to_return = []
+ var has_directory = false
+ var dir = Directory.new()
+
+ for i in range(DIRS_TO_LIST):
+ var key = str('directory_', i)
+ var path = _cfg_ctrls[key].text
+ if(path != null and path != ''):
+ has_directory = true
+ if(!dir.dir_exists(path)):
+ to_return.append(str('Test directory ', path, ' does not exist.'))
+
+ if(!has_directory):
+ to_return.append('You do not have any directories set.')
+
+ if(_cfg_ctrls['prefix'].text == ''):
+ to_return.append("You must set a Script prefix or GUT won't find any scripts")
+
+ return to_return
+
+
+func set_options(options):
+ _add_title("Settings")
+ _add_number("log_level", options.log_level, "Log Level", 0, 3,
+ "Detail level for log messages.\n" + \
+ "\t0: Errors and failures only.\n" + \
+ "\t1: Adds all test names + warnings + info\n" + \
+ "\t2: Shows all asserts\n" + \
+ "\t3: Adds more stuff probably, maybe not.")
+ _add_boolean('ignore_pause', options.ignore_pause, 'Ignore Pause',
+ "Ignore calls to pause_before_teardown")
+ _add_boolean('hide_orphans', options.hide_orphans, 'Hide Orphans',
+ 'Do not display orphan counts in output.')
+ _add_boolean('should_exit', options.should_exit, 'Exit on Finish',
+ "Exit when tests finished.")
+ _add_boolean('should_exit_on_success', options.should_exit_on_success, 'Exit on Success',
+ "Exit if there are no failures. Does nothing if 'Exit on Finish' is enabled.")
+
+
+ _add_title("Panel Output")
+ _add_select('output_font_name', options.panel_options.font_name, _avail_fonts, 'Font',
+ "The name of the font to use when running tests and in the output panel to the left.")
+ _add_number('output_font_size', options.panel_options.font_size, 'Font Size', 5, 100,
+ "The font size to use when running tests and in the output panel to the left.")
+
+
+ _add_title('Runner Window')
+ _add_boolean("gut_on_top", options.gut_on_top, "On Top",
+ "The GUT Runner appears above children added during tests.")
+ _add_number('opacity', options.opacity, 'Opacity', 0, 100,
+ "The opacity of GUT when tests are running.")
+ _add_boolean('should_maximize', options.should_maximize, 'Maximize',
+ "Maximize GUT when tests are being run.")
+ _add_boolean('compact_mode', options.compact_mode, 'Compact Mode',
+ 'The runner will be in compact mode. This overrides Maximize.')
+
+ _add_title('Runner Appearance')
+ _add_select('font_name', options.font_name, _avail_fonts, 'Font',
+ "The font to use for text output in the Gut Runner.")
+ _add_number('font_size', options.font_size, 'Font Size', 5, 100,
+ "The font size for text output in the Gut Runner.")
+ _add_color('font_color', options.font_color, 'Font Color',
+ "The font color for text output in the Gut Runner.")
+ _add_color('background_color', options.background_color, 'Background Color',
+ "The background color for text output in the Gut Runner.")
+ _add_boolean('disable_colors', options.disable_colors, 'Disable Formatting',
+ 'Disable formatting and colors used in the Runner. Does not affect panel output.')
+
+ _add_title('Test Directories')
+ _add_boolean('include_subdirs', options.include_subdirs, 'Include Subdirs',
+ "Include subdirectories of the directories configured below.")
+ for i in range(DIRS_TO_LIST):
+ var value = ''
+ if(options.dirs.size() > i):
+ value = options.dirs[i]
+
+ _add_directory(str('directory_', i), value, str('Directory ', i))
+
+ _add_title("XML Output")
+ _add_value("junit_xml_file", options.junit_xml_file, "Output Path",
+ "Path and filename where GUT should create a JUnit compliant XML file. " +
+ "This file will contain the results of the last test run. To avoid " +
+ "overriding the file use Include Timestamp.")
+ _add_boolean("junit_xml_timestamp", options.junit_xml_timestamp, "Include Timestamp",
+ "Include a timestamp in the filename so that each run gets its own xml file.")
+
+
+ _add_title('Hooks')
+ _add_file('pre_run_script', options.pre_run_script, 'Pre-Run Hook',
+ 'This script will be run by GUT before any tests are run.')
+ _add_file('post_run_script', options.post_run_script, 'Post-Run Hook',
+ 'This script will be run by GUT after all tests are run.')
+
+
+ _add_title('Misc')
+ _add_value('prefix', options.prefix, 'Script Prefix',
+ "The filename prefix for all test scripts.")
+
+
+func get_options(base_opts):
+ var to_return = base_opts.duplicate()
+
+ # Settings
+ to_return.log_level = _cfg_ctrls.log_level.value
+ to_return.ignore_pause = _cfg_ctrls.ignore_pause.pressed
+ to_return.hide_orphans = _cfg_ctrls.hide_orphans.pressed
+ to_return.should_exit = _cfg_ctrls.should_exit.pressed
+ to_return.should_exit_on_success = _cfg_ctrls.should_exit_on_success.pressed
+
+ #Output
+ to_return.panel_options.font_name = _cfg_ctrls.output_font_name.get_item_text(
+ _cfg_ctrls.output_font_name.selected)
+ to_return.panel_options.font_size = _cfg_ctrls.output_font_size.value
+
+ # Runner Appearance
+ to_return.font_name = _cfg_ctrls.font_name.get_item_text(
+ _cfg_ctrls.font_name.selected)
+ to_return.font_size = _cfg_ctrls.font_size.value
+ to_return.should_maximize = _cfg_ctrls.should_maximize.pressed
+ to_return.compact_mode = _cfg_ctrls.compact_mode.pressed
+ to_return.opacity = _cfg_ctrls.opacity.value
+ to_return.background_color = _cfg_ctrls.background_color.color.to_html()
+ to_return.font_color = _cfg_ctrls.font_color.color.to_html()
+ to_return.disable_colors = _cfg_ctrls.disable_colors.pressed
+ to_return.gut_on_top = _cfg_ctrls.gut_on_top.pressed
+
+
+ # Directories
+ to_return.include_subdirs = _cfg_ctrls.include_subdirs.pressed
+ var dirs = []
+ for i in range(DIRS_TO_LIST):
+ var key = str('directory_', i)
+ var val = _cfg_ctrls[key].text
+ if(val != '' and val != null):
+ dirs.append(val)
+ to_return.dirs = dirs
+
+ # XML Output
+ to_return.junit_xml_file = _cfg_ctrls.junit_xml_file.text
+ to_return.junit_xml_timestamp = _cfg_ctrls.junit_xml_timestamp.pressed
+
+ # Hooks
+ to_return.pre_run_script = _cfg_ctrls.pre_run_script.text
+ to_return.post_run_script = _cfg_ctrls.post_run_script.text
+
+ # Misc
+ to_return.prefix = _cfg_ctrls.prefix.text
+
+ return to_return