Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import com.ichi2.anki.NoteEditorFragment.Companion.NoteEditorCaller
import com.ichi2.anki.cardviewer.Gesture
import com.ichi2.anki.cardviewer.ViewerCommand
import com.ichi2.anki.libanki.sched.Ease
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.anki.observability.undoableOp
import com.ichi2.anki.preferences.sharedPrefs
import com.ichi2.anki.reviewer.AutomaticAnswer
Expand All @@ -30,7 +31,6 @@ import com.ichi2.anki.reviewer.AutomaticAnswerSettings
import com.ichi2.anki.servicelayer.LanguageHintService
import com.ichi2.testutils.common.Flaky
import com.ichi2.testutils.common.OS
import com.ichi2.testutils.ext.addNote
import com.ichi2.utils.createBasicTypingNoteType
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.containsString
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ import com.ichi2.anki.CardTemplateEditor.CardTemplateFragment.CardTemplate
import com.ichi2.anki.CollectionManager.withCol
import com.ichi2.anki.dialogs.DeckSelectionDialog.SelectableDeck
import com.ichi2.anki.libanki.NotetypeJson
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.anki.previewer.CardViewerActivity
import com.ichi2.testutils.assertFalse
import com.ichi2.testutils.ext.addNote
import org.hamcrest.MatcherAssert
import org.hamcrest.Matchers
import org.json.JSONObject
Expand Down
2 changes: 1 addition & 1 deletion AnkiDroid/src/test/java/com/ichi2/anki/ReviewerTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,14 @@ import com.ichi2.anki.libanki.Notetypes
import com.ichi2.anki.libanki.QueueType
import com.ichi2.anki.libanki.exception.ConfirmModSchemaException
import com.ichi2.anki.libanki.sched.Ease
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.anki.model.CardStateFilter
import com.ichi2.anki.observability.undoableOp
import com.ichi2.anki.preferences.PreferenceTestUtils
import com.ichi2.anki.preferences.sharedPrefs
import com.ichi2.anki.reviewer.ActionButtonStatus
import com.ichi2.testutils.common.Flaky
import com.ichi2.testutils.common.OS
import com.ichi2.testutils.ext.addNote
import com.ichi2.utils.BASIC_NOTE_TYPE_NAME
import junit.framework.TestCase.assertEquals
import junit.framework.TestCase.assertFalse
Expand Down
6 changes: 6 additions & 0 deletions AnkiDroid/src/test/java/com/ichi2/anki/RobolectricTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ import com.ichi2.testutils.filter
import com.ichi2.utils.InMemorySQLiteOpenHelperFactory
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
Expand Down Expand Up @@ -528,6 +529,11 @@ open class RobolectricTest :
}
}

override fun setupTestDispatcher(dispatcher: TestDispatcher) {
super.setupTestDispatcher(dispatcher)
ioDispatcher = dispatcher
}

