var _is_return_override = false var _is_defaults_override = false var _is_call_override = false var _method_meta : Dictionary = {} var _lgr = GutUtils.get_logger() var logger = _lgr : get: return _lgr set(val): _lgr = val var return_val = null var stub_target = null var parameters = null # the parameter values to match method call on. var stub_method = null var call_super = false var call_this = null var locked = false # When this stub is a parameter stub, this indicates that these are the defaults # defined in the script # When this stub is an action stub, this indicates it is a default stub added # by the stubber. This is currently used to stub native methods to call super # by default, but still be able to override that stub with any other stub. var is_script_default = false var parameter_count = -1 : get(): _lgr.deprecated("parameter count deprecated") return -1 # Default values for parameters. This is used to store default values for # scripts and to override those values. I'm not sure if there is a need to # override them anymore, since I think this was introduced for stubbing vararg # methods, but you still can for now. This value should only be used if # is_defaults_override is true. var parameter_defaults = [] 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_CALLABLE): stub_target = target.get_object() stub_method = target.get_method() parameters = target.get_bound_arguments() if(parameters.size() == 0): parameters = null elif(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 = GutUtils.get_scene_script_object(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): _method_meta = method _load_defaults_from_metadata(method) is_script_default = true elif(stub_target != null and stub_method != null and typeof(stub_target) != TYPE_STRING): if(!GutUtils.is_native_class(stub_target)): var method_list = stub_target.get_method_list() if(method_list != null): var meta = GutUtils.find_method_meta(method_list, stub_method) if(meta != null): _method_meta = meta 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 _get_method_meta(): if(_method_meta == {} and typeof(stub_target) == TYPE_OBJECT): var found_meta = GutUtils.get_method_meta(stub_target, stub_method) if(found_meta != null): _method_meta = found_meta return _method_meta func _error_if_locked(): if(locked): push_error("Cannot change stub as it has been locked.") return true else: return false # ------------------------- # Public # ------------------------- func to_return(val): if(_error_if_locked()): return return_val = val call_super = false _is_return_override = true return self func to_do_nothing(): to_return(null) return self func to_call_super(): if(_error_if_locked()): return call_super = true _is_call_override = true return self func to_use_singleton(): return to_call_super() func to_call(callable : Callable): if(_error_if_locked()): return call_this = callable _is_call_override = true 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): _lgr.deprecated("Stubbing param_count is no longer required or supported.") return self func param_defaults(values): if(_error_if_locked()): return var meta = _get_method_meta() if(meta != {} and meta.flags & METHOD_FLAG_VARARG): _lgr.error("Cannot stub defaults for methods with varargs: " + meta.name) else: parameter_defaults = values _is_defaults_override = true return self func is_default_override_only(): return is_defaults_override() and !is_return_override() and !is_call_override() func is_return_override(): return _is_return_override func is_defaults_override(): return _is_defaults_override func is_call_override(): return _is_call_override func to_s(): var base_string = str(stub_target, '.', stub_method) if(parameter_defaults.size() > 0): if(is_script_default): base_string += " SCRIPT DEFAULTS" else: base_string += " STUB DEFAULTS" base_string += str(" ", parameter_defaults) if(call_super): base_string += " to call SUPER" if(call_this != null): base_string += str(" to call ", call_this) if(parameters != null): base_string += str(' with params (', parameters, ') returns ', return_val) else: base_string += str(' returns ', return_val) return base_string