initial commit, 4.5 stable
Some checks failed
🔗 GHA / 📊 Static checks (push) Has been cancelled
🔗 GHA / 🤖 Android (push) Has been cancelled
🔗 GHA / 🍏 iOS (push) Has been cancelled
🔗 GHA / 🐧 Linux (push) Has been cancelled
🔗 GHA / 🍎 macOS (push) Has been cancelled
🔗 GHA / 🏁 Windows (push) Has been cancelled
🔗 GHA / 🌐 Web (push) Has been cancelled

This commit is contained in:
2025-09-16 20:46:46 -04:00
commit 9d30169a8d
13378 changed files with 7050105 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
class A extends Node:
pass
func subtest_native():
var x = Node.new()
x.free()
var _ok = x
var _bad: Node = x
func subtest_script():
var x = A.new()
x.free()
var _ok = x
var _bad: A = x
func test():
subtest_native()
subtest_script()

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/assign_freed_instance.gd:10 on subtest_native(): Trying to assign invalid previously freed instance.
>> SCRIPT ERROR at runtime/errors/assign_freed_instance.gd:18 on subtest_script(): Trying to assign invalid previously freed instance.

View File

@@ -0,0 +1,11 @@
func subtest_attribute(state):
state.center_of_mass.x -= 1.0
func subtest_variable_index(state, prop):
state[prop].x = 1.0
func test():
var state = PhysicsDirectBodyState3DExtension.new()
subtest_attribute(state)
subtest_variable_index(state, &"center_of_mass")
state.free()

View File

@@ -0,0 +1,6 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 9: (UNSAFE_CALL_ARGUMENT) The argument 1 of the function "subtest_attribute()" requires the subtype "Variant" but the supertype "Variant" was provided.
~~ WARNING at line 10: (UNSAFE_CALL_ARGUMENT) The argument 1 of the function "subtest_variable_index()" requires the subtype "Variant" but the supertype "Variant" was provided.
>> ERROR: Required virtual method PhysicsDirectBodyState3DExtension::_get_center_of_mass must be overridden before calling.
>> SCRIPT ERROR at runtime/errors/assign_to_read_only_property.gd:2 on subtest_attribute(): Cannot set value into property "center_of_mass" (on base "PhysicsDirectBodyState3DExtension") because it is read-only.
>> SCRIPT ERROR at runtime/errors/assign_to_read_only_property.gd:5 on subtest_variable_index(): Cannot set value into property "center_of_mass" (on base "PhysicsDirectBodyState3DExtension") because it is read-only.

View File

@@ -0,0 +1,8 @@
var weakling = 'not float'
func weak(x: float = weakling):
print(x)
print('typeof x is', typeof(x))
func test():
print(typeof(weak()))
print('not ok')

View File

@@ -0,0 +1,4 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/bad_conversion_for_default_parameter.gd:2 on weak(): Trying to assign value of type 'String' to a variable of type 'float'.
0
not ok

View File

@@ -0,0 +1,6 @@
#debug-only
func test():
var node := Node.new()
var inside_tree = node.is_inside_tree
node.free()
inside_tree.call()

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/callable_call_after_free_object.gd:6 on test(): Attempt to call function 'null::is_inside_tree (Callable)' on a null instance.

View File

@@ -0,0 +1,3 @@
#debug-only
func test():
print(load.bind([]).call())

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/callable_call_invalid_arg_type.gd:3 on test(): Invalid type in function '@GDScript::load (Callable)'. Cannot convert argument 1 from Array to String.

View File

@@ -0,0 +1,4 @@
func test():
var node := Node.new()
node.free()
print(node as Node2D)

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/cast_freed_object.gd:4 on test(): Trying to cast a freed object.

View File

@@ -0,0 +1,4 @@
func test():
var integer: Variant = 1
@warning_ignore("unsafe_cast")
print(integer as Array)

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/cast_int_to_array.gd:4 on test(): Invalid cast: could not convert value to 'Array'.

View File

@@ -0,0 +1,4 @@
func test():
var integer: Variant = 1
@warning_ignore("unsafe_cast")
print(integer as Node)

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/cast_int_to_object.gd:4 on test(): Invalid cast: can't convert a non-object value to an object type.

View File

@@ -0,0 +1,4 @@
func test():
var object: Variant = RefCounted.new()
@warning_ignore("unsafe_cast")
print(object as int)

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/cast_object_to_int.gd:4 on test(): Invalid cast: could not convert value to 'int'.

