diff options
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/AudioTest.cpp | 7 | ||||
| -rw-r--r-- | src/test/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/test/DBTest.cpp | 3 | ||||
| -rw-r--r-- | src/test/ECSTest.cpp | 156 | ||||
| -rw-r--r-- | src/test/EventTest.cpp | 11 | ||||
| -rw-r--r-- | src/test/ParticleTest.cpp | 13 | ||||
| -rw-r--r-- | src/test/PhysicsTest.cpp | 7 | ||||
| -rw-r--r-- | src/test/RenderSystemTest.cpp | 64 | ||||
| -rw-r--r-- | src/test/ResourceManagerTest.cpp | 5 | ||||
| -rw-r--r-- | src/test/SceneManagerTest.cpp | 23 | ||||
| -rw-r--r-- | src/test/ScriptEventTest.cpp | 51 | ||||
| -rw-r--r-- | src/test/ScriptSceneTest.cpp | 31 | ||||
| -rw-r--r-- | src/test/ScriptTest.cpp | 151 | ||||
| -rw-r--r-- | src/test/ScriptTest.h | 29 | 
14 files changed, 385 insertions, 168 deletions
diff --git a/src/test/AudioTest.cpp b/src/test/AudioTest.cpp index e181de9..afd2672 100644 --- a/src/test/AudioTest.cpp +++ b/src/test/AudioTest.cpp @@ -1,6 +1,6 @@  #include <gtest/gtest.h> -#include <crepe/ComponentManager.h> +#include <crepe/manager/ComponentManager.h>  #include <crepe/api/AudioSource.h>  #include <crepe/api/GameObject.h>  #include <crepe/system/AudioSystem.h> @@ -10,9 +10,10 @@ using namespace crepe;  using namespace testing;  class AudioTest : public Test { +	Mediator mediator;  public: -	ComponentManager component_manager{}; -	AudioSystem system {component_manager}; +	ComponentManager component_manager{mediator}; +	AudioSystem system {mediator};  	void SetUp() override {  		auto & mgr = this->component_manager; diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index b67baad..4174926 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -14,4 +14,6 @@ target_sources(test_main PUBLIC  	ValueBrokerTest.cpp  	DBTest.cpp  	Vector2Test.cpp +	ScriptEventTest.cpp +	ScriptSceneTest.cpp  ) diff --git a/src/test/DBTest.cpp b/src/test/DBTest.cpp index e80814c..99dedff 100644 --- a/src/test/DBTest.cpp +++ b/src/test/DBTest.cpp @@ -1,6 +1,7 @@ -#include <crepe/facade/DB.h>  #include <gtest/gtest.h> +#include <crepe/facade/DB.h> +  using namespace std;  using namespace crepe;  using namespace testing; diff --git a/src/test/ECSTest.cpp b/src/test/ECSTest.cpp index 80b936b..22c4fe7 100644 --- a/src/test/ECSTest.cpp +++ b/src/test/ECSTest.cpp @@ -2,7 +2,7 @@  #define protected public -#include <crepe/ComponentManager.h> +#include <crepe/manager/ComponentManager.h>  #include <crepe/api/GameObject.h>  #include <crepe/api/Metadata.h>  #include <crepe/api/Transform.h> @@ -12,8 +12,9 @@ using namespace std;  using namespace crepe;  class ECSTest : public ::testing::Test { +	Mediator m;  public: -	ComponentManager mgr{}; +	ComponentManager mgr{m};  };  TEST_F(ECSTest, createGameObject) { @@ -136,6 +137,53 @@ TEST_F(ECSTest, manyGameObjects) {  	EXPECT_EQ(metadata.size(), 10000 - 5000);  	EXPECT_EQ(transform.size(), 10000); + +	for (int i = 0; i < 10000 - 5000; i++) { +		EXPECT_EQ(metadata[i].get().game_object_id, i + 5000); +		EXPECT_EQ(metadata[i].get().name, "body"); +		EXPECT_EQ(metadata[i].get().tag, "person" + to_string(i)); +		EXPECT_EQ(metadata[i].get().parent, -1); +		EXPECT_EQ(metadata[i].get().children.size(), 0); + +		EXPECT_EQ(transform[i].get().game_object_id, i); +		EXPECT_EQ(transform[i].get().position.x, 0); +		EXPECT_EQ(transform[i].get().position.y, 0); +		EXPECT_EQ(transform[i].get().rotation, 0); +		EXPECT_EQ(transform[i].get().scale, i); +	} + +	mgr.delete_all_components(); + +	metadata = mgr.get_components_by_type<Metadata>(); +	transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 0); +	EXPECT_EQ(transform.size(), 0); + +	for (int i = 0; i < 10000; i++) { +		string name = "body" + to_string(i); +		GameObject obj = mgr.new_object(name, "person", vec2{0, 0}, 0, 0); +	} + +	metadata = mgr.get_components_by_type<Metadata>(); +	transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 10000); +	EXPECT_EQ(transform.size(), 10000); + +	for (int i = 0; i < 10000; i++) { +		EXPECT_EQ(metadata[i].get().game_object_id, i); +		EXPECT_EQ(metadata[i].get().name, "body" + to_string(i)); +		EXPECT_EQ(metadata[i].get().tag, "person"); +		EXPECT_EQ(metadata[i].get().parent, -1); +		EXPECT_EQ(metadata[i].get().children.size(), 0); + +		EXPECT_EQ(transform[i].get().game_object_id, i); +		EXPECT_EQ(transform[i].get().position.x, 0); +		EXPECT_EQ(transform[i].get().position.y, 0); +		EXPECT_EQ(transform[i].get().rotation, 0); +		EXPECT_EQ(transform[i].get().scale, 0); +	}  }  TEST_F(ECSTest, getComponentsByID) { @@ -234,3 +282,107 @@ TEST_F(ECSTest, partentChild) {  	EXPECT_EQ(metadata[1].get().children[0], 3);  	EXPECT_EQ(metadata[2].get().children[0], 4);  } + +TEST_F(ECSTest, persistent) { +	GameObject obj0 = mgr.new_object("obj0", "obj0", vec2{0, 0}, 0, 1); +	GameObject obj1 = mgr.new_object("obj1", "obj1", vec2{0, 0}, 0, 1); +	obj1.set_persistent(); +	GameObject obj2 = mgr.new_object("obj2", "obj2", vec2{0, 0}, 0, 1); + +	vector<reference_wrapper<Metadata>> metadata = mgr.get_components_by_type<Metadata>(); +	vector<reference_wrapper<Transform>> transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 3); +	EXPECT_EQ(transform.size(), 3); + +	mgr.delete_components_by_id<Metadata>(1); +	mgr.delete_components<Metadata>(); +	mgr.delete_all_components_of_id(1); + +	metadata = mgr.get_components_by_type<Metadata>(); +	transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 1); +	EXPECT_EQ(transform.size(), 3); + +	mgr.delete_all_components(); + +	metadata = mgr.get_components_by_type<Metadata>(); +	transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 1); +	EXPECT_EQ(transform.size(), 1); + +	EXPECT_EQ(metadata[0].get().game_object_id, 1); +	EXPECT_EQ(metadata[0].get().name, "obj1"); +	EXPECT_EQ(metadata[0].get().tag, "obj1"); +	EXPECT_EQ(metadata[0].get().parent, -1); +	EXPECT_EQ(metadata[0].get().children.size(), 0); + +	EXPECT_EQ(transform[0].get().game_object_id, 1); +	EXPECT_EQ(transform[0].get().position.x, 0); +	EXPECT_EQ(transform[0].get().position.y, 0); + +	GameObject obj3 = mgr.new_object("obj3", "obj3", vec2{0, 0}, 0, 5); +	GameObject obj4 = mgr.new_object("obj4", "obj4", vec2{0, 0}, 0, 5); + +	metadata = mgr.get_components_by_type<Metadata>(); +	transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 3); +	EXPECT_EQ(transform.size(), 3); + +	EXPECT_EQ(metadata[0].get().game_object_id, 0); +	EXPECT_EQ(metadata[0].get().name, "obj3"); + +	EXPECT_EQ(metadata[1].get().game_object_id, 1); +	EXPECT_EQ(metadata[1].get().name, "obj1"); + +	EXPECT_EQ(metadata[2].get().game_object_id, 2); +	EXPECT_EQ(metadata[2].get().name, "obj4"); + +	EXPECT_EQ(transform[0].get().game_object_id, 0); +	EXPECT_EQ(transform[0].get().scale, 5); + +	EXPECT_EQ(transform[1].get().game_object_id, 1); +	EXPECT_EQ(transform[1].get().scale, 1); + +	EXPECT_EQ(transform[2].get().game_object_id, 2); +	EXPECT_EQ(transform[2].get().scale, 5); +} + +TEST_F(ECSTest, resetPersistent) { +	GameObject obj0 = mgr.new_object("obj0", "obj0", vec2{0, 0}, 0, 1); +	GameObject obj1 = mgr.new_object("obj1", "obj1", vec2{0, 0}, 0, 1); +	obj1.set_persistent(); +	GameObject obj2 = mgr.new_object("obj2", "obj2", vec2{0, 0}, 0, 1); + +	vector<reference_wrapper<Metadata>> metadata = mgr.get_components_by_type<Metadata>(); +	vector<reference_wrapper<Transform>> transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 3); +	EXPECT_EQ(transform.size(), 3); + +	mgr.delete_all_components(); + +	metadata = mgr.get_components_by_type<Metadata>(); +	transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 1); +	EXPECT_EQ(transform.size(), 1); + +	vector<reference_wrapper<Metadata>> metadata_id = mgr.get_components_by_id<Metadata>(1); + +	EXPECT_EQ(metadata_id.size(), 1); +	EXPECT_EQ(metadata_id[0].get().game_object_id, 1); +	EXPECT_EQ(metadata_id[0].get().name, "obj1"); + +	mgr.set_persistent(1, false); +	mgr.delete_all_components(); + +	metadata = mgr.get_components_by_type<Metadata>(); +	transform = mgr.get_components_by_type<Transform>(); + +	EXPECT_EQ(metadata.size(), 0); +	EXPECT_EQ(transform.size(), 0); +} diff --git a/src/test/EventTest.cpp b/src/test/EventTest.cpp index a21a851..350dd07 100644 --- a/src/test/EventTest.cpp +++ b/src/test/EventTest.cpp @@ -1,10 +1,11 @@ - -#include "api/Event.h" -#include "api/EventManager.h" -#include "api/IKeyListener.h" -#include "api/IMouseListener.h"  #include <gmock/gmock.h>  #include <gtest/gtest.h> + +#include <crepe/api/Event.h> +#include <crepe/manager/EventManager.h> +#include <crepe/api/IKeyListener.h> +#include <crepe/api/IMouseListener.h> +  using namespace std;  using namespace std::chrono_literals;  using namespace crepe; diff --git a/src/test/ParticleTest.cpp b/src/test/ParticleTest.cpp index 8b81e74..4e9fa4e 100644 --- a/src/test/ParticleTest.cpp +++ b/src/test/ParticleTest.cpp @@ -1,11 +1,11 @@ -#include "api/Vector2.h" -#include <crepe/ComponentManager.h> +#include <crepe/manager/ComponentManager.h>  #include <crepe/Particle.h>  #include <crepe/api/Config.h>  #include <crepe/api/GameObject.h>  #include <crepe/api/ParticleEmitter.h>  #include <crepe/api/Rigidbody.h>  #include <crepe/api/Sprite.h> +#include <crepe/api/Texture.h>  #include <crepe/api/Transform.h>  #include <crepe/system/ParticleSystem.h>  #include <gtest/gtest.h> @@ -16,9 +16,10 @@ using namespace std::chrono_literals;  using namespace crepe;  class ParticlesTest : public ::testing::Test { +	Mediator m;  public: -	ComponentManager component_manager; -	ParticleSystem particle_system{component_manager}; +	ComponentManager component_manager{m}; +	ParticleSystem particle_system{m};  	void SetUp() override {  		ComponentManager & mgr = this->component_manager; @@ -28,9 +29,9 @@ public:  			GameObject game_object = mgr.new_object("", "", vec2{0, 0}, 0, 0);  			Color color(0, 0, 0, 0); +			auto s1 = Texture("asset/texture/img.png");  			Sprite & test_sprite = game_object.add_component<Sprite>( -				make_shared<Texture>("asset/texture/img.png"), color, -				FlipSettings{true, true}); +				s1, color, Sprite::FlipSettings{true, true}, 1, 1, 100);  			game_object.add_component<ParticleEmitter>(ParticleEmitter::Data{  				.position = {0, 0}, diff --git a/src/test/PhysicsTest.cpp b/src/test/PhysicsTest.cpp index 33b6020..01b7c51 100644 --- a/src/test/PhysicsTest.cpp +++ b/src/test/PhysicsTest.cpp @@ -1,4 +1,4 @@ -#include <crepe/ComponentManager.h> +#include <crepe/manager/ComponentManager.h>  #include <crepe/api/Config.h>  #include <crepe/api/GameObject.h>  #include <crepe/api/Rigidbody.h> @@ -11,9 +11,10 @@ using namespace std::chrono_literals;  using namespace crepe;  class PhysicsTest : public ::testing::Test { +	Mediator m;  public: -	ComponentManager component_manager; -	PhysicsSystem system{component_manager}; +	ComponentManager component_manager{m}; +	PhysicsSystem system{m};  	void SetUp() override {  		ComponentManager & mgr = this->component_manager; diff --git a/src/test/RenderSystemTest.cpp b/src/test/RenderSystemTest.cpp index f37fb56..3528e46 100644 --- a/src/test/RenderSystemTest.cpp +++ b/src/test/RenderSystemTest.cpp @@ -1,4 +1,3 @@ -#include "api/Camera.h"  #include <functional>  #include <gtest/gtest.h>  #include <memory> @@ -7,7 +6,8 @@  #define private public  #define protected public -#include <crepe/ComponentManager.h> +#include <crepe/api/Camera.h> +#include <crepe/manager/ComponentManager.h>  #include <crepe/api/Color.h>  #include <crepe/api/GameObject.h>  #include <crepe/api/Sprite.h> @@ -20,49 +20,40 @@ using namespace crepe;  using namespace testing;  class RenderSystemTest : public Test { +	Mediator m;  public: -	ComponentManager mgr{}; -	RenderSystem sys{mgr}; +	ComponentManager mgr{m}; +	RenderSystem sys{m};  	GameObject entity1 = this->mgr.new_object("name");  	GameObject entity2 = this->mgr.new_object("name");  	GameObject entity3 = this->mgr.new_object("name");  	GameObject entity4 = this->mgr.new_object("name");  	void SetUp() override { -		auto & sprite1 -			= entity1.add_component<Sprite>(make_shared<Texture>("asset/texture/img.png"), -											Color(0, 0, 0, 0), FlipSettings{false, false}); -		ASSERT_NE(sprite1.sprite_image.get(), nullptr); -		sprite1.order_in_layer = 5; -		sprite1.sorting_in_layer = 5; +		auto s1 = Texture("asset/texture/img.png"); +		auto s2 = Texture("asset/texture/img.png"); +		auto s3 = Texture("asset/texture/img.png"); +		auto s4 = Texture("asset/texture/img.png"); +		auto & sprite1 = entity1.add_component<Sprite>( +			s1, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 5, 5, 100); +		ASSERT_NE(sprite1.sprite_image.texture.get(), nullptr);  		EXPECT_EQ(sprite1.order_in_layer, 5);  		EXPECT_EQ(sprite1.sorting_in_layer, 5); -		auto & sprite2 -			= entity2.add_component<Sprite>(make_shared<Texture>("asset/texture/img.png"), -											Color(0, 0, 0, 0), FlipSettings{false, false}); -		ASSERT_NE(sprite2.sprite_image.get(), nullptr); -		sprite2.sorting_in_layer = 2; -		sprite2.order_in_layer = 1; - +		auto & sprite2 = entity2.add_component<Sprite>( +			s2, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 2, 1, 100); +		ASSERT_NE(sprite2.sprite_image.texture.get(), nullptr);  		EXPECT_EQ(sprite2.sorting_in_layer, 2);  		EXPECT_EQ(sprite2.order_in_layer, 1); -		auto & sprite3 -			= entity3.add_component<Sprite>(make_shared<Texture>("asset/texture/img.png"), -											Color(0, 0, 0, 0), FlipSettings{false, false}); -		ASSERT_NE(sprite3.sprite_image.get(), nullptr); -		sprite3.sorting_in_layer = 1; -		sprite3.order_in_layer = 2; - +		auto & sprite3 = entity3.add_component<Sprite>( +			s3, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 1, 2, 100); +		ASSERT_NE(sprite3.sprite_image.texture.get(), nullptr);  		EXPECT_EQ(sprite3.sorting_in_layer, 1);  		EXPECT_EQ(sprite3.order_in_layer, 2); -		auto & sprite4 -			= entity4.add_component<Sprite>(make_shared<Texture>("asset/texture/img.png"), -											Color(0, 0, 0, 0), FlipSettings{false, false}); -		ASSERT_NE(sprite4.sprite_image.get(), nullptr); -		sprite4.sorting_in_layer = 1; -		sprite4.order_in_layer = 1; +		auto & sprite4 = entity4.add_component<Sprite>( +			s4, Color(0, 0, 0, 0), Sprite::FlipSettings{false, false}, 1, 1, 100); +		ASSERT_NE(sprite4.sprite_image.texture.get(), nullptr);  		EXPECT_EQ(sprite4.sorting_in_layer, 1);  		EXPECT_EQ(sprite4.order_in_layer, 1);  	} @@ -73,8 +64,9 @@ TEST_F(RenderSystemTest, expected_throws) {  	// no texture img  	EXPECT_ANY_THROW({ -		entity1.add_component<Sprite>(make_shared<Texture>("NO_IMAGE"), Color(0, 0, 0, 0), -									  FlipSettings{false, false}); +		auto test = Texture(""); +		entity1.add_component<Sprite>(test, Color(0, 0, 0, 0), +									  Sprite::FlipSettings{false, false}, 1, 1, 100);  	});  	// No camera @@ -121,7 +113,7 @@ TEST_F(RenderSystemTest, sorting_sprites) {  }  TEST_F(RenderSystemTest, Update) { -	entity1.add_component<Camera>(Color::WHITE); +	entity1.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f);  	{  		vector<reference_wrapper<Sprite>> sprites = this->mgr.get_components_by_type<Sprite>();  		ASSERT_EQ(sprites.size(), 4); @@ -149,7 +141,7 @@ TEST_F(RenderSystemTest, Camera) {  		EXPECT_NE(cameras.size(), 1);  	}  	{ -		entity1.add_component<Camera>(Color::WHITE); +		entity1.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f);  		auto cameras = this->mgr.get_components_by_type<Camera>();  		EXPECT_EQ(cameras.size(), 1);  	} @@ -157,9 +149,9 @@ TEST_F(RenderSystemTest, Camera) {  	//TODO improve with newer version  }  TEST_F(RenderSystemTest, Color) { -	entity1.add_component<Camera>(Color::WHITE); +	entity1.add_component<Camera>(Color::WHITE, ivec2{1080, 720}, vec2{2000, 2000}, 1.0f);  	auto & sprite = this->mgr.get_components_by_id<Sprite>(entity1.id).front().get(); -	ASSERT_NE(sprite.sprite_image.get(), nullptr); +	ASSERT_NE(sprite.sprite_image.texture.get(), nullptr);  	sprite.color = Color::GREEN;  	EXPECT_EQ(sprite.color.r, Color::GREEN.r); diff --git a/src/test/ResourceManagerTest.cpp b/src/test/ResourceManagerTest.cpp index cc3b022..1f56e23 100644 --- a/src/test/ResourceManagerTest.cpp +++ b/src/test/ResourceManagerTest.cpp @@ -4,7 +4,7 @@  #define protected public  #include <crepe/util/Log.h> -#include <crepe/ResourceManager.h> +#include <crepe/manager/ResourceManager.h>  #include <crepe/api/GameObject.h>  using namespace std; @@ -12,8 +12,9 @@ using namespace crepe;  using namespace testing;  class ResourceManagerTest : public Test { +	Mediator mediator;  public: -	ResourceManager resource_manager{}; +	ResourceManager resource_manager{mediator};  	Asset asset_a{"asset/texture/img.png"};  	Asset asset_b{"asset/texture/ERROR.png"}; diff --git a/src/test/SceneManagerTest.cpp b/src/test/SceneManagerTest.cpp index 62b7d33..d027d89 100644 --- a/src/test/SceneManagerTest.cpp +++ b/src/test/SceneManagerTest.cpp @@ -1,12 +1,13 @@ -#include "types.h" -#include <crepe/ComponentManager.h> +#include <gtest/gtest.h> + +#include <crepe/types.h> +#include <crepe/manager/SceneManager.h> +#include <crepe/manager/ComponentManager.h>  #include <crepe/api/GameObject.h>  #include <crepe/api/Metadata.h>  #include <crepe/api/Scene.h> -#include <crepe/api/SceneManager.h>  #include <crepe/api/Transform.h>  #include <crepe/api/Vector2.h> -#include <gtest/gtest.h>  using namespace std;  using namespace crepe; @@ -14,7 +15,8 @@ using namespace crepe;  class ConcreteScene1 : public Scene {  public:  	void load_scene() { -		ComponentManager & mgr = this->component_manager; +		Mediator & mediator = this->mediator; +		ComponentManager & mgr = mediator.component_manager;  		GameObject object1 = mgr.new_object("scene_1", "tag_scene_1", vec2{0, 0}, 0, 1);  		GameObject object2 = mgr.new_object("scene_1", "tag_scene_1", vec2{1, 0}, 0, 1);  		GameObject object3 = mgr.new_object("scene_1", "tag_scene_1", vec2{2, 0}, 0, 1); @@ -26,7 +28,8 @@ public:  class ConcreteScene2 : public Scene {  public:  	void load_scene() { -		ComponentManager & mgr = this->component_manager; +		Mediator & mediator = this->mediator; +		ComponentManager & mgr = mediator.component_manager;  		GameObject object1 = mgr.new_object("scene_2", "tag_scene_2", vec2{0, 0}, 0, 1);  		GameObject object2 = mgr.new_object("scene_2", "tag_scene_2", vec2{0, 1}, 0, 1);  		GameObject object3 = mgr.new_object("scene_2", "tag_scene_2", vec2{0, 2}, 0, 1); @@ -41,7 +44,8 @@ public:  	ConcreteScene3(const string & name) : name(name) {}  	void load_scene() { -		ComponentManager & mgr = this->component_manager; +		Mediator & mediator = this->mediator; +		ComponentManager & mgr = mediator.component_manager;  		GameObject object1 = mgr.new_object("scene_3", "tag_scene_3", vec2{0, 0}, 0, 1);  	} @@ -52,9 +56,10 @@ private:  };  class SceneManagerTest : public ::testing::Test { +	Mediator m;  public: -	ComponentManager component_mgr{}; -	SceneManager scene_mgr{component_mgr}; +	ComponentManager component_mgr{m}; +	SceneManager scene_mgr{m};  };  TEST_F(SceneManagerTest, loadScene) { diff --git a/src/test/ScriptEventTest.cpp b/src/test/ScriptEventTest.cpp new file mode 100644 index 0000000..7a9abbb --- /dev/null +++ b/src/test/ScriptEventTest.cpp @@ -0,0 +1,51 @@ +#include <gtest/gtest.h> + +// stupid hack to allow access to private/protected members under test +#define private public +#define protected public + +#include <crepe/manager/ComponentManager.h> +#include <crepe/manager/EventManager.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/Event.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/Script.h> +#include <crepe/api/Vector2.h> +#include <crepe/system/ScriptSystem.h> + +#include "ScriptTest.h" + +using namespace std; +using namespace crepe; +using namespace testing; + +class ScriptEventTest : public ScriptTest { +public: +	EventManager & event_manager = mediator.event_manager; + +	class MyEvent : public Event {}; +}; + +TEST_F(ScriptEventTest, Inactive) { +	BehaviorScript & behaviorscript = this->behaviorscript; +	MyScript & script = this->script; +	EventManager & evmgr = this->event_manager; + +	unsigned event_count = 0; +	script.subscribe<MyEvent>([&](const MyEvent &){ +		event_count++; +		return true; +	}); + +	system.update(); +	behaviorscript.active = false; +	EXPECT_EQ(0, event_count); + +	evmgr.trigger_event<MyEvent>(); +	EXPECT_EQ(0, event_count); + +	behaviorscript.active = true; +	evmgr.trigger_event<MyEvent>(); +	EXPECT_EQ(1, event_count); +} + diff --git a/src/test/ScriptSceneTest.cpp b/src/test/ScriptSceneTest.cpp new file mode 100644 index 0000000..f96ae8b --- /dev/null +++ b/src/test/ScriptSceneTest.cpp @@ -0,0 +1,31 @@ +#include <gtest/gtest.h> + +// stupid hack to allow access to private/protected members under test +#define private public +#define protected public + +#include <crepe/manager/SceneManager.h> +#include "ScriptTest.h" + +using namespace std; +using namespace crepe; +using namespace testing; + +class ScriptSceneTest : public ScriptTest { +public: +	SceneManager scene_manager{mediator}; + +	class MyScene : public Scene {}; +}; + +TEST_F(ScriptSceneTest, Inactive) { +	BehaviorScript & behaviorscript = this->behaviorscript; +	MyScript & script = this->script; + +	const char * non_default_value = "foo"; +	ASSERT_NE(non_default_value, scene_manager.next_scene); + +	script.set_next_scene(non_default_value); +	EXPECT_EQ(non_default_value, scene_manager.next_scene); +} + diff --git a/src/test/ScriptTest.cpp b/src/test/ScriptTest.cpp index 78d5061..6d0d5fb 100644 --- a/src/test/ScriptTest.cpp +++ b/src/test/ScriptTest.cpp @@ -1,129 +1,78 @@  #include <gtest/gtest.h> +#include <gmock/gmock.h>  // stupid hack to allow access to private/protected members under test  #define private public  #define protected public -#include <crepe/ComponentManager.h> -#include <crepe/api/BehaviorScript.h> -#include <crepe/api/Event.h> -#include <crepe/api/EventManager.h> +#include "ScriptTest.h"  #include <crepe/api/GameObject.h> -#include <crepe/api/Script.h> -#include <crepe/api/Vector2.h> -#include <crepe/system/ScriptSystem.h>  using namespace std;  using namespace crepe;  using namespace testing; -class MyEvent : public Event {}; - -class ScriptTest : public Test { -public: -	ComponentManager component_manager{}; -	ScriptSystem system{component_manager}; -	EventManager & event_manager = EventManager::get_instance(); - -	class MyScript : public Script { -		// NOTE: default (private) visibility of init and update shouldn't cause -		// issues! -		void init() { -			this->init_count++; - -			subscribe<MyEvent>([this](const MyEvent &) { -				this->event_count++; -				return true; -			}); - -			// init should never be called more than once -			EXPECT_LE(this->init_count, 1); -		} -		void update() { this->update_count++; } - -	public: -		unsigned init_count = 0; -		unsigned update_count = 0; -		unsigned event_count = 0; -	}; - -	OptionalRef<BehaviorScript> behaviorscript; -	OptionalRef<MyScript> script; - -	void SetUp() override { -		auto & mgr = this->component_manager; -		GameObject entity = mgr.new_object("name"); -		BehaviorScript & component = entity.add_component<BehaviorScript>(); - -		this->behaviorscript = component; -		ASSERT_TRUE(this->behaviorscript); -		EXPECT_EQ(component.script.get(), nullptr); -		component.set_script<MyScript>(); -		ASSERT_NE(component.script.get(), nullptr); - -		this->script = *(MyScript *) component.script.get(); -		ASSERT_TRUE(this->script); - -		// sanity -		MyScript & script = this->script; -		ASSERT_EQ(script.init_count, 0); -		ASSERT_EQ(script.update_count, 0); -		ASSERT_EQ(script.event_count, 0); -	} -}; +void ScriptTest::SetUp() { +	auto & mgr = this->component_manager; +	GameObject entity = mgr.new_object("name"); +	BehaviorScript & component = entity.add_component<BehaviorScript>(); + +	this->behaviorscript = component; +	ASSERT_TRUE(this->behaviorscript); +	EXPECT_EQ(component.script.get(), nullptr); +	component.set_script<NiceMock<MyScript>>(); +	ASSERT_NE(component.script.get(), nullptr); + +	this->script = *(MyScript *) component.script.get(); +	ASSERT_TRUE(this->script); +}  TEST_F(ScriptTest, Default) {  	MyScript & script = this->script; -	EXPECT_EQ(0, script.init_count); -	EXPECT_EQ(0, script.update_count); -	EXPECT_EQ(0, script.event_count); +	EXPECT_CALL(script, init()).Times(0); +	EXPECT_CALL(script, update()).Times(0);  }  TEST_F(ScriptTest, UpdateOnce) {  	MyScript & script = this->script; -	system.update(); -	EXPECT_EQ(1, script.init_count); -	EXPECT_EQ(1, script.update_count); -	EXPECT_EQ(0, script.event_count); +	{ +		InSequence seq; + +		EXPECT_CALL(script, init()).Times(1); +		EXPECT_CALL(script, update()).Times(1); +		system.update(); +	} + +	{ +		InSequence seq; + +		EXPECT_CALL(script, init()).Times(0); +		EXPECT_CALL(script, update()).Times(1); +		system.update(); +	}  }  TEST_F(ScriptTest, UpdateInactive) {  	BehaviorScript & behaviorscript = this->behaviorscript;  	MyScript & script = this->script; -	behaviorscript.active = false; -	system.update(); -	EXPECT_EQ(0, script.init_count); -	EXPECT_EQ(0, script.update_count); -	EXPECT_EQ(0, script.event_count); - -	behaviorscript.active = true; -	system.update(); -	EXPECT_EQ(1, script.init_count); -	EXPECT_EQ(1, script.update_count); -	EXPECT_EQ(0, script.event_count); -} +	{ +		InSequence seq; -TEST_F(ScriptTest, EventInactive) { -	BehaviorScript & behaviorscript = this->behaviorscript; -	MyScript & script = this->script; -	EventManager & evmgr = this->event_manager; - -	system.update(); -	behaviorscript.active = false; -	EXPECT_EQ(1, script.init_count); -	EXPECT_EQ(1, script.update_count); -	EXPECT_EQ(0, script.event_count); - -	evmgr.trigger_event<MyEvent>(); -	EXPECT_EQ(1, script.init_count); -	EXPECT_EQ(1, script.update_count); -	EXPECT_EQ(0, script.event_count); - -	behaviorscript.active = true; -	evmgr.trigger_event<MyEvent>(); -	EXPECT_EQ(1, script.init_count); -	EXPECT_EQ(1, script.update_count); -	EXPECT_EQ(1, script.event_count); +		EXPECT_CALL(script, init()).Times(0); +		EXPECT_CALL(script, update()).Times(0); +		behaviorscript.active = false; +		system.update(); +	} + +	{ +		InSequence seq; + +		EXPECT_CALL(script, init()).Times(1); +		EXPECT_CALL(script, update()).Times(1); +		behaviorscript.active = true; +		system.update(); +	}  } + diff --git a/src/test/ScriptTest.h b/src/test/ScriptTest.h new file mode 100644 index 0000000..9a71ba7 --- /dev/null +++ b/src/test/ScriptTest.h @@ -0,0 +1,29 @@ +#pragma once + +#include <gtest/gtest.h> +#include <gmock/gmock.h> + +#include <crepe/manager/ComponentManager.h> +#include <crepe/system/ScriptSystem.h> +#include <crepe/api/BehaviorScript.h> +#include <crepe/api/Script.h> + +class ScriptTest : public testing::Test { +protected: +	crepe::Mediator mediator; +public: +	crepe::ComponentManager component_manager{mediator}; +	crepe::ScriptSystem system{mediator}; + +	class MyScript : public crepe::Script { +		// NOTE: explicitly stating `public:` is not required on actual scripts +	public: +		MOCK_METHOD(void, init, (), (override)); +		MOCK_METHOD(void, update, (), (override)); +	}; + +	crepe::OptionalRef<crepe::BehaviorScript> behaviorscript; +	crepe::OptionalRef<MyScript> script; + +	virtual void SetUp(); +};  |