var Gut = load("res://addons/gut/gut.gd") # Do not want a ref to _utils here due to use by editor plugin. # _utils needs to be split so that constants and what not do not # have to rely on the weird singleton thing I made. enum DOUBLE_STRATEGY { FULL, PARTIAL } var valid_fonts = ["AnonymousPro", "CourierPro", "LobsterTwo", "Default"] var default_options = { background_color = Color(.15, .15, .15, 1).to_html(), config_file = "res://.gutconfig.json", dirs = [], disable_colors = false, double_strategy = "partial", font_color = Color(.8, .8, .8, 1).to_html(), font_name = "CourierPrime", font_size = 16, hide_orphans = false, ignore_pause = false, include_subdirs = false, inner_class = "", junit_xml_file = "", junit_xml_timestamp = false, log_level = 1, opacity = 100, paint_after = .1, post_run_script = "", pre_run_script = "", prefix = "test_", selected = "", should_exit = false, should_exit_on_success = false, should_maximize = false, compact_mode = false, show_help = false, suffix = ".gd", tests = [], unit_test_name = "", gut_on_top = true, } var default_panel_options = { font_name = "CourierPrime", font_size = 30, hide_result_tree = false, hide_output_text = false, hide_settings = false, use_colors = true } var options = default_options.duplicate() var json = JSON.new() func _null_copy(h): var new_hash = {} for key in h: new_hash[key] = null return new_hash func _load_options_from_config_file(file_path, into): # SHORTCIRCUIT if !FileAccess.file_exists(file_path): if file_path != "res://.gutconfig.json": print('ERROR: Config File "', file_path, '" does not exist.') return -1 else: return 1 var f = FileAccess.open(file_path, FileAccess.READ) if f == null: var result = FileAccess.get_open_error() push_error(str("Could not load data ", file_path, " ", result)) return result var json = f.get_as_text() f = null # close file var test_json_conv = JSON.new() test_json_conv.parse(json) var results = test_json_conv.get_data() # SHORTCIRCUIT if results == null: print("\n\n", "!! ERROR parsing file: ", file_path) print(" at line ", results.error_line, ":") print(" ", results.error_string) return -1 # Get all the options out of the config file using the option name. The # options hash is now the default source of truth for the name of an option. _load_dict_into(results, into) return 1 func _load_dict_into(source, dest): for key in dest: if source.has(key): if source[key] != null: if typeof(source[key]) == TYPE_DICTIONARY: _load_dict_into(source[key], dest[key]) else: dest[key] = source[key] func write_options(path): var content = json.stringify(options, " ") var f = FileAccess.open(path, FileAccess.WRITE) var result = FileAccess.get_open_error() if f != null: f.store_string(content) f.close() else: print("ERROR: could not open file ", path, " ", result) return result # Apply all the options specified to _tester. This is where the rubber meets # the road. func _apply_options(opts, _tester): _tester.include_subdirectories = opts.include_subdirs if opts.inner_class != "": _tester.inner_class_name = opts.inner_class _tester.log_level = opts.log_level _tester.ignore_pause_before_teardown = opts.ignore_pause if opts.selected != "": _tester.select_script(opts.selected) for i in range(opts.dirs.size()): _tester.add_directory(opts.dirs[i], opts.prefix, opts.suffix) for i in range(opts.tests.size()): _tester.add_script(opts.tests[i]) if opts.double_strategy == "include super": _tester.double_strategy = DOUBLE_STRATEGY.FULL elif opts.double_strategy == "script only": _tester.double_strategy = DOUBLE_STRATEGY.PARTIAL _tester.unit_test_name = opts.unit_test_name _tester.pre_run_script = opts.pre_run_script _tester.post_run_script = opts.post_run_script _tester.color_output = !opts.disable_colors _tester.show_orphans(!opts.hide_orphans) _tester.junit_xml_file = opts.junit_xml_file _tester.junit_xml_timestamp = opts.junit_xml_timestamp _tester.paint_after = str(opts.paint_after).to_float() return _tester func config_gut(gut): return _apply_options(options, gut) func load_options(path): return _load_options_from_config_file(path, options) func load_panel_options(path): options["panel_options"] = default_panel_options.duplicate() return _load_options_from_config_file(path, options) func load_options_no_defaults(path): options = _null_copy(default_options) return _load_options_from_config_file(path, options) func apply_options(gut): _apply_options(options, gut)