View File

@@ -0,0 +1,6 @@
const array: Array = [{}]
func test():
var dictionary := array[0]
var key: int = 0
dictionary[key] = 0

View File

@@ -0,0 +1,4 @@
GDTEST_RUNTIME_ERROR
>> ERROR: Condition "_p->read_only" is true. Returning: false
>> Dictionary is in read-only state.
>> SCRIPT ERROR at runtime/errors/constant_array_is_deep.gd:6 on test(): Invalid assignment on read-only value (on base: 'Dictionary').

View File

@@ -0,0 +1,6 @@
const dictionary := {0: [0]}
func test():
var array := dictionary[0]
var key: int = 0
array[key] = 0

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/constant_dictionary_is_deep.gd:6 on test(): Invalid assignment on read-only value (on base: 'Array').

View File

@@ -0,0 +1,3 @@
func test():
var integer: int = 1
integer /= 0

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 2: (UNUSED_VARIABLE) The local variable "integer" is declared but never used in the block. If this is intended, prefix it with an underscore: "_integer".
>> SCRIPT ERROR at runtime/errors/division_by_zero.gd:3 on test(): Division by zero error in operator '/'.

View File

@@ -0,0 +1,4 @@
func test():
var a: Array = [Resource.new()]
for node: Node in a:
print(node)

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/for_loop_iterator_type_not_match_specified.gd:3 on test(): Trying to assign value of type 'Resource' to a variable of type 'Node'.

View File

@@ -0,0 +1,3 @@
func test():
var x = Color()
print(len(x)) # GDScript utility function.

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/gd_utility_function_wrong_arg.gd:3 on test(): Error calling GDScript utility function "len()": Value of type 'Color' can't provide a length.

View File

@@ -0,0 +1,9 @@
# https://github.com/godotengine/godot/issues/90086
class MyObj:
var obj: WeakRef
func test():
var obj_1 = MyObj.new()
var obj_2 = MyObj.new()
obj_1.obj = obj_2

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/invalid_property_assignment.gd:9 on test(): Invalid assignment of property or key 'obj' with value of type 'RefCounted (MyObj)' on a base object of type 'RefCounted (MyObj)'.

View File

@@ -0,0 +1,3 @@
func test():
var integer: int = 1
integer %= 0

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 2: (UNUSED_VARIABLE) The local variable "integer" is declared but never used in the block. If this is intended, prefix it with an underscore: "_integer".
>> SCRIPT ERROR at runtime/errors/modulo_by_zero.gd:3 on test(): Modulo by zero error in operator '%'.

View File

@@ -0,0 +1,6 @@
# https://github.com/godotengine/godot/issues/66675
func test():
example(Node2D)
func example(thing):
print(thing.has_method('asdf'))

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 6: (UNSAFE_METHOD_ACCESS) The method "has_method()" is not present on the inferred type "Variant" (but may be present on a subtype).
>> SCRIPT ERROR at runtime/errors/non_static_method_call_on_native_class.gd:6 on example(): Invalid call. Nonexistent function 'has_method' in base 'Node2D'.

View File

@@ -0,0 +1,28 @@
class Outer:
const OUTER_CONST := 0
class Inner:
pass
func subtest_type_hard():
var type := Outer.Inner
print(type.OUTER_CONST)
func subtest_type_weak():
var type := Outer.Inner
var type_v: Variant = type
print(type_v.OUTER_CONST)
func subtest_instance_hard():
var instance := Outer.Inner.new()
print(instance.OUTER_CONST)
func subtest_instance_weak():
var instance := Outer.Inner.new()
var instance_v: Variant = instance
print(instance_v.OUTER_CONST)
func test():
subtest_type_hard()
subtest_type_weak()
subtest_instance_hard()
subtest_instance_weak()

View File

@@ -0,0 +1,7 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 8: (UNSAFE_PROPERTY_ACCESS) The property "OUTER_CONST" is not present on the inferred type "Inner" (but may be present on a subtype).
~~ WARNING at line 17: (UNSAFE_PROPERTY_ACCESS) The property "OUTER_CONST" is not present on the inferred type "Inner" (but may be present on a subtype).
>> SCRIPT ERROR at runtime/errors/outer_class_constants.gd:8 on subtest_type_hard(): Invalid access to property or key 'OUTER_CONST' on a base object of type 'GDScript'.
>> SCRIPT ERROR at runtime/errors/outer_class_constants.gd:13 on subtest_type_weak(): Invalid access to property or key 'OUTER_CONST' on a base object of type 'GDScript'.
>> SCRIPT ERROR at runtime/errors/outer_class_constants.gd:17 on subtest_instance_hard(): Invalid access to property or key 'OUTER_CONST' on a base object of type 'RefCounted (Inner)'.
>> SCRIPT ERROR at runtime/errors/outer_class_constants.gd:22 on subtest_instance_weak(): Invalid access to property or key 'OUTER_CONST' on a base object of type 'RefCounted (Inner)'.

