diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index 37fdd8f554..bbd1887fd4 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -861,7 +861,7 @@ struct VariantInitializer { template struct VariantInitializer::is_local>> { static _FORCE_INLINE_ void init(Variant *v) { - memnew_placement(&VariantInternalAccessor::get(v), T); + memnew_placement(&VariantInternalAccessor::get(v), T()); VariantInternal::set_type(*v, GetTypeInfo::VARIANT_TYPE); } }; @@ -969,9 +969,9 @@ struct VariantTypeChanger { if (v->get_type() != GetTypeInfo::VARIANT_TYPE || GetTypeInfo::VARIANT_TYPE >= Variant::PACKED_BYTE_ARRAY) { //second condition removed by optimizer VariantInternal::clear(v); VariantInitializer::init(v); + } else { + VariantDefaultInitializer::init(v); } - - VariantDefaultInitializer::init(v); } }; diff --git a/tests/core/variant/test_variant_initialization.cpp b/tests/core/variant/test_variant_initialization.cpp new file mode 100644 index 0000000000..f30d4dfcd2 --- /dev/null +++ b/tests/core/variant/test_variant_initialization.cpp @@ -0,0 +1,648 @@ +/**************************************************************************/ +/* test_variant_initialization.cpp */ +/**************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/**************************************************************************/ +/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */ +/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/**************************************************************************/ + +#include "tests/test_macros.h" + +TEST_FORCE_LINK(test_variant_initialization) + +#include "core/variant/variant_internal.h" + +namespace TestVariantInitialization { + +TEST_CASE("[VariantInitialization] change_and_reset") { + // Garbage data + Variant *p = new Variant(); + std::memset((void *)p, -1, sizeof(Variant)); + VariantInternal::set_type(*p, Variant::Type::NIL); + + SUBCASE("bool") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::BOOL); + CHECK(*p == Variant(false)); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::BOOL); + CHECK(*p == Variant(false)); + + *p = Variant(1); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::BOOL); + CHECK(*p == Variant(false)); + } + + SUBCASE("int") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::INT); + CHECK(*p == Variant(0)); + + *p = Variant(1); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::INT); + CHECK(*p == Variant(0)); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::INT); + CHECK(*p == Variant(0)); + } + + SUBCASE("float") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::FLOAT); + CHECK(*p == Variant(0.)); + + *p = Variant(1.0); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::FLOAT); + CHECK(*p == Variant(0.)); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::FLOAT); + CHECK(*p == Variant(0.)); + } + + SUBCASE("String") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::STRING); + CHECK(*p == Variant("")); + + *p = Variant(1.0); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::STRING); + CHECK(*p == Variant("")); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::STRING); + CHECK(*p == Variant("")); + } + + SUBCASE("Vector2") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR2); + CHECK(*p == Variant(Vector2())); + + *p = Variant(Vector2(1., 1.)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR2); + CHECK(*p == Variant(Vector2())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR2); + CHECK(*p == Variant(Vector2())); + } + + SUBCASE("Vector2i") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR2I); + CHECK(*p == Variant(Vector2i())); + + *p = Variant(Vector2i(1, 1)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR2I); + CHECK(*p == Variant(Vector2i())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR2I); + CHECK(*p == Variant(Vector2i())); + } + + SUBCASE("Vector3") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR3); + CHECK(*p == Variant(Vector3())); + + *p = Variant(Vector3(1., 1., 1.)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR3); + CHECK(*p == Variant(Vector3())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR3); + CHECK(*p == Variant(Vector3())); + } + + SUBCASE("Vector3i") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR3I); + CHECK(*p == Variant(Vector3i())); + + *p = Variant(Vector3i(1, 1, 1)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR3I); + CHECK(*p == Variant(Vector3i())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR3I); + CHECK(*p == Variant(Vector3i())); + } + + SUBCASE("Vector4") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR4); + CHECK(*p == Variant(Vector4())); + + *p = Variant(Vector4(1., 1., 1., 1.)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR4); + CHECK(*p == Variant(Vector4())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR4); + CHECK(*p == Variant(Vector4())); + } + + SUBCASE("Vector4i") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR4I); + CHECK(*p == Variant(Vector4i())); + + *p = Variant(Vector4i(1, 1, 1, 1)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR4I); + CHECK(*p == Variant(Vector4i())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::VECTOR4I); + CHECK(*p == Variant(Vector4i())); + } + + SUBCASE("Rect2") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RECT2); + CHECK(*p == Variant(Rect2())); + + *p = Variant(Rect2(1., 1., 1., 1.)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RECT2); + CHECK(*p == Variant(Rect2())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RECT2); + CHECK(*p == Variant(Rect2())); + } + + SUBCASE("Rect2i") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RECT2I); + CHECK(*p == Variant(Rect2i())); + + *p = Variant(Rect2i(1, 1, 1, 1)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RECT2I); + CHECK(*p == Variant(Rect2i())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RECT2I); + CHECK(*p == Variant(Rect2i())); + } + + SUBCASE("Transform3D") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::TRANSFORM3D); + CHECK(*p == Variant(Transform3D())); + + Transform3D t; + t.origin = Vector3(1, 1, 1); + *p = Variant(t); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::TRANSFORM3D); + CHECK(*p == Variant(Transform3D())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::TRANSFORM3D); + CHECK(*p == Variant(Transform3D())); + } + + SUBCASE("Projection") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PROJECTION); + CHECK(*p == Variant(Projection())); + + Projection pj; + pj.columns[0].x = 1; + *p = Variant(pj); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PROJECTION); + CHECK(*p == Variant(Projection())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PROJECTION); + CHECK(*p == Variant(Projection())); + } + + SUBCASE("Transform2D") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::TRANSFORM2D); + CHECK(*p == Variant(Transform2D())); + + Transform2D t; + t *= 2; + *p = Variant(t); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::TRANSFORM2D); + CHECK(*p == Variant(Transform2D())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::TRANSFORM2D); + CHECK(*p == Variant(Transform2D())); + } + + SUBCASE("Quaternion") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::QUATERNION); + CHECK(*p == Variant(Quaternion())); + + *p = Variant(Quaternion(1., 2., 3., 4.)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::QUATERNION); + CHECK(*p == Variant(Quaternion())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::QUATERNION); + CHECK(*p == Variant(Quaternion())); + } + + SUBCASE("Plane") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PLANE); + CHECK(*p == Variant(Plane())); + + *p = Variant(Plane(Vector3(), 1.)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PLANE); + CHECK(*p == Variant(Plane())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PLANE); + CHECK(*p == Variant(Plane())); + } + + SUBCASE("Basis") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::BASIS); + CHECK(*p == Variant(Basis())); + + *p = Variant(Basis::from_scale(Vector3::UP)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::BASIS); + CHECK(*p == Variant(Basis())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::BASIS); + CHECK(*p == Variant(Basis())); + } + + SUBCASE("AABB") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::AABB); + CHECK(*p == Variant(AABB())); + + *p = Variant(AABB(Vector3::UP, Vector3::RIGHT)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::AABB); + CHECK(*p == Variant(AABB())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::AABB); + CHECK(*p == Variant(AABB())); + } + + SUBCASE("Color") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::COLOR); + CHECK(*p == Variant(Color())); + + *p = Variant(Color::from_hsv(0.5, 0.5, 0.5)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::COLOR); + CHECK(*p == Variant(Color())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::COLOR); + CHECK(*p == Variant(Color())); + } + + SUBCASE("StringName") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::STRING_NAME); + CHECK(*p == Variant(StringName())); + + *p = Variant(StringName("abc")); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::STRING_NAME); + CHECK(*p == Variant(StringName())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::STRING_NAME); + CHECK(*p == Variant(StringName())); + } + + SUBCASE("NodePath") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::NODE_PATH); + CHECK(*p == Variant(NodePath())); + + *p = Variant(NodePath("abc")); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::NODE_PATH); + CHECK(*p == Variant(NodePath())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::NODE_PATH); + CHECK(*p == Variant(NodePath())); + } + + SUBCASE("RID") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RID); + CHECK(*p == Variant(RID())); + + *p = Variant(RID::from_uint64(123ull)); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RID); + CHECK(*p == Variant(RID())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::RID); + CHECK(*p == Variant(RID())); + } + + SUBCASE("Callable") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::CALLABLE); + CHECK(*p == Variant(Callable())); + + Object o; + *p = Variant(Callable(&o, "abc")); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::CALLABLE); + CHECK(*p == Variant(Callable())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::CALLABLE); + CHECK(*p == Variant(Callable())); + } + + SUBCASE("Signal") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::SIGNAL); + CHECK(*p == Variant(Signal())); + + Object o; + *p = Variant(Signal(&o, "abc")); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::SIGNAL); + CHECK(*p == Variant(Signal())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::SIGNAL); + CHECK(*p == Variant(Signal())); + } + + SUBCASE("Dictionary") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::DICTIONARY); + CHECK(*p == Variant(Dictionary())); + + *p = Variant(Dictionary{ KeyValue{ Variant(1), Variant(2) } }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::DICTIONARY); + CHECK(*p == Variant(Dictionary())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::DICTIONARY); + CHECK(*p == Variant(Dictionary())); + } + + SUBCASE("Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::ARRAY); + CHECK(*p == Variant(Array())); + + *p = Variant(Array{ Variant(1) }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::ARRAY); + CHECK(*p == Variant(Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::ARRAY); + CHECK(*p == Variant(Array())); + } + + SUBCASE("PackedByteArray") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_BYTE_ARRAY); + CHECK(*p == Variant(PackedByteArray())); + + *p = Variant(PackedByteArray{ 1, 2 }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_BYTE_ARRAY); + CHECK(*p == Variant(PackedByteArray())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_BYTE_ARRAY); + CHECK(*p == Variant(PackedByteArray())); + } + + SUBCASE("PackedInt32Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_INT32_ARRAY); + CHECK(*p == Variant(PackedInt32Array())); + + *p = Variant(PackedInt32Array{ 1, 2 }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_INT32_ARRAY); + CHECK(*p == Variant(PackedInt32Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_INT32_ARRAY); + CHECK(*p == Variant(PackedInt32Array())); + } + + SUBCASE("PackedInt64Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_INT64_ARRAY); + CHECK(*p == Variant(PackedInt64Array())); + + *p = Variant(PackedInt64Array{ 1, 2 }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_INT64_ARRAY); + CHECK(*p == Variant(PackedInt64Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_INT64_ARRAY); + CHECK(*p == Variant(PackedInt64Array())); + } + + SUBCASE("PackedFloat32Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_FLOAT32_ARRAY); + CHECK(*p == Variant(PackedFloat32Array())); + + *p = Variant(PackedFloat32Array{ 1, 2 }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_FLOAT32_ARRAY); + CHECK(*p == Variant(PackedFloat32Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_FLOAT32_ARRAY); + CHECK(*p == Variant(PackedFloat32Array())); + } + + SUBCASE("PackedFloat64Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_FLOAT64_ARRAY); + CHECK(*p == Variant(PackedFloat64Array())); + + *p = Variant(PackedFloat64Array{ 1, 2 }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_FLOAT64_ARRAY); + CHECK(*p == Variant(PackedFloat64Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_FLOAT64_ARRAY); + CHECK(*p == Variant(PackedFloat64Array())); + } + + SUBCASE("PackedStringArray") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_STRING_ARRAY); + CHECK(*p == Variant(PackedStringArray())); + + *p = Variant(PackedStringArray{ "1", "2" }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_STRING_ARRAY); + CHECK(*p == Variant(PackedStringArray())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_STRING_ARRAY); + CHECK(*p == Variant(PackedStringArray())); + } + + SUBCASE("PackedVector2Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR2_ARRAY); + CHECK(*p == Variant(PackedVector2Array())); + + *p = Variant(PackedVector2Array{ Vector2::UP, Vector2::RIGHT }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR2_ARRAY); + CHECK(*p == Variant(PackedVector2Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR2_ARRAY); + CHECK(*p == Variant(PackedVector2Array())); + } + + SUBCASE("PackedVector3Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR3_ARRAY); + CHECK(*p == Variant(PackedVector3Array())); + + *p = Variant(PackedVector3Array{ Vector3::UP, Vector3::RIGHT }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR3_ARRAY); + CHECK(*p == Variant(PackedVector3Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR3_ARRAY); + CHECK(*p == Variant(PackedVector3Array())); + } + + SUBCASE("PackedColorArray") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_COLOR_ARRAY); + CHECK(*p == Variant(PackedColorArray())); + + *p = Variant(PackedColorArray{ Color::from_hsv(0., .1, .2) }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_COLOR_ARRAY); + CHECK(*p == Variant(PackedColorArray())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_COLOR_ARRAY); + CHECK(*p == Variant(PackedColorArray())); + } + + SUBCASE("PackedVector4Array") { + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR4_ARRAY); + CHECK(*p == Variant(PackedVector4Array())); + + *p = Variant(PackedVector4Array{ Vector4(1, 2, 3, 4) }); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR4_ARRAY); + CHECK(*p == Variant(PackedVector4Array())); + + *p = Variant(true); + VariantTypeChanger::change_and_reset(p); + CHECK(p->get_type() == Variant::Type::PACKED_VECTOR4_ARRAY); + CHECK(*p == Variant(PackedVector4Array())); + } + + delete p; +} + +} // namespace TestVariantInitialization