Skip to content

Commit 9722fb3

Browse files
committed
Add tests for Audio module types
1 parent a61eb6a commit 9722fb3

File tree

9 files changed

+640
-37
lines changed

9 files changed

+640
-37
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ jobs:
3636
- { name: Windows VS2022 Unity, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -DCMAKE_UNITY_BUILD=ON -GNinja }
3737
- { name: Windows LLVM/Clang, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -DCMAKE_CXX_COMPILER=clang++ -GNinja }
3838
- { name: Windows MinGW, os: windows-2022, flags: -DSFML_USE_MESA3D=TRUE -DCMAKE_CXX_COMPILER=g++ -GNinja }
39-
- { name: Linux GCC, os: ubuntu-22.04, flags: -GNinja }
40-
- { name: Linux Clang, os: ubuntu-22.04, flags: -DCMAKE_CXX_COMPILER=clang++ -GNinja , gcovr_options: '--gcov-executable="llvm-cov-$CLANG_VERSION gcov"' }
41-
- { name: Linux GCC DRM, os: ubuntu-22.04, flags: -DSFML_USE_DRM=ON -DSFML_RUN_DISPLAY_TESTS=OFF -GNinja }
42-
- { name: Linux GCC OpenGL ES, os: ubuntu-22.04, flags: -DSFML_OPENGL_ES=ON -DSFML_RUN_DISPLAY_TESTS=OFF -GNinja }
39+
- { name: Linux GCC, os: ubuntu-22.04, flags: -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF -GNinja }
40+
- { name: Linux Clang, os: ubuntu-22.04, flags: -DCMAKE_CXX_COMPILER=clang++ -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF -GNinja , gcovr_options: '--gcov-executable="llvm-cov-$CLANG_VERSION gcov"' }
41+
- { name: Linux GCC DRM, os: ubuntu-22.04, flags: -DSFML_USE_DRM=ON -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF -GNinja }
42+
- { name: Linux GCC OpenGL ES, os: ubuntu-22.04, flags: -DSFML_OPENGL_ES=ON -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF -GNinja }
4343
- { name: macOS x64, os: macos-12, flags: -GNinja }
4444
- { name: macOS x64 Xcode, os: macos-12, flags: -GXcode }
45-
- { name: macOS arm64, os: macos-14, flags: -GNinja }
45+
- { name: macOS arm64, os: macos-14, flags: -GNinja -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF }
4646
- { name: iOS, os: macos-12, flags: -DCMAKE_SYSTEM_NAME=iOS -DCMAKE_OSX_ARCHITECTURES=arm64 }
4747
- { name: iOS Xcode, os: macos-12, flags: -DCMAKE_SYSTEM_NAME=iOS -GXcode -DCMAKE_XCODE_ATTRIBUTE_CODE_SIGNING_ALLOWED=NO }
4848
config:
@@ -56,9 +56,9 @@ jobs:
5656
- platform: { name: Windows VS2022 x64, os: windows-2022 }
5757
config: { name: Static with PCH (MSVC), flags: -DSFML_USE_MESA3D=TRUE -GNinja -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 }
5858
- platform: { name: Linux GCC, os: ubuntu-22.04 }
59-
config: { name: Static with PCH (GCC), flags: -GNinja -DCMAKE_CXX_COMPILER=g++ -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 }
59+
config: { name: Static with PCH (GCC), flags: -GNinja -DCMAKE_CXX_COMPILER=g++ -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF }
6060
- platform: { name: Linux Clang, os: ubuntu-22.04 }
61-
config: { name: Static with PCH (Clang), flags: -GNinja -DCMAKE_CXX_COMPILER=clang++ -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 }
61+
config: { name: Static with PCH (Clang), flags: -GNinja -DCMAKE_CXX_COMPILER=clang++ -DBUILD_SHARED_LIBS=FALSE -DSFML_ENABLE_PCH=1 -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF }
6262
- platform: { name: Windows MinGW, os: windows-2022 }
6363
config: { name: Static Standard Libraries, flags: -GNinja -DSFML_USE_MESA3D=TRUE -DCMAKE_CXX_COMPILER=g++ -DSFML_USE_STATIC_STD_LIBS=TRUE }
6464
- platform: { name: Windows MinGW, os: windows-2022 }
@@ -70,7 +70,7 @@ jobs:
7070
- platform: { name: Android, os: ubuntu-latest }
7171
config:
7272
name: x86 (API 21)
73-
flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=21 -DCMAKE_ANDROID_NDK=$ANDROID_NDK_ROOT -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared -DSFML_RUN_DISPLAY_TESTS=OFF
73+
flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=x86 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=21 -DCMAKE_ANDROID_NDK=$ANDROID_NDK_ROOT -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF
7474
arch: x86
7575
api: 21
7676
libcxx: i686-linux-android/libc++_shared.so
@@ -80,7 +80,7 @@ jobs:
8080
- platform: { name: Android, os: ubuntu-latest }
8181
config:
8282
name: x86_64 (API 24)
83-
flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=x86_64 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=24 -DCMAKE_ANDROID_NDK=$ANDROID_NDK_ROOT -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared -DSFML_RUN_DISPLAY_TESTS=OFF
83+
flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=x86_64 -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=24 -DCMAKE_ANDROID_NDK=$ANDROID_NDK_ROOT -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF
8484
arch: x86_64
8585
api: 24
8686
libcxx: x86_64-linux-android/libc++_shared.so
@@ -98,7 +98,7 @@ jobs:
9898
- platform: { name: Android, os: ubuntu-latest }
9999
config:
100100
name: arm64-v8a (API 33)
101-
flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=33 -DCMAKE_ANDROID_NDK=$ANDROID_NDK_ROOT -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared -DSFML_RUN_DISPLAY_TESTS=OFF
101+
flags: -GNinja -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DCMAKE_SYSTEM_NAME=Android -DCMAKE_SYSTEM_VERSION=33 -DCMAKE_ANDROID_NDK=$ANDROID_NDK_ROOT -DBUILD_SHARED_LIBS=TRUE -DCMAKE_ANDROID_STL_TYPE=c++_shared -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF
102102
arch: arm64-v8a
103103
api: 33
104104
libcxx: aarch64-linux-android/libc++_shared.so
@@ -386,9 +386,9 @@ jobs:
386386
fail-fast: false
387387
matrix:
388388
platform:
389-
- { name: Linux, os: ubuntu-22.04 }
390-
- { name: Linux DRM, os: ubuntu-22.04, flags: -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_USE_DRM=ON }
391-
- { name: Linux GCC OpenGL ES, os: ubuntu-22.04, flags: -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_OPENGL_ES=ON }
389+
- { name: Linux, os: ubuntu-22.04, flags: -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF }
390+
- { name: Linux DRM, os: ubuntu-22.04, flags: -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_USE_DRM=ON }
391+
- { name: Linux GCC OpenGL ES, os: ubuntu-22.04, flags: -DSFML_RUN_AUDIO_DEVICE_TESTS=OFF -DSFML_RUN_DISPLAY_TESTS=OFF -DSFML_OPENGL_ES=ON }
392392

