Skip to content

Commit 40a7c9f

Browse files
david-allisonBrayanDSO
authored andcommitted
refactor(test): remove 'undoableOp' from 'TestClass'
in order to split out `TestClass` to libanki:testutils
1 parent c199774 commit 40a7c9f

File tree

4 files changed

+52
-21
lines changed

4 files changed

+52
-21
lines changed

AnkiDroid/src/test/java/com/ichi2/anki/DeckPickerTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ import com.ichi2.testutils.BackupManagerTestUtilities
3636
import com.ichi2.testutils.DbUtils
3737
import com.ichi2.testutils.common.Flaky
3838
import com.ichi2.testutils.common.OS
39+
import com.ichi2.testutils.ext.addBasicNoteWithOp
3940
import com.ichi2.testutils.ext.menu
4041
import com.ichi2.testutils.grantWritePermissions
4142
import com.ichi2.testutils.revokeWritePermissions

AnkiDroid/src/test/java/com/ichi2/anki/RobolectricTest.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
package com.ichi2.anki
1818

1919
import android.Manifest
20+
import android.annotation.SuppressLint
2021
import android.app.Application
2122
import android.content.Context
2223
import android.content.Intent
@@ -32,15 +33,21 @@ import androidx.test.core.app.ApplicationProvider
3233
import androidx.work.Configuration
3334
import androidx.work.testing.SynchronousExecutor
3435
import androidx.work.testing.WorkManagerTestInitHelper
36+
import anki.collection.OpChanges
3537
import com.ichi2.anki.CollectionManager.CollectionOpenFailure
38+
import com.ichi2.anki.RobolectricTest.Companion.advanceRobolectricLooper
39+
import com.ichi2.anki.RobolectricTest.Companion.advanceRobolectricLooperWithSleep
40+
import com.ichi2.anki.common.annotations.UseContextParameter
3641
import com.ichi2.anki.common.time.MockTime
3742
import com.ichi2.anki.common.time.TimeManager
3843
import com.ichi2.anki.dialogs.DialogHandler
3944
import com.ichi2.anki.libanki.Card
4045
import com.ichi2.anki.libanki.Collection
46+
import com.ichi2.anki.libanki.Note
4147
import com.ichi2.anki.libanki.NotetypeJson
4248
import com.ichi2.anki.libanki.Storage
4349
import com.ichi2.anki.observability.ChangeManager
50+
import com.ichi2.anki.observability.undoableOp
4451
import com.ichi2.anki.preferences.sharedPrefs
4552
import com.ichi2.compat.customtabs.CustomTabActivityHelper
4653
import com.ichi2.testutils.AndroidTest
@@ -476,6 +483,15 @@ open class RobolectricTest :
476483
}
477484
}
478485

486+
/** Helper method to update a note */
487+
@SuppressLint("CheckResult")
488+
@UseContextParameter("TestClass")
489+
suspend fun Note.updateOp(block: Note.() -> Unit): Note =
490+
this.also { note ->
491+
block(note)
492+
undoableOp<OpChanges> { col.updateNote(note) }
493+
}
494+
479495
private fun maybeSetupBackend() {
480496
try {
481497
targetContext

AnkiDroid/src/test/java/com/ichi2/testutils/TestClass.kt

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
package com.ichi2.testutils
1818

1919
import android.annotation.SuppressLint
20-
import anki.collection.OpChanges
2120
import com.ichi2.anki.CollectionManager
2221
import com.ichi2.anki.ioDispatcher
2322
import com.ichi2.anki.isCollectionEmpty
@@ -32,7 +31,6 @@ import com.ichi2.anki.libanki.NotetypeJson
3231
import com.ichi2.anki.libanki.Notetypes
3332
import com.ichi2.anki.libanki.QueueType
3433
import com.ichi2.anki.libanki.exception.ConfirmModSchemaException
35-
import com.ichi2.anki.observability.undoableOp
3634
import com.ichi2.testutils.ext.addNote
3735
import kotlinx.coroutines.Dispatchers
3836
import kotlinx.coroutines.test.StandardTestDispatcher
@@ -106,17 +104,6 @@ interface TestClass {
106104
return n
107105
}
108106

109-
suspend fun addBasicNoteWithOp(
110-
fields: List<String> = listOf("foo", "bar"),
111-
noteType: NotetypeJson = col.notetypes.byName("Basic")!!,
112-
): Note =
113-
col.newNote(noteType).also { note ->
114-
for ((i, field) in fields.withIndex()) {
115-
note.setField(i, field)
116-
}
117-
undoableOp<OpChanges> { col.addNote(note, Consts.DEFAULT_DECK_ID) }
118-
}
119-
120107
/**
121108
* Create a new note type in the collection.
122109
* @param name the name of the note type
@@ -245,14 +232,6 @@ interface TestClass {
245232
return this
246233
}
247234

248-
/** Helper method to update a note */
249-
@SuppressLint("CheckResult")
250-
suspend fun Note.updateOp(block: Note.() -> Unit): Note =
251-
this.also { note ->
252-
block(note)
253-
undoableOp<OpChanges> { col.updateNote(note) }
254-
}
255-
256235
/** Helper method to all cards of a note */
257236
fun Note.updateCards(update: Card.() -> Unit): Note {
258237
cards().forEach { it.update(update) }
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
/*
2+
* Copyright (c) 2025 David Allison <davidallisongithub@gmail.com>
3+
*
4+
* This program is free software; you can redistribute it and/or modify it under
5+
* the terms of the GNU General Public License as published by the Free Software
6+
* Foundation; either version 3 of the License, or (at your option) any later
7+
* version.
8+
*
9+
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
10+
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
11+
* PARTICULAR PURPOSE. See the GNU General Public License for more details.
12+
*
13+
* You should have received a copy of the GNU General Public License along with
14+
* this program. If not, see <http://www.gnu.org/licenses/>.
15+
*/
16+
17+
package com.ichi2.testutils.ext
18+
19+
import anki.collection.OpChanges
20+
import com.ichi2.anki.libanki.Consts
21+
import com.ichi2.anki.libanki.Note
22+
import com.ichi2.anki.libanki.NotetypeJson
23+
import com.ichi2.anki.observability.undoableOp
24+
import com.ichi2.testutils.TestClass
25+
26+
suspend fun TestClass.addBasicNoteWithOp(
27+
fields: List<String> = listOf("foo", "bar"),
28+
noteType: NotetypeJson = col.notetypes.byName("Basic")!!,
29+
): Note =
30+
col.newNote(noteType).also { note ->
31+
for ((i, field) in fields.withIndex()) {
32+
note.setField(i, field)
33+
}
34+
undoableOp<OpChanges> { col.addNote(note, Consts.DEFAULT_DECK_ID) }
35+
}

0 commit comments

Comments
 (0)