diff options
Diffstat (limited to 'main/tests')
-rw-r--r-- | main/tests/test_class_db.cpp | 68 | ||||
-rw-r--r-- | main/tests/test_math.cpp | 5 | ||||
-rw-r--r-- | main/tests/test_oa_hash_map.cpp | 83 | ||||
-rw-r--r-- | main/tests/test_physics_3d.cpp | 16 | ||||
-rw-r--r-- | main/tests/test_render.cpp | 6 |
5 files changed, 131 insertions, 47 deletions
diff --git a/main/tests/test_class_db.cpp b/main/tests/test_class_db.cpp index 4c00a09e9c..3171091402 100644 --- a/main/tests/test_class_db.cpp +++ b/main/tests/test_class_db.cpp @@ -44,21 +44,21 @@ enum class [[nodiscard]] TestResult{ PASS }; -#define TEST_FAIL_COND_FATAL(m_cond, m_msg) \ - if (unlikely(m_cond)) { \ - ERR_PRINT(m_msg); \ - return TestResult::FAILED; \ - } else \ +#define TEST_FAIL_COND(m_cond, m_msg) \ + if (unlikely(m_cond)) { \ + ERR_PRINT(m_msg); \ + return TestResult::FAILED; \ + } else \ ((void)0) -#define TEST_FAIL_COND(m_cond, m_msg) \ +#define TEST_COND(m_cond, m_msg) \ if (unlikely(m_cond)) { \ ERR_PRINT(m_msg); \ __test_result__ = TestResult::FAILED; \ } else \ ((void)0) -#define TEST_CHECK_FATAL(m_test_expr) \ +#define TEST_FAIL_CHECK(m_test_expr) \ if (unlikely((m_test_expr) == TestResult::FAILED)) { \ return TestResult::FAILED; \ } else \ @@ -229,18 +229,18 @@ struct Context { return elem ? &elem.value() : nullptr; } - bool has_type(const Context &p_context, const TypeReference &p_type_ref) const { - if (p_context.builtin_types.find(p_type_ref.name) >= 0) { + bool has_type(const TypeReference &p_type_ref) const { + if (builtin_types.find(p_type_ref.name) >= 0) { return true; } if (p_type_ref.is_enum) { - if (p_context.enum_types.find(p_type_ref.name) >= 0) { + if (enum_types.find(p_type_ref.name) >= 0) { return true; } // Enum not found. Most likely because none of its constants were bound, so it's empty. That's fine. Use int instead. - return p_context.builtin_types.find(p_context.names_cache.int_type); + return builtin_types.find(names_cache.int_type); } return false; @@ -370,10 +370,10 @@ TestResult validate_property(const Context &p_context, const ExposedClass &p_cla const ExposedClass *prop_class = p_context.find_exposed_class(prop_type_ref); if (prop_class) { - TEST_FAIL_COND(prop_class->is_singleton, + TEST_COND(prop_class->is_singleton, "Property type is a singleton: '" + p_class.name + "." + String(p_prop.name) + "'."); } else { - TEST_FAIL_COND(!p_context.has_type(p_context, prop_type_ref), + TEST_FAIL_COND(!p_context.has_type(prop_type_ref), "Property type '" + prop_type_ref.name + "' not found: '" + p_class.name + "." + String(p_prop.name) + "'."); } @@ -382,7 +382,7 @@ TestResult validate_property(const Context &p_context, const ExposedClass &p_cla const ArgumentData &idx_arg = getter->arguments.front()->get(); if (idx_arg.type.name != p_context.names_cache.int_type) { // If not an int, it can be an enum - TEST_FAIL_COND(p_context.enum_types.find(idx_arg.type.name) < 0, + TEST_COND(p_context.enum_types.find(idx_arg.type.name) < 0, "Invalid type '" + idx_arg.type.name + "' for index argument of property getter: '" + p_class.name + "." + String(p_prop.name) + "'."); } } @@ -394,7 +394,7 @@ TestResult validate_property(const Context &p_context, const ExposedClass &p_cla if (idx_arg.type.name != p_context.names_cache.int_type) { // Assume the index parameter is an enum // If not an int, it can be an enum - TEST_FAIL_COND(p_context.enum_types.find(idx_arg.type.name) < 0, + TEST_COND(p_context.enum_types.find(idx_arg.type.name) < 0, "Invalid type '" + idx_arg.type.name + "' for index argument of property setter: '" + p_class.name + "." + String(p_prop.name) + "'."); } } @@ -408,7 +408,7 @@ TestResult validate_method(const Context &p_context, const ExposedClass &p_class const ExposedClass *return_class = p_context.find_exposed_class(p_method.return_type); if (return_class) { - TEST_FAIL_COND(return_class->is_singleton, + TEST_COND(return_class->is_singleton, "Method return type is a singleton: '" + p_class.name + "." + p_method.name + "'."); } @@ -417,15 +417,15 @@ TestResult validate_method(const Context &p_context, const ExposedClass &p_class const ExposedClass *arg_class = p_context.find_exposed_class(arg.type); if (arg_class) { - TEST_FAIL_COND(arg_class->is_singleton, + TEST_COND(arg_class->is_singleton, "Argument type is a singleton: '" + arg.name + "' of method '" + p_class.name + "." + p_method.name + "'."); } else { - TEST_FAIL_COND(!p_context.has_type(p_context, arg.type), + TEST_FAIL_COND(!p_context.has_type(arg.type), "Argument type '" + arg.type.name + "' not found: '" + arg.name + "' of method" + p_class.name + "." + p_method.name + "'."); } if (arg.has_defval) { - TEST_FAIL_COND(!arg_default_value_is_assignable_to_type(p_context, arg.defval, arg.type), + TEST_COND(!arg_default_value_is_assignable_to_type(p_context, arg.defval, arg.type), "Invalid default value for parameter '" + arg.name + "' of method '" + p_class.name + "." + p_method.name + "'."); } } @@ -441,10 +441,10 @@ TestResult validate_signal(const Context &p_context, const ExposedClass &p_class const ExposedClass *arg_class = p_context.find_exposed_class(arg.type); if (arg_class) { - TEST_FAIL_COND(arg_class->is_singleton, + TEST_COND(arg_class->is_singleton, "Argument class is a singleton: '" + arg.name + "' of signal" + p_class.name + "." + p_signal.name + "'."); } else { - TEST_FAIL_COND(!p_context.has_type(p_context, arg.type), + TEST_FAIL_COND(!p_context.has_type(arg.type), "Argument type '" + arg.type.name + "' not found: '" + arg.name + "' of signal" + p_class.name + "." + p_signal.name + "'."); } } @@ -459,20 +459,20 @@ TestResult validate_class(const Context &p_context, const ExposedClass &p_expose if (!is_derived_type) { // Asserts about the base Object class - TEST_FAIL_COND_FATAL(p_exposed_class.name != p_context.names_cache.object_class, + TEST_FAIL_COND(p_exposed_class.name != p_context.names_cache.object_class, "Class '" + p_exposed_class.name + "' has no base class."); - TEST_FAIL_COND_FATAL(!p_exposed_class.is_instantiable, + TEST_FAIL_COND(!p_exposed_class.is_instantiable, "Object class is not instantiable."); - TEST_FAIL_COND_FATAL(p_exposed_class.api_type != ClassDB::API_CORE, + TEST_FAIL_COND(p_exposed_class.api_type != ClassDB::API_CORE, "Object class is API is not API_CORE."); - TEST_FAIL_COND_FATAL(p_exposed_class.is_singleton, + TEST_FAIL_COND(p_exposed_class.is_singleton, "Object class is registered as a singleton."); } - CRASH_COND_MSG(p_exposed_class.is_singleton && p_exposed_class.base != p_context.names_cache.object_class, + TEST_FAIL_COND(p_exposed_class.is_singleton && p_exposed_class.base != p_context.names_cache.object_class, "Singleton base class '" + String(p_exposed_class.base) + "' is not Object, for class '" + p_exposed_class.name + "'."); - CRASH_COND_MSG(is_derived_type && !p_context.exposed_classes.has(p_exposed_class.base), + TEST_FAIL_COND(is_derived_type && !p_context.exposed_classes.has(p_exposed_class.base), "Base type '" + p_exposed_class.base.operator String() + "' does not exist, for class '" + p_exposed_class.name + "'."); for (const List<PropertyData>::Element *F = p_exposed_class.properties.front(); F; F = F->next()) { @@ -619,9 +619,9 @@ TestResult add_exposed_classes(Context &r_context) { bool bad_reference_hint = !method.is_virtual && return_info.hint != PROPERTY_HINT_RESOURCE_TYPE && ClassDB::is_parent_class(return_info.class_name, r_context.names_cache.reference_class); - TEST_FAIL_COND(bad_reference_hint, String() + "Return type is reference but hint is not '" _STR(PROPERTY_HINT_RESOURCE_TYPE) "'." + - " Are you returning a reference type by pointer? Method: '" + - exposed_class.name + "." + method.name + "'."); + TEST_COND(bad_reference_hint, String() + "Return type is reference but hint is not '" _STR(PROPERTY_HINT_RESOURCE_TYPE) "'." + + " Are you returning a reference type by pointer? Method: '" + + exposed_class.name + "." + method.name + "'."); } else if (return_info.hint == PROPERTY_HINT_RESOURCE_TYPE) { method.return_type.name = return_info.hint_string; } else if (return_info.type == Variant::NIL && return_info.usage & PROPERTY_USAGE_NIL_IS_VARIANT) { @@ -670,7 +670,7 @@ TestResult add_exposed_classes(Context &r_context) { method.arguments.push_back(vararg); } - TEST_FAIL_COND(exposed_class.find_property_by_name(method.name), + TEST_COND(exposed_class.find_property_by_name(method.name), "Method name conflicts with property: '" + String(class_name) + "." + String(method.name) + "'."); // Classes starting with an underscore are ignored unless they're used as a property setter or getter @@ -851,13 +851,13 @@ TestResult run_class_db_tests() { Context context; - TEST_CHECK_FATAL(add_exposed_classes(context)); + TEST_FAIL_CHECK(add_exposed_classes(context)); add_builtin_types(context); add_global_enums(context); const ExposedClass *object_class = context.find_exposed_class(context.names_cache.object_class); - TEST_FAIL_COND_FATAL(!object_class, "Object class not found."); - TEST_FAIL_COND_FATAL(object_class->base != StringName(), + TEST_FAIL_COND(!object_class, "Object class not found."); + TEST_FAIL_COND(object_class->base != StringName(), "Object class derives from another class: '" + object_class->base + "'."); for (ExposedClasses::Element E = context.exposed_classes.front(); E; E = E.next()) { diff --git a/main/tests/test_math.cpp b/main/tests/test_math.cpp index 11aa164709..5f84bad4e9 100644 --- a/main/tests/test_math.cpp +++ b/main/tests/test_math.cpp @@ -33,6 +33,7 @@ #include "core/math/basis.h" #include "core/math/camera_matrix.h" #include "core/math/delaunay_3d.h" +#include "core/math/geometry_2d.h" #include "core/math/math_funcs.h" #include "core/math/transform.h" #include "core/method_ptrcall.h" @@ -482,7 +483,7 @@ MainLoop *test() { float gb = (rgbe >> 9) & 0x1ff; float bb = (rgbe >> 18) & 0x1ff; float eb = (rgbe >> 27); - float mb = Math::pow(2, eb - 15.0 - 9.0); + float mb = Math::pow(2.0, eb - 15.0 - 9.0); float rd = rb * mb; float gd = gb * mb; float bd = bb * mb; @@ -635,7 +636,7 @@ MainLoop *test() { b["44"] = 4; } - print_line("inters: " + rtos(Geometry::segment_intersects_circle(Vector2(-5, 0), Vector2(-2, 0), Vector2(), 1.0))); + print_line("inters: " + rtos(Geometry2D::segment_intersects_circle(Vector2(-5, 0), Vector2(-2, 0), Vector2(), 1.0))); print_line("cross: " + Vector3(1, 2, 3).cross(Vector3(4, 5, 7))); print_line("dot: " + rtos(Vector3(1, 2, 3).dot(Vector3(4, 5, 7)))); diff --git a/main/tests/test_oa_hash_map.cpp b/main/tests/test_oa_hash_map.cpp index 719817baf4..9182f66b61 100644 --- a/main/tests/test_oa_hash_map.cpp +++ b/main/tests/test_oa_hash_map.cpp @@ -210,6 +210,89 @@ MainLoop *test() { } } + // Test map with 0 capacity. + { + OAHashMap<int, String> original_map(0); + original_map.set(1, "1"); + OS::get_singleton()->print("OAHashMap 0 capacity initialization passed.\n"); + } + + // Test copy constructor. + { + OAHashMap<int, String> original_map; + original_map.set(1, "1"); + original_map.set(2, "2"); + original_map.set(3, "3"); + original_map.set(4, "4"); + original_map.set(5, "5"); + + OAHashMap<int, String> map_copy(original_map); + + bool pass = true; + for ( + OAHashMap<int, String>::Iterator it = original_map.iter(); + it.valid; + it = original_map.next_iter(it)) { + if (map_copy.lookup_ptr(*it.key) == nullptr) { + pass = false; + } + if (*it.value != *map_copy.lookup_ptr(*it.key)) { + pass = false; + } + } + if (pass) { + OS::get_singleton()->print("OAHashMap copy constructor test passed.\n"); + } else { + OS::get_singleton()->print("OAHashMap copy constructor test FAILED.\n"); + } + + map_copy.set(1, "Random String"); + if (*map_copy.lookup_ptr(1) == *original_map.lookup_ptr(1)) { + OS::get_singleton()->print("OAHashMap copy constructor, atomic copy test FAILED.\n"); + } else { + OS::get_singleton()->print("OAHashMap copy constructor, atomic copy test passed.\n"); + } + } + + // Test assign operator. + { + OAHashMap<int, String> original_map; + original_map.set(1, "1"); + original_map.set(2, "2"); + original_map.set(3, "3"); + original_map.set(4, "4"); + original_map.set(5, "5"); + + OAHashMap<int, String> map_copy(100000); + map_copy.set(1, "Just a string."); + map_copy = original_map; + + bool pass = true; + for ( + OAHashMap<int, String>::Iterator it = map_copy.iter(); + it.valid; + it = map_copy.next_iter(it)) { + if (original_map.lookup_ptr(*it.key) == nullptr) { + pass = false; + } + if (*it.value != *original_map.lookup_ptr(*it.key)) { + pass = false; + } + } + if (pass) { + OS::get_singleton()->print("OAHashMap assign operation test passed.\n"); + } else { + OS::get_singleton()->print("OAHashMap assign operation test FAILED.\n"); + } + + map_copy.set(1, "Random String"); + if (*map_copy.lookup_ptr(1) == *original_map.lookup_ptr(1)) { + OS::get_singleton()->print("OAHashMap assign operation atomic copy test FAILED.\n"); + } else { + OS::get_singleton()->print("OAHashMap assign operation atomic copy test passed.\n"); + } + } + return nullptr; } diff --git a/main/tests/test_physics_3d.cpp b/main/tests/test_physics_3d.cpp index fe54ece98e..dfe2e946cf 100644 --- a/main/tests/test_physics_3d.cpp +++ b/main/tests/test_physics_3d.cpp @@ -136,9 +136,9 @@ protected: /* BOX SHAPE */ - Vector<Plane> box_planes = Geometry::build_box_planes(Vector3(0.5, 0.5, 0.5)); + Vector<Plane> box_planes = Geometry3D::build_box_planes(Vector3(0.5, 0.5, 0.5)); RID box_mesh = vs->mesh_create(); - Geometry::MeshData box_data = Geometry::build_convex_mesh(box_planes); + Geometry3D::MeshData box_data = Geometry3D::build_convex_mesh(box_planes); vs->mesh_add_surface_from_mesh_data(box_mesh, box_data); type_mesh_map[PhysicsServer3D::SHAPE_BOX] = box_mesh; @@ -148,10 +148,10 @@ protected: /* CAPSULE SHAPE */ - Vector<Plane> capsule_planes = Geometry::build_capsule_planes(0.5, 0.7, 12, Vector3::AXIS_Z); + Vector<Plane> capsule_planes = Geometry3D::build_capsule_planes(0.5, 0.7, 12, Vector3::AXIS_Z); RID capsule_mesh = vs->mesh_create(); - Geometry::MeshData capsule_data = Geometry::build_convex_mesh(capsule_planes); + Geometry3D::MeshData capsule_data = Geometry3D::build_convex_mesh(capsule_planes); vs->mesh_add_surface_from_mesh_data(capsule_mesh, capsule_data); type_mesh_map[PhysicsServer3D::SHAPE_CAPSULE] = capsule_mesh; @@ -165,10 +165,10 @@ protected: /* CONVEX SHAPE */ - Vector<Plane> convex_planes = Geometry::build_cylinder_planes(0.5, 0.7, 5, Vector3::AXIS_Z); + Vector<Plane> convex_planes = Geometry3D::build_cylinder_planes(0.5, 0.7, 5, Vector3::AXIS_Z); RID convex_mesh = vs->mesh_create(); - Geometry::MeshData convex_data = Geometry::build_convex_mesh(convex_planes); + Geometry3D::MeshData convex_data = Geometry3D::build_convex_mesh(convex_planes); QuickHull::build(convex_data.vertices, convex_data); vs->mesh_add_surface_from_mesh_data(convex_mesh, convex_data); @@ -341,10 +341,10 @@ public: RenderingServer *vs = RenderingServer::get_singleton(); PhysicsServer3D *ps = PhysicsServer3D::get_singleton(); - Vector<Plane> capsule_planes = Geometry::build_capsule_planes(0.5, 1, 12, 5, Vector3::AXIS_Y); + Vector<Plane> capsule_planes = Geometry3D::build_capsule_planes(0.5, 1, 12, 5, Vector3::AXIS_Y); RID capsule_mesh = vs->mesh_create(); - Geometry::MeshData capsule_data = Geometry::build_convex_mesh(capsule_planes); + Geometry3D::MeshData capsule_data = Geometry3D::build_convex_mesh(capsule_planes); vs->mesh_add_surface_from_mesh_data(capsule_mesh, capsule_data); type_mesh_map[PhysicsServer3D::SHAPE_CAPSULE] = capsule_mesh; diff --git a/main/tests/test_render.cpp b/main/tests/test_render.cpp index afc09374b9..d936dd72e7 100644 --- a/main/tests/test_render.cpp +++ b/main/tests/test_render.cpp @@ -79,8 +79,8 @@ public: Vector<Vector3> vts; /* - Vector<Plane> sp = Geometry::build_sphere_planes(2,5,5); - Geometry::MeshData md2 = Geometry::build_convex_mesh(sp); + Vector<Plane> sp = Geometry3D::build_sphere_planes(2,5,5); + Geometry3D::MeshData md2 = Geometry3D::build_convex_mesh(sp); vts=md2.vertices; */ /* @@ -118,7 +118,7 @@ public: vts.push_back(Vector3(-1, 1, -1)); vts.push_back(Vector3(-1, -1, -1)); - Geometry::MeshData md; + Geometry3D::MeshData md; Error err = QuickHull::build(vts, md); print_line("ERR: " + itos(err)); test_cube = vs->mesh_create(); |