99
1010package com.facebook.react.modules.deviceinfo
1111
12+ import android.util.DisplayMetrics
1213import com.facebook.react.bridge.BridgeReactContext
1314import com.facebook.react.bridge.JavaOnlyMap
1415import com.facebook.react.bridge.ReactContext
1516import com.facebook.react.bridge.ReactTestHelper
1617import com.facebook.react.bridge.WritableMap
1718import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
1819import com.facebook.react.uimanager.DisplayMetricsHolder
20+ import com.facebook.testutils.shadows.ShadowNativeLoader
21+ import com.facebook.testutils.shadows.ShadowNativeMap
22+ import com.facebook.testutils.shadows.ShadowReadableNativeMap
23+ import com.facebook.testutils.shadows.ShadowSoLoader
24+ import com.facebook.testutils.shadows.ShadowWritableNativeMap
1925import junit.framework.TestCase
20- import org.assertj.core.api.Assertions
26+ import org.assertj.core.api.Assertions.assertThat
2127import org.junit.After
2228import org.junit.Before
2329import org.junit.Test
@@ -26,13 +32,26 @@ import org.mockito.ArgumentCaptor
2632import org.mockito.ArgumentMatchers
2733import org.mockito.MockedStatic
2834import org.mockito.Mockito.mockStatic
35+ import org.mockito.kotlin.doReturn
2936import org.mockito.kotlin.spy
3037import org.mockito.kotlin.times
3138import org.mockito.kotlin.verify
39+ import org.mockito.kotlin.whenever
3240import org.robolectric.RobolectricTestRunner
3341import org.robolectric.RuntimeEnvironment
42+ import org.robolectric.annotation.Config
3443
3544@RunWith(RobolectricTestRunner ::class )
45+ @Config(
46+ shadows =
47+ [
48+ ShadowSoLoader ::class ,
49+ ShadowNativeLoader ::class ,
50+ ShadowNativeMap ::class ,
51+ ShadowWritableNativeMap ::class ,
52+ ShadowReadableNativeMap ::class ,
53+ ]
54+ )
3655class DeviceInfoModuleTest : TestCase () {
3756
3857 private lateinit var deviceInfoModule: DeviceInfoModule
@@ -55,7 +74,7 @@ class DeviceInfoModuleTest : TestCase() {
5574 reactContext = spy(BridgeReactContext (RuntimeEnvironment .getApplication()))
5675 val catalystInstanceMock = ReactTestHelper .createMockCatalystInstance()
5776 reactContext.initializeWithInstance(catalystInstanceMock)
58- deviceInfoModule = DeviceInfoModule (reactContext)
77+ deviceInfoModule = spy( DeviceInfoModule (reactContext) )
5978 }
6079
6180 @After
@@ -110,10 +129,29 @@ class DeviceInfoModuleTest : TestCase() {
110129 )
111130 }
112131
113- private fun givenDisplayMetricsHolderContains (fakeDisplayMetrics : WritableMap ? ) {
132+ @Test
133+ fun getDisplayMetricsWritableMap_returnsCorrectMap () {
114134 displayMetricsHolder
115- .`when `<WritableMap > { DisplayMetricsHolder .getDisplayMetricsWritableMap(1.0 ) }
116- .thenAnswer { fakeDisplayMetrics }
135+ .`when `<DisplayMetrics > { DisplayMetricsHolder .getScreenDisplayMetrics() }
136+ .thenAnswer { reactContext.resources.displayMetrics }
137+
138+ // Use the official initialization method to ensure both metrics are set
139+ val map: WritableMap = deviceInfoModule.getDisplayMetricsWritableMap()
140+ assertThat(map.hasKey(" windowPhysicalPixels" )).isTrue()
141+ assertThat(map.hasKey(" screenPhysicalPixels" )).isTrue()
142+ val windowMap = map.getMap(" windowPhysicalPixels" )
143+ val screenMap = map.getMap(" screenPhysicalPixels" )
144+ checkNotNull(windowMap)
145+ checkNotNull(screenMap)
146+ assertThat(windowMap.hasKey(" width" )).isTrue()
147+ assertThat(windowMap.hasKey(" height" )).isTrue()
148+ assertThat(windowMap.hasKey(" scale" )).isTrue()
149+ assertThat(windowMap.hasKey(" fontScale" )).isTrue()
150+ assertThat(windowMap.hasKey(" densityDpi" )).isTrue()
151+ }
152+
153+ private fun givenDisplayMetricsHolderContains (fakeDisplayMetrics : WritableMap ? ) {
154+ doReturn(fakeDisplayMetrics).whenever(deviceInfoModule).getDisplayMetricsWritableMap()
117155 }
118156
119157 companion object {
@@ -126,7 +164,7 @@ class DeviceInfoModuleTest : TestCase() {
126164 verify(context, times(expectedEventList.size))
127165 ?.emitDeviceEvent(ArgumentMatchers .eq(" didUpdateDimensions" ), captor.capture())
128166 val actualEvents = captor.allValues
129- Assertions . assertThat(actualEvents).isEqualTo(expectedEventList)
167+ assertThat(actualEvents).isEqualTo(expectedEventList)
130168 }
131169 }
132170}
0 commit comments