Files
XCEngine/tests/Resources/AudioClip/test_audio_clip.cpp

75 lines
2.3 KiB
C++

#include <gtest/gtest.h>
#include <XCEngine/Resources/AudioClip/AudioClip.h>
#include <XCEngine/Core/Asset/ResourceTypes.h>
#include <XCEngine/Core/Asset/ResourceManager.h>
using namespace XCEngine::Resources;
namespace {
XCEngine::Containers::Array<XCEngine::Core::uint8> EncodeMono16PCM(std::initializer_list<int16_t> samples) {
XCEngine::Containers::Array<XCEngine::Core::uint8> pcmData;
pcmData.ResizeUninitialized(samples.size() * sizeof(int16_t));
size_t byteOffset = 0;
for (const int16_t sample : samples) {
const uint16_t encoded = static_cast<uint16_t>(sample);
pcmData[byteOffset++] = static_cast<XCEngine::Core::uint8>(encoded & 0xFFu);
pcmData[byteOffset++] = static_cast<XCEngine::Core::uint8>((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<float>& firstDecode = audio.GetDecodedPCMData();
const std::vector<float>& 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