Skip to content

Commit

Permalink
Convert DeviceInfoModuleTest to Kotlin (#37805)
Browse files Browse the repository at this point in the history
Summary:
This PR converts DeviceInfoModuleTest into Kotlin as requested in #37708.

## Changelog:

[INTERNAL] [CHANGED] - Convert DeviceInfoModuleTest to Kotlin

Pull Request resolved: #37805

Test Plan:
1. Run `./gradlew :packages:react-native:ReactAndroid:test`.
2. All tests should pass.

Reviewed By: cortinico

Differential Revision: D46614375

Pulled By: rshest

fbshipit-source-id: 3fc390069628e3ce188121f3e775b28e88875af8
  • Loading branch information
okwasniewski authored and facebook-github-bot committed Jun 12, 2023
1 parent 03f70bf commit ef5d92f
Show file tree
Hide file tree
Showing 2 changed files with 138 additions and 163 deletions.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,138 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

package com.facebook.react.modules.deviceinfo

import com.facebook.react.bridge.Arguments
import com.facebook.react.bridge.JavaOnlyMap
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContext
import com.facebook.react.bridge.ReactTestHelper
import com.facebook.react.bridge.WritableMap
import com.facebook.react.uimanager.DisplayMetricsHolder
import junit.framework.TestCase
import org.assertj.core.api.Assertions
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentCaptor
import org.mockito.ArgumentMatchers
import org.mockito.Mockito.*
import org.powermock.api.mockito.PowerMockito
import org.powermock.api.mockito.PowerMockito.`when` as whenever
import org.powermock.core.classloader.annotations.PowerMockIgnore
import org.powermock.core.classloader.annotations.PrepareForTest
import org.powermock.modules.junit4.rule.PowerMockRule
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment

@RunWith(RobolectricTestRunner::class)
@PrepareForTest(Arguments::class, DisplayMetricsHolder::class)
@PowerMockIgnore("org.mockito.*", "org.robolectric.*", "androidx.*", "android.*")
class DeviceInfoModuleTest : TestCase() {
@get:Rule var rule = PowerMockRule()

private lateinit var deviceInfoModule: DeviceInfoModule
private lateinit var fakePortraitDisplayMetrics: WritableMap
private lateinit var fakeLandscapeDisplayMetrics: WritableMap
private lateinit var reactContext: ReactApplicationContext

@Before
public override fun setUp() {
initTestData()
PowerMockito.mockStatic(DisplayMetricsHolder::class.java)
reactContext = spy(ReactApplicationContext(RuntimeEnvironment.application))
val catalystInstanceMock = ReactTestHelper.createMockCatalystInstance()
reactContext.initializeWithInstance(catalystInstanceMock)
deviceInfoModule = DeviceInfoModule(reactContext)
}

@After
fun teardown() {
DisplayMetricsHolder.setWindowDisplayMetrics(null)
DisplayMetricsHolder.setScreenDisplayMetrics(null)
}

@Test
fun test_itDoesNotEmitAnEvent_whenDisplayMetricsNotChanged() {
givenDisplayMetricsHolderContains(fakePortraitDisplayMetrics)
deviceInfoModule.typedExportedConstants
deviceInfoModule.emitUpdateDimensionsEvent()
verify(reactContext, times(0))
?.emitDeviceEvent(ArgumentMatchers.anyString(), ArgumentMatchers.any())
}

@Test
fun test_itEmitsOneEvent_whenDisplayMetricsChangedOnce() {
givenDisplayMetricsHolderContains(fakePortraitDisplayMetrics)
deviceInfoModule.typedExportedConstants
givenDisplayMetricsHolderContains(fakeLandscapeDisplayMetrics)
deviceInfoModule.emitUpdateDimensionsEvent()
verifyUpdateDimensionsEventsEmitted(reactContext, fakeLandscapeDisplayMetrics)
}

@Test
fun test_itEmitsJustOneEvent_whenUpdateRequestedMultipleTimes() {
givenDisplayMetricsHolderContains(fakePortraitDisplayMetrics)
deviceInfoModule.typedExportedConstants
givenDisplayMetricsHolderContains(fakeLandscapeDisplayMetrics)
deviceInfoModule.emitUpdateDimensionsEvent()
deviceInfoModule.emitUpdateDimensionsEvent()
verifyUpdateDimensionsEventsEmitted(reactContext, fakeLandscapeDisplayMetrics)
}

@Test
fun test_itEmitsMultipleEvents_whenDisplayMetricsChangedBetweenUpdates() {
givenDisplayMetricsHolderContains(fakePortraitDisplayMetrics)
deviceInfoModule.typedExportedConstants
deviceInfoModule.emitUpdateDimensionsEvent()
givenDisplayMetricsHolderContains(fakeLandscapeDisplayMetrics)
deviceInfoModule.emitUpdateDimensionsEvent()
givenDisplayMetricsHolderContains(fakePortraitDisplayMetrics)
deviceInfoModule.emitUpdateDimensionsEvent()
givenDisplayMetricsHolderContains(fakeLandscapeDisplayMetrics)
deviceInfoModule.emitUpdateDimensionsEvent()
verifyUpdateDimensionsEventsEmitted(
reactContext,
fakeLandscapeDisplayMetrics,
fakePortraitDisplayMetrics,
fakeLandscapeDisplayMetrics)
}

private fun initTestData() {
PowerMockito.mockStatic(Arguments::class.java)
whenever(Arguments.createMap()).thenAnswer { JavaOnlyMap() }
fakePortraitDisplayMetrics = Arguments.createMap()
fakePortraitDisplayMetrics.putInt("width", 100)
fakePortraitDisplayMetrics.putInt("height", 200)
fakeLandscapeDisplayMetrics = Arguments.createMap()
fakeLandscapeDisplayMetrics.putInt("width", 200)
fakeLandscapeDisplayMetrics.putInt("height", 100)
}

companion object {
private fun givenDisplayMetricsHolderContains(fakeDisplayMetrics: WritableMap?) {
whenever(DisplayMetricsHolder.getDisplayMetricsWritableMap(1.0)).thenAnswer {
fakeDisplayMetrics
}
}

private fun verifyUpdateDimensionsEventsEmitted(
context: ReactContext?,
vararg expectedEvents: WritableMap
) {
val expectedEventList = listOf(*expectedEvents)
val captor = ArgumentCaptor.forClass(WritableMap::class.java)
verify(context, times(expectedEventList.size))
?.emitDeviceEvent(ArgumentMatchers.eq("didUpdateDimensions"), captor.capture())
val actualEvents = captor.allValues
Assertions.assertThat(actualEvents).isEqualTo(expectedEventList)
}
}
}

0 comments on commit ef5d92f

Please sign in to comment.