feat: godot-engine-source-4.3-stable

This commit is contained in:
Jan van der Weide 2025-01-17 16:36:38 +01:00
parent c59a7dcade
commit 7125d019b5
11149 changed files with 5070401 additions and 0 deletions

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 = []
assert(!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("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,6 @@
GDTEST_OK
>> WARNING
>> Line: 4
>> REDUNDANT_AWAIT
>> "await" keyword not needed in this case, 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,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) }
{ 3: (4, 0) }
[[(5, 0)]]
[[(6, 0)]]
[[(7, 0)]]
[X: (8, 9, 7), Y: (0, 1, 0), Z: (0, 0, 1), O: (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)

View file

@ -0,0 +1,37 @@
GDTEST_OK
true
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false

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)

View file

@ -0,0 +1,37 @@
GDTEST_OK
false
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true

View file

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

View file

@ -0,0 +1,36 @@
GDTEST_OK
true
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false
false

View file

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

View file

@ -0,0 +1,36 @@
GDTEST_OK
false
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true
true

View file

@ -0,0 +1,16 @@
# https://github.com/godotengine/godot/issues/61636
const External := preload("const_class_reference_external.notest.gd")
class Class1:
class Class2:
pass
const Class1Alias = Class1
const Class1Class2Alias = Class1.Class2
const ExternalAlias = External
const ExternalClassAlias = External.Class
func test():
pass

View file

@ -0,0 +1,10 @@
const array: Array = [0]
const dictionary := {1: 2}
@warning_ignore("assert_always_true")
func test():
assert(array.is_read_only() == true)
assert(str(array) == '[0]')
assert(dictionary.is_read_only() == true)
assert(str(dictionary) == '{ 1: 2 }')
print('ok')

View file

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

View file

@ -0,0 +1,19 @@
func literal(x: float = 1):
print('x is ', x)
print('typeof x is ', typeof(x))
var inferring := 2
func inferred(x: float = inferring):
print('x is ', x)
print('typeof x is ', typeof(x))
var weakling = 3
func weak(x: float = weakling):
print('x is ', x)
print('typeof x is ', typeof(x))
func test():
literal()
inferred()
weak()
print('ok')

View file

@ -0,0 +1,8 @@
GDTEST_OK
x is 1
typeof x is 3
x is 2
typeof x is 3
x is 3
typeof x is 3
ok

View file

@ -0,0 +1,11 @@
class Foo extends Node:
func _init():
name = 'f'
var string: String = name
assert(typeof(string) == TYPE_STRING)
assert(string == 'f')
print('ok')
func test():
var foo := Foo.new()
foo.free()

View file

@ -0,0 +1,10 @@
# https://github.com/godotengine/godot/issues/70319
class InnerClass:
pass
func test():
var inner_ctor : Callable = InnerClass.new
print(inner_ctor)
var native_ctor : Callable = Node.new
print(native_ctor)

View file

@ -0,0 +1,3 @@
GDTEST_OK
GDScript::new
GDScriptNativeClass::new

View file

@ -0,0 +1,20 @@
extends Node
@onready var later_inferred := [1]
@onready var later_static: Array
@onready var later_static_with_init: Array = [1]
@onready var later_untyped = [1]
func test():
assert(typeof(later_inferred) == TYPE_ARRAY)
assert(later_inferred.size() == 0)
assert(typeof(later_static) == TYPE_ARRAY)
assert(later_static.size() == 0)
assert(typeof(later_static_with_init) == TYPE_ARRAY)
assert(later_static_with_init.size() == 0)
assert(typeof(later_untyped) == TYPE_NIL)
print("ok")

View file

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

View file

@ -0,0 +1,19 @@
# https://github.com/godotengine/godot/issues/48121
func test():
var x := Dictionary()
var y := Dictionary()
y[0]=1
y[1]=1
y[2]=1
print("TEST OTHER DICTIONARY: " + str(len(x)))
x.clear()
x = Dictionary().duplicate()
y = Dictionary().duplicate()
y[0]=1
y[1]=1
y[2]=1
print("TEST OTHER DICTIONARY: " + str(len(x)))
x.clear()
return

View file

@ -0,0 +1,3 @@
GDTEST_OK
TEST OTHER DICTIONARY: 0
TEST OTHER DICTIONARY: 0

View file