View File

@@ -0,0 +1,4 @@
func test():
var dictionary := { "a": 0 }
dictionary.make_read_only()
dictionary.a = 1

View File

@@ -0,0 +1,4 @@
GDTEST_RUNTIME_ERROR
>> ERROR: Condition "_p->read_only" is true. Returning: false
>> Dictionary is in read-only state.
>> SCRIPT ERROR at runtime/errors/read_only_dictionary.gd:4 on test(): Invalid assignment on read-only value (on base: 'Dictionary').

View File

@@ -0,0 +1,12 @@
# TODO: This test is currently disabled since it triggers some complex memory leaks. Try enabling it again once GH-101830 is fixed.
signal finished
const scr: GDScript = preload("reload_suspended_function_helper.notest.gd")
func test():
@warning_ignore("UNSAFE_METHOD_ACCESS")
scr.test(self)
@warning_ignore("RETURN_VALUE_DISCARDED")
scr.reload(true)
finished.emit()

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> WARNING: Canceling suspended execution of "test" due to a script reload.

View File

@@ -0,0 +1,3 @@
static func test(a):
await a.finished
pass

View File

@@ -0,0 +1,4 @@
func test():
var basic := [1]
var _typed: Array[int] = basic
print('not ok')

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/typed_array_assign_basic_to_typed.gd:3 on test(): Trying to assign an array of type "Array" to a variable of type "Array[int]".

View File

@@ -0,0 +1,4 @@
func test():
var differently: Variant = [1.0] as Array[float]
var _typed: Array[int] = differently
print('not ok')

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/typed_array_assign_differently_typed.gd:3 on test(): Trying to assign an array of type "Array[float]" to a variable of type "Array[int]".

View File

@@ -0,0 +1,7 @@
class Foo: pass
class Bar extends Foo: pass
class Baz extends Foo: pass
func test():
var _typed: Array[Bar] = [Baz.new() as Foo]
print('not ok')

View File

@@ -0,0 +1,6 @@
GDTEST_RUNTIME_ERROR
>> ERROR: Method/function failed. Returning: false
>> Attempted to assign an object into a TypedArray, that does not inherit from 'GDScript'.
>> ERROR: Method/function failed.
>> Unable to convert array index 0 from "Object" to "Object".
not ok

View File

@@ -0,0 +1,7 @@
func expect_typed(typed: Array[int]):
print(typed.size())
func test():
var basic := [1]
expect_typed(basic)
print('not ok')

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/typed_array_pass_basic_to_typed.gd:6 on test(): Invalid type in function 'expect_typed' in base 'RefCounted (typed_array_pass_basic_to_typed.gd)'. The array of argument 1 (Array) does not have the same element type as the expected typed array argument.

View File

@@ -0,0 +1,7 @@
func expect_typed(typed: Array[int]):
print(typed.size())
func test():
var differently: Variant = [1.0] as Array[float]
expect_typed(differently)
print('not ok')

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 6: (UNSAFE_CALL_ARGUMENT) The argument 1 of the function "expect_typed()" requires the subtype "Array[int]" but the supertype "Variant" was provided.
>> SCRIPT ERROR at runtime/errors/typed_array_pass_differently_to_typed.gd:6 on test(): Invalid type in function 'expect_typed' in base 'RefCounted (typed_array_pass_differently_to_typed.gd)'. The array of argument 1 (Array[float]) does not have the same element type as the expected typed array argument.

View File

@@ -0,0 +1,4 @@
func test():
var basic := { 1: 1 }
var _typed: Dictionary[int, int] = basic
print('not ok')

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/typed_dictionary_assign_basic_to_typed.gd:3 on test(): Trying to assign a dictionary of type "Dictionary" to a variable of type "Dictionary[int, int]".

View File

