#include #include #include #include using namespace XCEngine::Resources; namespace { XCEngine::Containers::Array EncodeMono16PCM(std::initializer_list samples) { XCEngine::Containers::Array pcmData; pcmData.ResizeUninitialized(samples.size() * sizeof(int16_t)); size_t byteOffset = 0; for (const int16_t sample : samples) { const uint16_t encoded = static_cast(sample); pcmData[byteOffset++] = static_cast(encoded & 0xFFu); pcmData[byteOffset++] = static_cast((encoded >> 8) & 0xFFu); } return pcmData; } TEST(AudioClip, GetType) { AudioClip audio; EXPECT_EQ(audio.GetType(), ResourceType::AudioClip); } TEST(AudioClip, GetMemorySize) { AudioClip audio; EXPECT_EQ(audio.GetMemorySize(), 0u); } TEST(AudioClip, DefaultPCMStatsAreZero) { AudioClip audio; EXPECT_EQ(audio.GetPCMDataSize(), 0u); EXPECT_EQ(audio.GetFrameCount(), 0u); EXPECT_EQ(audio.GetSampleCount(), 0u); } TEST(AudioClip, DecodedPCMCacheConverts16BitSamplesAndReusesBuffer) { AudioClip audio; audio.SetSampleRate(4); audio.SetChannels(1); audio.SetBitsPerSample(16); audio.SetPCMData(EncodeMono16PCM({32767, -32768, 16384})); const std::vector& firstDecode = audio.GetDecodedPCMData(); const std::vector& secondDecode = audio.GetDecodedPCMData(); ASSERT_EQ(firstDecode.size(), 3u); EXPECT_NEAR(firstDecode[0], 32767.0f / 32768.0f, 1e-5f); EXPECT_NEAR(firstDecode[1], -1.0f, 1e-5f); EXPECT_NEAR(firstDecode[2], 16384.0f / 32768.0f, 1e-5f); EXPECT_EQ(firstDecode.data(), secondDecode.data()); } TEST(AudioClip, UpdatingSampleRateRefreshesDurationWithoutReplacingPCMData) { AudioClip audio; audio.SetChannels(1); audio.SetBitsPerSample(16); audio.SetPCMData(EncodeMono16PCM({1, 2, 3, 4})); audio.SetSampleRate(4); EXPECT_FLOAT_EQ(audio.GetDuration(), 1.0f); audio.SetSampleRate(8); EXPECT_FLOAT_EQ(audio.GetDuration(), 0.5f); EXPECT_EQ(audio.GetFrameCount(), 4u); EXPECT_EQ(audio.GetSampleCount(), 4u); } } // namespace