@ -0,0 +1,17 @@
# https://github.com/godotengine/godot/issues/62957
func test():
var string_dict = {}
string_dict["abc"] = 42
var stringname_dict = {}
stringname_dict[&"abc"] = 24
print("String key is TYPE_STRING: ", typeof(string_dict.keys()[0]) == TYPE_STRING)
print("StringName key is TYPE_STRING: ", typeof(stringname_dict.keys()[0]) == TYPE_STRING)
print("StringName gets String: ", string_dict.get(&"abc"))
print("String gets StringName: ", stringname_dict.get("abc"))
stringname_dict[&"abc"] = 42
# They compare equal because StringName keys are converted to String.
print("String Dictionary == StringName Dictionary: ", string_dict == stringname_dict)

View file

@ -0,0 +1,6 @@
GDTEST_OK
String key is TYPE_STRING: true
StringName key is TYPE_STRING: true
StringName gets String: 42
String gets StringName: 24
String Dictionary == StringName Dictionary: true

View file

@ -0,0 +1,17 @@
# https://github.com/godotengine/godot/issues/71177
func test():
builtin_method()
builtin_method_static()
print("done")
func builtin_method():
var pba := PackedByteArray()
@warning_ignore("return_value_discarded")
pba.resize(1) # Built-in validated.
func builtin_method_static():
var _pba := PackedByteArray()
@warning_ignore("return_value_discarded")
Vector2.from_angle(PI) # Static built-in validated.

View file

@ -0,0 +1,12 @@
# https://github.com/godotengine/godot/issues/89439
extends Node
signal my_signal
func async_func():
await my_signal
my_signal.emit()
func test():
async_func()
my_signal.emit()

View file

@ -0,0 +1 @@
GDTEST_OK

View file

@ -0,0 +1,22 @@
# https://github.com/godotengine/godot/issues/89439
signal my_signal
func foo():
print("Foo")
my_signal.emit()
func bar():
print("Bar")
func baz():
print("Baz")
func test():
@warning_ignore("return_value_discarded")
my_signal.connect(foo, CONNECT_ONE_SHOT)
@warning_ignore("return_value_discarded")
my_signal.connect(bar, CONNECT_ONE_SHOT)
@warning_ignore("return_value_discarded")
my_signal.connect(baz)
my_signal.emit()

View file

@ -0,0 +1,5 @@
GDTEST_OK
Foo
Baz
Bar
Baz

View file

@ -0,0 +1,17 @@
const Utils = preload("../../utils.notest.gd")
# GH-73843
@export_group("Resource")
# GH-78252
@export var test_1: int
@export_category("test_1")
@export var test_2: int
func test():
var resource := Resource.new()
prints("Not shadowed:", resource.get_class())
for property in get_property_list():
if str(property.name).begins_with("test_"):
Utils.print_property_extended_info(property, self)

View file

@ -0,0 +1,8 @@
GDTEST_OK
Not shadowed: Resource
var test_1: int = 0
hint=NONE hint_string="" usage=DEFAULT|SCRIPT_VARIABLE class_name=&""
@export_category("test_1")
hint=NONE hint_string="" usage=CATEGORY class_name=&""
var test_2: int = 0
hint=NONE hint_string="" usage=DEFAULT|SCRIPT_VARIABLE class_name=&""

View file

@ -0,0 +1,14 @@
# GH-80157
extends Node
func f():
pass
signal s()
func test():
print(f)
print(s)
print(get_child)
print(ready)

View file

@ -0,0 +1,5 @@
GDTEST_OK
Node::f
Node::[signal]s
Node::get_child
Node::[signal]ready

View file

@ -0,0 +1,40 @@
func test():
print("Test range.")
for e: float in range(2, 5):
var elem := e
prints(var_to_str(e), var_to_str(elem))
print("Test int.")
for e: float in 3:
var elem := e
prints(var_to_str(e), var_to_str(elem))
print("Test untyped int array.")
var a1 := [10, 20, 30]
for e: float in a1:
var elem := e
prints(var_to_str(e), var_to_str(elem))
print("Test typed int array.")
var a2: Array[int] = [10, 20, 30]
for e: float in a2:
var elem := e
prints(var_to_str(e), var_to_str(elem))
# GH-82021
print("Test implicitly typed array literal.")
for e: float in [100, 200, 300]:
var elem := e
prints(var_to_str(e), var_to_str(elem))
print("Test String-keys dictionary.")
var d1 := {a = 1, b = 2, c = 3}
for k: StringName in d1:
var key := k
prints(var_to_str(k), var_to_str(key))
print("Test RefCounted-keys dictionary.")
var d2 := {RefCounted.new(): 1, Resource.new(): 2, ConfigFile.new(): 3}
for k: RefCounted in d2:
var key := k
prints(k.get_class(), key.get_class())

