diff options
Diffstat (limited to 'modules/gdscript/tests/scripts/analyzer/features')
84 files changed, 1075 insertions, 17 deletions
diff --git a/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd new file mode 100644 index 0000000000..eb0003eed8 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd @@ -0,0 +1,15 @@ + +var m_string_array: Array[String] = [&"abc"] +var m_stringname_array: Array[StringName] = ["abc"] + +func test(): +	print(m_string_array) +	print(m_stringname_array) + +	# Converted to String when initialized +	var string_array: Array[String] = [&"abc"] +	print(string_array) + +	# Converted to StringName when initialized +	var stringname_array: Array[StringName] = ["abc"] +	print(stringname_array) diff --git a/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out new file mode 100644 index 0000000000..09c199bde1 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out @@ -0,0 +1,5 @@ +GDTEST_OK +["abc"] +[&"abc"] +["abc"] +[&"abc"] diff --git a/modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.gd b/modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.gd new file mode 100644 index 0000000000..2d2c2bef19 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.gd @@ -0,0 +1,19 @@ +func test(): +	var one_0 = 0 +	one_0 = 1 +	var one_1 := one_0 +	print(one_1) + +	var two: Variant = 0 +	two += 2 +	print(two) + +	var three_0: Variant = 1 +	var three_1: int = 2 +	three_0 += three_1 +	print(three_0) + +	var four_0: int = 3 +	var four_1: Variant = 1 +	four_0 += four_1 +	print(four_0) diff --git a/modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.out b/modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.out new file mode 100644 index 0000000000..7536c38490 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/assignments_with_untyped.out @@ -0,0 +1,5 @@ +GDTEST_OK +1 +2 +3 +4 diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.gd new file mode 100644 index 0000000000..a94487d989 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.gd @@ -0,0 +1,13 @@ +const A: = preload("base_outer_resolution_a.notest.gd") +const B: = preload("base_outer_resolution_b.notest.gd") +const C: = preload("base_outer_resolution_c.notest.gd") + +const Extend: = preload("base_outer_resolution_extend.notest.gd") + +func test() -> void: +	Extend.test_a(A.new()) +	Extend.test_b(B.new()) +	Extend.InnerClass.test_c(C.new()) +	Extend.InnerClass.InnerInnerClass.test_a_b_c(A.new(), B.new(), C.new()) +	Extend.InnerClass.InnerInnerClass.test_enum(C.TestEnum.HELLO_WORLD) +	Extend.InnerClass.InnerInnerClass.test_a_prime(A.APrime.new()) diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.out b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.out new file mode 100644 index 0000000000..bd27bd31f6 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.out @@ -0,0 +1,7 @@ +GDTEST_OK +true +true +true +true +true +true diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_a.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_a.notest.gd new file mode 100644 index 0000000000..966c8bfc8f --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_a.notest.gd @@ -0,0 +1,2 @@ +class APrime: +	pass diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_b.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_b.notest.gd new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_b.notest.gd diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_base.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_base.notest.gd new file mode 100644 index 0000000000..666b147ced --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_base.notest.gd @@ -0,0 +1,4 @@ +const A: = preload("base_outer_resolution_a.notest.gd") + +class InnerClassInBase: +	const C: = preload("base_outer_resolution_c.notest.gd") diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_c.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_c.notest.gd new file mode 100644 index 0000000000..814be35314 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_c.notest.gd @@ -0,0 +1,3 @@ +enum TestEnum { +	HELLO_WORLD +} diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_extend.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_extend.notest.gd new file mode 100644 index 0000000000..fbd28779d4 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_extend.notest.gd @@ -0,0 +1,23 @@ +extends "base_outer_resolution_base.notest.gd" + +const B: = preload("base_outer_resolution_b.notest.gd") + +static func test_a(a: A) -> void: +	print(a is A) + +static func test_b(b: B) -> void: +	print(b is B) + +class InnerClass extends InnerClassInBase: +	static func test_c(c: C) -> void: +		print(c is C) + +	class InnerInnerClass: +		static func test_a_b_c(a: A, b: B, c: C) -> void: +			print(a is A and b is B and c is C) + +		static func test_enum(test_enum: C.TestEnum) -> void: +			print(test_enum == C.TestEnum.HELLO_WORLD) + +		static func test_a_prime(a_prime: A.APrime) -> void: +			print(a_prime is A.APrime) diff --git a/modules/gdscript/tests/scripts/analyzer/features/cast_non_null.gd b/modules/gdscript/tests/scripts/analyzer/features/cast_non_null.gd new file mode 100644 index 0000000000..ba1b198cbf --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/cast_non_null.gd @@ -0,0 +1,5 @@ +# https://github.com/godotengine/godot/issues/69504#issuecomment-1345725988 + +func test(): +	print("cast to Variant == null: ", 1 as Variant == null) +	print("cast to Object == null: ", self as Object == null) diff --git a/modules/gdscript/tests/scripts/analyzer/features/cast_non_null.out b/modules/gdscript/tests/scripts/analyzer/features/cast_non_null.out new file mode 100644 index 0000000000..541de99b8e --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/cast_non_null.out @@ -0,0 +1,3 @@ +GDTEST_OK +cast to Variant == null: false +cast to Object == null: false diff --git a/modules/gdscript/tests/scripts/analyzer/features/class_from_parent.gd b/modules/gdscript/tests/scripts/analyzer/features/class_from_parent.gd index 30e7deb05a..7c846c59bd 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/class_from_parent.gd +++ b/modules/gdscript/tests/scripts/analyzer/features/class_from_parent.gd @@ -1,19 +1,19 @@  class A: -    var x = 3 +	var x = 3  class B: -    var x = 4 +	var x = 4  class C: -    var x = 5 +	var x = 5  class Test: -    var a = A.new() -    var b: B = B.new() -    var c := C.new() +	var a = A.new() +	var b: B = B.new() +	var c := C.new()  func test(): -    var test_instance := Test.new() -    prints(test_instance.a.x) -    prints(test_instance.b.x) -    prints(test_instance.c.x) +	var test_instance := Test.new() +	prints(test_instance.a.x) +	prints(test_instance.b.x) +	prints(test_instance.c.x) diff --git a/modules/gdscript/tests/scripts/analyzer/features/default_arg_convertable.gd b/modules/gdscript/tests/scripts/analyzer/features/default_arg_convertable.gd new file mode 100644 index 0000000000..d0d04897e0 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/default_arg_convertable.gd @@ -0,0 +1,6 @@ +func check(arg: float = 3): +	return typeof(arg) == typeof(3.0) + +func test(): +	if check(): +		print('ok') diff --git a/modules/gdscript/tests/scripts/analyzer/features/default_arg_convertable.out b/modules/gdscript/tests/scripts/analyzer/features/default_arg_convertable.out new file mode 100644 index 0000000000..1b47ed10dc --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/default_arg_convertable.out @@ -0,0 +1,2 @@ +GDTEST_OK +ok diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_access_types.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_access_types.gd new file mode 100644 index 0000000000..9bc08f2dc5 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_access_types.gd @@ -0,0 +1,29 @@ +class_name EnumAccessOuterClass + +class InnerClass: +	enum MyEnum { V0, V2, V1 } + +	static func print_enums(): +		print("Inner - Inner") +		print(MyEnum.V0, MyEnum.V1, MyEnum.V2) +		print(InnerClass.MyEnum.V0, InnerClass.MyEnum.V1, InnerClass.MyEnum.V2) +		print(EnumAccessOuterClass.InnerClass.MyEnum.V0, EnumAccessOuterClass.InnerClass.MyEnum.V1, EnumAccessOuterClass.InnerClass.MyEnum.V2) + +		print("Inner - Outer") +		print(EnumAccessOuterClass.MyEnum.V0, EnumAccessOuterClass.MyEnum.V1, EnumAccessOuterClass.MyEnum.V2) + + +enum MyEnum { V0, V1, V2 } + +func print_enums(): +	print("Outer - Outer") +	print(MyEnum.V0, MyEnum.V1, MyEnum.V2) +	print(EnumAccessOuterClass.MyEnum.V0, EnumAccessOuterClass.MyEnum.V1, EnumAccessOuterClass.MyEnum.V2) + +	print("Outer - Inner") +	print(InnerClass.MyEnum.V0, InnerClass.MyEnum.V1, InnerClass.MyEnum.V2) +	print(EnumAccessOuterClass.InnerClass.MyEnum.V0, EnumAccessOuterClass.InnerClass.MyEnum.V1, EnumAccessOuterClass.InnerClass.MyEnum.V2) + +func test(): +	print_enums() +	InnerClass.print_enums() diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_access_types.out b/modules/gdscript/tests/scripts/analyzer/features/enum_access_types.out new file mode 100644 index 0000000000..02e2e2b396 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_access_types.out @@ -0,0 +1,13 @@ +GDTEST_OK +Outer - Outer +012 +012 +Outer - Inner +021 +021 +Inner - Inner +021 +021 +021 +Inner - Outer +012 diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_as_const.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_as_const.gd new file mode 100644 index 0000000000..2ce588373b --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_as_const.gd @@ -0,0 +1,29 @@ +class Outer: +	enum OuterEnum { OuterValue = 3 } +	const OuterConst := OuterEnum + +	class Inner: +		enum InnerEnum { InnerValue = 7 } +		const InnerConst := InnerEnum + +		static func test() -> void: +			print(OuterEnum.size()); +			print(OuterEnum.OuterValue); +			print(OuterConst.size()); +			print(OuterConst.OuterValue); +			print(Outer.OuterEnum.size()); +			print(Outer.OuterEnum.OuterValue); +			print(Outer.OuterConst.size()); +			print(Outer.OuterConst.OuterValue); + +			print(InnerEnum.size()); +			print(InnerEnum.InnerValue); +			print(InnerConst.size()); +			print(InnerConst.InnerValue); +			print(Inner.InnerEnum.size()); +			print(Inner.InnerEnum.InnerValue); +			print(Inner.InnerConst.size()); +			print(Inner.InnerConst.InnerValue); + +func test(): +	Outer.Inner.test() diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_as_const.out b/modules/gdscript/tests/scripts/analyzer/features/enum_as_const.out new file mode 100644 index 0000000000..e049f85b6e --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_as_const.out @@ -0,0 +1,17 @@ +GDTEST_OK +1 +3 +1 +3 +1 +3 +1 +3 +1 +7 +1 +7 +1 +7 +1 +7 diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_duplicate_into_dict.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_duplicate_into_dict.gd new file mode 100644 index 0000000000..3076e7069f --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_duplicate_into_dict.gd @@ -0,0 +1,13 @@ +enum Enum {V1, V2} + +func test(): +	var enumAsDict : Dictionary = Enum.duplicate() +	var enumAsVariant = Enum.duplicate() +	print(Enum.has("V1")) +	print(enumAsDict.has("V1")) +	print(enumAsVariant.has("V1")) +	enumAsDict.clear() +	enumAsVariant.clear() +	print(Enum.has("V1")) +	print(enumAsDict.has("V1")) +	print(enumAsVariant.has("V1")) diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_duplicate_into_dict.out b/modules/gdscript/tests/scripts/analyzer/features/enum_duplicate_into_dict.out new file mode 100644 index 0000000000..a41924d0c9 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_duplicate_into_dict.out @@ -0,0 +1,7 @@ +GDTEST_OK +true +true +true +true +false +false diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_from_base.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_from_base.gd new file mode 100644 index 0000000000..b3f9941903 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_from_base.gd @@ -0,0 +1,13 @@ +class A: +	enum Named { VALUE_A, VALUE_B, VALUE_C = 42 } + +class B extends A: +	var a = Named.VALUE_A +	var b = Named.VALUE_B +	var c = Named.VALUE_C + +func test(): +	var test_instance = B.new() +	prints("a", test_instance.a, test_instance.a == A.Named.VALUE_A) +	prints("b", test_instance.b, test_instance.b == A.Named.VALUE_B) +	prints("c", test_instance.c, test_instance.c == B.Named.VALUE_C) diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_from_parent.out b/modules/gdscript/tests/scripts/analyzer/features/enum_from_base.out index c160839da3..c160839da3 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/enum_from_parent.out +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_from_base.out diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_from_parent.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_from_outer.gd index 5f57c5b8c2..4d6852a9be 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/enum_from_parent.gd +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_from_outer.gd @@ -1,5 +1,3 @@ -extends Node -  enum Named { VALUE_A, VALUE_B, VALUE_C = 42 }  class Test: diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_from_outer.out b/modules/gdscript/tests/scripts/analyzer/features/enum_from_outer.out new file mode 100644 index 0000000000..c160839da3 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_from_outer.out @@ -0,0 +1,4 @@ +GDTEST_OK +a 0 true +b 1 true +c 42 true diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_function_typecheck.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_function_typecheck.gd new file mode 100644 index 0000000000..8a4e89d0d6 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_function_typecheck.gd @@ -0,0 +1,112 @@ +class_name EnumFunctionTypecheckOuterClass + +enum MyEnum { V0, V1, V2 } + +class InnerClass: +	enum MyEnum { V0, V2, V1 } + +	func inner_inner_no_class(e : MyEnum) -> MyEnum: +		print(e) +		return e + +	func inner_inner_class(e : InnerClass.MyEnum) -> InnerClass.MyEnum: +		print(e) +		return e + +	func inner_inner_class_class(e : EnumFunctionTypecheckOuterClass.InnerClass.MyEnum) -> EnumFunctionTypecheckOuterClass.InnerClass.MyEnum: +		print(e) +		return e + +	func inner_outer(e : EnumFunctionTypecheckOuterClass.MyEnum) -> EnumFunctionTypecheckOuterClass.MyEnum: +		print(e) +		return e + +	func test(): +		var _d +		print("Inner") + +		var o := EnumFunctionTypecheckOuterClass.new() + +		_d = o.outer_outer_no_class(EnumFunctionTypecheckOuterClass.MyEnum.V1) +		print() +		_d = o.outer_outer_class(EnumFunctionTypecheckOuterClass.MyEnum.V1) +		print() +		_d = o.outer_inner_class(MyEnum.V1) +		_d = o.outer_inner_class(InnerClass.MyEnum.V1) +		_d = o.outer_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +		print() +		_d = o.outer_inner_class_class(MyEnum.V1) +		_d = o.outer_inner_class_class(InnerClass.MyEnum.V1) +		_d = o.outer_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +		print() +		print() + + +		_d = inner_inner_no_class(MyEnum.V1) +		_d = inner_inner_no_class(InnerClass.MyEnum.V1) +		_d = inner_inner_no_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +		print() +		_d = inner_inner_class(MyEnum.V1) +		_d = inner_inner_class(InnerClass.MyEnum.V1) +		_d = inner_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +		print() +		_d = inner_inner_class_class(MyEnum.V1) +		_d = inner_inner_class_class(InnerClass.MyEnum.V1) +		_d = inner_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +		print() +		_d = inner_outer(EnumFunctionTypecheckOuterClass.MyEnum.V1) +		print() +		print() + + +func outer_outer_no_class(e : MyEnum) -> MyEnum: +	print(e) +	return e + +func outer_outer_class(e : EnumFunctionTypecheckOuterClass.MyEnum) -> EnumFunctionTypecheckOuterClass.MyEnum: +	print(e) +	return e + +func outer_inner_class(e : InnerClass.MyEnum) -> InnerClass.MyEnum: +	print(e) +	return e + +func outer_inner_class_class(e : EnumFunctionTypecheckOuterClass.InnerClass.MyEnum) -> EnumFunctionTypecheckOuterClass.InnerClass.MyEnum: +	print(e) +	return e + +func test(): +	var _d +	print("Outer") + +	_d = outer_outer_no_class(MyEnum.V1) +	_d = outer_outer_no_class(EnumFunctionTypecheckOuterClass.MyEnum.V1) +	print() +	_d = outer_outer_class(MyEnum.V1) +	_d = outer_outer_class(EnumFunctionTypecheckOuterClass.MyEnum.V1) +	print() +	_d = outer_inner_class(InnerClass.MyEnum.V1) +	_d = outer_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +	print() +	_d = outer_inner_class_class(InnerClass.MyEnum.V1) +	_d = outer_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +	print() +	print() + +	var i := EnumFunctionTypecheckOuterClass.InnerClass.new() + +	_d = i.inner_inner_no_class(InnerClass.MyEnum.V1) +	_d = i.inner_inner_no_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +	print() +	_d = i.inner_inner_class(InnerClass.MyEnum.V1) +	_d = i.inner_inner_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +	print() +	_d = i.inner_inner_class_class(InnerClass.MyEnum.V1) +	_d = i.inner_inner_class_class(EnumFunctionTypecheckOuterClass.InnerClass.MyEnum.V1) +	print() +	_d = i.inner_outer(MyEnum.V1) +	_d = i.inner_outer(EnumFunctionTypecheckOuterClass.MyEnum.V1) +	print() +	print() + +	i.test() diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_function_typecheck.out b/modules/gdscript/tests/scripts/analyzer/features/enum_function_typecheck.out new file mode 100644 index 0000000000..2e3ce1aa10 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_function_typecheck.out @@ -0,0 +1,55 @@ +GDTEST_OK +Outer +1 +1 + +1 +1 + +2 +2 + +2 +2 + + +2 +2 + +2 +2 + +2 +2 + +1 +1 + + +Inner +1 + +1 + +2 +2 +2 + +2 +2 +2 + + +2 +2 +2 + +2 +2 +2 + +2 +2 +2 + +1 diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_named_no_shadow.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_named_no_shadow.gd new file mode 100644 index 0000000000..b97d9bbb6b --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_named_no_shadow.gd @@ -0,0 +1,16 @@ +const A := 1 +enum { B } +enum NamedEnum { C } + +class Parent: +	const D := 2 +	enum { E } +	enum NamedEnum2 { F } + +class Child extends Parent: +	enum TestEnum { A, B, C, D, E, F, Node, Object, Child, Parent} + +func test(): +	print(A, B, NamedEnum.C, Parent.D, Parent.E, Parent.NamedEnum2.F) +	print(Child.TestEnum.A, Child.TestEnum.B, Child.TestEnum.C, Child.TestEnum.D, Child.TestEnum.E, Child.TestEnum.F) +	print(Child.TestEnum.Node, Child.TestEnum.Object, Child.TestEnum.Child, Child.TestEnum.Parent) diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_named_no_shadow.out b/modules/gdscript/tests/scripts/analyzer/features/enum_named_no_shadow.out new file mode 100644 index 0000000000..864ba2a549 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_named_no_shadow.out @@ -0,0 +1,4 @@ +GDTEST_OK +100200 +012345 +6789 diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_native_access_types.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_native_access_types.gd new file mode 100644 index 0000000000..6a0a1e1969 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_native_access_types.gd @@ -0,0 +1,19 @@ +func print_enum(e : TileSet.TileShape) -> TileSet.TileShape: +	print(e) +	return e + +func test(): +	var v : TileSet.TileShape +	v = TileSet.TILE_SHAPE_SQUARE +	v = print_enum(v) +	v = print_enum(TileSet.TILE_SHAPE_SQUARE) +	v = TileSet.TileShape.TILE_SHAPE_SQUARE +	v = print_enum(v) +	v = print_enum(TileSet.TileShape.TILE_SHAPE_SQUARE) + +	v = TileSet.TILE_SHAPE_ISOMETRIC +	v = print_enum(v) +	v = print_enum(TileSet.TILE_SHAPE_ISOMETRIC) +	v = TileSet.TileShape.TILE_SHAPE_ISOMETRIC +	v = print_enum(v) +	v = print_enum(TileSet.TileShape.TILE_SHAPE_ISOMETRIC) diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_native_access_types.out b/modules/gdscript/tests/scripts/analyzer/features/enum_native_access_types.out new file mode 100644 index 0000000000..1126dcc6ec --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_native_access_types.out @@ -0,0 +1,9 @@ +GDTEST_OK +0 +0 +0 +0 +1 +1 +1 +1 diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_typecheck_inner_class.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_typecheck_inner_class.gd new file mode 100644 index 0000000000..b05ae82048 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_typecheck_inner_class.gd @@ -0,0 +1,86 @@ +class_name EnumTypecheckOuterClass + +enum MyEnum { V0, V1, V2 } + +class InnerClass: +	enum MyEnum { V0, V2, V1 } + +	static func test_inner_from_inner(): +		print("Inner - Inner") +		var e1 : MyEnum +		var e2 : InnerClass.MyEnum +		var e3 : EnumTypecheckOuterClass.InnerClass.MyEnum + +		print("Self ", e1, e2, e3) +		e1 = MyEnum.V1 +		e2 = MyEnum.V1 +		e3 = MyEnum.V1 +		print("MyEnum ", e1, e2, e3) +		e1 = InnerClass.MyEnum.V1 +		e2 = InnerClass.MyEnum.V1 +		e3 = InnerClass.MyEnum.V1 +		print("Inner.MyEnum ", e1, e2, e3) +		e1 = EnumTypecheckOuterClass.InnerClass.MyEnum.V1 +		e2 = EnumTypecheckOuterClass.InnerClass.MyEnum.V1 +		e3 = EnumTypecheckOuterClass.InnerClass.MyEnum.V1 +		print("Outer.Inner.MyEnum ", e1, e2, e3) + +		e1 = e2 +		e1 = e3 +		e2 = e1 +		e2 = e3 +		e3 = e1 +		e3 = e2 + +		print() + +	static func test_outer_from_inner(): +		print("Inner - Outer") +		var e : EnumTypecheckOuterClass.MyEnum + +		e = EnumTypecheckOuterClass.MyEnum.V1 +		print("Outer.MyEnum ", e) + +		print() + +func test_outer_from_outer(): +	print("Outer - Outer") +	var e1 : MyEnum +	var e2 : EnumTypecheckOuterClass.MyEnum + +	print("Self ", e1, e2) +	e1 = MyEnum.V1 +	e2 = MyEnum.V1 +	print("Outer ", e1, e2) +	e1 = EnumTypecheckOuterClass.MyEnum.V1 +	e2 = EnumTypecheckOuterClass.MyEnum.V1 +	print("Outer.MyEnum ", e1, e2) + +	e1 = e2 +	e2 = e1 + +	print() + +func test_inner_from_outer(): +	print("Outer - Inner") +	var e1 : InnerClass.MyEnum +	var e2 : EnumTypecheckOuterClass.InnerClass.MyEnum + +	print("Inner ", e1, e2) +	e1 = InnerClass.MyEnum.V1 +	e2 = InnerClass.MyEnum.V1 +	print("Outer.Inner ", e1, e2) +	e1 = EnumTypecheckOuterClass.InnerClass.MyEnum.V1 +	e2 = EnumTypecheckOuterClass.InnerClass.MyEnum.V1 +	print("Outer.Inner.MyEnum ", e1, e2) + +	e1 = e2 +	e2 = e1 + +	print() + +func test(): +	test_outer_from_outer() +	test_inner_from_outer() +	InnerClass.test_outer_from_inner() +	InnerClass.test_inner_from_inner() diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_typecheck_inner_class.out b/modules/gdscript/tests/scripts/analyzer/features/enum_typecheck_inner_class.out new file mode 100644 index 0000000000..3b2dcade26 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_typecheck_inner_class.out @@ -0,0 +1,19 @@ +GDTEST_OK +Outer - Outer +Self 00 +Outer 11 +Outer.MyEnum 11 + +Outer - Inner +Inner 00 +Outer.Inner 22 +Outer.Inner.MyEnum 22 + +Inner - Outer +Outer.MyEnum 1 + +Inner - Inner +Self 000 +MyEnum 222 +Inner.MyEnum 222 +Outer.Inner.MyEnum 222 diff --git a/modules/gdscript/tests/scripts/analyzer/features/enum_unnamed_depend.gd b/modules/gdscript/tests/scripts/analyzer/features/enum_unnamed_depend.gd new file mode 100644 index 0000000000..f351fc1f7b --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_unnamed_depend.gd @@ -0,0 +1,7 @@ +enum { +	V1, +	V2 = V1, +} + +func test(): +	pass diff --git a/modules/gdscript/tests/scripts/analyzer/features/gdscript_to_preload.out b/modules/gdscript/tests/scripts/analyzer/features/enum_unnamed_depend.out index d73c5eb7cd..d73c5eb7cd 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/gdscript_to_preload.out +++ b/modules/gdscript/tests/scripts/analyzer/features/enum_unnamed_depend.out diff --git a/modules/gdscript/tests/scripts/analyzer/features/extend_abstract_class.gd b/modules/gdscript/tests/scripts/analyzer/features/extend_abstract_class.gd new file mode 100644 index 0000000000..95c3268130 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/extend_abstract_class.gd @@ -0,0 +1,12 @@ +class A extends CanvasItem: +	func _init(): +		pass + +class B extends A: +	pass + +class C extends CanvasItem: +	pass + +func test(): +	print('ok') diff --git a/modules/gdscript/tests/scripts/analyzer/features/extend_abstract_class.out b/modules/gdscript/tests/scripts/analyzer/features/extend_abstract_class.out new file mode 100644 index 0000000000..1b47ed10dc --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/extend_abstract_class.out @@ -0,0 +1,2 @@ +GDTEST_OK +ok diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.gd b/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.gd new file mode 100644 index 0000000000..0c740935b9 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.gd @@ -0,0 +1,6 @@ +const External = preload("external_enum_as_constant_external.notest.gd") +const MyEnum = External.MyEnum + +func test(): +	print(MyEnum.WAITING == 0) +	print(MyEnum.GODOT == 1) diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.out b/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.out new file mode 100644 index 0000000000..9d111a8322 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant.out @@ -0,0 +1,3 @@ +GDTEST_OK +true +true diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant_external.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant_external.notest.gd new file mode 100644 index 0000000000..24c1e41aab --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_enum_as_constant_external.notest.gd @@ -0,0 +1,4 @@ +enum MyEnum { +	WAITING, +	GODOT +} diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_inner_base.gd b/modules/gdscript/tests/scripts/analyzer/features/external_inner_base.gd new file mode 100644 index 0000000000..3f9bfe189c --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_inner_base.gd @@ -0,0 +1,4 @@ +extends "inner_base.gd".InnerA.InnerAB + +func test(): +	super.test() diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_inner_base.out b/modules/gdscript/tests/scripts/analyzer/features/external_inner_base.out new file mode 100644 index 0000000000..62f1383392 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_inner_base.out @@ -0,0 +1,3 @@ +GDTEST_OK +InnerA.InnerAB.test +InnerB.test diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.gd b/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.gd new file mode 100644 index 0000000000..18dca109fb --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.gd @@ -0,0 +1,7 @@ +const External = preload("external_inner_class_as_constant_external.notest.gd") +const ExternalInnerClass = External.InnerClass + +func test(): +	var inst_external: ExternalInnerClass = ExternalInnerClass.new() +	inst_external.x = 4.0 +	print(inst_external.x) diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.out b/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.out new file mode 100644 index 0000000000..15666c46ad --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant.out @@ -0,0 +1,2 @@ +GDTEST_OK +4 diff --git a/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant_external.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant_external.notest.gd new file mode 100644 index 0000000000..788c99d469 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/external_inner_class_as_constant_external.notest.gd @@ -0,0 +1,2 @@ +class InnerClass: +	var x: = 3.0 diff --git a/modules/gdscript/tests/scripts/analyzer/features/for_loop_on_variant.gd b/modules/gdscript/tests/scripts/analyzer/features/for_loop_on_variant.gd new file mode 100644 index 0000000000..7b74be6f2c --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/for_loop_on_variant.gd @@ -0,0 +1,15 @@ +func test(): +	var variant_int: Variant = 1 +	var weak_int = 1 + +	for x in variant_int: +		if x is String: +			print('never') +		print(x) + +	for x in weak_int: +		if x is String: +			print('never') +		print(x) + +	print('ok') diff --git a/modules/gdscript/tests/scripts/analyzer/features/for_loop_on_variant.out b/modules/gdscript/tests/scripts/analyzer/features/for_loop_on_variant.out new file mode 100644 index 0000000000..7677671cfd --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/for_loop_on_variant.out @@ -0,0 +1,4 @@ +GDTEST_OK +0 +0 +ok diff --git a/modules/gdscript/tests/scripts/analyzer/features/gdscript_to_preload.gd b/modules/gdscript/tests/scripts/analyzer/features/gdscript_to_preload.notest.gd index ea744e3027..c3fc176679 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/gdscript_to_preload.gd +++ b/modules/gdscript/tests/scripts/analyzer/features/gdscript_to_preload.notest.gd @@ -1,7 +1,4 @@  const A := 42 -func test(): -	pass -  func something():  	return "OK" diff --git a/modules/gdscript/tests/scripts/analyzer/features/inferred_return_type.gd b/modules/gdscript/tests/scripts/analyzer/features/inferred_return_type.gd new file mode 100644 index 0000000000..39ced354df --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/inferred_return_type.gd @@ -0,0 +1,9 @@ +# https://github.com/godotengine/godot/issues/61159 + +func get_param(): +	return null + +func test(): +	var v = get_param() +	v = get_param() +	print(v) diff --git a/modules/gdscript/tests/scripts/analyzer/features/inferred_return_type.out b/modules/gdscript/tests/scripts/analyzer/features/inferred_return_type.out new file mode 100644 index 0000000000..f0c83a69b3 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/inferred_return_type.out @@ -0,0 +1,2 @@ +GDTEST_OK +<null> diff --git a/modules/gdscript/tests/scripts/analyzer/features/inner_base.gd b/modules/gdscript/tests/scripts/analyzer/features/inner_base.gd new file mode 100644 index 0000000000..a825b59255 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/inner_base.gd @@ -0,0 +1,18 @@ +extends InnerA + +func test(): +	super.test() + +class InnerA extends InnerAB: +	func test(): +		print("InnerA.test") +		super.test() + +	class InnerAB extends InnerB: +		func test(): +			print("InnerA.InnerAB.test") +			super.test() + +class InnerB: +	func test(): +		print("InnerB.test") diff --git a/modules/gdscript/tests/scripts/analyzer/features/inner_base.out b/modules/gdscript/tests/scripts/analyzer/features/inner_base.out new file mode 100644 index 0000000000..ddd5ffcfd3 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/inner_base.out @@ -0,0 +1,4 @@ +GDTEST_OK +InnerA.test +InnerA.InnerAB.test +InnerB.test diff --git a/modules/gdscript/tests/scripts/analyzer/features/lambda_typed.gd b/modules/gdscript/tests/scripts/analyzer/features/lambda_typed.gd new file mode 100644 index 0000000000..114d7f7652 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/lambda_typed.gd @@ -0,0 +1,12 @@ +func test(): +	var lambda_0 := func() -> void: +		print(0) +	lambda_0.call() + +	var lambda_1 := func(printed: int) -> void: +		print(printed) +	lambda_1.call(1) + +	var lambda_2 := func(identity: int) -> int: +		return identity +	print(lambda_2.call(2)) diff --git a/modules/gdscript/tests/scripts/analyzer/features/lambda_typed.out b/modules/gdscript/tests/scripts/analyzer/features/lambda_typed.out new file mode 100644 index 0000000000..63e262aeff --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/lambda_typed.out @@ -0,0 +1,4 @@ +GDTEST_OK +0 +1 +2 diff --git a/modules/gdscript/tests/scripts/analyzer/features/lookup_class.gd b/modules/gdscript/tests/scripts/analyzer/features/lookup_class.gd new file mode 100644 index 0000000000..541da78332 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/lookup_class.gd @@ -0,0 +1,50 @@ +# Inner-outer class lookup +class A: +	const Q: = "right one" + +class X: +	const Q: = "wrong one" + +class Y extends X: +	class B extends A: +		static func check() -> void: +			print(Q) + +# External class lookup +const External: = preload("lookup_class_external.notest.gd") + +class Internal extends External.A: +	static func check() -> void: +		print(TARGET) + +	class E extends External.E: +		static func check() -> void: +			print(TARGET) +			print(WAITING) + +# Variable lookup +class C: +	var Q := 'right one' + +class D: +	const Q := 'wrong one' + +class E extends D: +	class F extends C: +		func check() -> void: +			print(Q) + +# Test +func test() -> void: +	# Inner-outer class lookup +	Y.B.check() +	print("---") + +	# External class lookup +	Internal.check() +	Internal.E.check() +	print("---") + +	# Variable lookup +	var f: = E.F.new() +	f.check() diff --git a/modules/gdscript/tests/scripts/analyzer/features/lookup_class.out b/modules/gdscript/tests/scripts/analyzer/features/lookup_class.out new file mode 100644 index 0000000000..a0983c1438 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/lookup_class.out @@ -0,0 +1,8 @@ +GDTEST_OK +right one +--- +wrong +right +godot +--- +right one diff --git a/modules/gdscript/tests/scripts/analyzer/features/lookup_class_external.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/lookup_class_external.notest.gd new file mode 100644 index 0000000000..a2904e20a8 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/lookup_class_external.notest.gd @@ -0,0 +1,15 @@ +class A: +	const TARGET: = "wrong" + +	class B: +		const TARGET: = "wrong" +		const WAITING: = "godot" + +		class D extends C: +			pass + +class C: +	const TARGET: = "right" + +class E extends A.B.D: +	pass diff --git a/modules/gdscript/tests/scripts/analyzer/features/lookup_signal.gd b/modules/gdscript/tests/scripts/analyzer/features/lookup_signal.gd new file mode 100644 index 0000000000..26cf6c7322 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/lookup_signal.gd @@ -0,0 +1,41 @@ +signal hello + +func get_signal() -> Signal: +	return hello + +class A: +	signal hello + +	func get_signal() -> Signal: +		return hello + +	class B: +		signal hello + +		func get_signal() -> Signal: +			return hello + +class C extends A.B: +	func get_signal() -> Signal: +		return hello + +func test(): +	var a: = A.new() +	var b: = A.B.new() +	var c: = C.new() + +	var hello_a_result: = hello == a.get_signal() +	var hello_b_result: = hello == b.get_signal() +	var hello_c_result: = hello == c.get_signal() +	var a_b_result: = a.get_signal() == b.get_signal() +	var a_c_result: = a.get_signal() == c.get_signal() +	var b_c_result: = b.get_signal() == c.get_signal() +	var c_c_result: = c.get_signal() == c.get_signal() + +	print("hello == A.hello? %s" % hello_a_result) +	print("hello == A.B.hello? %s" % hello_b_result) +	print("hello == C.hello? %s" % hello_c_result) +	print("A.hello == A.B.hello? %s" % a_b_result) +	print("A.hello == C.hello? %s" % a_c_result) +	print("A.B.hello == C.hello? %s" % b_c_result) +	print("C.hello == C.hello? %s" % c_c_result) diff --git a/modules/gdscript/tests/scripts/analyzer/features/lookup_signal.out b/modules/gdscript/tests/scripts/analyzer/features/lookup_signal.out new file mode 100644 index 0000000000..6b0d32eaf8 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/lookup_signal.out @@ -0,0 +1,8 @@ +GDTEST_OK +hello == A.hello? false +hello == A.B.hello? false +hello == C.hello? false +A.hello == A.B.hello? false +A.hello == C.hello? false +A.B.hello == C.hello? false +C.hello == C.hello? true diff --git a/modules/gdscript/tests/scripts/analyzer/features/null_initializer.gd b/modules/gdscript/tests/scripts/analyzer/features/null_initializer.gd new file mode 100644 index 0000000000..5a413e2015 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/null_initializer.gd @@ -0,0 +1,32 @@ +func check(input: int) -> bool: +	return input == 1 + +var recur = null +var prop = null + +func check_arg(arg = null) -> void: +	if arg != null: +		print(check(arg)) + +func check_recur() -> void: +	if recur != null: +		print(check(recur)) +	else: +		recur = 1 +		check_recur() + +func test() -> void: +	check_arg(1) + +	check_recur() + +	if prop == null: +		set('prop', 1) +		print(check(prop)) +		set('prop', null) + +	var loop = null +	while loop != 2: +		if loop != null: +			print(check(loop)) +		loop = 1 if loop == null else 2 diff --git a/modules/gdscript/tests/scripts/analyzer/features/null_initializer.out b/modules/gdscript/tests/scripts/analyzer/features/null_initializer.out new file mode 100644 index 0000000000..f9783e4362 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/null_initializer.out @@ -0,0 +1,5 @@ +GDTEST_OK +true +true +true +true diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order.gd b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.gd new file mode 100644 index 0000000000..11349cc916 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.gd @@ -0,0 +1,51 @@ +func test(): +	print("v1: ", v1) +	print("v1 is String: ", v1 is String) +	print("v2: ", v2) +	print("v2 is bool: ", v2 is bool) +	print("c1: ", c1) +	print("c1 is int: ", c1 is int) +	print("c2: ", c2) +	print("c2 is int: ", c2 is int) +	print("E1.V1: ", E1.V1) +	print("E1.V2: ", E1.V2) +	print("E2.V: ", E2.V) +	print("EV1: ", EV1) +	print("EV2: ", EV2) +	print("EV3: ", EV3) + +var v1 := InnerA.new().fn() + +class InnerA extends InnerAB: +	func fn(p2 := E1.V2) -> String: +		return "%s, p2=%s" % [super.fn(), p2] + +	class InnerAB: +		func fn(p1 := c1) -> String: +			return "p1=%s" % p1 + +var v2 := f() + +func f() -> bool: +	return true + +const c1 := E1.V1 + +enum E1 { +	V1 = E2.V + 2, +	V2 = V1 - 1 +} + +enum E2 {V = 2} + +const c2 := EV2 + +enum { +	EV1 = 42, +	UNUSED = EV3, +	EV2 +} + +enum { +	EV3 = EV1 + 1 +} diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order.out b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.out new file mode 100644 index 0000000000..b1e75d611d --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.out @@ -0,0 +1,15 @@ +GDTEST_OK +v1: p1=4, p2=3 +v1 is String: true +v2: true +v2 is bool: true +c1: 4 +c1 is int: true +c2: 44 +c2 is int: true +E1.V1: 4 +E1.V2: 3 +E2.V: 2 +EV1: 42 +EV2: 44 +EV3: 43 diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.gd b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.gd new file mode 100644 index 0000000000..0b162bdff8 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.gd @@ -0,0 +1,39 @@ +const B = preload("out_of_order_external_a.notest.gd") + +func test(): +	print("v1: ", v1) +	print("v1 is String: ", v1 is String) +	print("v2: ", v2) +	print("v2 is bool: ", v2 is bool) +	print("c1: ", c1) +	print("c1 is int: ", c1 is int) +	print("c2: ", c2) +	print("c2 is int: ", c2 is int) +	print("E1.V1: ", E1.V1) +	print("E1.V2: ", E1.V2) +	print("B.E2.V: ", B.E2.V) +	print("EV1: ", EV1) +	print("EV2: ", EV2) +	print("B.EV3: ", B.EV3) + +var v1 := Inner.new().fn() + +class Inner extends B.Inner: +	func fn(p2 := E1.V2) -> String: +		return "%s, p2=%s" % [super.fn(), p2] + +var v2 := B.new().f() + +const c1 := E1.V1 + +enum E1 { +	V1 = B.E2.V + 2, +	V2 = V1 - 1 +} + +const c2 := EV2 + +enum { +	EV1 = 42, +	EV2 = B.EV3 + 1 +} diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.out b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.out new file mode 100644 index 0000000000..437f782fe6 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.out @@ -0,0 +1,15 @@ +GDTEST_OK +v1: p1=4, p2=3 +v1 is String: true +v2: true +v2 is bool: true +c1: 4 +c1 is int: true +c2: 44 +c2 is int: true +E1.V1: 4 +E1.V2: 3 +B.E2.V: 2 +EV1: 42 +EV2: 44 +B.EV3: 43 diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external_a.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external_a.notest.gd new file mode 100644 index 0000000000..d276f72fcf --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external_a.notest.gd @@ -0,0 +1,12 @@ +const A = preload("out_of_order_external.gd") + +class Inner: +	func fn(p1 := A.c1) -> String: +		return "p1=%s" % p1 + +func f(p := A.c1) -> bool: +	return p is int + +enum E2 {V = 2} + +enum {EV3 = A.EV1 + 1} diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_constant_types_are_inferred.gd b/modules/gdscript/tests/scripts/analyzer/features/preload_constant_types_are_inferred.gd index 276875dd5a..9d0324ead8 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/preload_constant_types_are_inferred.gd +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_constant_types_are_inferred.gd @@ -1,4 +1,4 @@ -const Constants = preload("gdscript_to_preload.gd") +const Constants = preload("gdscript_to_preload.notest.gd")  func test():  	var a := Constants.A diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference.gd b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference.gd new file mode 100644 index 0000000000..b730453a8a --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference.gd @@ -0,0 +1,4 @@ +const A = preload("preload_cyclic_reference_a.notest.gd") + +func test(): +	A.test_cyclic_reference() diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference.out b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference.out new file mode 100644 index 0000000000..14bb971221 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference.out @@ -0,0 +1,2 @@ +GDTEST_OK +godot diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference_a.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference_a.notest.gd new file mode 100644 index 0000000000..7a6035ded1 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference_a.notest.gd @@ -0,0 +1,12 @@ +const B = preload("preload_cyclic_reference_b.notest.gd") + +const WAITING_FOR = "godot" + +static func test_cyclic_reference(): +	B.test_cyclic_reference() + +static func test_cyclic_reference_2(): +	B.test_cyclic_reference_2() + +static func test_cyclic_reference_3(): +	B.test_cyclic_reference_3() diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference_b.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference_b.notest.gd new file mode 100644 index 0000000000..3ea5b01156 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_cyclic_reference_b.notest.gd @@ -0,0 +1,10 @@ +const A = preload("preload_cyclic_reference_a.notest.gd") + +static func test_cyclic_reference(): +	A.test_cyclic_reference_2() + +static func test_cyclic_reference_2(): +	A.test_cyclic_reference_3() + +static func test_cyclic_reference_3(): +	print(A.WAITING_FOR) diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.gd b/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.gd new file mode 100644 index 0000000000..25381035b2 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.gd @@ -0,0 +1,15 @@ +const Preloaded := preload( 'preload_script_native_type.notest.gd' ) + +func test() -> void: +	var inferred := Preloaded.new() +	var inferred_owner := inferred.owner + +	var typed: Preloaded +	typed = Preloaded.new() +	var typed_owner := typed.owner + +	print(typed_owner == inferred_owner) + +	inferred.free() +	typed.free() +	print('ok') diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.notest.gd new file mode 100644 index 0000000000..61510e14cd --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.notest.gd @@ -0,0 +1 @@ +extends Node diff --git a/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.out b/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.out new file mode 100644 index 0000000000..3e24a1e2af --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/preload_script_native_type.out @@ -0,0 +1,3 @@ +GDTEST_OK +true +ok diff --git a/modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.gd b/modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.gd new file mode 100644 index 0000000000..95f04421d1 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.gd @@ -0,0 +1,5 @@ +func variant() -> Variant: +	return 'variant' + +func test(): +	print(variant()) diff --git a/modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.out b/modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.out new file mode 100644 index 0000000000..57fe608cc5 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/return_variant_typed.out @@ -0,0 +1,2 @@ +GDTEST_OK +variant diff --git a/modules/gdscript/tests/scripts/analyzer/features/typed_array_as_default_parameter.gd b/modules/gdscript/tests/scripts/analyzer/features/typed_array_as_default_parameter.gd new file mode 100644 index 0000000000..fc343377fc --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/typed_array_as_default_parameter.gd @@ -0,0 +1,17 @@ +func print_untyped(array = [0]) -> void: +	print(array) +	print(array.get_typed_builtin()) + +func print_inferred(array := [1]) -> void: +	print(array) +	print(array.get_typed_builtin()) + +func print_typed(array: Array[int] = [2]) -> void: +	print(array) +	print(array.get_typed_builtin()) + +func test(): +	print_untyped() +	print_inferred() +	print_typed() +	print('ok') diff --git a/modules/gdscript/tests/scripts/analyzer/features/typed_array_as_default_parameter.out b/modules/gdscript/tests/scripts/analyzer/features/typed_array_as_default_parameter.out new file mode 100644 index 0000000000..082e3ade19 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/typed_array_as_default_parameter.out @@ -0,0 +1,8 @@ +GDTEST_OK +[0] +0 +[1] +2 +[2] +2 +ok diff --git a/modules/gdscript/tests/scripts/analyzer/features/use_preload_script_as_type.gd b/modules/gdscript/tests/scripts/analyzer/features/use_preload_script_as_type.gd index 5f73064cc0..beabf3d2e5 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/use_preload_script_as_type.gd +++ b/modules/gdscript/tests/scripts/analyzer/features/use_preload_script_as_type.gd @@ -1,4 +1,4 @@ -const preloaded : GDScript = preload("gdscript_to_preload.gd") +const preloaded : GDScript = preload("gdscript_to_preload.notest.gd")  func test():  	var preloaded_instance: preloaded = preloaded.new() diff --git a/modules/gdscript/tests/scripts/analyzer/features/variant_arg_in_virtual_method.gd b/modules/gdscript/tests/scripts/analyzer/features/variant_arg_in_virtual_method.gd new file mode 100644 index 0000000000..da24c06b2e --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/variant_arg_in_virtual_method.gd @@ -0,0 +1,6 @@ +class Check extends Node: +	func _set(_property: StringName, _value: Variant) -> bool: +		return true + +func test() -> void: +	print('OK') diff --git a/modules/gdscript/tests/scripts/analyzer/features/variant_arg_in_virtual_method.out b/modules/gdscript/tests/scripts/analyzer/features/variant_arg_in_virtual_method.out new file mode 100644 index 0000000000..1ccb591560 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/variant_arg_in_virtual_method.out @@ -0,0 +1,2 @@ +GDTEST_OK +OK diff --git a/modules/gdscript/tests/scripts/analyzer/features/weak_initializer.gd b/modules/gdscript/tests/scripts/analyzer/features/weak_initializer.gd new file mode 100644 index 0000000000..c5f3ccc59e --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/weak_initializer.gd @@ -0,0 +1,5 @@ +func test(): +	var bar = 1 +	var foo: float = bar +	print(typeof(foo)) +	print(foo is float) diff --git a/modules/gdscript/tests/scripts/analyzer/features/weak_initializer.out b/modules/gdscript/tests/scripts/analyzer/features/weak_initializer.out new file mode 100644 index 0000000000..5d798c1f24 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/weak_initializer.out @@ -0,0 +1,3 @@ +GDTEST_OK +3 +true  |