@@ -0,0 +1,4 @@
func test():
var differently: Variant = { 1.0: 0.0 } as Dictionary[float, float]
var _typed: Dictionary[int, int] = differently
print('not ok')

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/typed_dictionary_assign_differently_typed.gd:3 on test(): Trying to assign a dictionary of type "Dictionary[float, float]" to a variable of type "Dictionary[int, int]".

View File

@@ -0,0 +1,7 @@
func get_key() -> Variant:
return "key"
func test():
var typed: Dictionary[int, int]
typed[get_key()] = 0
print('not ok')

View File

@@ -0,0 +1,5 @@
GDTEST_RUNTIME_ERROR
>> ERROR: Method/function failed. Returning: false
>> Attempted to set a variable of type 'String' into a TypedDictionary.Key of type 'int'.
>> ERROR: Condition "!_p->typed_key.validate(key, "set")" is true. Returning: false
>> SCRIPT ERROR at runtime/errors/typed_dictionary_assign_differently_typed_key.gd:6 on test(): Invalid assignment of property or key 'key' with value of type 'int' on a base object of type 'Dictionary[int, int]'.

View File

@@ -0,0 +1,7 @@
func get_value() -> Variant:
return "value"
func test():
var typed: Dictionary[int, int]
typed[0] = get_value()
print("not ok")

View File

@@ -0,0 +1,5 @@
GDTEST_RUNTIME_ERROR
>> ERROR: Method/function failed. Returning: false
>> Attempted to set a variable of type 'String' into a TypedDictionary.Value of type 'int'.
>> ERROR: Condition "!_p->typed_value.validate(value, "set")" is true. Returning: false
>> SCRIPT ERROR at runtime/errors/typed_dictionary_assign_differently_typed_value.gd:6 on test(): Invalid assignment of property or key '0' with value of type 'String' on a base object of type 'Dictionary[int, int]'.

View File

@@ -0,0 +1,7 @@
class Foo: pass
class Bar extends Foo: pass
class Baz extends Foo: pass
func test():
var _typed: Dictionary[Bar, Bar] = { Baz.new() as Foo: Baz.new() as Foo }
print('not ok')

View File

@@ -0,0 +1,6 @@
GDTEST_RUNTIME_ERROR
>> ERROR: Method/function failed. Returning: false
>> Attempted to assign an object into a TypedDictionary.Key, that does not inherit from 'GDScript'.
>> ERROR: Method/function failed.
>> Unable to convert key from "Object" to "Object".
not ok

View File

@@ -0,0 +1,7 @@
func expect_typed(typed: Dictionary[int, int]):
print(typed.size())
func test():
var basic := { 1: 1 }
expect_typed(basic)
print('not ok')

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/typed_dictionary_pass_basic_to_typed.gd:6 on test(): Invalid type in function 'expect_typed' in base 'RefCounted (typed_dictionary_pass_basic_to_typed.gd)'. The dictionary of argument 1 (Dictionary) does not have the same element type as the expected typed dictionary argument.

View File

@@ -0,0 +1,7 @@
func expect_typed(typed: Dictionary[int, int]):
print(typed.size())
func test():
var differently: Variant = { 1.0: 0.0 } as Dictionary[float, float]
expect_typed(differently)
print('not ok')

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 6: (UNSAFE_CALL_ARGUMENT) The argument 1 of the function "expect_typed()" requires the subtype "Dictionary[int, int]" but the supertype "Variant" was provided.
>> SCRIPT ERROR at runtime/errors/typed_dictionary_pass_differently_to_typed.gd:6 on test(): Invalid type in function 'expect_typed' in base 'RefCounted (typed_dictionary_pass_differently_to_typed.gd)'. The dictionary of argument 1 (Dictionary[float, float]) does not have the same element type as the expected typed dictionary argument.

View File

@@ -0,0 +1,4 @@
func test():
var obj
obj = Node.new()
print(obj.free())

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 4: (UNSAFE_METHOD_ACCESS) The method "free()" is not present on the inferred type "Variant" (but may be present on a subtype).
>> SCRIPT ERROR at runtime/errors/use_return_value_of_free_call.gd:4 on test(): Trying to get a return value of a method that returns "void"

View File

@@ -0,0 +1,4 @@
func test():
var value
value = []
print(value.reverse())

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 4: (UNSAFE_METHOD_ACCESS) The method "reverse()" is not present on the inferred type "Variant" (but may be present on a subtype).
>> SCRIPT ERROR at runtime/errors/use_return_value_of_void_builtin_method_call.gd:4 on test(): Trying to get a return value of a method that returns "void"

