From 7eba3a832d8c4c07adb0abdbab2094d514cbb025 Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison-1@users.noreply.github.com> Date: Sun, 30 Jan 2022 02:26:40 +0000 Subject: [PATCH] test(DeckPickerContextMenu): Ensure arguments set This removes the possibility that `getLong()` returns 0L if the argument was not set. --- .../dialogs/DeckPickerConfirmDeleteDeckDialog.kt | 3 ++- .../ichi2/anki/dialogs/DeckPickerContextMenu.kt | 3 ++- .../src/main/java/com/ichi2/utils/BundleUtils.kt | 14 ++++++++++++++ .../anki/dialogs/DeckPickerContextMenuTest.kt | 6 ++++++ 4 files changed, 24 insertions(+), 2 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerConfirmDeleteDeckDialog.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerConfirmDeleteDeckDialog.kt index 952c05e0f9..7e1e0e1066 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerConfirmDeleteDeckDialog.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerConfirmDeleteDeckDialog.kt @@ -23,9 +23,10 @@ import com.afollestad.materialdialogs.MaterialDialog import com.ichi2.anki.DeckPicker import com.ichi2.anki.R import com.ichi2.anki.analytics.AnalyticsDialogFragment +import com.ichi2.utils.BundleUtils.requireLong class DeckPickerConfirmDeleteDeckDialog : AnalyticsDialogFragment() { - val deckId get() = requireArguments().getLong("deckId") + val deckId get() = requireArguments().requireLong("deckId") override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { super.onCreate(savedInstanceState) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt index 9a53f133ea..a80c96989e 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt +++ b/AnkiDroid/src/main/java/com/ichi2/anki/dialogs/DeckPickerContextMenu.kt @@ -29,6 +29,7 @@ import com.ichi2.anki.StudyOptionsFragment.StudyOptionsListener import com.ichi2.anki.analytics.AnalyticsDialogFragment import com.ichi2.anki.dialogs.customstudy.CustomStudyDialog import com.ichi2.libanki.Collection +import com.ichi2.utils.BundleUtils.requireLong import com.ichi2.utils.ExtendedFragmentFactory import com.ichi2.utils.FragmentFactoryUtils import timber.log.Timber @@ -47,7 +48,7 @@ class DeckPickerContextMenu(private val collection: Collection) : AnalyticsDialo } /** The selected deck for the context menu */ - private val deckId get() = requireArguments().getLong("did") + val deckId get() = requireArguments().requireLong("did") override fun onCreateDialog(savedInstanceState: Bundle?): Dialog { super.onCreate(savedInstanceState) diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/BundleUtils.kt b/AnkiDroid/src/main/java/com/ichi2/utils/BundleUtils.kt index b8f3a64fef..9f4512da41 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/BundleUtils.kt +++ b/AnkiDroid/src/main/java/com/ichi2/utils/BundleUtils.kt @@ -35,4 +35,18 @@ object BundleUtils { null } else bundle.getLong(key) } + + /** + * Retrieves a [Long] value from a [Bundle] using a key, throws if not found + * + * @param key A string key + * @return the value associated with [key] + * @throws IllegalStateException If [key] does not exist in the bundle + */ + fun Bundle.requireLong(key: String): Long { + if (!this.containsKey(key)) { + throw IllegalStateException("key: '$key' not found") + } + return getLong(key) + } } diff --git a/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/DeckPickerContextMenuTest.kt b/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/DeckPickerContextMenuTest.kt index 24c10162f7..783fa491be 100644 --- a/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/DeckPickerContextMenuTest.kt +++ b/AnkiDroid/src/test/java/com/ichi2/anki/dialogs/DeckPickerContextMenuTest.kt @@ -23,6 +23,7 @@ import com.afollestad.materialdialogs.MaterialDialog import com.ichi2.anki.R import com.ichi2.anki.RobolectricTest import com.ichi2.libanki.Consts +import com.ichi2.testutils.assertThrows import org.hamcrest.CoreMatchers.equalTo import org.hamcrest.MatcherAssert.assertThat import org.junit.Test @@ -44,6 +45,11 @@ class DeckPickerContextMenuTest : RobolectricTest() { } } + @Test + fun ensure_cannot_be_instantiated_without_arguments() { + assertThrows { DeckPickerContextMenu(col).deckId } + } + /** * Allows testing the [MaterialDialog] returned from the [DeckPickerContextMenu] *