diff options
| author | heavydemon21 <nielsstunnebrink1@gmail.com> | 2024-11-19 11:48:07 +0100 | 
|---|---|---|
| committer | heavydemon21 <nielsstunnebrink1@gmail.com> | 2024-11-19 11:48:07 +0100 | 
| commit | 9fb2e3a1d697f4961379980651e5434395e372bd (patch) | |
| tree | b7c18b40cec50a01288e45a0f38a7264810ee5ff /src | |
| parent | 66bbea079bf1ae84c355349d337db468c18eac32 (diff) | |
unit tests
Diffstat (limited to 'src')
| -rw-r--r-- | src/crepe/api/Color.h | 4 | ||||
| -rw-r--r-- | src/crepe/system/RenderSystem.cpp | 7 | ||||
| -rw-r--r-- | src/test/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/test/rendering.cpp | 174 | 
4 files changed, 182 insertions, 4 deletions
diff --git a/src/crepe/api/Color.h b/src/crepe/api/Color.h index aa47bf4..c207ba7 100644 --- a/src/crepe/api/Color.h +++ b/src/crepe/api/Color.h @@ -21,13 +21,13 @@ public:  	static const Color & get_yellow();  	static const Color & get_black(); -private: -	// TODO: why are these private!? +public:  	uint8_t r;  	uint8_t g;  	uint8_t b;  	uint8_t a; +private:  	static Color white;  	static Color red;  	static Color green; diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 11c20f5..82257c4 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -1,6 +1,7 @@  #include <algorithm>  #include <cassert>  #include <functional> +#include <stdexcept>  #include <vector>  #include "../ComponentManager.h" @@ -20,6 +21,8 @@ void RenderSystem::update_camera() {  	std::vector<std::reference_wrapper<Camera>> cameras = mgr.get_components_by_type<Camera>(); +	if (cameras.size() == 0) throw std::runtime_error("No cameras in current scene"); +  	for (Camera & cam : cameras) {  		SDLContext::get_instance().camera(cam);  		this->curr_cam_ref = &cam; @@ -27,8 +30,8 @@ void RenderSystem::update_camera() {  }  bool sorting_comparison(const Sprite & a, const Sprite & b) { -	if (a.sorting_in_layer > b.sorting_in_layer) return true; -	if (a.sorting_in_layer == b.sorting_in_layer) return a.order_in_layer > b.order_in_layer; +	if (a.sorting_in_layer < b.sorting_in_layer) return true; +	if (a.sorting_in_layer == b.sorting_in_layer) return a.order_in_layer < b.order_in_layer;  	return false;  } diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 49c8151..0969a52 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -3,5 +3,6 @@ target_sources(test_main PUBLIC  	PhysicsTest.cpp  	ScriptTest.cpp  	ParticleTest.cpp +	rendering.cpp  ) diff --git a/src/test/rendering.cpp b/src/test/rendering.cpp new file mode 100644 index 0000000..4c5fb1d --- /dev/null +++ b/src/test/rendering.cpp @@ -0,0 +1,174 @@ +#include "api/Camera.h" +#include <functional> +#include <gtest/gtest.h> +#include <memory> +#include <vector> + +#define private public +#define protected public + +#include <crepe/ComponentManager.h> +#include <crepe/api/Color.h> +#include <crepe/api/GameObject.h> +#include <crepe/api/Sprite.h> +#include <crepe/api/Texture.h> + +#include <crepe/system/RenderSystem.h> + +using namespace std; +using namespace crepe; +using namespace testing; + +class RenderSystemTest : public Test { +public: +	ComponentManager mgr{}; +	RenderSystem sys{mgr}; +	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; +		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; + +		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; + +		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; +		EXPECT_EQ(sprite4.sorting_in_layer, 1); +		EXPECT_EQ(sprite4.order_in_layer, 1); +	} +}; + +TEST_F(RenderSystemTest, expected_throws) { +	GameObject entity1 = this->mgr.new_object("NAME"); + +	// no texture img +	EXPECT_ANY_THROW({ +		entity1.add_component<Sprite>(make_shared<Texture>("NO_IMAGE"), Color(0, 0, 0, 0), +									  FlipSettings{false, false}); +	}); + +	// No camera +	EXPECT_ANY_THROW({ this->sys.update(); }); +} + +TEST_F(RenderSystemTest, make_sprites) {} + +TEST_F(RenderSystemTest, sorting_sprites) { +	vector<reference_wrapper<Sprite>> sprites = this->mgr.get_components_by_type<Sprite>(); +	ASSERT_EQ(sprites.size(), 4); + +	vector<reference_wrapper<Sprite>> sorted_sprites = this->sys.sort(sprites); +	ASSERT_EQ(sorted_sprites.size(), 4); + +	// Expected order after sorting: +	// 1. sorting_in_layer: 1, order_in_layer: 1 (entity4) +	// 2. sorting_in_layer: 1, order_in_layer: 2 (entity3) +	// 3. sorting_in_layer: 2, order_in_layer: 1 (entity2) +	// 4. sorting_in_layer: 5, order_in_layer: 5 (entity1) + +	EXPECT_EQ(sorted_sprites[0].get().sorting_in_layer, 1); +	EXPECT_EQ(sorted_sprites[0].get().order_in_layer, 1); + +	EXPECT_EQ(sorted_sprites[1].get().sorting_in_layer, 1); +	EXPECT_EQ(sorted_sprites[1].get().order_in_layer, 2); + +	EXPECT_EQ(sorted_sprites[2].get().sorting_in_layer, 2); +	EXPECT_EQ(sorted_sprites[2].get().order_in_layer, 1); + +	EXPECT_EQ(sorted_sprites[3].get().sorting_in_layer, 5); +	EXPECT_EQ(sorted_sprites[3].get().order_in_layer, 5); + +	for (size_t i = 1; i < sorted_sprites.size(); ++i) { +		const Sprite & prev = sorted_sprites[i - 1].get(); +		const Sprite & curr = sorted_sprites[i].get(); + +		if (prev.sorting_in_layer == curr.sorting_in_layer) { +			EXPECT_LE(prev.order_in_layer, curr.order_in_layer); +		} else { +			EXPECT_LE(prev.sorting_in_layer, curr.sorting_in_layer); +		} +	} +} + +TEST_F(RenderSystemTest, Update) { +	entity1.add_component<Camera>(Color::get_white()); +	{ +		vector<reference_wrapper<Sprite>> sprites = this->mgr.get_components_by_type<Sprite>(); +		ASSERT_EQ(sprites.size(), 4); + +		EXPECT_EQ(sprites[0].get().game_object_id, 0); +		EXPECT_EQ(sprites[1].get().game_object_id, 1); +		EXPECT_EQ(sprites[2].get().game_object_id, 2); +		EXPECT_EQ(sprites[3].get().game_object_id, 3); +	} +	this->sys.update(); +	{ +		vector<reference_wrapper<Sprite>> sprites = this->mgr.get_components_by_type<Sprite>(); +		ASSERT_EQ(sprites.size(), 4); + +		EXPECT_EQ(sprites[0].get().game_object_id, 0); +		EXPECT_EQ(sprites[1].get().game_object_id, 1); +		EXPECT_EQ(sprites[2].get().game_object_id, 2); +		EXPECT_EQ(sprites[3].get().game_object_id, 3); +	} +} + +TEST_F(RenderSystemTest, Camera) { +	{ +		auto cameras = this->mgr.get_components_by_type<Camera>(); +		EXPECT_NE(cameras.size(), 1); +	} +	{ +		entity1.add_component<Camera>(Color::get_white()); +		auto cameras = this->mgr.get_components_by_type<Camera>(); +		EXPECT_EQ(cameras.size(), 1); +	} + +	//TODO improve with newer version +} +TEST_F(RenderSystemTest, Color) { +	entity1.add_component<Camera>(Color::get_white()); +	auto & sprite = this->mgr.get_components_by_id<Sprite>(entity1.id).front().get(); +	ASSERT_NE(sprite.sprite_image.get(), nullptr); + +	sprite.color = Color::get_green(); +	EXPECT_EQ(sprite.color.r, Color::get_green().r); +	EXPECT_EQ(sprite.color.g, Color::get_green().g); +	EXPECT_EQ(sprite.color.b, Color::get_green().b); +	EXPECT_EQ(sprite.color.a, Color::get_green().a); +	this->sys.update(); +	EXPECT_EQ(sprite.color.r, Color::get_green().r); +	EXPECT_EQ(sprite.color.g, Color::get_green().g); +	EXPECT_EQ(sprite.color.b, Color::get_green().b); +	EXPECT_EQ(sprite.color.a, Color::get_green().a); +}  |