diff options
Diffstat (limited to 'src/test/CollisionTest.cpp')
-rw-r--r-- | src/test/CollisionTest.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/test/CollisionTest.cpp b/src/test/CollisionTest.cpp new file mode 100644 index 0000000..a68db46 --- /dev/null +++ b/src/test/CollisionTest.cpp @@ -0,0 +1,139 @@ +#include <gtest/gtest.h> + +#define private public +#define protected public + +#include <crepe/ComponentManager.h> +#include <crepe/api/Event.h> +#include <crepe/api/EventManager.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/Rigidbody.h> +#include <crepe/api/Script.h> +#include <crepe/api/Transform.h> +#include <crepe/system/CollisionSystem.h> +#include <crepe/system/ScriptSystem.h> +#include <crepe/types.h> +#include <crepe/util/Log.h> + +using namespace std; +using namespace std::chrono_literals; +using namespace crepe; +using namespace testing; + +class CollisionHandler : public Script { +public: + int box_id; + EventManager & evmgr = EventManager::get_instance(); + function<void(const CollisionEvent& ev)> test_fn = [](const CollisionEvent & ev) { }; + + CollisionHandler(int box_id) { + this->box_id = box_id; + } + + bool on_collision(const CollisionEvent& ev) { + test_fn(ev); + return true; + } + + void init() { + Log::logf("Box {} script init()", box_id); + + // TODO: this should be built into script + evmgr.subscribe<CollisionEvent>([this](const CollisionEvent & ev) { + return this->on_collision(ev); + }, this->get_game_object_id()); + } +}; + +class CollisionTest : public Test { +public: + ComponentManager mgr; + CollisionSystem collision_sys{mgr}; + ScriptSystem script_sys{mgr}; + + GameObject world = mgr.new_object("world"); + GameObject game_object1 = mgr.new_object("object1", "", { 0, 0 }); + GameObject game_object2 = mgr.new_object("object2", "", { 0, 0 }); + + CollisionHandler * script_object1_ref = nullptr; + CollisionHandler * script_object2_ref = nullptr; + + void SetUp() override { + world.add_component<Rigidbody>(Rigidbody::Data{ + // TODO: remove unrelated properties: + .body_type = Rigidbody::BodyType::STATIC, + .bounce = false, + .offset = {0,0}, + }); + // Create a box with an inner size of 10x10 units + world.add_component<BoxCollider>(Vector2{5, 11}, 10, 2); // Top + world.add_component<BoxCollider>(Vector2{5, -1}, 10, 2); // Bottom + world.add_component<BoxCollider>(Vector2{-1, 5}, 2, 10); // Left + world.add_component<BoxCollider>(Vector2{11, 5}, 2, 10); // right + + game_object1.add_component<Rigidbody>(Rigidbody::Data{ + .mass = 1, + .gravity_scale = 0.01, + .body_type = Rigidbody::BodyType::DYNAMIC, + .linear_velocity = {1,0}, + .constraints = {0, 0, 0}, + .use_gravity = true, + .bounce = true, + .elastisity = 1, + .offset = {0,0}, + }); + game_object1.add_component<BoxCollider>(Vector2{0, 0}, 20, 20); + BehaviorScript & script_object1 = game_object1.add_component<BehaviorScript>().set_script<CollisionHandler>(1); + script_object1_ref = static_cast<CollisionHandler*>(script_object1.script.get()); + ASSERT_NE(script_object1_ref, nullptr); + + game_object2.add_component<Rigidbody>(Rigidbody::Data{ + .mass = 1, + .gravity_scale = 0.01, + .body_type = Rigidbody::BodyType::DYNAMIC, + .linear_velocity = {1,0}, + .constraints = {0, 0, 0}, + .use_gravity = true, + .bounce = true, + .elastisity = 1, + .offset = {0,0}, + }); + game_object2.add_component<BoxCollider>(Vector2{0, 0}, 20, 20); + BehaviorScript & script_object2 = game_object2.add_component<BehaviorScript>().set_script<CollisionHandler>(2); + script_object2_ref = static_cast<CollisionHandler*>(script_object2.script.get()); + ASSERT_NE(script_object2_ref, nullptr); + + // Ensure Script::init() is called on all BehaviorScript instances + script_sys.update(); + } +}; + +TEST_F(CollisionTest, collision_example) { + script_object1_ref->test_fn = [](const CollisionEvent & ev) { + Log::logf("event x={} y={}", ev.info.move_back_value.x, ev.info.move_back_value.y); + EXPECT_TRUE(true); + }; + collision_sys.update(); + + // should be nullptr after update with no collision + //ASSERT_EQ(MyScriptCollider1::last_collision_info_1, nullptr); + //ASSERT_EQ(MyScriptCollider2::last_collision_info_2, nullptr); + // check if values are correct (filled in data) + // EXPECT_EQ(MyScriptCollider1::last_collision_info->first.collider.game_object_id, 1); + // EXPECT_EQ(MyScriptCollider2::last_collision_info->second.collider.game_object_id, 2); + // check test data +} + +TEST_F(CollisionTest, collision_box_box_dynamic) { + script_object1_ref->test_fn = [](const CollisionEvent & ev) { + EXPECT_TRUE(false); + }; + collision_sys.update(); + // should be nullptr after update with no collision + // ASSERT_NE(MyScriptCollider1::last_collision_info_1, nullptr); + // ASSERT_NE(MyScriptCollider2::last_collision_info_2, nullptr); + // // check if values are correct (filled in data) + // EXPECT_EQ(MyScriptCollider1::last_collision_info_1->first.collider.game_object_id, 1); + // EXPECT_EQ(MyScriptCollider2::last_collision_info_2->second.collider.game_object_id, 2); + // check test data +} |