View File

@@ -0,0 +1,4 @@
func test():
var obj
obj = RefCounted.new()
print(obj.notify_property_list_changed())

View File

@@ -0,0 +1,3 @@
GDTEST_RUNTIME_ERROR
~~ WARNING at line 4: (UNSAFE_METHOD_ACCESS) The method "notify_property_list_changed()" is not present on the inferred type "Variant" (but may be present on a subtype).
>> SCRIPT ERROR at runtime/errors/use_return_value_of_void_native_method_call.gd:4 on test(): Trying to get a return value of a method that returns "void"

View File

@@ -0,0 +1,3 @@
func test():
var x = Color()
print(floor(x)) # Built-in utility function.

View File

@@ -0,0 +1,2 @@
GDTEST_RUNTIME_ERROR
>> SCRIPT ERROR at runtime/errors/utility_function_wrong_arg.gd:3 on test(): Error calling utility function "floor()": Argument "x" must be "int", "float", "Vector2", "Vector2i", "Vector3", "Vector3i", "Vector4", or "Vector4i".

View File

@@ -0,0 +1,50 @@
@abstract class A:
@abstract func get_text_1() -> String
@abstract func get_text_2() -> String
# No `UNUSED_PARAMETER` warning.
@abstract func func_with_param(param: int) -> int
@abstract func func_with_rest_param(...args: Array) -> int
@abstract func func_with_semicolon() -> int;
@abstract func func_1() -> int; @abstract func func_2() -> int
@abstract func func_without_return_type()
func print_text_1() -> void:
print(get_text_1())
@abstract class B extends A:
func get_text_1() -> String:
return "text_1b"
func print_text_2() -> void:
print(get_text_2())
class C extends B:
func get_text_2() -> String:
return "text_2c"
func func_with_param(param: int) -> int: return param
func func_with_rest_param(...args: Array) -> int: return args.size()
func func_with_semicolon() -> int: return 0
func func_1() -> int: return 0
func func_2() -> int: return 0
func func_without_return_type(): pass
@abstract class D extends C:
@abstract func get_text_1() -> String
func get_text_2() -> String:
return super() + " text_2d"
class E extends D:
func get_text_1() -> String:
return "text_1e"
func test():
var c := C.new()
c.print_text_1()
c.print_text_2()
var e := E.new()
e.print_text_1()
e.print_text_2()

View File

@@ -0,0 +1,5 @@
GDTEST_OK
text_1b
text_2c
text_1e
text_2c text_2d

View File

