Skip to content

Commit a677a8a

Browse files
committed
test: fix ActivityScenario memory leaks
Issue 21168 Assisted-by: Claude Opus 4.8 - all
1 parent 8b1cc60 commit a677a8a

6 files changed

Lines changed: 42 additions & 34 deletions

File tree

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ class CardTemplateEditorTest : RobolectricTest() {
485485
.start()
486486
.resume()
487487
.visible()
488+
saveControllerForCleanup(templateEditorController)
488489
testEditor = templateEditorController.get()
489490
shadowTestEditor = shadowOf(testEditor)
490491
assertFalse("Note type should not have changed yet", testEditor.noteTypeHasChanged())

AnkiDroid/src/test/java/com/ichi2/anki/pages/StatisticsTest.kt

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -42,13 +42,15 @@ class StatisticsTest : RobolectricTest() {
4242
@Test
4343
fun `shows 'Default' deck when collection is empty`() =
4444
runTest {
45-
ActivityScenario.launch<SingleFragmentActivity>(
46-
StatisticsDestination().toIntent(
47-
targetContext,
48-
),
49-
)
50-
advanceUntilIdle()
51-
onView(withText("Default")).check(matches(isDisplayed()))
45+
ActivityScenario
46+
.launch<SingleFragmentActivity>(
47+
StatisticsDestination().toIntent(
48+
targetContext,
49+
),
50+
).use {
51+
advanceUntilIdle()
52+
onView(withText("Default")).check(matches(isDisplayed()))
53+
}
5254
}
5355

5456
@Test
@@ -59,19 +61,21 @@ class StatisticsTest : RobolectricTest() {
5961
val testDeck1 = addDeck(testDeckName1)
6062
withCol { decks.select(testDeck1) }
6163
addDeck(testDeckName2)
62-
ActivityScenario.launch<SingleFragmentActivity>(
63-
StatisticsDestination().toIntent(
64-
targetContext,
65-
),
66-
)
67-
advanceUntilIdle()
68-
onView(withId(R.id.deck_name)).check(matches(withText(testDeckName1)))
69-
onView(withId(R.id.deck_name)).perform(click())
70-
advanceUntilIdle()
71-
// select test deck 2
72-
onView(withText(testDeckName2)).inRoot(isDialog()).perform(click())
73-
// check the activity that it has the new deck name
74-
onView(withId(R.id.deck_name)).check(matches(withText(testDeckName2)))
64+
ActivityScenario
65+
.launch<SingleFragmentActivity>(
66+
StatisticsDestination().toIntent(
67+
targetContext,
68+
),
69+
).use {
70+
advanceUntilIdle()
71+
onView(withId(R.id.deck_name)).check(matches(withText(testDeckName1)))
72+
onView(withId(R.id.deck_name)).perform(click())
73+
advanceUntilIdle()
74+
// select test deck 2
75+
onView(withText(testDeckName2)).inRoot(isDialog()).perform(click())
76+
// check the activity that it has the new deck name
77+
onView(withId(R.id.deck_name)).check(matches(withText(testDeckName2)))
78+
}
7579
}
7680

7781
@Test
@@ -93,6 +97,6 @@ class StatisticsTest : RobolectricTest() {
9397
assertFalse(deckSelectionDialog.requireArguments().getBoolean(DeckSelectionDialog.ARG_ALLOW_ALL, true))
9498
assertFalse(deckSelectionDialog.requireArguments().getBoolean(DeckSelectionDialog.ARG_ALLOW_FILTERED, true))
9599
assertTrue(deckSelectionDialog.requireArguments().getBoolean(DeckSelectionDialog.ARG_SKIP_EMPTY_DEFAULT, false))
96-
}
100+
}.close()
97101
}
98102
}

AnkiDroid/src/test/java/com/ichi2/anki/preferences/PreferencesTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ class PreferencesTest : RobolectricTest() {
8080
/** checks if any of the Preferences fragments throws while being created */
8181
@Test
8282
fun fragmentsDoNotThrowOnCreation() {
83-
val activityScenario = ActivityScenario.launch<PreferencesActivity>(PreferencesActivity.getIntent(targetContext))
84-
85-
activityScenario.onActivity { activity ->
86-
PreferenceTestUtils.getAllPreferencesFragments(activity).forEach {
87-
activity.supportFragmentManager.commitNow {
88-
add(R.id.settings_container, it)
83+
ActivityScenario.launch<PreferencesActivity>(PreferencesActivity.getIntent(targetContext)).use { activityScenario ->
84+
activityScenario.onActivity { activity ->
85+
PreferenceTestUtils.getAllPreferencesFragments(activity).forEach {
86+
activity.supportFragmentManager.commitNow {
87+
add(R.id.settings_container, it)
88+
}
8989
}
9090
}
9191
}

AnkiDroid/src/test/java/com/ichi2/anki/preferences/PrefsSearchBarTest.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,13 @@ class PrefsSearchBarTest : RobolectricTest() {
8888

8989
private fun getPreferencesActivity(): PreferencesActivity {
9090
val intent = PreferencesActivity.getIntent(targetContext)
91-
return Robolectric
92-
.buildActivity(PreferencesActivity::class.java, intent)
93-
.create()
94-
.start()
95-
.resume()
96-
.get()
91+
val controller =
92+
Robolectric
93+
.buildActivity(PreferencesActivity::class.java, intent)
94+
.create()
95+
.start()
96+
.resume()
97+
saveControllerForCleanup(controller)
98+
return controller.get()
9799
}
98100
}

AnkiDroid/src/test/java/com/ichi2/anki/ui/windows/reviewer/ReviewerBigScreenTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,6 @@ class ReviewerBigScreenTest : RobolectricTest() {
3030
fun `sw600dp layout is initialized`() {
3131
ensureCollectionLoadIsSynchronous()
3232
val intent = ReviewerFragment.getIntent(targetContext)
33-
ActivityScenario.launch<CardViewerActivity>(intent)
33+
ActivityScenario.launch<CardViewerActivity>(intent).close()
3434
}
3535
}

AnkiDroid/src/test/java/com/ichi2/anki/utils/ext/StateFlowLifecycleCollectionTest.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ class StateFlowLifecycleCollectionTest : RobolectricTest() {
3636
@Test
3737
fun `concurrent value change does not skip UI update`() {
3838
val controller = Robolectric.buildActivity(AnkiActivity::class.java, Intent())
39+
saveControllerForCleanup(controller)
3940
val flow = MutableStateFlow(0)
4041
val concurrentFlow =
4142
ConcurrentStateFlow(flow) { emitted ->

0 commit comments

Comments
 (0)