View file

@ -0,0 +1,29 @@
GDTEST_OK
Test range.
2.0 2.0
3.0 3.0
4.0 4.0
Test int.
0.0 0.0
1.0 1.0
2.0 2.0
Test untyped int array.
10.0 10.0
20.0 20.0
30.0 30.0
Test typed int array.
10.0 10.0
20.0 20.0
30.0 30.0
Test implicitly typed array literal.
100.0 100.0
200.0 200.0
300.0 300.0
Test String-keys dictionary.
&"a" &"a"
&"b" &"b"
&"c" &"c"
Test RefCounted-keys dictionary.
RefCounted RefCounted
Resource Resource
ConfigFile ConfigFile

View file

@ -0,0 +1,51 @@
const constant_float = 1.0
const constant_int = 1
enum { enum_value = 1 }
class Iterator:
func _iter_init(_count):
return true
func _iter_next(_count):
return false
func _iter_get(_count) -> StringName:
return &'custom'
func test():
var hard_float := 1.0
var hard_int := 1
var hard_string := '0'
var hard_iterator := Iterator.new()
var variant_float: Variant = hard_float
var variant_int: Variant = hard_int
var variant_string: Variant = hard_string
var variant_iterator: Variant = hard_iterator
for i in 1.0:
print(typeof(i) == TYPE_FLOAT)
for i in 1:
print(typeof(i) == TYPE_INT)
for i in 'a':
print(typeof(i) == TYPE_STRING)
for i in Iterator.new():
print(typeof(i) == TYPE_STRING_NAME)
for i in hard_float:
print(typeof(i) == TYPE_FLOAT)
for i in hard_int:
print(typeof(i) == TYPE_INT)
for i in hard_string:
print(typeof(i) == TYPE_STRING)
for i in hard_iterator:
print(typeof(i) == TYPE_STRING_NAME)
for i in variant_float:
print(typeof(i) == TYPE_FLOAT)
for i in variant_int:
print(typeof(i) == TYPE_INT)
for i in variant_string:
print(typeof(i) == TYPE_STRING)
for i in variant_iterator:
print(typeof(i) == TYPE_STRING_NAME)
print('ok')

View file

@ -0,0 +1,14 @@
GDTEST_OK
true
true
true
true
true
true
true
true
true
true
true
true
ok

View file

@ -0,0 +1,10 @@
func test():
var node := Node.new()
var callable: Callable = node.free
callable.call()
print(node)
node = Node.new()
callable = node["free"]
callable.call()
print(node)

View file

@ -0,0 +1,3 @@
GDTEST_OK
<Freed Object>
<Freed Object>

View file

@ -0,0 +1,20 @@
func test():
var gdscr: = GDScript.new()
gdscr.source_code = '''
extends Resource
func test() -> void:
prints("Outer")
var inner = InnerClass.new()
class InnerClass:
func _init() -> void:
prints("Inner")
'''
@warning_ignore("return_value_discarded")
gdscr.reload()
var inst = gdscr.new()
@warning_ignore("unsafe_method_access")
inst.test()

View file

@ -0,0 +1,3 @@
GDTEST_OK
Outer
Inner

View file

@ -0,0 +1,15 @@
# https://github.com/godotengine/godot/issues/68184
var node: Node:
get:
return node
set(n):
node = n
func test():
node = Node.new()
node.free()
if !is_instance_valid(node):
print("It is freed")

View file

@ -0,0 +1,2 @@
GDTEST_OK
It is freed

View file

@ -0,0 +1,18 @@
# https://github.com/godotengine/godot/issues/93952
func foo():
pass
func test():
var a: int
var lambda_self := func (x: int) -> void:
foo()
print(a, x)
print(lambda_self.get_argument_count()) # Should print 1.
var lambda_non_self := func (x: int) -> void:
print(a, x)
print(lambda_non_self.get_argument_count()) # Should print 1.

View file