@@ -0,0 +1,102 @@
extends Node
func my_func_1(_foo, _bar):
pass
func my_func_2(_foo, _bar, _baz):
pass
static func my_static_func_1(_foo, _bar):
pass
static func my_static_func_2(_foo, _bar, _baz):
pass
@rpc
func my_rpc_func_1(_foo, _bar):
pass
@rpc
func my_rpc_func_2(_foo, _bar, _baz):
pass
func test():
# Test built-in methods.
var builtin_callable_1 : Callable = add_to_group
print(builtin_callable_1.get_argument_count()) # Should print 2.
var builtin_callable_2 : Callable = find_child
print(builtin_callable_2.get_argument_count()) # Should print 3.
# Test built-in vararg methods.
var builtin_vararg_callable_1 : Callable = call_thread_safe
print(builtin_vararg_callable_1.get_argument_count()) # Should print 1.
var builtin_vararg_callable_2 : Callable = rpc_id
print(builtin_vararg_callable_2.get_argument_count()) # Should print 2.
# Test plain methods.
var callable_1 : Callable = my_func_1
print(callable_1.get_argument_count()) # Should print 2.
var callable_2 : Callable = my_func_2
print(callable_2.get_argument_count()) # Should print 3.
# Test static methods.
var static_callable_1 : Callable = my_static_func_1
print(static_callable_1.get_argument_count()) # Should print 2.
var static_callable_2 : Callable = my_static_func_2
print(static_callable_2.get_argument_count()) # Should print 3.
# Test rpc methods.
var rpc_callable_1 : Callable = my_rpc_func_1
print(rpc_callable_1.get_argument_count()) # Should print 2.
var rpc_callable_2 : Callable = my_rpc_func_2
print(rpc_callable_2.get_argument_count()) # Should print 3.
# Test lambdas.
var lambda_callable_1 : Callable = func(_foo, _bar): pass
print(lambda_callable_1.get_argument_count()) # Should print 2.
var lambda_callable_2 : Callable = func(_foo, _bar, _baz): pass
print(lambda_callable_2.get_argument_count()) # Should print 3.
# Test lambdas with self.
var lambda_self_callable_1 : Callable = func(_foo, _bar): return self
print(lambda_self_callable_1.get_argument_count()) # Should print 2.
var lambda_self_callable_2 : Callable = func(_foo, _bar, _baz): return self
print(lambda_self_callable_2.get_argument_count()) # Should print 3.
# Test bind.
var bind_callable_1 : Callable = my_func_2.bind(1)
print(bind_callable_1.get_argument_count()) # Should print 2.
var bind_callable_2 : Callable = my_func_2.bind(1, 2)
print(bind_callable_2.get_argument_count()) # Should print 1.
# Test unbind.
var unbind_callable_1 : Callable = my_func_2.unbind(1)
print(unbind_callable_1.get_argument_count()) # Should print 4.
var unbind_callable_2 : Callable = my_func_2.unbind(2)
print(unbind_callable_2.get_argument_count()) # Should print 5.
# Test variant callables.
var string_tmp := String()
var variant_callable_1 : Callable = string_tmp.replace
print(variant_callable_1.get_argument_count()) # Should print 2.
var variant_callable_2 : Callable = string_tmp.rsplit
print(variant_callable_2.get_argument_count()) # Should print 3.
# Test variant vararg callables.
var callable_tmp := Callable()
var variant_vararg_callable_1 : Callable = callable_tmp.call
print(variant_vararg_callable_1.get_argument_count()) # Should print 0.
var variant_vararg_callable_2 : Callable = callable_tmp.rpc_id
print(variant_vararg_callable_2.get_argument_count()) # Should print 1.
# Test global methods.
var global_callable_1 = is_equal_approx
print(global_callable_1.get_argument_count()) # Should print 2.
var global_callable_2 = inverse_lerp
print(global_callable_2.get_argument_count()) # Should print 3.
# Test GDScript methods.
var gdscript_callable_1 = char
print(gdscript_callable_1.get_argument_count()) # Should print 1.
var gdscript_callable_2 = is_instance_of
print(gdscript_callable_2.get_argument_count()) # Should print 2.

View File

@@ -0,0 +1,27 @@
GDTEST_OK
2
3
1
2
2
3
2
3
2
3
2
3
2
3
2
1
4
5
2
3
0
1
2
3
1
2

View File

@@ -0,0 +1,35 @@
# https://github.com/godotengine/godot/issues/63965
func test():
var array_str: Array = []
array_str.push_back("godot")
print("StringName in Array: ", &"godot" in array_str)
var array_sname: Array = []
array_sname.push_back(&"godot")
print("String in Array: ", "godot" in array_sname)
# Not equal because the values are different types.
print("Arrays not equal: ", array_str != array_sname)
var string_array: Array[String] = []
var stringname_array: Array[StringName] = []
string_array.push_back(&"abc")
print("Array[String] insert converted: ", typeof(string_array[0]) == TYPE_STRING)
stringname_array.push_back("abc")
print("Array[StringName] insert converted: ", typeof(stringname_array[0]) == TYPE_STRING_NAME)
print("StringName in Array[String]: ", &"abc" in string_array)
print("String in Array[StringName]: ", "abc" in stringname_array)
var packed_string_array: PackedStringArray = []
Utils.check(!packed_string_array.push_back("abc"))
print("StringName in PackedStringArray: ", &"abc" in packed_string_array)
string_array.push_back("abc")
print("StringName finds String in Array: ", string_array.find(&"abc"))
stringname_array.push_back(&"abc")
print("String finds StringName in Array: ", stringname_array.find("abc"))

View File

@@ -0,0 +1,11 @@
GDTEST_OK
StringName in Array: true
String in Array: true
Arrays not equal: true
Array[String] insert converted: true
Array[StringName] insert converted: true
StringName in Array[String]: true
String in Array[StringName]: true
StringName in PackedStringArray: true
StringName finds String in Array: 0
String finds StringName in Array: 0

View File

