11/*
2- * Copyright 2024 Google LLC
2+ * Copyright 2025 Google LLC
33 *
44 * Licensed under the Apache License, Version 2.0 (the "License");
55 * you may not use this file except in compliance with the License.
1414 * limitations under the License.
1515 */
1616
17- package com.google.android.fhir.datacapture.views
17+ package com.google.android.fhir.datacapture.test. views
1818
19+ import android.text.format.DateFormat
1920import android.widget.FrameLayout
2021import android.widget.TextView
21- import androidx.appcompat.app.AppCompatActivity
22+ import androidx.compose.ui.test.assertTextEquals
23+ import androidx.compose.ui.test.junit4.createEmptyComposeRule
24+ import androidx.compose.ui.test.onNodeWithTag
25+ import androidx.test.ext.junit.rules.ActivityScenarioRule
26+ import androidx.test.ext.junit.runners.AndroidJUnit4
27+ import androidx.test.platform.app.InstrumentationRegistry
2228import com.google.android.fhir.datacapture.R
29+ import com.google.android.fhir.datacapture.test.TestActivity
2330import com.google.android.fhir.datacapture.validation.NotValidated
31+ import com.google.android.fhir.datacapture.views.QuestionnaireViewItem
32+ import com.google.android.fhir.datacapture.views.compose.TIME_PICKER_INPUT_FIELD
2433import com.google.android.fhir.datacapture.views.factories.QuestionnaireItemViewHolder
2534import com.google.android.fhir.datacapture.views.factories.TimePickerViewHolderFactory
2635import com.google.common.truth.Truth.assertThat
2736import org.hl7.fhir.r4.model.Questionnaire
2837import org.hl7.fhir.r4.model.QuestionnaireResponse
2938import org.hl7.fhir.r4.model.TimeType
39+ import org.junit.Before
40+ import org.junit.Rule
3041import org.junit.Test
3142import org.junit.runner.RunWith
32- import org.robolectric.Robolectric
33- import org.robolectric.RobolectricTestRunner
34- import org.robolectric.shadows.ShadowSettings
3543
36- @RunWith(RobolectricTestRunner ::class )
44+ @RunWith(AndroidJUnit4 ::class )
3745class TimePickerViewHolderFactoryTest {
38- private val context =
39- Robolectric .buildActivity(AppCompatActivity ::class .java).create().get().apply {
40- setTheme(com.google.android.material.R .style.Theme_Material3_DayNight )
41- }
42- private val parent = FrameLayout (context)
43- private val viewHolder = TimePickerViewHolderFactory .create(parent)
46+ @get:Rule
47+ val activityScenarioRule: ActivityScenarioRule <TestActivity > =
48+ ActivityScenarioRule (TestActivity ::class .java)
49+
50+ @get:Rule val composeTestRule = createEmptyComposeRule()
51+
52+ private lateinit var viewHolder: QuestionnaireItemViewHolder
53+ private lateinit var parent: FrameLayout
4454
45- private val QuestionnaireItemViewHolder .timeInputView: TextView
46- get() {
47- return itemView.findViewById(R .id.text_input_edit_text)
55+ @Before
56+ fun setUp () {
57+ activityScenarioRule.scenario.onActivity { activity ->
58+ parent = FrameLayout (activity)
59+ viewHolder = TimePickerViewHolderFactory .create(parent)
60+ activity.setContentView(viewHolder.itemView)
4861 }
4962
63+ InstrumentationRegistry .getInstrumentation().waitForIdleSync()
64+ }
65+
5066 @Test
5167 fun shouldSetQuestionHeader () {
5268 viewHolder.bind(
@@ -57,6 +73,8 @@ class TimePickerViewHolderFactoryTest {
5773 answersChangedCallback = { _, _, _, _ -> },
5874 ),
5975 )
76+ // Synchronize
77+ composeTestRule.waitForIdle()
6078
6179 assertThat(viewHolder.itemView.findViewById<TextView >(R .id.question).text.toString())
6280 .isEqualTo(" Question?" )
@@ -73,60 +91,56 @@ class TimePickerViewHolderFactoryTest {
7391 ),
7492 )
7593
76- assertThat(viewHolder.timeInputView.text.toString()).isEqualTo(" " )
94+ composeTestRule
95+ .onNodeWithTag(TIME_PICKER_INPUT_FIELD , useUnmergedTree = true )
96+ .assertTextEquals(" " )
7797 }
7898
7999 @Test
80- fun `should show AM time when set time format is 12 hrs` () {
81- ShadowSettings .set24HourTimeFormat(false )
82- viewHolder.bind(
83- QuestionnaireViewItem (
84- Questionnaire .QuestionnaireItemComponent ().apply { text = " Question?" },
85- QuestionnaireResponse .QuestionnaireResponseItemComponent ()
86- .addAnswer(
87- QuestionnaireResponse .QuestionnaireResponseItemAnswerComponent ()
88- .setValue(TimeType (" 10:10" )),
89- ),
90- validationResult = NotValidated ,
91- answersChangedCallback = { _, _, _, _ -> },
92- ),
93- )
94- assertThat(viewHolder.timeInputView.text.toString()).isEqualTo(" 10:10 AM" )
95- }
100+ fun shouldDisplayAMTimeInCorrectFormat_dependingOnSystemSettings () {
101+ val context = viewHolder.itemView.context
102+ val is24Hour = DateFormat .is24HourFormat(context)
96103
97- @Test
98- fun `should show PM time when set time format is 12 hrs` () {
99- ShadowSettings .set24HourTimeFormat(false )
100104 viewHolder.bind(
101105 QuestionnaireViewItem (
102106 Questionnaire .QuestionnaireItemComponent ().apply { text = " Question?" },
103107 QuestionnaireResponse .QuestionnaireResponseItemComponent ()
104108 .addAnswer(
105109 QuestionnaireResponse .QuestionnaireResponseItemAnswerComponent ()
106- .setValue(TimeType (" 22: 10:10" )),
110+ .setValue(TimeType (" 10:10:00 " )),
107111 ),
108112 validationResult = NotValidated ,
109113 answersChangedCallback = { _, _, _, _ -> },
110114 ),
111115 )
112- assertThat(viewHolder.timeInputView.text.toString()).isEqualTo(" 10:10 PM" )
116+
117+ val expectedTime = if (is24Hour) " 10:10" else " 10:10 AM"
118+ composeTestRule
119+ .onNodeWithTag(TIME_PICKER_INPUT_FIELD , useUnmergedTree = true )
120+ .assertTextEquals(expectedTime)
113121 }
114122
115123 @Test
116- fun `should show time when set time format is 24 hrs` () {
117- ShadowSettings .set24HourTimeFormat(true )
124+ fun shouldDisplayPMTimeInCorrectFormat_dependingOnSystemSettings () {
125+ val context = viewHolder.itemView.context
126+ val is24Hour = DateFormat .is24HourFormat(context)
127+
118128 viewHolder.bind(
119129 QuestionnaireViewItem (
120130 Questionnaire .QuestionnaireItemComponent ().apply { text = " Question?" },
121131 QuestionnaireResponse .QuestionnaireResponseItemComponent ()
122132 .addAnswer(
123133 QuestionnaireResponse .QuestionnaireResponseItemAnswerComponent ()
124- .setValue(TimeType (" 22:10" )),
134+ .setValue(TimeType (" 22:10:00 " )),
125135 ),
126136 validationResult = NotValidated ,
127137 answersChangedCallback = { _, _, _, _ -> },
128138 ),
129139 )
130- assertThat(viewHolder.timeInputView.text.toString()).isEqualTo(" 22:10" )
140+
141+ val expectedTime = if (is24Hour) " 22:10" else " 10:10 PM"
142+ composeTestRule
143+ .onNodeWithTag(TIME_PICKER_INPUT_FIELD , useUnmergedTree = true )
144+ .assertTextEquals(expectedTime)
131145 }
132146}
0 commit comments