393393
steps:
394394
- name: Checkout Code

test/Audio/Music.test.cpp

Lines changed: 205 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,209 @@
11
#include <SFML/Audio/Music.hpp>
22

3+
// Other 1st party headers
4+
#include <SFML/System/FileInputStream.hpp>
5+
6+
#include <catch2/catch_test_macros.hpp>
7+
8+
#include <AudioUtil.hpp>
9+
#include <SystemUtil.hpp>
10+
#include <array>
11+
#include <fstream>
12+
#include <thread>
313
#include <type_traits>
414

5-
static_assert(!std::is_copy_constructible_v<sf::Music>);
6-
static_assert(!std::is_copy_assignable_v<sf::Music>);
7-
static_assert(!std::is_nothrow_move_constructible_v<sf::Music>);
8-
static_assert(!std::is_nothrow_move_assignable_v<sf::Music>);
15+
TEST_CASE("[Audio] sf::Music", runAudioDeviceTests())
16+
{
17+
SECTION("Type traits")
18+
{
19+
STATIC_CHECK(!std::is_copy_constructible_v<sf::Music>);
20+
STATIC_CHECK(!std::is_copy_assignable_v<sf::Music>);
21+
STATIC_CHECK(!std::is_nothrow_move_constructible_v<sf::Music>);
22+
STATIC_CHECK(!std::is_nothrow_move_assignable_v<sf::Music>);
23+
STATIC_CHECK(std::has_virtual_destructor_v<sf::Music>);
24+
}
25+
26+
SECTION("Span")
27+
{
28+
const sf::Music::Span<float> span;
29+
CHECK(span.offset == 0);
30+
CHECK(span.length == 0);
31+
32+
const sf::Music::TimeSpan timeSpan;
33+
CHECK(timeSpan.offset == sf::Time::Zero);
34+
CHECK(timeSpan.length == sf::Time::Zero);
35+
}
36+
37+
SECTION("Construction")
38+
{
39+
const sf::Music music;
40+
CHECK(music.getDuration() == sf::Time::Zero);
41+
const auto [offset, length] = music.getLoopPoints();
42+
CHECK(offset == sf::Time::Zero);
43+
CHECK(length == sf::Time::Zero);
44+
CHECK(music.getChannelCount() == 0);
45+
CHECK(music.getSampleRate() == 0);
46+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
47+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
48+
CHECK(!music.getLoop());
49+
}
50+
51+
SECTION("openFromFile()")
52+
{
53+
sf::Music music;
54+
55+
SECTION("Invalid file")
56+
{
57+
REQUIRE(!music.openFromFile("does/not/exist.wav"));
58+
CHECK(music.getDuration() == sf::Time::Zero);
59+
const auto [offset, length] = music.getLoopPoints();
60+
CHECK(offset == sf::Time::Zero);
61+
CHECK(length == sf::Time::Zero);
62+
CHECK(music.getChannelCount() == 0);
63+
CHECK(music.getSampleRate() == 0);
64+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
65+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
66+
CHECK(!music.getLoop());
67+
}
68+
69+
SECTION("Valid file")
70+
{
71+
REQUIRE(music.openFromFile("Audio/ding.mp3"));
72+
CHECK(music.getDuration() == sf::microseconds(1990884));
73+
const auto [offset, length] = music.getLoopPoints();
74+
CHECK(offset == sf::Time::Zero);
75+
CHECK(length == sf::microseconds(1990884));
76+
CHECK(music.getChannelCount() == 1);
77+
CHECK(music.getSampleRate() == 44100);
78+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
79+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
80+
CHECK(!music.getLoop());
81+
}
82+
}
83+
84+
SECTION("openFromMemory()")
85+
{
86+
std::vector<std::byte> memory;
87+
sf::Music music;
88+
89+
SECTION("Invalid buffer")
90+
{
91+
REQUIRE(!music.openFromMemory(memory.data(), memory.size()));
92+
CHECK(music.getDuration() == sf::Time::Zero);
93+
const auto [offset, length] = music.getLoopPoints();
94+
CHECK(offset == sf::Time::Zero);
95+
CHECK(length == sf::Time::Zero);
96+
CHECK(music.getChannelCount() == 0);
97+
CHECK(music.getSampleRate() == 0);
98+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
99+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
100+
CHECK(!music.getLoop());
101+
}
102+
103+
SECTION("Valid buffer")
104+
{
105+
memory = loadIntoMemory("Audio/ding.flac");
106+
REQUIRE(music.openFromMemory(memory.data(), memory.size()));
107+
CHECK(music.getDuration() == sf::microseconds(1990884));
108+
const auto [offset, length] = music.getLoopPoints();
109+
CHECK(offset == sf::Time::Zero);
110+
CHECK(length == sf::microseconds(1990884));
111+
CHECK(music.getChannelCount() == 1);
112+
CHECK(music.getSampleRate() == 44100);
113+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
114+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
115+
CHECK(!music.getLoop());
116+
}
117+
}
118+
119+
SECTION("openFromStream()")
120+
{
121+
sf::FileInputStream stream;
122+
sf::Music music;
123+
124+
SECTION("Invalid stream")
125+
{
126+
CHECK(!music.openFromStream(stream));
127+
CHECK(music.getDuration() == sf::Time::Zero);
128+
const auto [offset, length] = music.getLoopPoints();
129+
CHECK(offset == sf::Time::Zero);
130+
CHECK(length == sf::Time::Zero);
131+
CHECK(music.getChannelCount() == 0);
132+
CHECK(music.getSampleRate() == 0);
133+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
134+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
135+
CHECK(!music.getLoop());
136+
}
137+
138+
SECTION("Valid stream")
139+
{
140+
REQUIRE(stream.open("Audio/doodle_pop.ogg"));
141+
REQUIRE(music.openFromStream(stream));
142+
CHECK(music.getDuration() == sf::microseconds(24002176));
143+
const auto [offset, length] = music.getLoopPoints();
144+
CHECK(offset == sf::Time::Zero);
145+
CHECK(length == sf::microseconds(24002176));
146+
CHECK(music.getChannelCount() == 2);
147+
CHECK(music.getSampleRate() == 44100);
148+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
149+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
150+
CHECK(!music.getLoop());
151+
}
152+
}
153+
154+
SECTION("play/pause/stop")
155+
{
156+
sf::Music music;
157+
REQUIRE(music.openFromFile("Audio/ding.mp3"));
158+
159+
// Wait for background thread to start
160+
music.play();
161+
while (music.getStatus() == sf::SoundSource::Status::Stopped)
162+
std::this_thread::sleep_for(std::chrono::milliseconds(10));
163+
CHECK(music.getStatus() == sf::SoundSource::Status::Playing);
164+
165+
// Wait for background thread to pause
166+
music.pause();
167+
while (music.getStatus() == sf::SoundSource::Status::Playing)
168+
std::this_thread::sleep_for(std::chrono::milliseconds(10));
169+
CHECK(music.getStatus() == sf::SoundSource::Status::Paused);
170+
171+
// Wait for background thread to stop
172+
music.stop();
173+
while (music.getStatus() == sf::SoundSource::Status::Paused)
174+
std::this_thread::sleep_for(std::chrono::milliseconds(10));
175+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
176+
}
177+
178+
SECTION("setLoopPoints()")
179+
{
180+
sf::Music music;
181+
182+
SECTION("No file")
183+
{
184+
music.setLoopPoints({sf::Time::Zero, sf::Time::Zero});
185+
const auto [offset, length] = music.getLoopPoints();
186+
CHECK(offset == sf::Time::Zero);
187+
CHECK(length == sf::Time::Zero);
188+
CHECK(music.getChannelCount() == 0);
189+
CHECK(music.getSampleRate() == 0);
190+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
191+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
192+
CHECK(!music.getLoop());
193+
}
194+
195+
SECTION("Loaded file")
196+
{
197+
REQUIRE(music.openFromFile("Audio/killdeer.wav"));
198+
music.setLoopPoints({sf::seconds(1), sf::seconds(2)});
199+
const auto [offset, length] = music.getLoopPoints();
200+
CHECK(offset == sf::seconds(1));
201+
CHECK(length == sf::seconds(2));
202+
CHECK(music.getChannelCount() == 1);
203+
CHECK(music.getSampleRate() == 22050);
204+
CHECK(music.getStatus() == sf::SoundSource::Status::Stopped);
205+
CHECK(music.getPlayingOffset() == sf::Time::Zero);
206+
CHECK(!music.getLoop());
207+
}
208+
}
209+
}