@ -0,0 +1,26 @@
# GH-92217
# TODO: Add more tests.
static var static_var: int:
set(value):
prints("set static_var", value)
get:
print("get static_var")
return 0
var member_var: int:
set(value):
prints("set member_var", value)
get:
print("get member_var")
return 0
func test():
var lambda := func ():
var _tmp := static_var
_tmp = member_var
static_var = 1
member_var = 1
lambda.call()

View file

@ -0,0 +1,5 @@
GDTEST_OK
get static_var
get member_var
set static_var 1
set member_var 1

View file

@ -0,0 +1,21 @@
# https://github.com/godotengine/godot/issues/94074
func foo():
pass
func test():
var lambda_self := func test() -> void:
foo()
var anon_lambda_self := func() -> void:
foo()
print(lambda_self.get_method()) # Should print "test".
print(anon_lambda_self.get_method()) # Should print "<anonymous lambda>".
var lambda_non_self := func test() -> void:
pass
var anon_lambda_non_self := func() -> void:
pass
print(lambda_non_self.get_method()) # Should print "test".
print(anon_lambda_non_self.get_method()) # Should print "<anonymous lambda>".

View file

@ -0,0 +1,5 @@
GDTEST_OK
test
<anonymous lambda>
test
<anonymous lambda>

View file

@ -0,0 +1,23 @@
var member = "foo"
func bar():
print("bar")
func test():
var lambda1 = func():
print(member)
lambda1.call()
var lambda2 = func():
var nested = func():
print(member)
nested.call()
lambda2.call()
var lambda3 = func():
bar()
lambda3.call()
var lambda4 = func():
return self
print(lambda4.call() == self)

View file

@ -0,0 +1,5 @@
GDTEST_OK
foo
foo
bar
true

View file

@ -0,0 +1,4 @@
func test():
var dict = {}
dict.test = 1
print(dict.test)

View file

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

View file

@ -0,0 +1,6 @@
func test():
match null:
null:
print('null matched')
_:
pass

View file

@ -0,0 +1,2 @@
GDTEST_OK
null matched

View file

@ -0,0 +1,71 @@
var global := 0
func test():
var a = 0
var b = 1
match a:
0 when b == 0:
print("does not run" if true else "")
0 when b == 1:
print("guards work")
_:
print("does not run")
match a:
var a_bind when b == 0:
prints("a is", a_bind, "and b is 0")
var a_bind when b == 1:
prints("a is", a_bind, "and b is 1")
_:
print("does not run")
match a:
var a_bind when a_bind < 0:
print("a is less than zero")
var a_bind when a_bind == 0:
print("a is equal to zero")
_:
print("a is more than zero")
match [1, 2, 3]:
[1, 2, var element] when element == 0:
print("does not run")
[1, 2, var element] when element == 3:
print("3rd element is 3")
match a:
_ when b == 0:
print("does not run")
_ when b == 1:
print("works with wildcard too.")
_:
print("does not run")
match a:
0, 1 when b == 0:
print("does not run")
0, 1 when b == 1:
print("guard with multiple patterns")
_:
print("does not run")
match a:
0 when b == 0:
print("does not run")
0:
print("regular pattern after guard mismatch")
match a:
1 when side_effect():
print("should not run the side effect call")
0 when side_effect():
print("will run the side effect call, but not this")
_:
assert(global == 1)
print("side effect only ran once")
func side_effect():
print("side effect")
global += 1
return false

View file

@ -0,0 +1,10 @@
GDTEST_OK
guards work
a is 0 and b is 1
a is equal to zero
3rd element is 3
works with wildcard too.
guard with multiple patterns
regular pattern after guard mismatch
side effect
side effect only ran once

View file

