Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ package com.facebook.react.views.image

import android.graphics.Color
import android.util.DisplayMetrics
import com.facebook.common.logging.FLog
import com.facebook.drawee.backends.pipeline.Fresco
import com.facebook.drawee.drawable.ScalingUtils
import com.facebook.react.bridge.Arguments
Expand All @@ -19,11 +20,16 @@ import com.facebook.react.bridge.JavaOnlyMap
import com.facebook.react.bridge.ReactTestHelper.createMockCatalystInstance
import com.facebook.react.bridge.WritableArray
import com.facebook.react.bridge.WritableMap
import com.facebook.react.common.ReactConstants
import com.facebook.react.internal.featureflags.ReactNativeFeatureFlagsForTests
import com.facebook.react.uimanager.DisplayMetricsHolder
import com.facebook.react.uimanager.ReactStylesDiffMap
import com.facebook.react.uimanager.ThemedReactContext
import com.facebook.react.util.RNLog
import com.facebook.react.views.image.ImageResizeMethod
import com.facebook.react.views.image.ImageResizeMode
import com.facebook.react.views.image.ReactImageView
import com.facebook.react.views.image.ScaleTypeStartInside
import com.facebook.react.views.imagehelper.ImageSource
import com.facebook.soloader.SoLoader
import org.assertj.core.api.Assertions.assertThat
Expand All @@ -34,7 +40,11 @@ import org.junit.runner.RunWith
import org.mockito.MockedStatic
import org.mockito.Mockito.any
import org.mockito.Mockito.anyString
import org.mockito.Mockito.mock
import org.mockito.Mockito.mockStatic
import org.mockito.Mockito.never
import org.mockito.Mockito.reset
import org.mockito.Mockito.verify
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment

Expand All @@ -47,6 +57,7 @@ class ReactImagePropertyTest {
private lateinit var themeContext: ThemedReactContext
private lateinit var arguments: MockedStatic<Arguments>
private lateinit var rnLog: MockedStatic<RNLog>
private lateinit var flogMock: MockedStatic<FLog>

@Before
fun setup() {
Expand All @@ -57,6 +68,8 @@ class ReactImagePropertyTest {
rnLog = mockStatic(RNLog::class.java)
rnLog.`when`<Boolean> { RNLog.w(any(), anyString()) }.thenAnswer {}

flogMock = mockStatic(FLog::class.java)

SoLoader.setInTestMode()
context = BridgeReactContext(RuntimeEnvironment.getApplication())
catalystInstanceMock = createMockCatalystInstance()
Expand All @@ -73,6 +86,7 @@ class ReactImagePropertyTest {
DisplayMetricsHolder.setWindowDisplayMetrics(null)
arguments.close()
rnLog.close()
flogMock.close()
}

private fun buildStyles(vararg keysAndValues: Any?): ReactStylesDiffMap {
Expand All @@ -87,6 +101,20 @@ class ReactImagePropertyTest {
assertThat(view.isFocusable).isTrue()
}

@Test
fun testOverlayColor() {
val viewManager = ReactImageManager()
val mockView = mock(ReactImageView::class.java)

viewManager.setOverlayColor(mockView, null)
verify(mockView).setOverlayColor(Color.TRANSPARENT)
reset(mockView)

viewManager.setOverlayColor(mockView, Color.argb(50, 0, 0, 255))
verify(mockView).setOverlayColor(Color.argb(50, 0, 0, 255))
reset(mockView)
}

@Test
fun testTintColor() {
val viewManager = ReactImageManager()
Expand All @@ -113,6 +141,97 @@ class ReactImagePropertyTest {
viewManager.setSource(view, sources)
view.maybeUpdateView()
assertThat(ImageSource.getTransparentBitmapImageSource(view.context))
.isEqualTo(view.imageSource)
.isEqualTo(view.imageSource)
}

@Test
fun testResizeMode() {
val viewManager = ReactImageManager()
val mockView = mock(ReactImageView::class.java)

viewManager.setResizeMode(mockView, null)
verify(mockView).setScaleType(ScalingUtils.ScaleType.CENTER_CROP)
reset(mockView)

viewManager.setResizeMode(mockView, "cover")
verify(mockView).setScaleType(ScalingUtils.ScaleType.CENTER_CROP)
reset(mockView)

viewManager.setResizeMode(mockView, "contain")
verify(mockView).setScaleType(ScalingUtils.ScaleType.FIT_CENTER)
reset(mockView)

viewManager.setResizeMode(mockView, "stretch")
verify(mockView).setScaleType(ScalingUtils.ScaleType.FIT_XY)
reset(mockView)

viewManager.setResizeMode(mockView, "repeat")
verify(mockView).setScaleType(ScaleTypeStartInside.INSTANCE)
reset(mockView)

viewManager.setResizeMode(mockView, "center")
verify(mockView).setScaleType(ScalingUtils.ScaleType.CENTER_INSIDE)
reset(mockView)

viewManager.setResizeMode(mockView, "invalid")
verify(mockView).setScaleType(ScalingUtils.ScaleType.CENTER_CROP)
}

@Test
fun testResizeMethod() {
val viewManager = ReactImageManager()
val mockView = mock(ReactImageView::class.java)

viewManager.setResizeMethod(mockView, null)
verify(mockView).setResizeMethod(ImageResizeMethod.AUTO)
reset(mockView)

viewManager.setResizeMethod(mockView, "auto")
verify(mockView).setResizeMethod(ImageResizeMethod.AUTO)
reset(mockView)

viewManager.setResizeMethod(mockView, "resize")
verify(mockView).setResizeMethod(ImageResizeMethod.RESIZE)
reset(mockView)

viewManager.setResizeMethod(mockView, "scale")
verify(mockView).setResizeMethod(ImageResizeMethod.SCALE)
reset(mockView)

viewManager.setResizeMethod(mockView, "none")
verify(mockView).setResizeMethod(ImageResizeMethod.NONE)
reset(mockView)

viewManager.setResizeMethod(mockView, "invalid")
verify(mockView).setResizeMethod(ImageResizeMethod.AUTO)
flogMock.verify { FLog.w(ReactConstants.TAG, "Invalid resize method: 'invalid'") }
}

@Test
fun testResizeMultiplier() {
val viewManager = ReactImageManager()
val mockView = mock(ReactImageView::class.java)

viewManager.setResizeMultiplier(mockView, 0.01f)
verify(mockView).setResizeMultiplier(0.01f)
reset(mockView)

viewManager.setResizeMultiplier(mockView, 0.009f)
verify(mockView).setResizeMultiplier(0.009f)
flogMock.verify { FLog.w(ReactConstants.TAG, "Invalid resize multiplier: '0.009'") }
}

@Test
fun testHeaders() {
val viewManager = ReactImageManager()
val mockView = mock(ReactImageView::class.java)

viewManager.setHeaders(mockView, null)
verify(mockView, never()).setHeaders(any())

val headers = JavaOnlyMap()
headers.putString("key", "value")
viewManager.setHeaders(mockView, headers)
verify(mockView).setHeaders(headers)
}
}