test/Audio/Sound.test.cpp

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,86 @@
11
#include <SFML/Audio/Sound.hpp>
22

3+
// Other 1st party headers
4+
#include <SFML/Audio/SoundBuffer.hpp>
5+
6+
#include <SFML/System/Time.hpp>
7+
8+
#include <catch2/catch_test_macros.hpp>
9+
10+
#include <AudioUtil.hpp>
11+
#include <SystemUtil.hpp>
312
#include <type_traits>
413

5-
static_assert(!std::is_constructible_v<sf::Sound, sf::SoundBuffer&&>);
6-
static_assert(std::is_copy_constructible_v<sf::Sound>);
7-
static_assert(std::is_copy_assignable_v<sf::Sound>);
8-
static_assert(std::is_move_constructible_v<sf::Sound>);
9-
static_assert(!std::is_nothrow_move_constructible_v<sf::Sound>);
10-
static_assert(std::is_move_assignable_v<sf::Sound>);
11-
static_assert(!std::is_nothrow_move_assignable_v<sf::Sound>);
14+
TEST_CASE("[Audio] sf::Sound", runAudioDeviceTests())
15+
{
16+
SECTION("Type traits")
17+
{
18+
STATIC_CHECK(!std::is_constructible_v<sf::Sound, sf::SoundBuffer&&>);
19+
STATIC_CHECK(std::is_copy_constructible_v<sf::Sound>);
20+
STATIC_CHECK(std::is_copy_assignable_v<sf::Sound>);
21+
STATIC_CHECK(std::is_move_constructible_v<sf::Sound>);
22+
STATIC_CHECK(!std::is_nothrow_move_constructible_v<sf::Sound>);
23+
STATIC_CHECK(std::is_move_assignable_v<sf::Sound>);
24+
STATIC_CHECK(!std::is_nothrow_move_assignable_v<sf::Sound>);
25+
STATIC_CHECK(std::has_virtual_destructor_v<sf::Sound>);
26+
}
27+
28+
sf::SoundBuffer soundBuffer;
29+
REQUIRE(soundBuffer.loadFromFile("Audio/ding.flac"));
30+
31+
SECTION("Construction")
32+
{
33+
const sf::Sound sound(soundBuffer);
34+
CHECK(&sound.getBuffer() == &soundBuffer);
35+
CHECK(!sound.getLoop());
36+
CHECK(sound.getPlayingOffset() == sf::Time::Zero);
37+
CHECK(sound.getStatus() == sf::SoundSource::Status::Stopped);
38+
}
39+
40+
SECTION("Copy semantics")
41+
{
42+
const sf::Sound sound(soundBuffer);
43+
44+
SECTION("Construction")
45+
{
46+
const sf::Sound soundCopy(sound); // NOLINT(performance-unnecessary-copy-initialization)
47+
CHECK(&soundCopy.getBuffer() == &soundBuffer);
48+
CHECK(!soundCopy.getLoop());
49+
CHECK(soundCopy.getPlayingOffset() == sf::Time::Zero);
50+
CHECK(soundCopy.getStatus() == sf::SoundSource::Status::Stopped);
51+
}
52+
53+
SECTION("Assignment")
54+
{
55+
const sf::SoundBuffer emptySoundBuffer;
56+
sf::Sound soundCopy(emptySoundBuffer);
57+
soundCopy = sound;
58+
CHECK(&soundCopy.getBuffer() == &soundBuffer);
59+
CHECK(!soundCopy.getLoop());
60+
CHECK(soundCopy.getPlayingOffset() == sf::Time::Zero);
61+
CHECK(soundCopy.getStatus() == sf::SoundSource::Status::Stopped);
62+
}
63+
}
64+
65+
SECTION("Set/get buffer")
66+
{
67+
const sf::SoundBuffer otherSoundBuffer;
68+
sf::Sound sound(soundBuffer);
69+
sound.setBuffer(otherSoundBuffer);
70+
CHECK(&sound.getBuffer() == &otherSoundBuffer);
71+
}
72+
73+
SECTION("Set/get loop")
74+
{
75+
sf::Sound sound(soundBuffer);
76+
sound.setLoop(true);
77+
CHECK(sound.getLoop());
78+
}
79+
80+
SECTION("Set/get playing offset")
81+
{
82+
sf::Sound sound(soundBuffer);
83+
sound.setPlayingOffset(sf::seconds(10));
84+
CHECK(sound.getPlayingOffset() == sf::seconds(10));
85+
}
86+
}

0 commit comments

Comments
 (0)