@ -0,0 +1,83 @@
class_name TestMemberInfo
class MyClass:
pass
enum MyEnum {}
const Utils = preload("../../utils.notest.gd")
static var test_static_var_untyped
static var test_static_var_weak_null = null
static var test_static_var_weak_int = 1
static var test_static_var_hard_int: int
var test_var_untyped
var test_var_weak_null = null
var test_var_weak_int = 1
@export var test_var_weak_int_exported = 1
var test_var_weak_variant_type = TYPE_NIL
@export var test_var_weak_variant_type_exported = TYPE_NIL
var test_var_hard_variant: Variant
var test_var_hard_int: int
var test_var_hard_variant_type: Variant.Type
@export var test_var_hard_variant_type_exported: Variant.Type
var test_var_hard_node_process_mode: Node.ProcessMode
@warning_ignore("enum_variable_without_default")
var test_var_hard_my_enum: MyEnum
var test_var_hard_array: Array
var test_var_hard_array_int: Array[int]
var test_var_hard_array_variant_type: Array[Variant.Type]
var test_var_hard_array_node_process_mode: Array[Node.ProcessMode]
var test_var_hard_array_my_enum: Array[MyEnum]
var test_var_hard_array_resource: Array[Resource]
var test_var_hard_array_this: Array[TestMemberInfo]
var test_var_hard_array_my_class: Array[MyClass]
var test_var_hard_resource: Resource
var test_var_hard_this: TestMemberInfo
var test_var_hard_my_class: MyClass
static func test_static_func(): pass
func test_func_implicit_void(): pass
func test_func_explicit_void() -> void: pass
func test_func_weak_null(): return null
func test_func_weak_int(): return 1
func test_func_hard_variant() -> Variant: return null
func test_func_hard_int() -> int: return 1
func test_func_args_1(_a: int, _b: Array[int], _c: int = 1, _d = 2): pass
func test_func_args_2(_a = 1, _b = _a, _c = [2], _d = 3): pass
signal test_signal_1()
signal test_signal_2(a: Variant, b)
signal test_signal_3(a: int, b: Array[int])
signal test_signal_4(a: Variant.Type, b: Array[Variant.Type])
signal test_signal_5(a: MyEnum, b: Array[MyEnum])
signal test_signal_6(a: Resource, b: Array[Resource])
signal test_signal_7(a: TestMemberInfo, b: Array[TestMemberInfo])
signal test_signal_8(a: MyClass, b: Array[MyClass])
func no_exec():
test_signal_1.emit()
test_signal_2.emit()
test_signal_3.emit()
test_signal_4.emit()
test_signal_5.emit()
test_signal_6.emit()
test_signal_7.emit()
test_signal_8.emit()
func test():
var script: Script = get_script()
for property in script.get_property_list():
if str(property.name).begins_with("test_"):
print(Utils.get_property_signature(property, null, true))
for property in get_property_list():
if str(property.name).begins_with("test_"):
print(Utils.get_property_signature(property))
for method in get_method_list():
if str(method.name).begins_with("test_"):
print(Utils.get_method_signature(method))
for method in get_signal_list():
if str(method.name).begins_with("test_"):
print(Utils.get_method_signature(method, true))

View file

@ -0,0 +1,45 @@
GDTEST_OK
static var test_static_var_untyped: Variant
static var test_static_var_weak_null: Variant
static var test_static_var_weak_int: Variant
static var test_static_var_hard_int: int
var test_var_untyped: Variant
var test_var_weak_null: Variant
var test_var_weak_int: Variant
var test_var_weak_int_exported: int
var test_var_weak_variant_type: Variant
var test_var_weak_variant_type_exported: Variant.Type
var test_var_hard_variant: Variant
var test_var_hard_int: int
var test_var_hard_variant_type: Variant.Type
var test_var_hard_variant_type_exported: Variant.Type
var test_var_hard_node_process_mode: Node.ProcessMode
var test_var_hard_my_enum: TestMemberInfo.MyEnum
var test_var_hard_array: Array
var test_var_hard_array_int: Array[int]
var test_var_hard_array_variant_type: Array[Variant.Type]
var test_var_hard_array_node_process_mode: Array[Node.ProcessMode]
var test_var_hard_array_my_enum: Array[TestMemberInfo.MyEnum]
var test_var_hard_array_resource: Array[Resource]
var test_var_hard_array_this: Array[TestMemberInfo]
var test_var_hard_array_my_class: Array[RefCounted]
var test_var_hard_resource: Resource
var test_var_hard_this: TestMemberInfo
var test_var_hard_my_class: RefCounted
static func test_static_func() -> void
func test_func_implicit_void() -> void
func test_func_explicit_void() -> void
func test_func_weak_null() -> Variant
func test_func_weak_int() -> Variant
func test_func_hard_variant() -> Variant
func test_func_hard_int() -> int
func test_func_args_1(_a: int, _b: Array[int], _c: int = 1, _d: Variant = 2) -> void
func test_func_args_2(_a: Variant = 1, _b: Variant = null, _c: Variant = null, _d: Variant = 3) -> void
signal test_signal_1()
signal test_signal_2(a: Variant, b: Variant)
signal test_signal_3(a: int, b: Array[int])
signal test_signal_4(a: Variant.Type, b: Array[Variant.Type])
signal test_signal_5(a: TestMemberInfo.MyEnum, b: Array[TestMemberInfo.MyEnum])
signal test_signal_6(a: Resource, b: Array[Resource])
signal test_signal_7(a: TestMemberInfo, b: Array[TestMemberInfo])
signal test_signal_8(a: RefCounted, b: Array[RefCounted])

