diff options
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/AudioTest.cpp | 161 | ||||
| -rw-r--r-- | src/test/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | src/test/ResourceManagerTest.cpp | 81 | ||||
| -rw-r--r-- | src/test/main.cpp | 14 | 
4 files changed, 250 insertions, 8 deletions
diff --git a/src/test/AudioTest.cpp b/src/test/AudioTest.cpp new file mode 100644 index 0000000..48bba1b --- /dev/null +++ b/src/test/AudioTest.cpp @@ -0,0 +1,161 @@ +#include <gmock/gmock.h> +#include <gtest/gtest.h> + +#include <crepe/api/AudioSource.h> +#include <crepe/api/GameObject.h> +#include <crepe/manager/ComponentManager.h> +#include <crepe/manager/ResourceManager.h> +#include <crepe/system/AudioSystem.h> + +using namespace std; +using namespace std::chrono_literals; +using namespace crepe; +using namespace testing; + +class AudioTest : public Test { +private: +	class TestSoundContext : public SoundContext { +	public: +		MOCK_METHOD(SoundHandle, play, (Sound & resource), (override)); +		MOCK_METHOD(void, stop, (const SoundHandle &), (override)); +		MOCK_METHOD(void, set_volume, (const SoundHandle &, float), (override)); +		MOCK_METHOD(void, set_loop, (const SoundHandle &, bool), (override)); +	}; + +	class TestAudioSystem : public AudioSystem { +	public: +		using AudioSystem::AudioSystem; +		StrictMock<TestSoundContext> context; +		virtual SoundContext & get_context() { return this->context; } +	}; + +private: +	Mediator mediator; +	ComponentManager component_manager{mediator}; +	ResourceManager resource_manager{mediator}; + +public: +	TestAudioSystem system{mediator}; +	TestSoundContext & context = system.context; + +private: +	GameObject entity = component_manager.new_object("name"); + +public: +	AudioSource & component = entity.add_component<AudioSource>("mwe/audio/bgm.ogg"); +}; + +TEST_F(AudioTest, Default) { +	EXPECT_CALL(context, play(_)).Times(0); +	EXPECT_CALL(context, stop(_)).Times(0); +	EXPECT_CALL(context, set_volume(_, _)).Times(0); +	EXPECT_CALL(context, set_loop(_, _)).Times(0); +	system.update(); +} + +TEST_F(AudioTest, Play) { +	system.update(); + +	{ +		InSequence seq; + +		EXPECT_CALL(context, play(_)).Times(0); +		component.play(); +	} + +	{ +		InSequence seq; + +		EXPECT_CALL(context, play(_)).Times(1); +		system.update(); +	} +} + +TEST_F(AudioTest, Stop) { +	system.update(); + +	{ +		InSequence seq; + +		EXPECT_CALL(context, stop(_)).Times(0); +		component.stop(); +	} + +	{ +		InSequence seq; + +		EXPECT_CALL(context, stop(_)).Times(1); +		system.update(); +	} +} + +TEST_F(AudioTest, Volume) { +	system.update(); + +	{ +		InSequence seq; + +		EXPECT_CALL(context, set_volume(_, _)).Times(0); +		component.volume += 0.2; +	} + +	{ +		InSequence seq; + +		EXPECT_CALL(context, set_volume(_, component.volume)).Times(1); +		system.update(); +	} +} + +TEST_F(AudioTest, Looping) { +	system.update(); + +	{ +		InSequence seq; + +		EXPECT_CALL(context, set_loop(_, _)).Times(0); +		component.loop = !component.loop; +	} + +	{ +		InSequence seq; + +		EXPECT_CALL(context, set_loop(_, component.loop)).Times(1); +		system.update(); +	} +} + +TEST_F(AudioTest, StopOnDeactivate) { +	system.update(); + +	{ +		InSequence seq; + +		EXPECT_CALL(context, stop(_)).Times(1); +		component.active = false; +		system.update(); +	} +} + +TEST_F(AudioTest, PlayOnActive) { +	component.active = false; +	component.play_on_awake = true; +	system.update(); + +	{ +		InSequence seq; + +		EXPECT_CALL(context, play(_)).Times(1); +		component.active = true; +		system.update(); +	} +} + +TEST_F(AudioTest, PlayImmediately) { +	component.play_on_awake = false; +	component.play(); + +	EXPECT_CALL(context, play(_)).Times(1); + +	system.update(); +} diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 0d98490..ef7b5c6 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -4,7 +4,9 @@ target_sources(test_main PUBLIC  	PhysicsTest.cpp  	ScriptTest.cpp  	ParticleTest.cpp +	AudioTest.cpp  	AssetTest.cpp +	ResourceManagerTest.cpp  	OptionalRefTest.cpp  	RenderSystemTest.cpp  	EventTest.cpp diff --git a/src/test/ResourceManagerTest.cpp b/src/test/ResourceManagerTest.cpp new file mode 100644 index 0000000..44a5921 --- /dev/null +++ b/src/test/ResourceManagerTest.cpp @@ -0,0 +1,81 @@ +#include <gtest/gtest.h> + +#define private public +#define protected public + +#include <crepe/api/GameObject.h> +#include <crepe/manager/ResourceManager.h> +#include <crepe/util/Log.h> + +using namespace std; +using namespace crepe; +using namespace testing; + +class ResourceManagerTest : public Test { +	Mediator mediator; + +public: +	ResourceManager resource_manager{mediator}; + +	class Unrelated : public Resource { +		using Resource::Resource; +	}; + +	Asset asset_a{"asset/texture/img.png"}; +	Asset asset_b{"asset/texture/ERROR.png"}; + +	class TestResource : public Resource { +	public: +		static unsigned instances; + +	public: +		const unsigned instance; +		TestResource(const Asset & src) : Resource(src), instance(this->instances++) {} +		~TestResource() { this->instances--; } +		bool operator==(const TestResource & other) const { +			return this->instance == other.instance; +		} +	}; + +private: +	void SetUp() override { TestResource::instances = 0; } +}; +unsigned ResourceManagerTest::TestResource::instances = 0; + +TEST_F(ResourceManagerTest, Default) { +	TestResource & res_1 = resource_manager.get<TestResource>(asset_a); +	TestResource & res_2 = resource_manager.get<TestResource>(asset_a); +	TestResource & res_3 = resource_manager.get<TestResource>(asset_b); +	TestResource & res_4 = resource_manager.get<TestResource>(asset_b); + +	ASSERT_EQ(res_1, res_2); +	ASSERT_EQ(res_3, res_4); +	EXPECT_NE(res_1, res_3); + +	EXPECT_EQ(TestResource::instances, 2); + +	resource_manager.clear(); +} + +TEST_F(ResourceManagerTest, Persistent) { +	resource_manager.set_persistent(asset_a, true); +	EXPECT_EQ(TestResource::instances, 0); + +	resource_manager.get<TestResource>(asset_a); +	resource_manager.get<TestResource>(asset_a); +	resource_manager.get<TestResource>(asset_b); +	resource_manager.get<TestResource>(asset_b); +	EXPECT_EQ(TestResource::instances, 2); + +	resource_manager.clear(); +	EXPECT_EQ(TestResource::instances, 1); + +	resource_manager.clear_all(); +	EXPECT_EQ(TestResource::instances, 0); +} + +TEST_F(ResourceManagerTest, UnmatchedType) { +	EXPECT_NO_THROW({ resource_manager.get<TestResource>(asset_a); }); + +	EXPECT_THROW({ resource_manager.get<Unrelated>(asset_a); }, runtime_error); +} diff --git a/src/test/main.cpp b/src/test/main.cpp index aece72d..ed2aed5 100644 --- a/src/test/main.cpp +++ b/src/test/main.cpp @@ -1,9 +1,5 @@ -#include <gtest/gtest.h> - -#define protected public -#define private public -  #include <crepe/api/Config.h> +#include <gtest/gtest.h>  using namespace crepe;  using namespace testing; @@ -11,12 +7,14 @@ using namespace testing;  class GlobalConfigReset : public EmptyTestEventListener {  public:  	Config & cfg = Config::get_instance(); -	Config cfg_default = Config();  	// This function is called before each test  	void OnTestStart(const TestInfo &) override { -		cfg = cfg_default; -		cfg.log.level = Log::Level::WARNING; +		cfg = { +			.log = { +				.level = Log::Level::WARNING, +			}, +		};  	}  };  |