From 70ffdf7ce9cf0b0463f0e507fd084ba9f7c14f13 Mon Sep 17 00:00:00 2001 From: austinried <4966622+austinried@users.noreply.github.com> Date: Wed, 23 Sep 2026 06:28:14 +0000 Subject: [PATCH] cover the drag drop target mapping --- .../com/subtracks/ui/playback/QueueScreen.kt | 2 +- .../ui/playback/QueueViewModelTest.kt | 32 +++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt b/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt index 8fda4a2e..160b0d81 100644 --- a/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt +++ b/app/src/main/kotlin/com/subtracks/ui/playback/QueueScreen.kt @@ -395,7 +395,7 @@ fun QueueScreen( } } -private fun dropTarget( +internal fun dropTarget( rows: List, index: Int, from: Long, diff --git a/app/src/test/kotlin/com/subtracks/ui/playback/QueueViewModelTest.kt b/app/src/test/kotlin/com/subtracks/ui/playback/QueueViewModelTest.kt index 729b43e2..ce9c8398 100644 --- a/app/src/test/kotlin/com/subtracks/ui/playback/QueueViewModelTest.kt +++ b/app/src/test/kotlin/com/subtracks/ui/playback/QueueViewModelTest.kt @@ -7,6 +7,7 @@ import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.subtracks.data.db.SubtracksDatabase import com.subtracks.data.model.Song +import com.subtracks.data.model.SongListItem import com.subtracks.data.model.Source import com.subtracks.data.prefs.fakeUserPreferences import com.subtracks.data.repo.QueueRepository @@ -98,6 +99,13 @@ class QueueViewModelTest { assertEquals((139L..199L).toList(), viewModel.rows.map { it.position }) } + @Test + fun dropTargetUsesStablePositionsAcrossDirectionChanges() { + assertEquals(1L, dropTarget(listOf(row(1), row(0), row(2), row(3)), index = 1, from = 0)) + assertEquals(3L, dropTarget(listOf(row(1), row(2), row(3), row(0)), index = 3, from = 0)) + assertEquals(1L, dropTarget(listOf(row(0), row(3), row(1), row(2)), index = 1, from = 3)) + } + @Test fun reorderingMovesTheRowLocally() { runBlocking { seedSongs(200) } @@ -113,6 +121,30 @@ class QueueViewModelTest { assertEquals(listOf(101L, 102L, 100L), positions.take(3)) } + private fun row(position: Int) = + QueueRow( + position.toLong(), + position.toLong(), + SongListItem( + song = + Song( + sourceId = 1, + id = "s$position", + albumId = "al1", + artistId = "ar1", + title = "Song $position", + album = "Album", + artist = "Artist", + duration = 100, + track = 1, + disc = 1, + starred = null, + genre = null, + ), + coverArt = null, + ), + ) + private suspend fun seedSongs(count: Int) { db.sourcesDao().upsertSource( Source(id = 1, name = "test", address = "http://localhost", isActive = true, createdAt = 0),