View file

@ -0,0 +1,49 @@
# GH-82169
const Utils = preload("../../utils.notest.gd")
class A:
static var test_static_var_a1
static var test_static_var_a2
var test_var_a1
var test_var_a2
static func test_static_func_a1(): pass
static func test_static_func_a2(): pass
func test_func_a1(): pass
func test_func_a2(): pass
@warning_ignore("unused_signal")
signal test_signal_a1()
@warning_ignore("unused_signal")
signal test_signal_a2()
class B extends A:
static var test_static_var_b1
static var test_static_var_b2
var test_var_b1
var test_var_b2
static func test_static_func_b1(): pass
static func test_static_func_b2(): pass
func test_func_b1(): pass
func test_func_b2(): pass
@warning_ignore("unused_signal")
signal test_signal_b1()
@warning_ignore("unused_signal")
signal test_signal_b2()
func test():
var b := B.new()
for property in (B as GDScript).get_property_list():
if str(property.name).begins_with("test_"):
print(Utils.get_property_signature(property, null, true))
print("---")
for property in b.get_property_list():
if str(property.name).begins_with("test_"):
print(Utils.get_property_signature(property))
print("---")
for method in b.get_method_list():
if str(method.name).begins_with("test_"):
print(Utils.get_method_signature(method))
print("---")
for method in b.get_signal_list():
if str(method.name).begins_with("test_"):
print(Utils.get_method_signature(method, true))

View file

@ -0,0 +1,24 @@
GDTEST_OK
static var test_static_var_a1: Variant
static var test_static_var_a2: Variant
static var test_static_var_b1: Variant
static var test_static_var_b2: Variant
---
var test_var_b1: Variant
var test_var_b2: Variant
var test_var_a1: Variant
var test_var_a2: Variant
---
static func test_static_func_b1() -> void
static func test_static_func_b2() -> void
func test_func_b1() -> void
func test_func_b2() -> void
static func test_static_func_a1() -> void
static func test_static_func_a2() -> void
func test_func_a1() -> void
func test_func_a2() -> void
---
signal test_signal_b1()
signal test_signal_b2()
signal test_signal_a1()
signal test_signal_a2()

View file

@ -0,0 +1,48 @@
class MyClass:
const TEST = 10
enum MyEnum {A, B, C}
const Utils = preload("../../utils.notest.gd")
const Other = preload("./metatypes.notest.gd")
var test_native := JSON
var test_script := Other
var test_class := MyClass
var test_enum := MyEnum
func check_gdscript_native_class(value: Variant) -> void:
print(var_to_str(value).get_slice(",", 0).trim_prefix("Object("))
func check_gdscript(value: GDScript) -> void:
print(value.get_class())
func check_enum(value: Dictionary) -> void:
print(value)
func test():
for property in get_property_list():
if str(property.name).begins_with("test_"):
print(Utils.get_property_signature(property))
print("---")
check_gdscript_native_class(test_native)
check_gdscript(test_script)
check_gdscript(test_class)
check_enum(test_enum)
print("---")
print(test_native.stringify([]))
print(test_script.TEST)
print(test_class.TEST)
print(test_enum.keys())
print("---")
# Some users add unnecessary type hints to `const`-`preload`, which removes metatypes.
# For **constant** `GDScript` we still check the class members, despite the wider type.
const ScriptNoMeta: GDScript = Other
const ClassNoMeta: GDScript = MyClass
var a := ScriptNoMeta.TEST
var b := ClassNoMeta.TEST
print(a)
print(b)

View file

@ -0,0 +1 @@
const TEST = 100

View file

@ -0,0 +1,18 @@
GDTEST_OK
var test_native: GDScriptNativeClass
var test_script: GDScript
var test_class: GDScript
var test_enum: Dictionary
---
GDScriptNativeClass
GDScript
GDScript
{ "A": 0, "B": 1, "C": 2 }
---
[]
100
10
["A", "B", "C"]
---
100
10

