Skip to content

Commit 5603ce4

Browse files
authored
Merge pull request #467 from AppDevNext/ComposeSample
Compose sample
2 parents 3728e6e + 98f5f98 commit 5603ce4

14 files changed

+619
-7
lines changed

app/src/androidTest/kotlin/info/appdev/chartexample/StartTest.kt

Lines changed: 93 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.graphics.Bitmap
44
import androidx.compose.ui.test.assertIsDisplayed
55
import androidx.compose.ui.test.junit4.createEmptyComposeRule
66
import androidx.compose.ui.test.onNodeWithTag
7-
import androidx.compose.ui.test.onNodeWithText
87
import androidx.compose.ui.test.performClick
98
import androidx.compose.ui.test.performScrollToIndex
109
import androidx.test.core.graphics.writeToTestStorage
@@ -20,7 +19,9 @@ import androidx.test.espresso.matcher.ViewMatchers.withText
2019
import androidx.test.ext.junit.rules.activityScenarioRule
2120
import androidx.test.ext.junit.runners.AndroidJUnit4
2221
import androidx.test.platform.app.InstrumentationRegistry.getInstrumentation
22+
import info.appdev.chartexample.notimportant.DemoBase
2323
import info.appdev.chartexample.notimportant.DemoBase.Companion.optionMenus
24+
import info.appdev.chartexample.notimportant.DemoBaseCompose
2425
import info.appdev.chartexample.notimportant.MainActivity
2526
import info.hannes.timber.DebugFormatTree
2627
import org.junit.After
@@ -103,11 +104,97 @@ class StartTest {
103104
onView(ViewMatchers.isRoot())
104105
.perform(captureToBitmap { bitmap: Bitmap -> bitmap.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-${index}-${it.simpleName}-${contentItem.name}-1SampleClick") })
105106

106-
optionMenu = ""
107-
optionMenus.filter { plain -> Character.isDigit(plain.first()) }.forEach { filteredTitle ->
108-
optionMenu = "$index->$filteredTitle"
109-
openActionBarOverflowOrOptionsMenu(getInstrumentation().targetContext)
110-
screenshotOfOptionMenu("${javaClass.simpleName}_${nameRule.methodName}-${index}-${it.simpleName}-${contentItem.name}", filteredTitle)
107+
// Test option menus based on activity type
108+
if (DemoBase::class.java.isAssignableFrom(it)) {
109+
// Test traditional ActionBar menu for DemoBase activities
110+
optionMenu = ""
111+
optionMenus.filter { plain -> plain.isNotEmpty() && Character.isDigit(plain.first()) }.forEach { filteredTitle ->
112+
optionMenu = "$index->$filteredTitle"
113+
Timber.d("optionMenu=$optionMenu")
114+
openActionBarOverflowOrOptionsMenu(getInstrumentation().targetContext)
115+
Timber.d("screenshot optionMenu=$optionMenu")
116+
screenshotOfOptionMenu("${javaClass.simpleName}_${nameRule.methodName}-${index}-${it.simpleName}-${contentItem.name}", filteredTitle)
117+
}
118+
} else if (DemoBaseCompose::class.java.isAssignableFrom(it)) {
119+
// Test Compose dropdown menu for DemoBaseCompose activities
120+
Timber.d("Testing Compose menu for: ${it.simpleName}")
121+
optionMenu = ""
122+
123+
try {
124+
// Click the menu button to open dropdown
125+
composeTestRule
126+
.onNodeWithTag("menuButton")
127+
.assertIsDisplayed()
128+
.performClick()
129+
composeTestRule.waitForIdle()
130+
Thread.sleep(100) // Wait for dropdown to appear
131+
132+
// Define menu items to test (those starting with numbers in traditional menus)
133+
val composeMenuItems = listOf(
134+
"Toggle Values",
135+
"Toggle Icons",
136+
"Toggle Highlight",
137+
"Toggle Pinch Zoom",
138+
"Toggle Auto Scale MinMax",
139+
"Toggle Bar Borders",
140+
// "Animate X",
141+
// "Animate Y",
142+
// "Animate XY",
143+
// "Save to Gallery"
144+
)
145+
146+
composeMenuItems.forEach { menuTitle ->
147+
try {
148+
optionMenu = "$index->$menuTitle"
149+
Timber.d("Testing Compose menu item: $optionMenu")
150+
151+
// Click the menu item
152+
composeTestRule
153+
.onNodeWithTag("menuItem_$menuTitle")
154+
.performClick()
155+
composeTestRule.waitForIdle()
156+
Thread.sleep(150) // Wait for action to complete
157+
onView(ViewMatchers.isRoot())
158+
.perform(captureToBitmap { bitmap: Bitmap ->
159+
bitmap.writeToTestStorage("${javaClass.simpleName}_${nameRule.methodName}-${index}-${it.simpleName}-${contentItem.name}-${menuTitle
160+
.replace(" ","")
161+
}")
162+
})
163+
164+
// Reopen menu for next item
165+
composeTestRule
166+
.onNodeWithTag("menuButton")
167+
.performClick()
168+
composeTestRule.waitForIdle()
169+
Thread.sleep(100)
170+
} catch (e: Exception) {
171+
Timber.w("Could not test menu item '$menuTitle': ${e.message}")
172+
// Try to reopen menu if it closed unexpectedly
173+
try {
174+
composeTestRule
175+
.onNodeWithTag("menuButton")
176+
.performClick()
177+
composeTestRule.waitForIdle()
178+
} catch (_: Exception) {
179+
// Menu button might not be available
180+
}
181+
}
182+
}
183+
184+
// Close the menu before going back
185+
try {
186+
// Click outside to close menu or press back
187+
Espresso.pressBack()
188+
composeTestRule.waitForIdle()
189+
} catch (_: Exception) {
190+
// Menu might already be closed
191+
}
192+
193+
} catch (e: Exception) {
194+
Timber.e("Error testing Compose menu: ${e.message}", e)
195+
}
196+
} else {
197+
Timber.d("Unknown activity type: ${it.simpleName}")
111198
}
112199

113200
//Thread.sleep(100)

app/src/main/AndroidManifest.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,8 @@
2222
<activity android:name="info.appdev.chartexample.LineChartDualAxisActivity" />
2323
<activity android:name="info.appdev.chartexample.LineChartTimeActivity" />
2424
<activity android:name="info.appdev.chartexample.BarChartActivity" />
25-
<activity android:name="info.appdev.chartexample.HorizontalBarChartActivity" />
25+
<activity android:name="info.appdev.chartexample.HorizontalBarChartActivity" />
26+
<activity android:name="info.appdev.chartexample.compose.HorizontalBarComposeActivity" />
2627
<activity android:name="info.appdev.chartexample.HorizontalBarNegativeChartActivity" />
2728
<activity android:name="info.appdev.chartexample.PieChartActivity" />
2829
<activity android:name="info.appdev.chartexample.PieChartRoundedActivity" />

0 commit comments

Comments
 (0)