@@ -0,0 +1,32 @@
# https://github.com/godotengine/godot/issues/48121
func test():
var x := []
var y := []
x.push_back(y)
print("TEST ARRAY ADD TO SELF: " + str(len(y)))
x.clear()
x = Array()
y = Array()
x.push_back(y)
print("TEST ARRAY ADD TO SELF: " + str(len(y)))
x.clear()
x = Array().duplicate()
y = Array().duplicate()
x.push_back(y)
print("TEST ARRAY ADD TO SELF: " + str(len(y)))
x.clear()
x = [].duplicate()
y = [].duplicate()
x.push_back(y)
print("TEST ARRAY ADD TO SELF: " + str(len(y)))
x.clear()
x = Array()
y = Array()
x.push_back(y)
print("TEST ARRAY ADD TO SELF: " + str(len(y)))
x.clear()

View File

@@ -0,0 +1,6 @@
GDTEST_OK
TEST ARRAY ADD TO SELF: 0
TEST ARRAY ADD TO SELF: 0
TEST ARRAY ADD TO SELF: 0
TEST ARRAY ADD TO SELF: 0
TEST ARRAY ADD TO SELF: 0

View File

@@ -0,0 +1,13 @@
extends Node
func test():
process_priority = 10
var change = 20
print(process_priority)
print(change)
process_priority += change
print(process_priority)
print(change)

View File

@@ -0,0 +1,5 @@
GDTEST_OK
10
20
30
20

View File

@@ -0,0 +1,31 @@
# https://github.com/godotengine/godot/issues/75832
@warning_ignore_start("narrowing_conversion")
func test():
var hf := 2.0
var sf = 2.0
var i := 2
i *= hf
i *= sf
i *= 2.0
print(i)
var v2 := Vector2i(1, 2)
v2 *= hf
v2 *= sf
v2 *= 2.0
print(v2)
var v3 := Vector3i(1, 2, 3)
v3 *= hf
v3 *= sf
v3 *= 2.0
print(v3)
var v4 := Vector4i(1, 2, 3, 4)
v4 *= hf
v4 *= sf
v4 *= 2.0
print(v4)
var arr := [1, 2, 3]
arr += [4, 5]
print(arr)

View File

@@ -0,0 +1,6 @@
GDTEST_OK
16
(8, 16)
(8, 16, 24)
(8, 16, 24, 32)
[1, 2, 3, 4, 5]

View File

@@ -0,0 +1,7 @@
func wait() -> void:
pass
func test():
@warning_ignore("redundant_await")
await wait()
print("end")

View File

@@ -0,0 +1,2 @@
GDTEST_OK
end

View File

@@ -0,0 +1,25 @@
signal no_parameters()
signal one_parameter(number)
signal two_parameters(number1, number2)
func await_no_parameters():
var result = await no_parameters
print(result)
func await_one_parameter():
var result = await one_parameter
print(result)
func await_two_parameters():
var result = await two_parameters
print(result)
func test():
await_no_parameters()
no_parameters.emit()
await_one_parameter()
one_parameter.emit(1)
await_two_parameters()
two_parameters.emit(1, 2)

View File

@@ -0,0 +1,4 @@
GDTEST_OK
<null>
1
[1, 2]

View File

@@ -0,0 +1,8 @@
# https://github.com/godotengine/godot/issues/50894
func test():
print(await not_coroutine())
func not_coroutine() -> String:
return "awaited"

View File

@@ -0,0 +1,3 @@
GDTEST_OK
~~ WARNING at line 4: (REDUNDANT_AWAIT) "await" keyword is unnecessary because the expression isn't a coroutine nor a signal.
awaited

View File

@@ -0,0 +1,13 @@
func test():
var array: Array = [1, 2, 3]
print(array)
var array_clear: Callable = array.clear
array_clear.call()
print(array)
var dictionary: Dictionary = {1: 2, 3: 4}
print(dictionary)
# `dictionary.clear` is treated as a key.
var dictionary_clear := Callable.create(dictionary, &"clear")
dictionary_clear.call()
print(dictionary)

View File

@@ -0,0 +1,5 @@
GDTEST_OK
[1, 2, 3]
[]
{ 1: 2, 3: 4 }
{ }

View File

@@ -0,0 +1,6 @@
func test():
# Validated native static call with return value.
print(FileAccess.file_exists("some_file"))
# Validated native static call without return value.
Node.print_orphan_nodes()

View File

@@ -0,0 +1,2 @@
GDTEST_OK
false

View File