View file

@ -0,0 +1,6 @@
# GH-73213
func test():
var object := Object.new() # Not `Object()`.
print(object.get_class())
object.free()

View file

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

View file

@ -0,0 +1,49 @@
class MyIterator:
var count: int
func _init(p_count: int) -> void:
count = p_count
func _iter_init(arg: Array) -> bool:
prints("_iter_init", arg)
arg[0] = 0
return arg[0] < count
func _iter_next(arg: Array) -> bool:
prints("_iter_next", arg)
arg[0] += 1
return arg[0] < count
func _iter_get(arg: Variant) -> Variant:
prints("_iter_get", arg)
return arg
func test():
var container := PackedDataContainer.new()
var _err := container.pack([{
id = 123,
node_path = ^"/some/path",
data = PackedByteArray(),
}])
for ref: PackedDataContainerRef in container:
for key: String in ref:
print(key)
print("===")
for ref: Variant in container:
for key: String in ref:
print(key)
print("===")
var hard_custom := MyIterator.new(3)
for x in hard_custom:
print(x)
print("===")
var weak_custom: Variant = MyIterator.new(3)
for x in weak_custom:
print(x)

View file

@ -0,0 +1,30 @@
GDTEST_OK
id
node_path
data
===
id
node_path
data
===
_iter_init [<null>]
_iter_get 0
0
_iter_next [0]
_iter_get 1
1
_iter_next [1]
_iter_get 2
2
_iter_next [2]
===
_iter_init [<null>]
_iter_get 0
0
_iter_next [0]
_iter_get 1
1
_iter_next [1]
_iter_get 2
2
_iter_next [2]

View file

@ -0,0 +1,18 @@
#GH-63329
class A extends Node:
@onready var a := get_value("a")
func get_value(var_name: String) -> String:
print(var_name)
return var_name
class B extends A:
@onready var b := get_value("b")
func _ready():
pass
func test():
var node := B.new()
node._ready()
node.free()

View file

@ -0,0 +1,25 @@
# https://github.com/godotengine/godot/pull/69620
var a: int = 1
func shadow_regular_assignment(a: Variant, b: Variant) -> void:
print(a)
print(self.a)
a = b
print(a)
print(self.a)
var v := Vector2(0.0, 0.0)
func shadow_subscript_assignment(v: Vector2, x: float) -> void:
print(v)
print(self.v)
v.x += x
print(v)
print(self.v)
func test():
shadow_regular_assignment('a', 'b')
shadow_subscript_assignment(Vector2(1.0, 1.0), 5.0)

View file

@ -0,0 +1,17 @@
GDTEST_OK
>> WARNING
>> Line: 5
>> SHADOWED_VARIABLE
>> The local function parameter "a" is shadowing an already-declared variable at line 3.
>> WARNING
>> Line: 15
>> SHADOWED_VARIABLE
>> The local function parameter "v" is shadowing an already-declared variable at line 13.
a
1
b
1
(1, 1)
(0, 0)
(6, 1)
(0, 0)

View file

@ -0,0 +1,35 @@
# https://github.com/godotengine/godot/issues/56702
func test():
const_default()
func_result_default()
# calling again will run the initializer again,
# as the default is not evaluated at time of defining the function (as in python)
# but every time the function is called (as in C++)
func_result_default()
lots_of_defaults("non-optional")
# somewhat obscure feature: referencing earlier parameters
ref_default("non-optional", 42)
func const_default(param=42):
print(param)
var default_val := 0
func get_default():
default_val += 1
return default_val
func func_result_default(param=get_default()):
print(param)
func lots_of_defaults(nondefault, one=1, two=2, three=get_default()):
prints(nondefault, one, two, three)
func ref_default(nondefault1, nondefault2, defa=nondefault1, defb=nondefault2 - 1):
prints(nondefault1, nondefault2, defa, defb)

View file

@ -0,0 +1,6 @@
GDTEST_OK
42
1
2
non-optional 1 2 3
non-optional 42 non-optional 41

View file

@ -0,0 +1,11 @@
#GDTEST_OK
var prop: int = 0:
get:
return prop
set(value):
prop = value % 7
func test():
for i in 7:
prop += 1
print(prop)

View file

@ -0,0 +1,8 @@
GDTEST_OK
1
2
3
4
5
6
0

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