override suspend fun TestScope.runTestInner(testBody: suspend TestScope.() -> Unit) {
collectionManager.setTestDispatcher(UnconfinedTestDispatcher(testScheduler))
testBody()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ package com.ichi2.anki.libanki
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.libanki.sched.Counts
import com.ichi2.anki.libanki.sched.Ease
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.notNullValue
Expand Down
2 changes: 1 addition & 1 deletion AnkiDroid/src/test/java/com/ichi2/anki/libanki/CardTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ import androidx.test.espresso.matcher.ViewMatchers.assertThat
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.libanki.exception.ConfirmModSchemaException
import com.ichi2.anki.libanki.sched.Ease
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import org.hamcrest.Matchers.containsString
import org.hamcrest.Matchers.equalTo
import org.hamcrest.Matchers.hasItemInArray
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ package com.ichi2.anki.libanki
import androidx.test.ext.junit.runners.AndroidJUnit4
import anki.notes.NoteFieldsCheckResponse
import anki.notetypes.StockNotetype
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import com.ichi2.utils.createBasicNoteType
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ package com.ichi2.anki.libanki
import android.annotation.SuppressLint
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.libanki.Decks.Companion.CURRENT_DECK
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import net.ankiweb.rsdroid.exceptions.BackendDeckIsFilteredException
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.equalTo
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ import com.ichi2.anki.libanki.QueueType.Suspended
import com.ichi2.anki.libanki.exception.ConfirmModSchemaException
import com.ichi2.anki.libanki.sched.Ease
import com.ichi2.anki.libanki.sched.Scheduler
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.contains
Expand Down
2 changes: 1 addition & 1 deletion AnkiDroid/src/test/java/com/ichi2/anki/libanki/FlagTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,9 +17,9 @@ package com.ichi2.anki.libanki

import android.annotation.SuppressLint
import androidx.test.ext.junit.runners.AndroidJUnit4
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.anki.utils.ext.CardExt.setFlag
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import org.junit.Test
import org.junit.runner.RunWith
import kotlin.test.assertEquals
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ import anki.notetypes.copy
import com.ichi2.anki.backend.stripHTML
import com.ichi2.anki.common.utils.annotation.KotlinCleanup
import com.ichi2.anki.libanki.exception.ConfirmModSchemaException
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import org.hamcrest.MatcherAssert.assertThat
import org.hamcrest.Matchers.containsString
import org.hamcrest.Matchers.endsWith
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ import com.ichi2.anki.libanki.Consts.STARTING_FACTOR
import com.ichi2.anki.libanki.exception.ConfirmModSchemaException
import com.ichi2.anki.libanki.sched.Counts
import com.ichi2.anki.libanki.sched.Ease
import com.ichi2.anki.libanki.testutils.ext.addNote
import com.ichi2.testutils.JvmTest
import com.ichi2.testutils.ext.addNote
import org.hamcrest.CoreMatchers.equalTo
import org.hamcrest.MatcherAssert
import org.hamcrest.Matchers
Expand Down
7 changes: 7 additions & 0 deletions AnkiDroid/src/test/java/com/ichi2/testutils/JvmTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,13 @@ import androidx.annotation.CallSuper
import com.ichi2.anki.CollectionManager
import com.ichi2.anki.common.time.MockTime
import com.ichi2.anki.common.time.TimeManager
import com.ichi2.anki.ioDispatcher
import com.ichi2.anki.libanki.Collection
import com.ichi2.anki.libanki.Storage
import com.ichi2.anki.observability.ChangeManager
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.resetMain
Expand Down Expand Up @@ -120,6 +122,11 @@ open class JvmTest : TestClass {
println("""-- completed test "${testName.methodName}"""")
}

override fun setupTestDispatcher(dispatcher: TestDispatcher) {
super.setupTestDispatcher(dispatcher)
ioDispatcher = dispatcher
}

fun <T> assumeThat(
actual: T,
matcher: Matcher<T>?,
Expand Down
15 changes: 9 additions & 6 deletions AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,6 @@
package com.ichi2.testutils

import android.annotation.SuppressLint
import com.ichi2.anki.ioDispatcher
import com.ichi2.anki.isCollectionEmpty
import com.ichi2.anki.libanki.Card
import com.ichi2.anki.libanki.CardType
import com.ichi2.anki.libanki.Collection
Expand All @@ -31,9 +29,10 @@ import com.ichi2.anki.libanki.Notetypes
import com.ichi2.anki.libanki.QueueType
import com.ichi2.anki.libanki.exception.ConfirmModSchemaException
import com.ichi2.anki.libanki.testutils.TestCollectionManager
import com.ichi2.testutils.ext.addNote
import com.ichi2.anki.libanki.testutils.ext.addNote
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.UnconfinedTestDispatcher
import kotlinx.coroutines.test.setMain
Expand All @@ -45,7 +44,8 @@ import kotlin.time.Duration.Companion.milliseconds

/**
* marker interface for classes which contain tests and access the Anki collection
* @see AndroidTest
*
* Android (AnkiDroid/Robolectric) is not required for these tests to run
*/
interface TestClass {
val col: Collection
Expand Down Expand Up @@ -189,7 +189,7 @@ interface TestClass {
}
}

/** Ensures [isCollectionEmpty] returns `false` */
/** Ensures `DeckUtils.isCollectionEmpty` returns `false` */
fun ensureNonEmptyCollection() {
addNotes(1)
}
Expand Down Expand Up @@ -296,6 +296,9 @@ interface TestClass {
col.updateNote(this)
}

fun setupTestDispatcher(dispatcher: TestDispatcher) {
}

/** * A wrapper around the standard [kotlinx.coroutines.test.runTest] that
* takes care of updating the dispatcher used by CollectionManager as well.
* * An argument could be made for using [StandardTestDispatcher] and
Expand All @@ -320,7 +323,7 @@ interface TestClass {
) {
val dispatcher = UnconfinedTestDispatcher()
Dispatchers.setMain(dispatcher)
ioDispatcher = dispatcher
setupTestDispatcher(dispatcher)
repeat(times) {
if (times != 1) Timber.d("------ Executing test $it/$times ------")
kotlinx.coroutines.test.runTest(context, dispatchTimeoutMs.milliseconds) {
Expand Down
6 changes: 0 additions & 6 deletions AnkiDroid/src/test/java/com/ichi2/testutils/ext/Collection.kt
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,8 @@ package com.ichi2.testutils.ext
import androidx.appcompat.app.AppCompatDelegate
import com.ichi2.anki.CollectionManager
import com.ichi2.anki.libanki.Collection
import com.ichi2.anki.libanki.Note
import com.ichi2.utils.LanguageUtil

fun Collection.addNote(note: Note): Int {
addNote(note, note.notetype.did)
return note.numberOfCards(this)
}

/**
* Closes and reopens the backend using the provided [language], typically for
* [CollectionManager.TR] calls
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright (c) 2025 David Allison <davidallisongithub@gmail.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/

package com.ichi2.anki.libanki.testutils.ext

import com.ichi2.anki.libanki.Collection
import com.ichi2.anki.libanki.Note

fun Collection.addNote(note: Note): Int {
addNote(note, note.notetype.did)
return note.numberOfCards(this)
}