var _utils = load("res://addons/gut/utils.gd").get_instance() var _lgr = _utils.get_logger() var return_val = null var stub_target = null # the parameter values to match method call on. var parameters = null var stub_method = null var call_super = false # Whether this is a stub for default parameter values as they are defined in # the script, and not an overridden default value. var is_script_default = false # -- Paramter Override -- # Parmater overrides are stored in here along with all the other stub info # so that you can chain stubbing parameter overrides along with all the # other stubbing. This adds some complexity to the logic that tries to # find the correct stub for a call by a double. Since an instance of this # class could be just a parameter override, or it could have been chained # we have to have _paramter_override_only so that we know when to tell the # difference. var parameter_count = -1 var parameter_defaults = null # Anything that would make this stub not just an override of paramters # must set this flag to false. This must be private bc the actual logic # to determine if this stub is only an override is more complicated. var _parameter_override_only = true # -- const NOT_SET = "|_1_this_is_not_set_1_|" func _init(target = null, method = null, subpath = null): stub_target = target stub_method = method if typeof(target) == TYPE_STRING: if target.is_absolute_path(): stub_target = load(str(target)) else: _lgr.warn(str(target, " is not a valid path")) if stub_target is PackedScene: stub_target = _utils.get_scene_script_object(stub_target) elif _utils.is_native_class(stub_target): print("Got a native class: ", stub_target) # this is used internally to stub default parameters for everything that is # doubled...or something. Look for stub_defaults_from_meta for usage. This # behavior is not to be used by end users. if typeof(method) == TYPE_DICTIONARY: _load_defaults_from_metadata(method) func _load_defaults_from_metadata(meta): stub_method = meta.name var values = meta.default_args.duplicate() while values.size() < meta.args.size(): values.push_front(null) param_defaults(values) func to_return(val): if stub_method == "_init": _lgr.error("You cannot stub _init to do nothing. Super's _init is always called.") else: return_val = val call_super = false _parameter_override_only = false return self func to_do_nothing(): to_return(null) return self func to_call_super(): if stub_method == "_init": _lgr.error("You cannot stub _init to call super. Super's _init is always called.") else: call_super = true _parameter_override_only = false return self func when_passed( p1 = NOT_SET, p2 = NOT_SET, p3 = NOT_SET, p4 = NOT_SET, p5 = NOT_SET, p6 = NOT_SET, p7 = NOT_SET, p8 = NOT_SET, p9 = NOT_SET, p10 = NOT_SET ): parameters = [p1, p2, p3, p4, p5, p6, p7, p8, p9, p10] var idx = 0 while idx < parameters.size(): if str(parameters[idx]) == NOT_SET: parameters.remove_at(idx) else: idx += 1 return self func param_count(x): parameter_count = x return self func param_defaults(values): parameter_count = values.size() parameter_defaults = values return self func has_param_override(): return parameter_count != -1 func is_param_override_only(): var to_return = false if has_param_override(): to_return = _parameter_override_only return to_return func to_s(): var base_string = str(stub_target, ".", stub_method) if has_param_override(): base_string += str( " (param count override=", parameter_count, " defaults=", parameter_defaults ) if is_param_override_only(): base_string += " ONLY" if is_script_default: base_string += " script default" base_string += ") " if call_super: base_string += " to call SUPER" if parameters != null: base_string += str(" with params (", parameters, ") returns ", return_val) else: base_string += str(" returns ", return_val) return base_string