summaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/core/variant/test_variant.h1033
-rw-r--r--tests/scene/test_code_edit.h44
-rw-r--r--tests/scene/test_text_edit.h3
-rw-r--r--tests/scene/test_viewport.h644
4 files changed, 1703 insertions, 21 deletions
diff --git a/tests/core/variant/test_variant.h b/tests/core/variant/test_variant.h
index 66b58620d2..54ca06c6c4 100644
--- a/tests/core/variant/test_variant.h
+++ b/tests/core/variant/test_variant.h
@@ -126,7 +126,7 @@ TEST_CASE("[Variant] Writer and parser Variant::FLOAT") {
CHECK_MESSAGE(float_parsed == 1.0e+100, "Should match the double literal.");
}
-TEST_CASE("[Variant] Assignment To Bool from Int,Float,String,Vec2,Vec2i,Vec3,Vec3i and Color") {
+TEST_CASE("[Variant] Assignment To Bool from Int,Float,String,Vec2,Vec2i,Vec3,Vec3i,Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant int_v = 0;
Variant bool_v = true;
int_v = bool_v; // int_v is now a bool
@@ -183,6 +183,54 @@ TEST_CASE("[Variant] Assignment To Bool from Int,Float,String,Vec2,Vec2i,Vec3,Ve
vec3i_v = bool_v;
CHECK(vec3i_v.get_type() == Variant::BOOL);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ bool_v = true;
+ vec4_v = bool_v;
+ CHECK(vec4_v == Variant(true));
+ bool_v = false;
+ vec4_v = bool_v;
+ CHECK(vec4_v.get_type() == Variant::BOOL);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ bool_v = true;
+ vec4i_v = bool_v;
+ CHECK(vec4i_v == Variant(true));
+ bool_v = false;
+ vec4i_v = bool_v;
+ CHECK(vec4i_v.get_type() == Variant::BOOL);
+
+ Variant rect2_v = Rect2();
+ bool_v = true;
+ rect2_v = bool_v;
+ CHECK(rect2_v == Variant(true));
+ bool_v = false;
+ rect2_v = bool_v;
+ CHECK(rect2_v.get_type() == Variant::BOOL);
+
+ Variant rect2i_v = Rect2i();
+ bool_v = true;
+ rect2i_v = bool_v;
+ CHECK(rect2i_v == Variant(true));
+ bool_v = false;
+ rect2i_v = bool_v;
+ CHECK(rect2i_v.get_type() == Variant::BOOL);
+
+ Variant transform2d_v = Transform2D();
+ bool_v = true;
+ transform2d_v = bool_v;
+ CHECK(transform2d_v == Variant(true));
+ bool_v = false;
+ transform2d_v = bool_v;
+ CHECK(transform2d_v.get_type() == Variant::BOOL);
+
+ Variant transform3d_v = Transform3D();
+ bool_v = true;
+ transform3d_v = bool_v;
+ CHECK(transform3d_v == Variant(true));
+ bool_v = false;
+ transform3d_v = bool_v;
+ CHECK(transform3d_v.get_type() == Variant::BOOL);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
bool_v = true;
col_v = bool_v;
@@ -190,9 +238,74 @@ TEST_CASE("[Variant] Assignment To Bool from Int,Float,String,Vec2,Vec2i,Vec3,Ve
bool_v = false;
col_v = bool_v;
CHECK(col_v.get_type() == Variant::BOOL);
+
+ Variant call_v = Callable();
+ bool_v = true;
+ call_v = bool_v;
+ CHECK(call_v == Variant(true));
+ bool_v = false;
+ call_v = bool_v;
+ CHECK(call_v.get_type() == Variant::BOOL);
+
+ Variant plane_v = Plane();
+ bool_v = true;
+ plane_v = bool_v;
+ CHECK(plane_v == Variant(true));
+ bool_v = false;
+ plane_v = bool_v;
+ CHECK(plane_v.get_type() == Variant::BOOL);
+
+ Variant basis_v = Basis();
+ bool_v = true;
+ basis_v = bool_v;
+ CHECK(basis_v == Variant(true));
+ bool_v = false;
+ basis_v = bool_v;
+ CHECK(basis_v.get_type() == Variant::BOOL);
+
+ Variant aabb_v = AABB();
+ bool_v = true;
+ aabb_v = bool_v;
+ CHECK(aabb_v == Variant(true));
+ bool_v = false;
+ aabb_v = bool_v;
+ CHECK(aabb_v.get_type() == Variant::BOOL);
+
+ Variant quaternion_v = Quaternion();
+ bool_v = true;
+ quaternion_v = bool_v;
+ CHECK(quaternion_v == Variant(true));
+ bool_v = false;
+ quaternion_v = bool_v;
+ CHECK(quaternion_v.get_type() == Variant::BOOL);
+
+ Variant projection_v = Projection();
+ bool_v = true;
+ projection_v = bool_v;
+ CHECK(projection_v == Variant(true));
+ bool_v = false;
+ projection_v = bool_v;
+ CHECK(projection_v.get_type() == Variant::BOOL);
+
+ Variant rid_v = RID();
+ bool_v = true;
+ rid_v = bool_v;
+ CHECK(rid_v == Variant(true));
+ bool_v = false;
+ rid_v = bool_v;
+ CHECK(rid_v.get_type() == Variant::BOOL);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ bool_v = true;
+ object_v = bool_v;
+ CHECK(object_v == Variant(true));
+ bool_v = false;
+ object_v = bool_v;
+ CHECK(object_v.get_type() == Variant::BOOL);
}
-TEST_CASE("[Variant] Assignment To Int from Bool,Float,String,Vec2,Vec2i,Vec3,Vec3i and Color") {
+TEST_CASE("[Variant] Assignment To Int from Bool,Float,String,Vec2,Vec2i,Vec3,Vec3i Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant bool_v = false;
Variant int_v = 2;
bool_v = int_v; // Now bool_v is int
@@ -249,6 +362,54 @@ TEST_CASE("[Variant] Assignment To Int from Bool,Float,String,Vec2,Vec2i,Vec3,Ve
vec3i_v = int_v;
CHECK(vec3i_v.get_type() == Variant::INT);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ int_v = 2;
+ vec4_v = int_v;
+ CHECK(vec4_v == Variant(2));
+ int_v = -3;
+ vec4_v = int_v;
+ CHECK(vec4_v.get_type() == Variant::INT);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ int_v = 2;
+ vec4i_v = int_v;
+ CHECK(vec4i_v == Variant(2));
+ int_v = -3;
+ vec4i_v = int_v;
+ CHECK(vec4i_v.get_type() == Variant::INT);
+
+ Variant rect2_v = Rect2();
+ int_v = 2;
+ rect2_v = int_v;
+ CHECK(rect2_v == Variant(2));
+ int_v = -3;
+ rect2_v = int_v;
+ CHECK(rect2_v.get_type() == Variant::INT);
+
+ Variant rect2i_v = Rect2i();
+ int_v = 2;
+ rect2i_v = int_v;
+ CHECK(rect2i_v == Variant(2));
+ int_v = -3;
+ rect2i_v = int_v;
+ CHECK(rect2i_v.get_type() == Variant::INT);
+
+ Variant transform2d_v = Transform2D();
+ int_v = 2;
+ transform2d_v = int_v;
+ CHECK(transform2d_v == Variant(2));
+ int_v = -3;
+ transform2d_v = int_v;
+ CHECK(transform2d_v.get_type() == Variant::INT);
+
+ Variant transform3d_v = Transform3D();
+ int_v = 2;
+ transform3d_v = int_v;
+ CHECK(transform3d_v == Variant(2));
+ int_v = -3;
+ transform3d_v = int_v;
+ CHECK(transform3d_v.get_type() == Variant::INT);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
int_v = 2;
col_v = int_v;
@@ -256,9 +417,74 @@ TEST_CASE("[Variant] Assignment To Int from Bool,Float,String,Vec2,Vec2i,Vec3,Ve
int_v = -3;
col_v = int_v;
CHECK(col_v.get_type() == Variant::INT);
+
+ Variant call_v = Callable();
+ int_v = 2;
+ call_v = int_v;
+ CHECK(call_v == Variant(2));
+ int_v = -3;
+ call_v = int_v;
+ CHECK(call_v.get_type() == Variant::INT);
+
+ Variant plane_v = Plane();
+ int_v = 2;
+ plane_v = int_v;
+ CHECK(plane_v == Variant(2));
+ int_v = -3;
+ plane_v = int_v;
+ CHECK(plane_v.get_type() == Variant::INT);
+
+ Variant basis_v = Basis();
+ int_v = 2;
+ basis_v = int_v;
+ CHECK(basis_v == Variant(2));
+ int_v = -3;
+ basis_v = int_v;
+ CHECK(basis_v.get_type() == Variant::INT);
+
+ Variant aabb_v = AABB();
+ int_v = 2;
+ aabb_v = int_v;
+ CHECK(aabb_v == Variant(2));
+ int_v = -3;
+ aabb_v = int_v;
+ CHECK(aabb_v.get_type() == Variant::INT);
+
+ Variant quaternion_v = Quaternion();
+ int_v = 2;
+ quaternion_v = int_v;
+ CHECK(quaternion_v == Variant(2));
+ int_v = -3;
+ quaternion_v = int_v;
+ CHECK(quaternion_v.get_type() == Variant::INT);
+
+ Variant projection_v = Projection();
+ int_v = 2;
+ projection_v = int_v;
+ CHECK(projection_v == Variant(2));
+ int_v = -3;
+ projection_v = int_v;
+ CHECK(projection_v.get_type() == Variant::INT);
+
+ Variant rid_v = RID();
+ int_v = 2;
+ rid_v = int_v;
+ CHECK(rid_v == Variant(2));
+ bool_v = -3;
+ rid_v = int_v;
+ CHECK(rid_v.get_type() == Variant::INT);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ int_v = 2;
+ object_v = int_v;
+ CHECK(object_v == Variant(2));
+ int_v = -3;
+ object_v = int_v;
+ CHECK(object_v.get_type() == Variant::INT);
}
-TEST_CASE("[Variant] Assignment To Float from Bool,Int,String,Vec2,Vec2i,Vec3,Vec3i and Color") {
+TEST_CASE("[Variant] Assignment To Float from Bool,Int,String,Vec2,Vec2i,Vec3,Vec3i,Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant bool_v = false;
Variant float_v = 1.5f;
bool_v = float_v; // Now bool_v is float
@@ -315,6 +541,54 @@ TEST_CASE("[Variant] Assignment To Float from Bool,Int,String,Vec2,Vec2i,Vec3,Ve
vec3i_v = float_v;
CHECK(vec3i_v.get_type() == Variant::FLOAT);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ float_v = 1.5f;
+ vec4_v = float_v;
+ CHECK(vec4_v == Variant(1.5f));
+ float_v = -4.6f;
+ vec4_v = float_v;
+ CHECK(vec4_v.get_type() == Variant::FLOAT);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ float_v = 1.5f;
+ vec4i_v = float_v;
+ CHECK(vec4i_v == Variant(1.5f));
+ float_v = -4.6f;
+ vec4i_v = float_v;
+ CHECK(vec4i_v.get_type() == Variant::FLOAT);
+
+ Variant rect2_v = Rect2();
+ float_v = 1.5f;
+ rect2_v = float_v;
+ CHECK(rect2_v == Variant(1.5f));
+ float_v = -4.6f;
+ rect2_v = float_v;
+ CHECK(rect2_v.get_type() == Variant::FLOAT);
+
+ Variant rect2i_v = Rect2i();
+ float_v = 1.5f;
+ rect2i_v = float_v;
+ CHECK(rect2i_v == Variant(1.5f));
+ float_v = -4.6f;
+ rect2i_v = float_v;
+ CHECK(rect2i_v.get_type() == Variant::FLOAT);
+
+ Variant transform2d_v = Transform2D();
+ float_v = 1.5f;
+ transform2d_v = float_v;
+ CHECK(transform2d_v == Variant(1.5f));
+ float_v = -4.6f;
+ transform2d_v = float_v;
+ CHECK(transform2d_v.get_type() == Variant::FLOAT);
+
+ Variant transform3d_v = Transform3D();
+ float_v = 1.5f;
+ transform3d_v = float_v;
+ CHECK(transform3d_v == Variant(1.5f));
+ float_v = -4.6f;
+ transform3d_v = float_v;
+ CHECK(transform2d_v.get_type() == Variant::FLOAT);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
float_v = 1.5f;
col_v = float_v;
@@ -322,9 +596,74 @@ TEST_CASE("[Variant] Assignment To Float from Bool,Int,String,Vec2,Vec2i,Vec3,Ve
float_v = -4.6f;
col_v = float_v;
CHECK(col_v.get_type() == Variant::FLOAT);
+
+ Variant call_v = Callable();
+ float_v = 1.5f;
+ call_v = float_v;
+ CHECK(call_v == Variant(1.5f));
+ float_v = -4.6f;
+ call_v = float_v;
+ CHECK(call_v.get_type() == Variant::FLOAT);
+
+ Variant plane_v = Plane();
+ float_v = 1.5f;
+ plane_v = float_v;
+ CHECK(plane_v == Variant(1.5f));
+ float_v = -4.6f;
+ plane_v = float_v;
+ CHECK(plane_v.get_type() == Variant::FLOAT);
+
+ Variant basis_v = Basis();
+ float_v = 1.5f;
+ basis_v = float_v;
+ CHECK(basis_v == Variant(1.5f));
+ float_v = -4.6f;
+ basis_v = float_v;
+ CHECK(basis_v.get_type() == Variant::FLOAT);
+
+ Variant aabb_v = AABB();
+ float_v = 1.5f;
+ aabb_v = float_v;
+ CHECK(aabb_v == Variant(1.5f));
+ float_v = -4.6f;
+ aabb_v = float_v;
+ CHECK(aabb_v.get_type() == Variant::FLOAT);
+
+ Variant quaternion_v = Quaternion();
+ float_v = 1.5f;
+ quaternion_v = float_v;
+ CHECK(quaternion_v == Variant(1.5f));
+ float_v = -4.6f;
+ quaternion_v = float_v;
+ CHECK(quaternion_v.get_type() == Variant::FLOAT);
+
+ Variant projection_v = Projection();
+ float_v = 1.5f;
+ projection_v = float_v;
+ CHECK(projection_v == Variant(1.5f));
+ float_v = -4.6f;
+ projection_v = float_v;
+ CHECK(projection_v.get_type() == Variant::FLOAT);
+
+ Variant rid_v = RID();
+ float_v = 1.5f;
+ rid_v = float_v;
+ CHECK(rid_v == Variant(1.5f));
+ float_v = -4.6f;
+ rid_v = float_v;
+ CHECK(rid_v.get_type() == Variant::FLOAT);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ float_v = 1.5f;
+ object_v = float_v;
+ CHECK(object_v == Variant(1.5f));
+ float_v = -4.6f;
+ object_v = float_v;
+ CHECK(object_v.get_type() == Variant::FLOAT);
}
-TEST_CASE("[Variant] Assignment To String from Bool,Int,Float,Vec2,Vec2i,Vec3,Vec3i and Color") {
+TEST_CASE("[Variant] Assignment To String from Bool,Int,Float,Vec2,Vec2i,Vec3,Vec3i,Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant bool_v = false;
Variant string_v = "Hello";
bool_v = string_v; // Now bool_v is string
@@ -381,6 +720,54 @@ TEST_CASE("[Variant] Assignment To String from Bool,Int,Float,Vec2,Vec2i,Vec3,Ve
vec3i_v = string_v;
CHECK(vec3i_v.get_type() == Variant::STRING);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ string_v = "Hello";
+ vec4_v = string_v;
+ CHECK(vec4_v == Variant("Hello"));
+ string_v = "Hello there";
+ vec4_v = string_v;
+ CHECK(vec4_v.get_type() == Variant::STRING);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ string_v = "Hello";
+ vec4i_v = string_v;
+ CHECK(vec4i_v == Variant("Hello"));
+ string_v = "Hello there";
+ vec4i_v = string_v;
+ CHECK(vec4i_v.get_type() == Variant::STRING);
+
+ Variant rect2_v = Rect2();
+ string_v = "Hello";
+ rect2_v = string_v;
+ CHECK(rect2_v == Variant("Hello"));
+ string_v = "Hello there";
+ rect2_v = string_v;
+ CHECK(rect2_v.get_type() == Variant::STRING);
+
+ Variant rect2i_v = Rect2i();
+ string_v = "Hello";
+ rect2i_v = string_v;
+ CHECK(rect2i_v == Variant("Hello"));
+ string_v = "Hello there";
+ rect2i_v = string_v;
+ CHECK(rect2i_v.get_type() == Variant::STRING);
+
+ Variant transform2d_v = Transform2D();
+ string_v = "Hello";
+ transform2d_v = string_v;
+ CHECK(transform2d_v == Variant("Hello"));
+ string_v = "Hello there";
+ transform2d_v = string_v;
+ CHECK(transform2d_v.get_type() == Variant::STRING);
+
+ Variant transform3d_v = Transform3D();
+ string_v = "Hello";
+ transform3d_v = string_v;
+ CHECK(transform3d_v == Variant("Hello"));
+ string_v = "Hello there";
+ transform3d_v = string_v;
+ CHECK(transform3d_v.get_type() == Variant::STRING);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
string_v = "Hello";
col_v = string_v;
@@ -388,9 +775,74 @@ TEST_CASE("[Variant] Assignment To String from Bool,Int,Float,Vec2,Vec2i,Vec3,Ve
string_v = "Hello there";
col_v = string_v;
CHECK(col_v.get_type() == Variant::STRING);
+
+ Variant call_v = Callable();
+ string_v = "Hello";
+ call_v = string_v;
+ CHECK(call_v == Variant("Hello"));
+ string_v = "Hello there";
+ call_v = string_v;
+ CHECK(call_v.get_type() == Variant::STRING);
+
+ Variant plane_v = Plane();
+ string_v = "Hello";
+ plane_v = string_v;
+ CHECK(plane_v == Variant("Hello"));
+ string_v = "Hello there";
+ plane_v = string_v;
+ CHECK(plane_v.get_type() == Variant::STRING);
+
+ Variant basis_v = Basis();
+ string_v = "Hello";
+ basis_v = string_v;
+ CHECK(basis_v == Variant("Hello"));
+ string_v = "Hello there";
+ basis_v = string_v;
+ CHECK(basis_v.get_type() == Variant::STRING);
+
+ Variant aabb_v = AABB();
+ string_v = "Hello";
+ aabb_v = string_v;
+ CHECK(aabb_v == Variant("Hello"));
+ string_v = "Hello there";
+ aabb_v = string_v;
+ CHECK(aabb_v.get_type() == Variant::STRING);
+
+ Variant quaternion_v = Quaternion();
+ string_v = "Hello";
+ quaternion_v = string_v;
+ CHECK(quaternion_v == Variant("Hello"));
+ string_v = "Hello there";
+ quaternion_v = string_v;
+ CHECK(quaternion_v.get_type() == Variant::STRING);
+
+ Variant projection_v = Projection();
+ string_v = "Hello";
+ projection_v = string_v;
+ CHECK(projection_v == Variant("Hello"));
+ string_v = "Hello there";
+ projection_v = string_v;
+ CHECK(projection_v.get_type() == Variant::STRING);
+
+ Variant rid_v = RID();
+ string_v = "Hello";
+ rid_v = string_v;
+ CHECK(rid_v == Variant("Hello"));
+ string_v = "Hello there";
+ rid_v = string_v;
+ CHECK(rid_v.get_type() == Variant::STRING);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ string_v = "Hello";
+ object_v = string_v;
+ CHECK(object_v == Variant("Hello"));
+ string_v = "Hello there";
+ object_v = string_v;
+ CHECK(object_v.get_type() == Variant::STRING);
}
-TEST_CASE("[Variant] Assignment To Vec2 from Bool,Int,Float,String,Vec2i,Vec3,Vec3i and Color") {
+TEST_CASE("[Variant] Assignment To Vec2 from Bool,Int,Float,String,Vec2i,Vec3,Vec3i,Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant bool_v = false;
Variant vec2_v = Vector2(2.2f, 3.5f);
bool_v = vec2_v; // Now bool_v is Vector2
@@ -447,6 +899,54 @@ TEST_CASE("[Variant] Assignment To Vec2 from Bool,Int,Float,String,Vec2i,Vec3,Ve
vec3i_v = vec2_v;
CHECK(vec3i_v.get_type() == Variant::VECTOR2);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ vec2_v = Vector2(2.2f, 3.5f);
+ vec4_v = vec2_v;
+ CHECK(vec4_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ vec4_v = vec2_v;
+ CHECK(vec4_v.get_type() == Variant::VECTOR2);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ vec2_v = Vector2(2.2f, 3.5f);
+ vec4i_v = vec2_v;
+ CHECK(vec4i_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ vec4i_v = vec2_v;
+ CHECK(vec4i_v.get_type() == Variant::VECTOR2);
+
+ Variant rect2_v = Rect2();
+ vec2_v = Vector2(2.2f, 3.5f);
+ rect2_v = vec2_v;
+ CHECK(rect2_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ rect2_v = vec2_v;
+ CHECK(rect2_v.get_type() == Variant::VECTOR2);
+
+ Variant rect2i_v = Rect2i();
+ vec2_v = Vector2(2.2f, 3.5f);
+ rect2i_v = vec2_v;
+ CHECK(rect2i_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ rect2i_v = vec2_v;
+ CHECK(rect2i_v.get_type() == Variant::VECTOR2);
+
+ Variant transform2d_v = Transform2D();
+ vec2_v = Vector2(2.2f, 3.5f);
+ transform2d_v = vec2_v;
+ CHECK(transform2d_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ transform2d_v = vec2_v;
+ CHECK(transform2d_v.get_type() == Variant::VECTOR2);
+
+ Variant transform3d_v = Transform3D();
+ vec2_v = Vector2(2.2f, 3.5f);
+ transform3d_v = vec2_v;
+ CHECK(transform3d_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ transform3d_v = vec2_v;
+ CHECK(transform3d_v.get_type() == Variant::VECTOR2);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
vec2_v = Vector2(2.2f, 3.5f);
col_v = vec2_v;
@@ -454,9 +954,74 @@ TEST_CASE("[Variant] Assignment To Vec2 from Bool,Int,Float,String,Vec2i,Vec3,Ve
vec2_v = Vector2(-5.4f, -7.9f);
col_v = vec2_v;
CHECK(col_v.get_type() == Variant::VECTOR2);
+
+ Variant call_v = Callable();
+ vec2_v = Vector2(2.2f, 3.5f);
+ call_v = vec2_v;
+ CHECK(call_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ call_v = vec2_v;
+ CHECK(call_v.get_type() == Variant::VECTOR2);
+
+ Variant plane_v = Plane();
+ vec2_v = Vector2(2.2f, 3.5f);
+ plane_v = vec2_v;
+ CHECK(plane_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ plane_v = vec2_v;
+ CHECK(plane_v.get_type() == Variant::VECTOR2);
+
+ Variant basis_v = Basis();
+ vec2_v = Vector2(2.2f, 3.5f);
+ basis_v = vec2_v;
+ CHECK(basis_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ basis_v = vec2_v;
+ CHECK(basis_v.get_type() == Variant::VECTOR2);
+
+ Variant aabb_v = AABB();
+ vec2_v = Vector2(2.2f, 3.5f);
+ aabb_v = vec2_v;
+ CHECK(aabb_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ aabb_v = vec2_v;
+ CHECK(aabb_v.get_type() == Variant::VECTOR2);
+
+ Variant quaternion_v = Quaternion();
+ vec2_v = Vector2(2.2f, 3.5f);
+ quaternion_v = vec2_v;
+ CHECK(quaternion_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ quaternion_v = vec2_v;
+ CHECK(quaternion_v.get_type() == Variant::VECTOR2);
+
+ Variant projection_v = Projection();
+ vec2_v = Vector2(2.2f, 3.5f);
+ projection_v = vec2_v;
+ CHECK(projection_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ projection_v = vec2_v;
+ CHECK(projection_v.get_type() == Variant::VECTOR2);
+
+ Variant rid_v = RID();
+ vec2_v = Vector2(2.2f, 3.5f);
+ rid_v = vec2_v;
+ CHECK(rid_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ rid_v = vec2_v;
+ CHECK(rid_v.get_type() == Variant::VECTOR2);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ vec2_v = Vector2(2.2f, 3.5f);
+ object_v = vec2_v;
+ CHECK(object_v == Variant(Vector2(2.2f, 3.5f)));
+ vec2_v = Vector2(-5.4f, -7.9f);
+ object_v = vec2_v;
+ CHECK(object_v.get_type() == Variant::VECTOR2);
}
-TEST_CASE("[Variant] Assignment To Vec2i from Bool,Int,Float,String,Vec2,Vec3,Vec3i and Color") {
+TEST_CASE("[Variant] Assignment To Vec2i from Bool,Int,Float,String,Vec2,Vec3,Vec3i,Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant bool_v = false;
Variant vec2i_v = Vector2i(2, 3);
bool_v = vec2i_v; // Now bool_v is Vector2i
@@ -513,6 +1078,54 @@ TEST_CASE("[Variant] Assignment To Vec2i from Bool,Int,Float,String,Vec2,Vec3,Ve
vec3i_v = vec2i_v;
CHECK(vec3i_v.get_type() == Variant::VECTOR2I);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ vec2i_v = Vector2i(2, 3);
+ vec4_v = vec2i_v;
+ CHECK(vec4_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ vec4_v = vec2i_v;
+ CHECK(vec4_v.get_type() == Variant::VECTOR2I);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ vec2i_v = Vector2i(2, 3);
+ vec4i_v = vec2i_v;
+ CHECK(vec4i_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ vec4i_v = vec2i_v;
+ CHECK(vec4i_v.get_type() == Variant::VECTOR2I);
+
+ Variant rect2_v = Rect2();
+ vec2i_v = Vector2i(2, 3);
+ rect2_v = vec2i_v;
+ CHECK(rect2_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ rect2_v = vec2i_v;
+ CHECK(rect2_v.get_type() == Variant::VECTOR2I);
+
+ Variant rect2i_v = Rect2i();
+ vec2i_v = Vector2i(2, 3);
+ rect2i_v = vec2i_v;
+ CHECK(rect2i_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ rect2i_v = vec2i_v;
+ CHECK(rect2i_v.get_type() == Variant::VECTOR2I);
+
+ Variant transform2d_v = Transform2D();
+ vec2i_v = Vector2i(2, 3);
+ transform2d_v = vec2i_v;
+ CHECK(transform2d_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ transform2d_v = vec2i_v;
+ CHECK(transform2d_v.get_type() == Variant::VECTOR2I);
+
+ Variant transform3d_v = Transform3D();
+ vec2i_v = Vector2i(2, 3);
+ transform3d_v = vec2i_v;
+ CHECK(transform3d_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ transform3d_v = vec2i_v;
+ CHECK(transform3d_v.get_type() == Variant::VECTOR2I);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
vec2i_v = Vector2i(2, 3);
col_v = vec2i_v;
@@ -520,9 +1133,74 @@ TEST_CASE("[Variant] Assignment To Vec2i from Bool,Int,Float,String,Vec2,Vec3,Ve
vec2i_v = Vector2i(-5, -7);
col_v = vec2i_v;
CHECK(col_v.get_type() == Variant::VECTOR2I);
+
+ Variant call_v = Callable();
+ vec2i_v = Vector2i(2, 3);
+ call_v = vec2i_v;
+ CHECK(call_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ call_v = vec2i_v;
+ CHECK(call_v.get_type() == Variant::VECTOR2I);
+
+ Variant plane_v = Plane();
+ vec2i_v = Vector2i(2, 3);
+ plane_v = vec2i_v;
+ CHECK(plane_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ plane_v = vec2i_v;
+ CHECK(plane_v.get_type() == Variant::VECTOR2I);
+
+ Variant basis_v = Basis();
+ vec2i_v = Vector2i(2, 3);
+ basis_v = vec2i_v;
+ CHECK(basis_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ basis_v = vec2i_v;
+ CHECK(basis_v.get_type() == Variant::VECTOR2I);
+
+ Variant aabb_v = AABB();
+ vec2i_v = Vector2i(2, 3);
+ aabb_v = vec2i_v;
+ CHECK(aabb_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ aabb_v = vec2i_v;
+ CHECK(aabb_v.get_type() == Variant::VECTOR2I);
+
+ Variant quaternion_v = Quaternion();
+ vec2i_v = Vector2i(2, 3);
+ quaternion_v = vec2i_v;
+ CHECK(quaternion_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ quaternion_v = vec2i_v;
+ CHECK(quaternion_v.get_type() == Variant::VECTOR2I);
+
+ Variant projection_v = Projection();
+ vec2i_v = Vector2i(2, 3);
+ projection_v = vec2i_v;
+ CHECK(projection_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ projection_v = vec2i_v;
+ CHECK(projection_v.get_type() == Variant::VECTOR2I);
+
+ Variant rid_v = RID();
+ vec2i_v = Vector2i(2, 3);
+ rid_v = vec2i_v;
+ CHECK(rid_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ rid_v = vec2i_v;
+ CHECK(rid_v.get_type() == Variant::VECTOR2I);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ vec2i_v = Vector2i(2, 3);
+ object_v = vec2i_v;
+ CHECK(object_v == Variant(Vector2i(2, 3)));
+ vec2i_v = Vector2i(-5, -7);
+ object_v = vec2i_v;
+ CHECK(object_v.get_type() == Variant::VECTOR2I);
}
-TEST_CASE("[Variant] Assignment To Vec3 from Bool,Int,Float,String,Vec2,Vec2i,Vec3i and Color") {
+TEST_CASE("[Variant] Assignment To Vec3 from Bool,Int,Float,String,Vec2,Vec2i,Vec3i,Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant bool_v = false;
Variant vec3_v = Vector3(2.2f, 3.5f, 5.3f);
bool_v = vec3_v; // Now bool_v is Vector3
@@ -579,6 +1257,54 @@ TEST_CASE("[Variant] Assignment To Vec3 from Bool,Int,Float,String,Vec2,Vec2i,Ve
vec3i_v = vec3_v;
CHECK(vec3i_v.get_type() == Variant::VECTOR3);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ vec4_v = vec3_v;
+ CHECK(vec4_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ vec4_v = vec3_v;
+ CHECK(vec4_v.get_type() == Variant::VECTOR3);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ vec4i_v = vec3_v;
+ CHECK(vec4i_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ vec4i_v = vec3_v;
+ CHECK(vec4i_v.get_type() == Variant::VECTOR3);
+
+ Variant rect2_v = Rect2();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ rect2_v = vec3_v;
+ CHECK(rect2_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ rect2_v = vec3_v;
+ CHECK(rect2_v.get_type() == Variant::VECTOR3);
+
+ Variant rect2i_v = Rect2i();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ rect2i_v = vec3_v;
+ CHECK(rect2i_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ rect2i_v = vec3_v;
+ CHECK(rect2i_v.get_type() == Variant::VECTOR3);
+
+ Variant transform2d_v = Transform2D();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ transform2d_v = vec3_v;
+ CHECK(transform2d_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ transform2d_v = vec3_v;
+ CHECK(transform2d_v.get_type() == Variant::VECTOR3);
+
+ Variant transform3d_v = Transform3D();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ transform3d_v = vec3_v;
+ CHECK(transform3d_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ transform3d_v = vec3_v;
+ CHECK(transform3d_v.get_type() == Variant::VECTOR3);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
vec3_v = Vector3(2.2f, 3.5f, 5.3f);
col_v = vec3_v;
@@ -586,6 +1312,71 @@ TEST_CASE("[Variant] Assignment To Vec3 from Bool,Int,Float,String,Vec2,Vec2i,Ve
vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
col_v = vec3_v;
CHECK(col_v.get_type() == Variant::VECTOR3);
+
+ Variant call_v = Callable();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ call_v = vec3_v;
+ CHECK(call_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ call_v = vec3_v;
+ CHECK(call_v.get_type() == Variant::VECTOR3);
+
+ Variant plane_v = Plane();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ plane_v = vec3_v;
+ CHECK(plane_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ plane_v = vec3_v;
+ CHECK(plane_v.get_type() == Variant::VECTOR3);
+
+ Variant basis_v = Basis();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ basis_v = vec3_v;
+ CHECK(basis_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ basis_v = vec3_v;
+ CHECK(basis_v.get_type() == Variant::VECTOR3);
+
+ Variant aabb_v = AABB();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ aabb_v = vec3_v;
+ CHECK(aabb_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ aabb_v = vec3_v;
+ CHECK(aabb_v.get_type() == Variant::VECTOR3);
+
+ Variant quaternion_v = Quaternion();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ quaternion_v = vec3_v;
+ CHECK(quaternion_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ quaternion_v = vec3_v;
+ CHECK(quaternion_v.get_type() == Variant::VECTOR3);
+
+ Variant projection_v = Projection();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ quaternion_v = vec3_v;
+ CHECK(quaternion_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ quaternion_v = vec3_v;
+ CHECK(quaternion_v.get_type() == Variant::VECTOR3);
+
+ Variant rid_v = RID();
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ rid_v = vec3_v;
+ CHECK(rid_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ rid_v = vec3_v;
+ CHECK(rid_v.get_type() == Variant::VECTOR3);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ vec3_v = Vector3(2.2f, 3.5f, 5.3f);
+ object_v = vec3_v;
+ CHECK(object_v == Variant(Vector3(2.2f, 3.5f, 5.3f)));
+ vec3_v = Vector3(-5.4f, -7.9f, -2.1f);
+ object_v = vec3_v;
+ CHECK(object_v.get_type() == Variant::VECTOR3);
}
TEST_CASE("[Variant] Assignment To Vec3i from Bool,Int,Float,String,Vec2,Vec2i,Vec3 and Color") {
@@ -645,6 +1436,54 @@ TEST_CASE("[Variant] Assignment To Vec3i from Bool,Int,Float,String,Vec2,Vec2i,V
vec3_v = vec3i_v;
CHECK(vec3_v.get_type() == Variant::VECTOR3I);
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ vec3i_v = Vector3i(2, 3, 5);
+ vec4_v = vec3i_v;
+ CHECK(vec4_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ vec4_v = vec3i_v;
+ CHECK(vec4_v.get_type() == Variant::VECTOR3I);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ vec3i_v = Vector3i(2, 3, 5);
+ vec4i_v = vec3i_v;
+ CHECK(vec4i_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ vec4i_v = vec3i_v;
+ CHECK(vec4i_v.get_type() == Variant::VECTOR3I);
+
+ Variant rect2_v = Rect2();
+ vec3i_v = Vector3i(2, 3, 5);
+ rect2_v = vec3i_v;
+ CHECK(rect2_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ rect2_v = vec3i_v;
+ CHECK(rect2_v.get_type() == Variant::VECTOR3I);
+
+ Variant rect2i_v = Rect2i();
+ vec3i_v = Vector3i(2, 3, 5);
+ rect2i_v = vec3i_v;
+ CHECK(rect2i_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ rect2i_v = vec3i_v;
+ CHECK(rect2i_v.get_type() == Variant::VECTOR3I);
+
+ Variant transform2d_v = Transform2D();
+ vec3i_v = Vector3i(2, 3, 5);
+ transform2d_v = vec3i_v;
+ CHECK(transform2d_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ transform2d_v = vec3i_v;
+ CHECK(transform2d_v.get_type() == Variant::VECTOR3I);
+
+ Variant transform3d_v = Transform3D();
+ vec3i_v = Vector3i(2, 3, 5);
+ transform3d_v = vec3i_v;
+ CHECK(transform3d_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ transform3d_v = vec3i_v;
+ CHECK(transform3d_v.get_type() == Variant::VECTOR3I);
+
Variant col_v = Color(0.5f, 0.2f, 0.75f);
vec3i_v = Vector3i(2, 3, 5);
col_v = vec3i_v;
@@ -652,9 +1491,74 @@ TEST_CASE("[Variant] Assignment To Vec3i from Bool,Int,Float,String,Vec2,Vec2i,V
vec3i_v = Vector3i(-5, -7, -2);
col_v = vec3i_v;
CHECK(col_v.get_type() == Variant::VECTOR3I);
+
+ Variant call_v = Callable();
+ vec3i_v = Vector3i(2, 3, 5);
+ call_v = vec3i_v;
+ CHECK(call_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ call_v = vec3i_v;
+ CHECK(call_v.get_type() == Variant::VECTOR3I);
+
+ Variant plane_v = Plane();
+ vec3i_v = Vector3i(2, 3, 5);
+ plane_v = vec3i_v;
+ CHECK(plane_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ plane_v = vec3i_v;
+ CHECK(plane_v.get_type() == Variant::VECTOR3I);
+
+ Variant basis_v = Basis();
+ vec3i_v = Vector3i(2, 3, 5);
+ basis_v = vec3i_v;
+ CHECK(basis_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ basis_v = vec3i_v;
+ CHECK(basis_v.get_type() == Variant::VECTOR3I);
+
+ Variant aabb_v = AABB();
+ vec3i_v = Vector3i(2, 3, 5);
+ aabb_v = vec3i_v;
+ CHECK(aabb_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ aabb_v = vec3i_v;
+ CHECK(aabb_v.get_type() == Variant::VECTOR3I);
+
+ Variant quaternion_v = Quaternion();
+ vec3i_v = Vector3i(2, 3, 5);
+ quaternion_v = vec3i_v;
+ CHECK(quaternion_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ quaternion_v = vec3i_v;
+ CHECK(quaternion_v.get_type() == Variant::VECTOR3I);
+
+ Variant projection_v = Projection();
+ vec3i_v = Vector3i(2, 3, 5);
+ projection_v = vec3i_v;
+ CHECK(projection_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ projection_v = vec3i_v;
+ CHECK(projection_v.get_type() == Variant::VECTOR3I);
+
+ Variant rid_v = RID();
+ vec3i_v = Vector3i(2, 3, 5);
+ rid_v = vec3i_v;
+ CHECK(rid_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ rid_v = vec3i_v;
+ CHECK(rid_v.get_type() == Variant::VECTOR3I);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ vec3i_v = Vector3i(2, 3, 5);
+ object_v = vec3i_v;
+ CHECK(object_v == Variant(Vector3i(2, 3, 5)));
+ vec3i_v = Vector3i(-5, -7, -2);
+ object_v = vec3i_v;
+ CHECK(object_v.get_type() == Variant::VECTOR3I);
}
-TEST_CASE("[Variant] Assignment To Color from Bool,Int,Float,String,Vec2,Vec2i,Vec3 and Vec3i") {
+TEST_CASE("[Variant] Assignment To Color from Bool,Int,Float,String,Vec2,Vec2i,Vec3,Vec3i,Vec4,Vec4i,Rect2,Rect2i,Trans2d,Trans3d,Color,Call,Plane,Basis,AABB,Quant,Proj,RID,and Object") {
Variant bool_v = false;
Variant col_v = Color(0.25f, 0.4f, 0.78f);
bool_v = col_v; // Now bool_v is Color
@@ -718,6 +1622,119 @@ TEST_CASE("[Variant] Assignment To Color from Bool,Int,Float,String,Vec2,Vec2i,V
col_v = Color(0.33f, 0.75f, 0.21f);
vec3i_v = col_v;
CHECK(vec3i_v.get_type() == Variant::COLOR);
+
+ Variant vec4_v = Vector4(0, 0, 0, 0);
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ vec4_v = col_v;
+ CHECK(vec4_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ vec4_v = col_v;
+ CHECK(vec4_v.get_type() == Variant::COLOR);
+
+ Variant vec4i_v = Vector4i(0, 0, 0, 0);
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ vec4i_v = col_v;
+ CHECK(vec4i_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ vec4i_v = col_v;
+ CHECK(vec4i_v.get_type() == Variant::COLOR);
+
+ Variant rect2_v = Rect2();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ rect2_v = col_v;
+ CHECK(rect2_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ rect2_v = col_v;
+ CHECK(rect2_v.get_type() == Variant::COLOR);
+
+ Variant rect2i_v = Rect2i();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ rect2i_v = col_v;
+ CHECK(rect2i_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ rect2i_v = col_v;
+ CHECK(rect2i_v.get_type() == Variant::COLOR);
+
+ Variant transform2d_v = Transform2D();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ transform2d_v = col_v;
+ CHECK(transform2d_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ transform2d_v = col_v;
+ CHECK(transform2d_v.get_type() == Variant::COLOR);
+
+ Variant transform3d_v = Transform3D();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ transform3d_v = col_v;
+ CHECK(transform3d_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ transform3d_v = col_v;
+ CHECK(transform3d_v.get_type() == Variant::COLOR);
+
+ Variant call_v = Callable();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ call_v = col_v;
+ CHECK(call_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ call_v = col_v;
+ CHECK(call_v.get_type() == Variant::COLOR);
+
+ Variant plane_v = Plane();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ plane_v = col_v;
+ CHECK(plane_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ plane_v = col_v;
+ CHECK(plane_v.get_type() == Variant::COLOR);
+
+ Variant basis_v = Basis();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ basis_v = col_v;
+ CHECK(basis_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ basis_v = col_v;
+ CHECK(basis_v.get_type() == Variant::COLOR);
+
+ Variant aabb_v = AABB();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ aabb_v = col_v;
+ CHECK(aabb_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ aabb_v = col_v;
+ CHECK(aabb_v.get_type() == Variant::COLOR);
+
+ Variant quaternion_v = Quaternion();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ quaternion_v = col_v;
+ CHECK(quaternion_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ quaternion_v = col_v;
+ CHECK(quaternion_v.get_type() == Variant::COLOR);
+
+ Variant projection_v = Projection();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ projection_v = col_v;
+ CHECK(projection_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ projection_v = col_v;
+ CHECK(projection_v.get_type() == Variant::COLOR);
+
+ Variant rid_v = RID();
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ rid_v = col_v;
+ CHECK(rid_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ rid_v = col_v;
+ CHECK(rid_v.get_type() == Variant::COLOR);
+
+ Object obj_one = Object();
+ Variant object_v = &obj_one;
+ col_v = Color(0.25f, 0.4f, 0.78f);
+ object_v = col_v;
+ CHECK(object_v == Variant(Color(0.25f, 0.4f, 0.78f)));
+ col_v = Color(0.33f, 0.75f, 0.21f);
+ object_v = col_v;
+ CHECK(object_v.get_type() == Variant::COLOR);
}
TEST_CASE("[Variant] Writer and parser array") {
diff --git a/tests/scene/test_code_edit.h b/tests/scene/test_code_edit.h
index 27907b8bb5..c3a374b5cd 100644
--- a/tests/scene/test_code_edit.h
+++ b/tests/scene/test_code_edit.h
@@ -2944,15 +2944,15 @@ TEST_CASE("[SceneTree][CodeEdit] region folding") {
CHECK(code_edit->is_line_code_region_end(2));
// Update code region delimiter when removing comment delimiter.
- code_edit->set_text("//region region_name\nline2\n//endregion\n#region region_name\nline2\n#endregion");
+ code_edit->set_text("#region region_name\nline2\n#endregion\n//region region_name\nline2\n//endregion");
code_edit->clear_comment_delimiters();
code_edit->add_comment_delimiter("//", "");
- code_edit->add_comment_delimiter("#", "");
+ code_edit->add_comment_delimiter("#", ""); // A shorter delimiter has higher priority.
CHECK(code_edit->is_line_code_region_start(0));
CHECK(code_edit->is_line_code_region_end(2));
CHECK_FALSE(code_edit->is_line_code_region_start(3));
CHECK_FALSE(code_edit->is_line_code_region_end(5));
- code_edit->remove_comment_delimiter("//");
+ code_edit->remove_comment_delimiter("#");
CHECK_FALSE(code_edit->is_line_code_region_start(0));
CHECK_FALSE(code_edit->is_line_code_region_end(2));
CHECK(code_edit->is_line_code_region_start(3));
@@ -3364,7 +3364,9 @@ TEST_CASE("[SceneTree][CodeEdit] completion") {
/* After update, pending add should not be counted, */
/* also does not work on col 0 */
+ int before_text_caret_column = code_edit->get_caret_column();
code_edit->insert_text_at_caret("i");
+
code_edit->update_code_completion_options();
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
@@ -3400,12 +3402,40 @@ TEST_CASE("[SceneTree][CodeEdit] completion") {
/* Set size for mouse input. */
code_edit->set_size(Size2(100, 100));
+ /* Test home and end keys close the completion and move the caret */
+ /* => ui_text_caret_line_start */
+ code_edit->set_caret_column(before_text_caret_column + 1);
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
+
+ code_edit->update_code_completion_options();
+
+ SEND_GUI_ACTION("ui_text_caret_line_start");
+ code_edit->update_code_completion_options();
+ CHECK(code_edit->get_code_completion_selected_index() == -1);
+ CHECK(code_edit->get_caret_column() == 0);
+
+ /* => ui_text_caret_line_end */
+ code_edit->set_caret_column(before_text_caret_column + 1);
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
+
+ code_edit->update_code_completion_options();
+
+ SEND_GUI_ACTION("ui_text_caret_line_end");
+ code_edit->update_code_completion_options();
+ CHECK(code_edit->get_code_completion_selected_index() == -1);
+ CHECK(code_edit->get_caret_column() == before_text_caret_column + 1);
+
/* Check input. */
- SEND_GUI_ACTION("ui_end");
- CHECK(code_edit->get_code_completion_selected_index() == 2);
+ code_edit->set_caret_column(before_text_caret_column + 1);
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_CLASS, "item_0.", "item_0", Color(1, 0, 0), Ref<Resource>(), Color(1, 0, 0));
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_1.", "item_1");
+ code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_VARIABLE, "item_2.", "item_2");
- SEND_GUI_ACTION("ui_home");
- CHECK(code_edit->get_code_completion_selected_index() == 0);
+ code_edit->update_code_completion_options();
SEND_GUI_ACTION("ui_page_down");
CHECK(code_edit->get_code_completion_selected_index() == 2);
diff --git a/tests/scene/test_text_edit.h b/tests/scene/test_text_edit.h
index 840a04becf..9c9ade4445 100644
--- a/tests/scene/test_text_edit.h
+++ b/tests/scene/test_text_edit.h
@@ -3913,7 +3913,8 @@ TEST_CASE("[SceneTree][TextEdit] viewport") {
CHECK(text_edit->get_h_scroll() == 0);
text_edit->set_h_scroll(10000000);
- CHECK(text_edit->get_h_scroll() == 314);
+ CHECK(text_edit->get_h_scroll() == 306);
+ CHECK(text_edit->get_h_scroll_bar()->get_combined_minimum_size().x == 8);
text_edit->set_h_scroll(-100);
CHECK(text_edit->get_h_scroll() == 0);
diff --git a/tests/scene/test_viewport.h b/tests/scene/test_viewport.h
index 0c53668c6d..1afae66ee0 100644
--- a/tests/scene/test_viewport.h
+++ b/tests/scene/test_viewport.h
@@ -50,17 +50,39 @@ protected:
void _notification(int p_what) {
switch (p_what) {
case NOTIFICATION_MOUSE_ENTER: {
+ if (mouse_over) {
+ invalid_order = true;
+ }
mouse_over = true;
} break;
case NOTIFICATION_MOUSE_EXIT: {
+ if (!mouse_over) {
+ invalid_order = true;
+ }
mouse_over = false;
} break;
+
+ case NOTIFICATION_MOUSE_ENTER_SELF: {
+ if (mouse_over_self) {
+ invalid_order = true;
+ }
+ mouse_over_self = true;
+ } break;
+
+ case NOTIFICATION_MOUSE_EXIT_SELF: {
+ if (!mouse_over_self) {
+ invalid_order = true;
+ }
+ mouse_over_self = false;
+ } break;
}
}
public:
bool mouse_over = false;
+ bool mouse_over_self = false;
+ bool invalid_order = false;
};
// `NotificationControlViewport`-derived class that additionally
@@ -119,12 +141,15 @@ public:
TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
DragStart *node_a = memnew(DragStart);
- Control *node_b = memnew(Control);
+ NotificationControlViewport *node_b = memnew(NotificationControlViewport);
Node2D *node_c = memnew(Node2D);
DragTarget *node_d = memnew(DragTarget);
- Control *node_e = memnew(Control);
+ NotificationControlViewport *node_e = memnew(NotificationControlViewport);
Node *node_f = memnew(Node);
- Control *node_g = memnew(Control);
+ NotificationControlViewport *node_g = memnew(NotificationControlViewport);
+ NotificationControlViewport *node_h = memnew(NotificationControlViewport);
+ NotificationControlViewport *node_i = memnew(NotificationControlViewport);
+ NotificationControlViewport *node_j = memnew(NotificationControlViewport);
node_a->set_name(SNAME("NodeA"));
node_b->set_name(SNAME("NodeB"));
@@ -133,6 +158,9 @@ TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
node_e->set_name(SNAME("NodeE"));
node_f->set_name(SNAME("NodeF"));
node_g->set_name(SNAME("NodeG"));
+ node_h->set_name(SNAME("NodeH"));
+ node_i->set_name(SNAME("NodeI"));
+ node_j->set_name(SNAME("NodeJ"));
node_a->set_position(Point2i(0, 0));
node_b->set_position(Point2i(10, 10));
@@ -140,16 +168,25 @@ TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
node_d->set_position(Point2i(10, 10));
node_e->set_position(Point2i(10, 100));
node_g->set_position(Point2i(10, 100));
+ node_h->set_position(Point2i(10, 120));
+ node_i->set_position(Point2i(2, 0));
+ node_j->set_position(Point2i(2, 0));
node_a->set_size(Point2i(30, 30));
node_b->set_size(Point2i(30, 30));
node_d->set_size(Point2i(30, 30));
node_e->set_size(Point2i(10, 10));
node_g->set_size(Point2i(10, 10));
+ node_h->set_size(Point2i(10, 10));
+ node_i->set_size(Point2i(10, 10));
+ node_j->set_size(Point2i(10, 10));
node_a->set_focus_mode(Control::FOCUS_CLICK);
node_b->set_focus_mode(Control::FOCUS_CLICK);
node_d->set_focus_mode(Control::FOCUS_CLICK);
node_e->set_focus_mode(Control::FOCUS_CLICK);
node_g->set_focus_mode(Control::FOCUS_CLICK);
+ node_h->set_focus_mode(Control::FOCUS_CLICK);
+ node_i->set_focus_mode(Control::FOCUS_CLICK);
+ node_j->set_focus_mode(Control::FOCUS_CLICK);
Window *root = SceneTree::get_singleton()->get_root();
DisplayServerMock *DS = (DisplayServerMock *)(DisplayServer::get_singleton());
@@ -162,6 +199,9 @@ TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
// - e (Control)
// - f (Node)
// - g (Control)
+ // - h (Control)
+ // - i (Control)
+ // - j (Control)
root->add_child(node_a);
root->add_child(node_b);
node_b->add_child(node_c);
@@ -169,12 +209,17 @@ TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
root->add_child(node_e);
node_e->add_child(node_f);
node_f->add_child(node_g);
+ root->add_child(node_h);
+ node_h->add_child(node_i);
+ node_i->add_child(node_j);
Point2i on_a = Point2i(5, 5);
Point2i on_b = Point2i(15, 15);
Point2i on_d = Point2i(25, 25);
Point2i on_e = Point2i(15, 105);
Point2i on_g = Point2i(15, 105);
+ Point2i on_i = Point2i(13, 125);
+ Point2i on_j = Point2i(15, 125);
Point2i on_background = Point2i(500, 500);
Point2i on_outside = Point2i(-1, -1);
@@ -419,26 +464,612 @@ TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
SUBCASE("[Viewport][GuiInputEvent] Mouse Motion") {
// FIXME: Tooltips are not yet tested. They likely require an internal clock.
- SUBCASE("[Viewport][GuiInputEvent] Mouse Motion changes the Control, that it is over.") {
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Motion changes the Control that it is over.") {
SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
CHECK_FALSE(node_a->mouse_over);
+ CHECK_FALSE(node_a->mouse_over_self);
// Move over Control.
SEND_GUI_MOUSE_MOTION_EVENT(on_a, MouseButtonMask::NONE, Key::NONE);
CHECK(node_a->mouse_over);
+ CHECK(node_a->mouse_over_self);
// No change.
SEND_GUI_MOUSE_MOTION_EVENT(on_a + Point2i(1, 1), MouseButtonMask::NONE, Key::NONE);
CHECK(node_a->mouse_over);
+ CHECK(node_a->mouse_over_self);
// Move over other Control.
SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE);
CHECK_FALSE(node_a->mouse_over);
+ CHECK_FALSE(node_a->mouse_over_self);
CHECK(node_d->mouse_over);
+ CHECK(node_d->mouse_over_self);
- // Move to background
+ // Move to background.
SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
CHECK_FALSE(node_d->mouse_over);
+ CHECK_FALSE(node_d->mouse_over_self);
+
+ CHECK_FALSE(node_a->invalid_order);
+ CHECK_FALSE(node_d->invalid_order);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification propagation.") {
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_g->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK_FALSE(node_d->mouse_over);
+ CHECK_FALSE(node_d->mouse_over_self);
+
+ // Move to Control node_d. node_b receives mouse over since it is only separated by a CanvasItem.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK(node_d->mouse_over);
+ CHECK(node_d->mouse_over_self);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK_FALSE(node_d->mouse_over);
+ CHECK_FALSE(node_d->mouse_over_self);
+
+ CHECK_FALSE(node_e->mouse_over);
+ CHECK_FALSE(node_e->mouse_over_self);
+ CHECK_FALSE(node_g->mouse_over);
+ CHECK_FALSE(node_g->mouse_over_self);
+
+ // Move to Control node_g. node_g receives mouse over but node_e does not since it is separated by a non-CanvasItem.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_g, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_e->mouse_over);
+ CHECK_FALSE(node_e->mouse_over_self);
+ CHECK(node_g->mouse_over);
+ CHECK(node_g->mouse_over_self);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_e->mouse_over);
+ CHECK_FALSE(node_e->mouse_over_self);
+ CHECK_FALSE(node_g->mouse_over);
+ CHECK_FALSE(node_g->mouse_over_self);
+
+ CHECK_FALSE(node_b->invalid_order);
+ CHECK_FALSE(node_d->invalid_order);
+ CHECK_FALSE(node_e->invalid_order);
+ CHECK_FALSE(node_g->invalid_order);
+
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_g->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification propagation when moving into child.") {
+ SIGNAL_WATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_WATCH(node_i, SNAME("mouse_exited"));
+ Array signal_args;
+ signal_args.push_back(Array());
+
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+
+ // Move to Control node_i.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_i, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_i->mouse_over);
+ CHECK(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Move to child Control node_j. node_i should not receive any new Mouse Enter signals.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Move to parent Control node_i. node_i should not receive any new Mouse Enter signals.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_i, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_i->mouse_over);
+ CHECK(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK(SNAME("mouse_exited"), signal_args);
+
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_exited"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification propagation with top level.") {
+ node_c->set_as_top_level(true);
+ node_i->set_as_top_level(true);
+ node_c->set_position(node_b->get_global_position());
+ node_i->set_position(node_h->get_global_position());
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK_FALSE(node_d->mouse_over);
+ CHECK_FALSE(node_d->mouse_over_self);
+
+ // Move to Control node_d. node_b does not receive mouse over since node_c is top level.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK(node_d->mouse_over);
+ CHECK(node_d->mouse_over_self);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK_FALSE(node_d->mouse_over);
+ CHECK_FALSE(node_d->mouse_over_self);
+
+ CHECK_FALSE(node_g->mouse_over);
+ CHECK_FALSE(node_g->mouse_over_self);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+
+ // Move to Control node_j. node_h does not receive mouse over since node_i is top level.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+
+ CHECK_FALSE(node_b->invalid_order);
+ CHECK_FALSE(node_d->invalid_order);
+ CHECK_FALSE(node_e->invalid_order);
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_c->set_as_top_level(false);
+ node_i->set_as_top_level(false);
+ node_c->set_position(Point2i(0, 0));
+ node_i->set_position(Point2i(0, 0));
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification propagation with mouse filter stop.") {
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+
+ // Move to Control node_j. node_h does not receive mouse over since node_i is MOUSE_FILTER_STOP.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification propagation with mouse filter ignore.") {
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+
+ // Move to Control node_j. node_i does not receive mouse over since node_i is MOUSE_FILTER_IGNORE.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+
+ // Move to background.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_background, MouseButtonMask::NONE, Key::NONE);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification when changing top level.") {
+ SIGNAL_WATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_WATCH(node_i, SNAME("mouse_exited"));
+ Array signal_args;
+ signal_args.push_back(Array());
+
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to Control node_d.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_d, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK(node_d->mouse_over);
+ CHECK(node_d->mouse_over_self);
+
+ // Change node_c to be top level. node_b should receive Mouse Exit.
+ node_c->set_as_top_level(true);
+ CHECK_FALSE(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK(node_d->mouse_over);
+ CHECK(node_d->mouse_over_self);
+
+ // Change node_c to be not top level. node_b should receive Mouse Enter.
+ node_c->set_as_top_level(false);
+ CHECK(node_b->mouse_over);
+ CHECK_FALSE(node_b->mouse_over_self);
+ CHECK(node_d->mouse_over);
+ CHECK(node_d->mouse_over_self);
+
+ // Move to Control node_j.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Change node_i to top level. node_h should receive Mouse Exit. node_i should not receive any new signals.
+ node_i->set_as_top_level(true);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Change node_i to not top level. node_h should receive Mouse Enter. node_i should not receive any new signals.
+ node_i->set_as_top_level(false);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ CHECK_FALSE(node_b->invalid_order);
+ CHECK_FALSE(node_d->invalid_order);
+ CHECK_FALSE(node_e->invalid_order);
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_d->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_exited"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification when changing the mouse filter to stop.") {
+ SIGNAL_WATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_WATCH(node_i, SNAME("mouse_exited"));
+ Array signal_args;
+ signal_args.push_back(Array());
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to Control node_j.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Change node_i to MOUSE_FILTER_STOP. node_h should receive Mouse Exit. node_i should not receive any new signals.
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ CHECK_FALSE(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Change node_i to MOUSE_FILTER_PASS. node_h should receive Mouse Enter. node_i should not receive any new signals.
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_exited"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification when changing the mouse filter to ignore.") {
+ SIGNAL_WATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_WATCH(node_i, SNAME("mouse_exited"));
+ Array signal_args;
+ signal_args.push_back(Array());
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to Control node_j.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Change node_i to MOUSE_FILTER_IGNORE. node_i should receive Mouse Exit.
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK(SNAME("mouse_exited"), signal_args);
+
+ // Change node_i to MOUSE_FILTER_PASS. node_i should receive Mouse Enter.
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Change node_j to MOUSE_FILTER_IGNORE. After updating the mouse motion, node_i should now have mouse_over_self.
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Change node_j to MOUSE_FILTER_PASS. After updating the mouse motion, node_j should now have mouse_over_self.
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_entered"));
+ SIGNAL_UNWATCH(node_i, SNAME("mouse_exited"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification when removing the hovered Control.") {
+ SIGNAL_WATCH(node_h, SNAME("mouse_entered"));
+ SIGNAL_WATCH(node_h, SNAME("mouse_exited"));
+ Array signal_args;
+ signal_args.push_back(Array());
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to Control node_j.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Remove node_i from the tree. node_i and node_j should receive Mouse Exit. node_h should not receive any new signals.
+ node_h->remove_child(node_i);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Add node_i to the tree and update the mouse. node_i and node_j should receive Mouse Enter. node_h should not receive any new signals.
+ node_h->add_child(node_i);
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+
+ SIGNAL_UNWATCH(node_h, SNAME("mouse_entered"));
+ SIGNAL_UNWATCH(node_h, SNAME("mouse_exited"));
+ }
+
+ SUBCASE("[Viewport][GuiInputEvent] Mouse Enter/Exit notification when hiding the hovered Control.") {
+ SIGNAL_WATCH(node_h, SNAME("mouse_entered"));
+ SIGNAL_WATCH(node_h, SNAME("mouse_exited"));
+ Array signal_args;
+ signal_args.push_back(Array());
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_PASS);
+
+ // Move to Control node_j.
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK(SNAME("mouse_entered"), signal_args);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Hide node_i. node_i and node_j should receive Mouse Exit. node_h should not receive any new signals.
+ node_i->hide();
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK_FALSE(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK_FALSE(node_j->mouse_over);
+ CHECK_FALSE(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ // Show node_i and update the mouse. node_i and node_j should receive Mouse Enter. node_h should not receive any new signals.
+ node_i->show();
+ SEND_GUI_MOUSE_MOTION_EVENT(on_j, MouseButtonMask::NONE, Key::NONE);
+ CHECK(node_h->mouse_over);
+ CHECK_FALSE(node_h->mouse_over_self);
+ CHECK(node_i->mouse_over);
+ CHECK_FALSE(node_i->mouse_over_self);
+ CHECK(node_j->mouse_over);
+ CHECK(node_j->mouse_over_self);
+ SIGNAL_CHECK_FALSE(SNAME("mouse_entered"));
+ SIGNAL_CHECK_FALSE(SNAME("mouse_exited"));
+
+ CHECK_FALSE(node_h->invalid_order);
+ CHECK_FALSE(node_i->invalid_order);
+ CHECK_FALSE(node_j->invalid_order);
+
+ node_i->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+ node_j->set_mouse_filter(Control::MOUSE_FILTER_STOP);
+
+ SIGNAL_UNWATCH(node_h, SNAME("mouse_entered"));
+ SIGNAL_UNWATCH(node_h, SNAME("mouse_exited"));
}
SUBCASE("[Viewport][GuiInputEvent] Window Mouse Enter/Exit signals.") {
@@ -710,6 +1341,9 @@ TEST_CASE("[SceneTree][Viewport] Controls and InputEvent handling") {
}
}
+ memdelete(node_j);
+ memdelete(node_i);
+ memdelete(node_h);
memdelete(node_g);
memdelete(node_f);
memdelete(node_e);