- Add GdUnit4 v6.2.1 framework in addons/gdUnit4/ - Create test directory structure (tests/unit/, tests/integration/, tests/mocks/) - Add unit tests for MusicPlayer.gd (8 tests) - Add unit tests for MainWindow.gd (15+ tests) - Add unit tests for Settings.gd (5 tests) - Add unit tests for Playlist.gd (11 tests) - Add integration tests for full flow (10+ tests) - Add MockHTTPRequest for HTTP request mocking - Add TestHelpers with utility functions - Add Gitea Actions CI workflow (.gitea/workflows/test.yml) - Add .runsettings for GdUnit4 CLI configuration - Add run_tests.sh for convenient test execution - Add TESTING.md with comprehensive documentation - Add TESTING_PLAN.md with implementation details - Update .gitignore for test artifacts - Enable GdUnit4 plugin in project.godot Features: - Test button functionality (play, pause, search, sync, etc.) - Mock REST API requests to server - Test complete application flows - Run tests in CI (headless mode) - Run tests in GUI for visual feedback - JUnit XML and HTML test reports Generated by OpenCode AI assistant.
159 lines
4.3 KiB
GDScript
159 lines
4.3 KiB
GDScript
class_name MusicPlayerTest
|
|
extends GdUnitTestSuite
|
|
|
|
|
|
func test_play_or_pause_toggles_play_state():
|
|
var music_player = MusicPlayer.new()
|
|
var mock_audio = mock(AudioStreamPlayer)
|
|
var mock_play_button = mock(TextureButton)
|
|
|
|
music_player.audio_player = mock_audio
|
|
music_player.play_button = mock_play_button
|
|
music_player.play_icon = load("res://icons/play_icon_light.svg")
|
|
music_player.pause_icon = load("res://icons/pause_icon_light.svg")
|
|
|
|
# Initial state - paused
|
|
mock_audio.stream_paused = true
|
|
music_player.song_finished = false
|
|
|
|
# First call should play
|
|
music_player.play_or_pause()
|
|
assert_false(mock_audio.stream_paused)
|
|
assert_eq(mock_play_button.texture_normal, music_player.pause_icon)
|
|
|
|
# Second call should pause
|
|
music_player.play_or_pause()
|
|
assert_true(mock_audio.stream_paused)
|
|
assert_eq(mock_play_button.texture_normal, music_player.play_icon)
|
|
|
|
|
|
func test_restart_resets_playback():
|
|
var music_player = MusicPlayer.new()
|
|
var mock_audio = mock(AudioStreamPlayer)
|
|
var mock_slider = mock(HSlider)
|
|
|
|
music_player.audio_player = mock_audio
|
|
music_player.progress_slider = mock_slider
|
|
|
|
mock_audio.stream_paused = false
|
|
mock_slider.value = 50.0
|
|
music_player.song_finished = true
|
|
|
|
music_player.restart()
|
|
|
|
assert_true(mock_audio.stop.was_called())
|
|
assert_false(mock_audio.stream_paused)
|
|
assert_false(music_player.song_finished)
|
|
assert_eq(mock_slider.value, 0)
|
|
assert_true(mock_audio.play.was_called())
|
|
|
|
|
|
func test_pause_sets_correct_state():
|
|
var music_player = MusicPlayer.new()
|
|
var mock_audio = mock(AudioStreamPlayer)
|
|
var mock_play_button = mock(TextureButton)
|
|
|
|
music_player.audio_player = mock_audio
|
|
music_player.play_button = mock_play_button
|
|
music_player.play_icon = load("res://icons/play_icon_light.svg")
|
|
|
|
mock_audio.stream_paused = false
|
|
|
|
music_player.pause()
|
|
|
|
assert_true(mock_audio.stream_paused)
|
|
assert_eq(mock_play_button.texture_normal, music_player.play_icon)
|
|
|
|
|
|
func test_format_time_correctly_formats_seconds():
|
|
var music_player = MusicPlayer.new()
|
|
|
|
assert_eq(music_player.format_time(65.0), "01:05")
|
|
assert_eq(music_player.format_time(0.0), "00:00")
|
|
assert_eq(music_player.format_time(3661.0), "61:01")
|
|
|
|
|
|
func test_format_text_hides_info_when_configured():
|
|
var music_player = MusicPlayer.new()
|
|
|
|
# Test with hide_beginning and hide_length
|
|
Settings.hide_beginning = true
|
|
Settings.hide_length = true
|
|
Settings.hide_for_seconds = 5.0
|
|
|
|
assert_eq(music_player.format_text(3.0, 100.0), "??:?? / ??:??")
|
|
|
|
Settings.hide_beginning = false
|
|
Settings.hide_length = true
|
|
assert_eq(music_player.format_text(10.0, 100.0), "00:10 / ??:??")
|
|
|
|
Settings.hide_beginning = true
|
|
Settings.hide_length = false
|
|
assert_eq(music_player.format_text(3.0, 100.0), "??:?? / 01:40")
|
|
|
|
Settings.hide_beginning = false
|
|
Settings.hide_length = false
|
|
assert_eq(music_player.format_text(10.0, 100.0), "00:10 / 01:40")
|
|
|
|
# Reset
|
|
Settings.hide_beginning = false
|
|
Settings.hide_length = false
|
|
|
|
|
|
func test_on_drag_started_sets_is_changing():
|
|
var music_player = MusicPlayer.new()
|
|
|
|
assert_false(music_player.is_changing)
|
|
|
|
music_player._on_drag_started()
|
|
|
|
assert_true(music_player.is_changing)
|
|
|
|
|
|
func test_on_drag_ended_updates_position():
|
|
var music_player = MusicPlayer.new()
|
|
var mock_audio = mock(AudioStreamPlayer)
|
|
var mock_slider = mock(HSlider)
|
|
|
|
music_player.audio_player = mock_audio
|
|
music_player.progress_slider = mock_slider
|
|
|
|
mock_slider.value = 30.0
|
|
music_player.is_changing = true
|
|
|
|
music_player._on_drag_ended(true)
|
|
|
|
assert_false(music_player.is_changing)
|
|
assert_true(mock_audio.seek.was_called_with([30.0]))
|
|
assert_eq(music_player.playback_position, 30.0)
|
|
|
|
|
|
func test_seek_updates_slider_and_position():
|
|
var music_player = MusicPlayer.new()
|
|
var mock_audio = mock(AudioStreamPlayer)
|
|
var mock_slider = mock(HSlider)
|
|
|
|
music_player.audio_player = mock_audio
|
|
music_player.progress_slider = mock_slider
|
|
|
|
mock_slider.value = 10.0
|
|
|
|
music_player.seek(5.0)
|
|
|
|
assert_eq(mock_slider.value, 15.0)
|
|
assert_true(mock_audio.seek.was_called_with([15.0]))
|
|
assert_eq(music_player.playback_position, 15.0)
|
|
|
|
|
|
func test_change_volume_updates_slider():
|
|
var music_player = MusicPlayer.new()
|
|
var mock_slider = mock(HSlider)
|
|
|
|
music_player.volume_slider = mock_slider
|
|
mock_slider.value = 0.5
|
|
|
|
music_player.change_volume(0.1)
|
|
|
|
assert_eq(mock_slider.value, 0.6)
|
|
assert_true(mock_slider.change_volume.was_called_with([0.6]))
|