@@ -0,0 +1,26 @@
var array_var: Array = ["one", "two", "three", "four"]
const array_const: Array = ["one", "two", "three", "four"]
var array_nested_var: Array = [["one"], ["two"], ["three"], ["four"]]
const array_nested_const: Array = [["one"], ["two"], ["three"], ["four"]]
func test():
Utils.check(array_const.is_read_only() == true)
Utils.check(array_nested_const.is_read_only() == true)
print("TEST Callable::callv")
print_four_variants.callv(array_var)
print_four_variants.callv(array_const)
print_four_variants.callv(array_nested_var)
print_four_variants.callv(array_nested_const)
print("TEST Object::callv")
self.callv("print_four_variants", array_var)
self.callv("print_four_variants", array_const)
self.callv("print_four_variants", array_nested_var)
self.callv("print_four_variants", array_nested_const)
func print_four_variants(v1, v2, v3, v4):
print("%s %s %s %s" % [v1, v2, v3, v4])

View File

@@ -0,0 +1,11 @@
GDTEST_OK
TEST Callable::callv
one two three four
one two three four
["one"] ["two"] ["three"] ["four"]
["one"] ["two"] ["three"] ["four"]
TEST Object::callv
one two three four
one two three four
["one"] ["two"] ["three"] ["four"]
["one"] ["two"] ["three"] ["four"]

View File

@@ -0,0 +1,19 @@
func test():
var dictionary1: Variant = {1:Vector2()}
dictionary1[1].x = 2
var dictionary2: Dictionary = {3:Vector2()}
dictionary2[3].x = 4
var array1: Variant = [[Vector2()]]
array1[0][0].x = 5
var array2: Array = [[Vector2()]]
array2[0][0].x = 6
var array3: Array[Array] = [[Vector2()]]
array3[0][0].x = 7
var transform = Transform3D()
transform.basis.x = Vector3(8.0, 9.0, 7.0)
print(dictionary1)
print(dictionary2)
print(array1)
print(array2)
print(array3)
print(transform)

View File

@@ -0,0 +1,7 @@
GDTEST_OK
{ 1: (2.0, 0.0) }
{ 3: (4.0, 0.0) }
[[(5.0, 0.0)]]
[[(6.0, 0.0)]]
[[(7.0, 0.0)]]
[X: (8.0, 9.0, 7.0), Y: (0.0, 1.0, 0.0), Z: (0.0, 0.0, 1.0), O: (0.0, 0.0, 0.0)]

View File

@@ -0,0 +1,146 @@
func test():
var value
# null
value = null
print(value == null)
# bool
value = false
print(value == null)
# int
value = 0
print(value == null)
# float
value = 0.0
print(value == null)
# String
value = ""
print(value == null)
# Vector2
value = Vector2()
print(value == null)
# Vector2i
value = Vector2i()
print(value == null)
# Rect2
value = Rect2()
print(value == null)
# Rect2i
value = Rect2i()
print(value == null)
# Vector3
value = Vector3()
print(value == null)
# Vector3i
value = Vector3i()
print(value == null)
# Transform2D
value = Transform2D()
print(value == null)
# Plane
value = Plane()
print(value == null)
# Quaternion
value = Quaternion()
print(value == null)
# AABB
value = AABB()
print(value == null)
# Basis
value = Basis()
print(value == null)
# Transform3D
value = Transform3D()
print(value == null)
# Projection
value = Projection()
print(value == null)
# Color
value = Color()
print(value == null)
# StringName
value = &""
print(value == null)
# NodePath
value = ^""
print(value == null)
# RID
value = RID()
print(value == null)
# Callable
value = Callable()
print(value == null)
# Signal
value = Signal()
print(value == null)
# Dictionary
value = {}
print(value == null)
# Array
value = []
print(value == null)
# PackedByteArray
value = PackedByteArray()
print(value == null)
# PackedInt32Array
value = PackedInt32Array()
print(value == null)
# PackedInt64Array
value = PackedInt64Array()
print(value == null)
# PackedFloat32Array
value = PackedFloat32Array()
print(value == null)
# PackedFloat64Array
value = PackedFloat64Array()
print(value == null)
# PackedStringArray
value = PackedStringArray()
print(value == null)
# PackedVector2Array
value = PackedVector2Array()
print(value == null)
# PackedVector3Array
value = PackedVector3Array()
print(value == null)
# PackedColorArray
value = PackedColorArray()
print(value == null)
# PackedVector4Array
value = PackedVector4Array()
print(value == null)

Some files were not shown because too many files have changed in this diff Show More