music: add tests for album types

Add tests for Album.Type.

Other tests for the music library will be done separately.
This commit is contained in:
Alexander Capehart 2023-01-07 09:14:36 -07:00
parent dc73f96ba8
commit a2b51825e8
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
26 changed files with 147 additions and 101 deletions

View file

@ -36,7 +36,7 @@ import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.util.*
/**

View file

@ -35,7 +35,7 @@ import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.util.collect
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.logD

View file

@ -33,9 +33,9 @@ import org.oxycblt.auxio.R
import org.oxycblt.auxio.list.Header
import org.oxycblt.auxio.list.Item
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.music.storage.MimeType
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.util.*

View file

@ -36,7 +36,7 @@ import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.util.collect
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.logD

View file

@ -50,8 +50,8 @@ import org.oxycblt.auxio.home.list.SongListFragment
import org.oxycblt.auxio.home.tabs.AdaptiveTabStrategy
import org.oxycblt.auxio.list.selection.SelectionFragment
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.music.system.Indexer
import org.oxycblt.auxio.ui.MainNavigationAction
import org.oxycblt.auxio.ui.NavigationViewModel

View file

@ -23,9 +23,9 @@ import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import org.oxycblt.auxio.home.tabs.Tab
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.util.logD

View file

@ -34,7 +34,7 @@ import org.oxycblt.auxio.list.recycler.AlbumViewHolder
import org.oxycblt.auxio.list.recycler.SelectionIndicatorAdapter
import org.oxycblt.auxio.list.recycler.SyncListDiffer
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.playback.formatDurationMs
import org.oxycblt.auxio.playback.secsToMs
import org.oxycblt.auxio.util.collectImmediately

View file

@ -34,7 +34,7 @@ import org.oxycblt.auxio.list.recycler.SyncListDiffer
import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.playback.formatDurationMs
import org.oxycblt.auxio.util.collectImmediately
import org.oxycblt.auxio.util.nonZeroOrNull

View file

@ -34,7 +34,7 @@ import org.oxycblt.auxio.list.recycler.SyncListDiffer
import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.playback.formatDurationMs
import org.oxycblt.auxio.util.collectImmediately

View file

@ -36,7 +36,7 @@ import org.oxycblt.auxio.list.recycler.SyncListDiffer
import org.oxycblt.auxio.music.MusicMode
import org.oxycblt.auxio.music.MusicParent
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.playback.formatDurationMs
import org.oxycblt.auxio.playback.secsToMs
import org.oxycblt.auxio.util.collectImmediately

View file

@ -35,7 +35,7 @@ import org.oxycblt.auxio.music.Artist
import org.oxycblt.auxio.music.Genre
import org.oxycblt.auxio.music.Music
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Sort
/**
* A [Keyer] implementation for [Music] data.

View file

@ -21,8 +21,8 @@ import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.library.Library
/**
* A [ViewModel] that manages the current selection.

View file

@ -30,6 +30,7 @@ import kotlinx.parcelize.IgnoredOnParcel
import kotlinx.parcelize.Parcelize
import org.oxycblt.auxio.R
import org.oxycblt.auxio.list.Item
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.music.parsing.parseId3GenreNames
import org.oxycblt.auxio.music.parsing.parseMultiValue
import org.oxycblt.auxio.music.storage.*

View file

@ -21,6 +21,7 @@ import android.content.Context
import android.os.storage.StorageManager
import androidx.core.content.edit
import org.oxycblt.auxio.R
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.music.storage.Directory
import org.oxycblt.auxio.music.storage.MusicDirectories
import org.oxycblt.auxio.settings.Settings

View file

@ -17,6 +17,8 @@
package org.oxycblt.auxio.music
import org.oxycblt.auxio.music.library.Library
/**
* A repository granting access to the music library.
*

View file

@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.music
package org.oxycblt.auxio.music.library
import android.content.Context
import android.net.Uri
@ -43,10 +43,10 @@ class Library(rawSongs: List<Song.Raw>, settings: MusicSettings) {
/** All [Genre]s found on the device. */
val genres = buildGenres(songs)
// Use a mapping to make finding information based on it's UID much faster.
private val uidMap = buildMap {
// We need to finalize the newly-created music and also add it to a mapping to make
// de-serializing music from UIDs much faster. Do these in the same loop for efficiency.
for (music in (songs + albums + artists + genres)) {
// Finalize all music in the same mapping creation loop for efficiency.
music._finalize()
this[music.uid] = music
}

View file

@ -15,13 +15,14 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.music
package org.oxycblt.auxio.music.library
import androidx.annotation.IdRes
import kotlin.math.max
import org.oxycblt.auxio.IntegerTable
import org.oxycblt.auxio.R
import org.oxycblt.auxio.music.Sort.Mode
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.library.Sort.Mode
/**
* A sorting method.

View file

@ -21,8 +21,8 @@ import androidx.lifecycle.ViewModel
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.util.unlikelyToBeNull
/**

View file

@ -28,8 +28,8 @@ import kotlinx.coroutines.withContext
import kotlinx.coroutines.yield
import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.extractor.*
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logE
import org.oxycblt.auxio.util.logW

View file

@ -24,7 +24,7 @@ import android.database.sqlite.SQLiteOpenHelper
import android.provider.BaseColumns
import androidx.core.database.sqlite.transaction
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.util.*
/**

View file

@ -21,9 +21,9 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.playback.state.PlaybackStateManager.Listener
import org.oxycblt.auxio.util.logD
import org.oxycblt.auxio.util.logE

View file

@ -43,10 +43,10 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Job
import kotlinx.coroutines.launch
import org.oxycblt.auxio.BuildConfig
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.MusicSettings
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Song
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.playback.replaygain.ReplayGainAudioProcessor
import org.oxycblt.auxio.playback.state.InternalPlayer

View file

@ -31,9 +31,9 @@ import org.oxycblt.auxio.R
import org.oxycblt.auxio.list.Header
import org.oxycblt.auxio.list.Item
import org.oxycblt.auxio.music.*
import org.oxycblt.auxio.music.Library
import org.oxycblt.auxio.music.MusicStore
import org.oxycblt.auxio.music.Sort
import org.oxycblt.auxio.music.library.Library
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.playback.PlaybackSettings
import org.oxycblt.auxio.util.context
import org.oxycblt.auxio.util.logD

View file

@ -0,0 +1,82 @@
/*
* Copyright (c) 2023 Auxio Project
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
package org.oxycblt.auxio.music
import org.junit.Assert.assertEquals
import org.junit.Test
class AlbumTypeTest {
@Test
fun albumType_parse_primary() {
assertEquals(Album.Type.Album(null), Album.Type.parse(listOf("album")))
assertEquals(Album.Type.EP(null), Album.Type.parse(listOf("ep")))
assertEquals(Album.Type.Single(null), Album.Type.parse(listOf("single")))
}
@Test
fun albumType_parse_secondary() {
assertEquals(Album.Type.Compilation(null), Album.Type.parse(listOf("album", "compilation")))
assertEquals(Album.Type.Soundtrack, Album.Type.parse(listOf("album", "soundtrack")))
assertEquals(Album.Type.Mix, Album.Type.parse(listOf("album", "dj-mix")))
assertEquals(Album.Type.Mixtape, Album.Type.parse(listOf("album", "mixtape/street")))
}
@Test
fun albumType_parse_modifiers() {
assertEquals(
Album.Type.Album(Album.Type.Refinement.LIVE), Album.Type.parse(listOf("album", "live")))
assertEquals(
Album.Type.Album(Album.Type.Refinement.REMIX),
Album.Type.parse(listOf("album", "remix")))
assertEquals(
Album.Type.EP(Album.Type.Refinement.LIVE), Album.Type.parse(listOf("ep", "live")))
assertEquals(
Album.Type.EP(Album.Type.Refinement.REMIX), Album.Type.parse(listOf("ep", "remix")))
assertEquals(
Album.Type.Single(Album.Type.Refinement.LIVE),
Album.Type.parse(listOf("single", "live")))
assertEquals(
Album.Type.Single(Album.Type.Refinement.REMIX),
Album.Type.parse(listOf("single", "remix")))
}
@Test
fun albumType_parse_secondaryModifiers() {
assertEquals(
Album.Type.Compilation(Album.Type.Refinement.LIVE),
Album.Type.parse(listOf("album", "compilation", "live")))
assertEquals(
Album.Type.Compilation(Album.Type.Refinement.REMIX),
Album.Type.parse(listOf("album", "compilation", "remix")))
}
@Test
fun albumType_parse_orphanedSecondary() {
assertEquals(Album.Type.Compilation(null), Album.Type.parse(listOf("compilation")))
assertEquals(Album.Type.Soundtrack, Album.Type.parse(listOf("soundtrack")))
assertEquals(Album.Type.Mix, Album.Type.parse(listOf("dj-mix")))
assertEquals(Album.Type.Mixtape, Album.Type.parse(listOf("mixtape/street")))
}
@Test
fun albumType_parse_orphanedModifier() {
assertEquals(Album.Type.Album(Album.Type.Refinement.LIVE), Album.Type.parse(listOf("live")))
assertEquals(
Album.Type.Album(Album.Type.Refinement.REMIX), Album.Type.parse(listOf("remix")))
}
}

View file

@ -23,35 +23,28 @@ import org.junit.Test
class DateTest {
@Test
fun date_equals() {
assertTrue(
requireNotNull(Date.from("2016-08-16T00:01:02")) ==
requireNotNull(Date.from("2016-08-16T00:01:02")))
}
@Test
fun date_precisionEquals() {
fun date_equals_varyingPrecision() {
assertTrue(
requireNotNull(Date.from("2016-08-16T00:01:02")) !=
requireNotNull(Date.from("2016-08-16")))
}
@Test
fun date_compareDates() {
fun date_compareTo_dates() {
val a = requireNotNull(Date.from("2016-08-16T00:01:02"))
val b = requireNotNull(Date.from("2016-09-16T00:01:02"))
assertEquals(-1, a.compareTo(b))
}
@Test
fun date_compareTimes() {
fun date_compareTo_times() {
val a = requireNotNull(Date.from("2016-08-16T00:02:02"))
val b = requireNotNull(Date.from("2016-08-16T00:01:02"))
assertEquals(1, a.compareTo(b))
}
@Test
fun date_comparePrecision() {
fun date_compareTo_varyingPrecision() {
val a = requireNotNull(Date.from("2016-08-16T00:01:02"))
val b = requireNotNull(Date.from("2016-08-16"))
assertEquals(
@ -61,77 +54,42 @@ class DateTest {
}
@Test
fun date_fromYear() {
fun date_from_values() {
assertEquals("2016", Date.from(2016).toString())
}
@Test
fun date_fromDate() {
assertEquals("2016-08-16", Date.from(2016, 8, 16).toString())
}
@Test
fun date_fromDatetime() {
assertEquals("2016-08-16T00:01Z", Date.from(2016, 8, 16, 0, 1).toString())
}
@Test
fun date_fromFormalTimestamp() {
assertEquals("2016-08-16T00:01:02Z", Date.from("2016-08-16T00:01:02").toString())
}
@Test
fun date_fromSpacedTimestamp() {
assertEquals("2016-08-16T00:01:02Z", Date.from("2016-08-16 00:01:02").toString())
}
@Test
fun date_fromDatestamp() {
assertEquals(
"2016-08-16",
Date.from("2016-08-16").toString(),
)
}
@Test
fun date_fromWeirdDateTimestamp() {
assertEquals("2016-08-16T00:01Z", Date.from("2016-08-16T00:01").toString())
}
@Test
fun date_fromWeirdDatestamp() {
assertEquals("2016-08", Date.from("2016-08").toString())
}
@Test
fun date_fromYearStamp() {
assertEquals("2016", Date.from("2016").toString())
}
@Test
fun date_fromWackTimestamp() {
assertEquals("2016-11", Date.from("2016-11-32 25:43:01").toString())
}
@Test
fun date_fromBustedTimestamp() {
assertEquals(null, Date.from("2016-08-16:00:01:02"))
assertEquals(null, Date.from(""))
}
@Test
fun date_fromWackYear() {
assertEquals(Date.from(0), null)
}
@Test
fun date_fromYearDate() {
fun date_from_yearDate() {
assertEquals("2016-08-16", Date.from(20160816).toString())
assertEquals("2016-08-16", Date.from("20160816").toString())
}
@Test
fun dateRange_fromDates() {
fun date_from_timestamp() {
assertEquals("2016-08-16T00:01:02Z", Date.from("2016-08-16T00:01:02").toString())
assertEquals("2016-08-16T00:01:02Z", Date.from("2016-08-16 00:01:02").toString())
}
@Test
fun date_from_lesserPrecision() {
assertEquals("2016", Date.from("2016").toString())
assertEquals("2016-08", Date.from("2016-08").toString())
assertEquals("2016-08-16", Date.from("2016-08-16").toString())
assertEquals("2016-08-16T00:01Z", Date.from("2016-08-16T00:01").toString())
}
@Test
fun date_from_wack() {
assertEquals(null, Date.from(0))
assertEquals(null, Date.from(""))
assertEquals(null, Date.from("2016-08-16:00:01:02"))
assertEquals("2016-11", Date.from("2016-11-32 25:43:01").toString())
}
@Test
fun dateRange_from_correct() {
val range =
requireNotNull(
Date.Range.from(
@ -145,7 +103,7 @@ class DateTest {
}
@Test
fun dateRange_fromSingle() {
fun dateRange_from_one() {
val range =
requireNotNull(
Date.Range.from(listOf(requireNotNull(Date.from("2016-08-16T00:01:02")))))
@ -154,7 +112,7 @@ class DateTest {
}
@Test
fun dateRange_empty() {
fun dateRange_from_none() {
assertEquals(null, Date.Range.from(listOf()))
}
}

View file

@ -17,6 +17,7 @@
package org.oxycblt.auxio.music
import org.oxycblt.auxio.music.library.Sort
import org.oxycblt.auxio.music.storage.MusicDirectories
interface FakeMusicSettings : MusicSettings {