regression-test-project/AutomaticBugs/ParseArgumentType.gd

337 lines
13 KiB
GDScript

extends Node
### Scripts to arguments and return needed info about them.
### Class which contains informations about used
class SingleArgument:
var name: String # E.G. var roman, can be empty, so temp variable isn't created(nodes and objects must be created with temp_variable due to memory leaks)
var type: String # np. Vector2 or Object
var value: String # np. randi() % 100 or
var is_object: bool = false # Check if this is object e.g. Node not Vector2
var is_only_object: bool = false # Only needs to freed with .free()
var is_only_reference: bool = false # Don't needs to be removed manually
var is_only_node: bool = false # Needs to be removed with .queue_free()
func parse_and_return_objects(method_data: Dictionary, name_of_class: String, debug_print: bool = false) -> Array:
var arguments_array: Array = Array([])
if BasicData.regression_test_project:
ValueCreator.number = 100
ValueCreator.random = false # Results in RegressionTestProject must be always reproducible
else:
ValueCreator.number = 1000
ValueCreator.random = true
ValueCreator.should_be_always_valid = false
for argument in method_data.get("args"):
var type = argument.get("type")
if type == TYPE_NIL: # Looks that this means VARIANT not null
arguments_array.push_back(false) # TODO Add some randomization
# assert(false)
elif type == TYPE_AABB:
arguments_array.push_back(ValueCreator.get_aabb())
elif type == TYPE_ARRAY:
arguments_array.push_back(ValueCreator.get_array())
elif type == TYPE_BASIS:
arguments_array.push_back(ValueCreator.get_basis())
elif type == TYPE_BOOL:
arguments_array.push_back(ValueCreator.get_bool())
elif type == TYPE_COLOR:
arguments_array.push_back(ValueCreator.get_color())
elif type == TYPE_COLOR_ARRAY:
arguments_array.push_back(PackedColorArray([]))
elif type == TYPE_DICTIONARY:
arguments_array.push_back(ValueCreator.get_dictionary())
elif type == TYPE_INT:
arguments_array.push_back(ValueCreator.get_int())
elif type == TYPE_INT32_ARRAY:
arguments_array.push_back(PackedInt32Array([]))
elif type == TYPE_INT64_ARRAY:
arguments_array.push_back(PackedInt64Array([]))
elif type == TYPE_NODE_PATH:
arguments_array.push_back(ValueCreator.get_nodepath())
elif type == TYPE_OBJECT:
arguments_array.push_back(ValueCreator.get_object(argument.get("class_name")))
elif type == TYPE_PLANE:
arguments_array.push_back(ValueCreator.get_plane())
elif type == TYPE_QUAT:
arguments_array.push_back(ValueCreator.get_quat())
elif type == TYPE_RAW_ARRAY:
arguments_array.push_back(PackedByteArray([]))
elif type == TYPE_FLOAT:
arguments_array.push_back(ValueCreator.get_float())
elif type == TYPE_FLOAT32_ARRAY:
arguments_array.push_back(PackedFloat32Array([]))
elif type == TYPE_FLOAT64_ARRAY:
arguments_array.push_back(PackedFloat64Array([]))
elif type == TYPE_RECT2:
arguments_array.push_back(ValueCreator.get_rect2())
elif type == TYPE_RECT2I:
arguments_array.push_back(ValueCreator.get_rect2i())
elif type == TYPE_RID:
arguments_array.push_back(RID())
elif type == TYPE_STRING:
arguments_array.push_back(ValueCreator.get_string())
elif type == TYPE_STRING_NAME:
arguments_array.push_back(StringName(ValueCreator.get_string()))
elif type == TYPE_STRING_ARRAY:
arguments_array.push_back(PackedStringArray([]))
elif type == TYPE_TRANSFORM:
arguments_array.push_back(ValueCreator.get_transform())
elif type == TYPE_TRANSFORM2D:
arguments_array.push_back(ValueCreator.get_transform2D())
elif type == TYPE_VECTOR2:
arguments_array.push_back(ValueCreator.get_vector2())
elif type == TYPE_VECTOR2I:
arguments_array.push_back(ValueCreator.get_vector2i())
elif type == TYPE_VECTOR2_ARRAY:
arguments_array.push_back(PackedVector2Array([]))
elif type == TYPE_VECTOR3:
arguments_array.push_back(ValueCreator.get_vector3())
elif type == TYPE_VECTOR3I:
arguments_array.push_back(ValueCreator.get_vector3i())
elif type == TYPE_VECTOR3_ARRAY:
arguments_array.push_back(PackedVector3Array([]))
elif type == TYPE_CALLABLE:
arguments_array.push_back(Callable(BoxMesh.new(), "Rar"))
else:
assert(false) # Missed some types, add it
# assert(is_instance_valid(arguments_array) == true)
if debug_print:
print("\n" + name_of_class + "." + method_data.get("name") + " --- executing with " + str(arguments_array.size()) + " parameters " + str(arguments_array))
return arguments_array
func return_gdscript_code_which_run_this_object(data) -> String:
var return_string: String = ""
var type = typeof(data)
if type == TYPE_NIL: # Looks that this means VARIANT not null
return_string = "null"
#assert("false", "This is even possible?")
elif type == TYPE_AABB:
return_string = "AABB("
return_string += return_gdscript_code_which_run_this_object(data.position)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.size)
return_string += ")"
elif type == TYPE_ARRAY:
return_string = "Array(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_BASIS:
return_string = "Basis("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.z)
return_string += ")"
elif type == TYPE_BOOL:
if data == true:
return_string = "true"
else:
return_string = "false"
elif type == TYPE_COLOR:
return_string = "Color("
return_string += return_gdscript_code_which_run_this_object(data.r)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.g)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.b)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.a)
return_string += ")"
elif type == TYPE_COLOR_ARRAY:
return_string = "PoolColorArray(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_DICTIONARY:
return_string = "{"
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data.keys()[i])
return_string += " : "
return_string += return_gdscript_code_which_run_this_object(data.values()[i])
if i != data.size() - 1:
return_string += ", "
return_string += "}"
elif type == TYPE_INT:
return_string = str(data)
elif type == TYPE_INT32_ARRAY:
return_string = "PoolInt32Array(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_INT64_ARRAY:
return_string = "PoolInt64Array(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_NODE_PATH:
return_string = "NodePath("
return_string += return_gdscript_code_which_run_this_object(str(data))
return_string += ")"
elif type == TYPE_OBJECT:
if data == null:
return_string = "null"
else:
var name_of_class: String = data.get_class()
if (
ClassDB.is_parent_class(name_of_class, "Object")
&& !ClassDB.is_parent_class(name_of_class, "Node")
&& !ClassDB.is_parent_class(name_of_class, "Reference")
&& !ClassDB.class_has_method(name_of_class, "new")
):
return_string += "ClassDB.instance(\"" + name_of_class + "\")"
else:
return_string = name_of_class.trim_prefix("_")
return_string += ".new()"
elif type == TYPE_PLANE:
return_string = "Plane("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.z)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.d)
return_string += ")"
elif type == TYPE_QUAT:
return_string = "Quat("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.z)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.w)
return_string += ")"
elif type == TYPE_RAW_ARRAY:
return_string = "PoolByteArray(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_FLOAT:
return_string = str(data)
elif type == TYPE_FLOAT32_ARRAY:
return_string = "PoolFloat32Array(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_FLOAT64_ARRAY:
return_string = "PoolFloat64Array(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_RECT2:
return_string = "Rect2("
return_string += return_gdscript_code_which_run_this_object(data.position)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.size)
return_string += ")"
elif type == TYPE_RECT2I:
return_string = "Rect2i("
return_string += return_gdscript_code_which_run_this_object(data.position)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.size)
return_string += ")"
elif type == TYPE_RID:
return_string = "RID()"
elif type == TYPE_STRING:
return_string = "\"" + data + "\""
elif type == TYPE_STRING_ARRAY:
return_string = "PackedStringArray(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_TRANSFORM:
return_string = "Transform("
return_string += return_gdscript_code_which_run_this_object(data.basis)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.origin)
return_string += ")"
elif type == TYPE_TRANSFORM2D:
return_string = "Transform2D("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.origin)
return_string += ")"
elif type == TYPE_VECTOR2:
return_string = "Vector2("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ")"
elif type == TYPE_VECTOR2I:
return_string = "Vector2i("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ")"
elif type == TYPE_VECTOR2_ARRAY:
return_string = "PoolVector2Array(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_VECTOR3:
return_string = "Vector3("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.z)
return_string += ")"
elif type == TYPE_VECTOR3I:
return_string = "Vector3i("
return_string += return_gdscript_code_which_run_this_object(data.x)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.y)
return_string += ", "
return_string += return_gdscript_code_which_run_this_object(data.z)
return_string += ")"
elif type == TYPE_STRING_NAME:
return_string = "StringName("
return_string += return_gdscript_code_which_run_this_object(str(data))
return_string += ")"
elif type == TYPE_VECTOR3_ARRAY:
return_string = "PoolVector3Array(["
for i in data.size():
return_string += return_gdscript_code_which_run_this_object(data[i])
if i != data.size() - 1:
return_string += ", "
return_string += "])"
elif type == TYPE_CALLABLE:
return_string = "Callable(BoxMesh.new(),\"\")"
else:
print(type)
assert(false, "Missing type, needs to be added to project")
return return_string