convert ReactPropAnnotationSetterTest to Kotlin (#39706)

Summary:
fix and convert `ReactPropAnnotationSetterTest` to Kotlin for https://github.com/facebook/react-native/issues/38825

## Changelog:

[ANDROID] [CHANGED] - Rewrite ReactPropAnnotationSetterTest to Kotlin,

Pull Request resolved: https://github.com/facebook/react-native/pull/39706

Test Plan:
yarn && ./gradlew :packages:react-native:ReactAndroid:test

cortinico mdvacca

Reviewed By: NickGerleman

Differential Revision: D49839905

Pulled By: cortinico

fbshipit-source-id: 4afda5cdccd722f0e16e2ab517e32ecee0b845a4
This commit is contained in:
huzhanbo.luc 2023-10-03 13:53:06 -07:00 коммит произвёл Facebook GitHub Bot
Родитель 5dedf277cb
Коммит ea88338d75
3 изменённых файлов: 427 добавлений и 496 удалений

Просмотреть файл

@ -1,495 +0,0 @@
/*
* 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.uimanager;
import static org.assertj.core.api.Assertions.fail;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import android.view.View;
import com.facebook.react.bridge.JSApplicationIllegalArgumentException;
import com.facebook.react.bridge.JavaOnlyArray;
import com.facebook.react.bridge.JavaOnlyMap;
import com.facebook.react.bridge.ReadableArray;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.annotations.ReactPropGroup;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
/**
* Test updating view through {@link ViewManager} with {@link ReactProp} and {@link ReactPropGroup}
* annotations.
*/
@RunWith(RobolectricTestRunner.class)
@Ignore // TODO T14964130
public class ReactPropAnnotationSetterTest {
public interface ViewManagerUpdatesReceiver {
void onBooleanSetterCalled(boolean value);
void onIntSetterCalled(int value);
void onDoubleSetterCalled(double value);
void onFloatSetterCalled(float value);
void onStringSetterCalled(String value);
void onBoxedBooleanSetterCalled(Boolean value);
void onBoxedIntSetterCalled(Integer value);
void onArraySetterCalled(ReadableArray value);
void onMapSetterCalled(ReadableMap value);
void onFloatGroupPropSetterCalled(int index, float value);
void onIntGroupPropSetterCalled(int index, int value);
void onBoxedIntGroupPropSetterCalled(int index, Integer value);
}
private class ViewManagerUnderTest extends ViewManager<View, ReactShadowNode> {
final ViewManagerUpdatesReceiver mViewManagerUpdatesReceiver;
private ViewManagerUnderTest(ViewManagerUpdatesReceiver viewManagerUpdatesReceiver) {
mViewManagerUpdatesReceiver = viewManagerUpdatesReceiver;
}
@Override
public String getName() {
return "RedpandasLivestreamVideoView";
}
@Override
public ReactShadowNode createShadowNodeInstance() {
fail("This method should not be executed as a part of this test");
return null;
}
@Override
public Class<? extends ReactShadowNode> getShadowNodeClass() {
return ReactShadowNode.class;
}
@Override
protected View createViewInstance(ThemedReactContext reactContext) {
fail("This method should not be executed as a part of this test");
return null;
}
@Override
public void updateExtraData(View root, Object extraData) {
fail("This method should not be executed as a part of this test");
}
@ReactProp(name = "boolProp")
public void setBoolProp(View v, boolean value) {
mViewManagerUpdatesReceiver.onBooleanSetterCalled(value);
}
@ReactProp(name = "boolPropWithDefault", defaultBoolean = true)
public void setBoolPropWithDefault(View v, boolean value) {
mViewManagerUpdatesReceiver.onBooleanSetterCalled(value);
}
@ReactProp(name = "intProp")
public void setIntProp(View v, int value) {
mViewManagerUpdatesReceiver.onIntSetterCalled(value);
}
@ReactProp(name = "intPropWithDefault", defaultInt = 7168)
public void setIntPropWithDefault(View v, int value) {
mViewManagerUpdatesReceiver.onIntSetterCalled(value);
}
@ReactProp(name = "floatProp")
public void setFloatProp(View v, float value) {
mViewManagerUpdatesReceiver.onFloatSetterCalled(value);
}
@ReactProp(name = "floatPropWithDefault", defaultFloat = 14.0f)
public void setFloatPropWithDefault(View v, float value) {
mViewManagerUpdatesReceiver.onFloatSetterCalled(value);
}
@ReactProp(name = "doubleProp")
public void setDoubleProp(View v, double value) {
mViewManagerUpdatesReceiver.onDoubleSetterCalled(value);
}
@ReactProp(name = "doublePropWithDefault", defaultDouble = -88.0)
public void setDoublePropWithDefault(View v, double value) {
mViewManagerUpdatesReceiver.onDoubleSetterCalled(value);
}
@ReactProp(name = "stringProp")
public void setStringProp(View v, String value) {
mViewManagerUpdatesReceiver.onStringSetterCalled(value);
}
@ReactProp(name = "boxedBoolProp")
public void setBoxedBoolProp(View v, Boolean value) {
mViewManagerUpdatesReceiver.onBoxedBooleanSetterCalled(value);
}
@ReactProp(name = "boxedIntProp")
public void setBoxedIntProp(View v, Integer value) {
mViewManagerUpdatesReceiver.onBoxedIntSetterCalled(value);
}
@ReactProp(name = "arrayProp")
public void setArrayProp(View v, ReadableArray value) {
mViewManagerUpdatesReceiver.onArraySetterCalled(value);
}
@ReactProp(name = "mapProp")
public void setMapProp(View v, ReadableMap value) {
mViewManagerUpdatesReceiver.onMapSetterCalled(value);
}
@ReactPropGroup(
names = {
"floatGroupPropFirst",
"floatGroupPropSecond",
})
public void setFloatGroupProp(View v, int index, float value) {
mViewManagerUpdatesReceiver.onFloatGroupPropSetterCalled(index, value);
}
@ReactPropGroup(
names = {
"floatGroupPropWithDefaultFirst",
"floatGroupPropWithDefaultSecond",
},
defaultFloat = -100.0f)
public void setFloatGroupPropWithDefault(View v, int index, float value) {
mViewManagerUpdatesReceiver.onFloatGroupPropSetterCalled(index, value);
}
@ReactPropGroup(names = {"intGroupPropFirst", "intGroupPropSecond"})
public void setIntGroupProp(View v, int index, int value) {
mViewManagerUpdatesReceiver.onIntGroupPropSetterCalled(index, value);
}
@ReactPropGroup(
names = {"intGroupPropWithDefaultFirst", "intGroupPropWithDefaultSecond"},
defaultInt = 555)
public void setIntGroupPropWithDefault(View v, int index, int value) {
mViewManagerUpdatesReceiver.onIntGroupPropSetterCalled(index, value);
}
@ReactPropGroup(
names = {
"boxedIntGroupPropFirst",
"boxedIntGroupPropSecond",
})
public void setBoxedIntGroupProp(View v, int index, Integer value) {
mViewManagerUpdatesReceiver.onBoxedIntGroupPropSetterCalled(index, value);
}
}
public static ReactStylesDiffMap buildStyles(Object... keysAndValues) {
return new ReactStylesDiffMap(JavaOnlyMap.of(keysAndValues));
}
private ViewManagerUnderTest mViewManager;
private ViewManagerUpdatesReceiver mUpdatesReceiverMock;
@Before
public void setup() {
mUpdatesReceiverMock = mock(ViewManagerUpdatesReceiver.class);
mViewManager = new ViewManagerUnderTest(mUpdatesReceiverMock);
}
@Test
public void testBooleanSetter() {
mViewManager.updateProperties(null, buildStyles("boolProp", true));
verify(mUpdatesReceiverMock).onBooleanSetterCalled(true);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boolProp", false));
verify(mUpdatesReceiverMock).onBooleanSetterCalled(false);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boolProp", null));
verify(mUpdatesReceiverMock).onBooleanSetterCalled(false);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boolPropWithDefault", false));
verify(mUpdatesReceiverMock).onBooleanSetterCalled(false);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boolPropWithDefault", null));
verify(mUpdatesReceiverMock).onBooleanSetterCalled(true);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testIntSetter() {
mViewManager.updateProperties(null, buildStyles("intProp", 13));
verify(mUpdatesReceiverMock).onIntSetterCalled(13);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intProp", null));
verify(mUpdatesReceiverMock).onIntSetterCalled(0);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intPropWithDefault", -1));
verify(mUpdatesReceiverMock).onIntSetterCalled(-1);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intPropWithDefault", null));
verify(mUpdatesReceiverMock).onIntSetterCalled(7168);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testDoubleSetter() {
mViewManager.updateProperties(null, buildStyles("doubleProp", 13.0));
verify(mUpdatesReceiverMock).onDoubleSetterCalled(13.0);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("doubleProp", null));
verify(mUpdatesReceiverMock).onDoubleSetterCalled(0.0);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("doublePropWithDefault", -1.0));
verify(mUpdatesReceiverMock).onDoubleSetterCalled(-1.0);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("doublePropWithDefault", null));
verify(mUpdatesReceiverMock).onDoubleSetterCalled(-88.0);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testFloatSetter() {
mViewManager.updateProperties(null, buildStyles("floatProp", 13.0));
verify(mUpdatesReceiverMock).onFloatSetterCalled(13.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("floatProp", null));
verify(mUpdatesReceiverMock).onFloatSetterCalled(0.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("floatPropWithDefault", -1.0));
verify(mUpdatesReceiverMock).onFloatSetterCalled(-1.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("floatPropWithDefault", null));
verify(mUpdatesReceiverMock).onFloatSetterCalled(14.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testStringSetter() {
mViewManager.updateProperties(null, buildStyles("stringProp", "someRandomString"));
verify(mUpdatesReceiverMock).onStringSetterCalled("someRandomString");
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("stringProp", null));
verify(mUpdatesReceiverMock).onStringSetterCalled(null);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testBoxedBooleanSetter() {
mViewManager.updateProperties(null, buildStyles("boxedBoolProp", true));
verify(mUpdatesReceiverMock).onBoxedBooleanSetterCalled(Boolean.TRUE);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boxedBoolProp", false));
verify(mUpdatesReceiverMock).onBoxedBooleanSetterCalled(Boolean.FALSE);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boxedBoolProp", null));
verify(mUpdatesReceiverMock).onBoxedBooleanSetterCalled(null);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testBoxedIntSetter() {
mViewManager.updateProperties(null, buildStyles("boxedIntProp", 55));
verify(mUpdatesReceiverMock).onBoxedIntSetterCalled(Integer.valueOf(55));
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boxedIntProp", null));
verify(mUpdatesReceiverMock).onBoxedIntSetterCalled(null);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testArraySetter() {
ReadableArray array = new JavaOnlyArray();
mViewManager.updateProperties(null, buildStyles("arrayProp", array));
verify(mUpdatesReceiverMock).onArraySetterCalled(array);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("arrayProp", null));
verify(mUpdatesReceiverMock).onArraySetterCalled(null);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testMapSetter() {
ReadableMap map = new JavaOnlyMap();
mViewManager.updateProperties(null, buildStyles("mapProp", map));
verify(mUpdatesReceiverMock).onMapSetterCalled(map);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("mapProp", null));
verify(mUpdatesReceiverMock).onMapSetterCalled(null);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testFloatGroupSetter() {
mViewManager.updateProperties(null, buildStyles("floatGroupPropFirst", 11.0));
verify(mUpdatesReceiverMock).onFloatGroupPropSetterCalled(0, 11.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("floatGroupPropSecond", -111.0));
verify(mUpdatesReceiverMock).onFloatGroupPropSetterCalled(1, -111.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("floatGroupPropSecond", null));
verify(mUpdatesReceiverMock).onFloatGroupPropSetterCalled(1, 0.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("floatGroupPropWithDefaultFirst", null));
verify(mUpdatesReceiverMock).onFloatGroupPropSetterCalled(0, -100.0f);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testIntGroupSetter() {
mViewManager.updateProperties(null, buildStyles("intGroupPropFirst", -7));
verify(mUpdatesReceiverMock).onIntGroupPropSetterCalled(0, -7);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intGroupPropSecond", -77));
verify(mUpdatesReceiverMock).onIntGroupPropSetterCalled(1, -77);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intGroupPropSecond", null));
verify(mUpdatesReceiverMock).onIntGroupPropSetterCalled(1, 0);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intGroupPropWithDefaultFirst", 5));
verify(mUpdatesReceiverMock).onIntGroupPropSetterCalled(0, 5);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intGroupPropWithDefaultFirst", null));
verify(mUpdatesReceiverMock).onIntGroupPropSetterCalled(0, 555);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("intGroupPropWithDefaultSecond", null));
verify(mUpdatesReceiverMock).onIntGroupPropSetterCalled(1, 555);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test
public void testStringGroupSetter() {
mViewManager.updateProperties(null, buildStyles("boxedIntGroupPropFirst", -7));
verify(mUpdatesReceiverMock).onBoxedIntGroupPropSetterCalled(0, -7);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boxedIntGroupPropSecond", 12345));
verify(mUpdatesReceiverMock).onBoxedIntGroupPropSetterCalled(1, 12345);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
mViewManager.updateProperties(null, buildStyles("boxedIntGroupPropSecond", null));
verify(mUpdatesReceiverMock).onBoxedIntGroupPropSetterCalled(1, null);
verifyNoMoreInteractions(mUpdatesReceiverMock);
reset(mUpdatesReceiverMock);
}
@Test(expected = JSApplicationIllegalArgumentException.class)
public void testFailToUpdateBoolPropWithMap() {
mViewManager.updateProperties(null, buildStyles("boolProp", new JavaOnlyMap()));
}
@Test(expected = JSApplicationIllegalArgumentException.class)
public void testFailToUpdateStringPropWithDouble() {
mViewManager.updateProperties(null, buildStyles("stringProp", 14.5));
}
@Test(expected = JSApplicationIllegalArgumentException.class)
public void testFailToUpdateDoublePropWithString() {
mViewManager.updateProperties(null, buildStyles("doubleProp", "hello"));
}
@Test(expected = JSApplicationIllegalArgumentException.class)
public void testFailToUpdateIntPropWithDouble() {
mViewManager.updateProperties(null, buildStyles("intProp", -7.4));
}
@Test(expected = JSApplicationIllegalArgumentException.class)
public void testFailToUpdateArrayPropWithBool() {
mViewManager.updateProperties(null, buildStyles("arrayProp", false));
}
@Test(expected = JSApplicationIllegalArgumentException.class)
public void testFailToUpdateMapPropWithArray() {
mViewManager.updateProperties(null, buildStyles("mapProp", new JavaOnlyArray()));
}
@Test(expected = JSApplicationIllegalArgumentException.class)
public void testFailToUpdateBoxedIntPropWithBoxedDouble() {
mViewManager.updateProperties(null, buildStyles("boxedIntProp", Double.valueOf(1)));
}
}

Просмотреть файл

@ -0,0 +1,426 @@
/*
* 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.uimanager
import android.view.View
import com.facebook.react.bridge.JSApplicationIllegalArgumentException
import com.facebook.react.bridge.JavaOnlyArray
import com.facebook.react.bridge.JavaOnlyMap
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
import com.facebook.react.uimanager.annotations.ReactProp
import com.facebook.react.uimanager.annotations.ReactPropGroup
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mockito
import org.robolectric.RobolectricTestRunner
import org.robolectric.RuntimeEnvironment
/** Test updating view through [ViewManager] with [ReactProp] and [ReactPropGroup] annotations. */
@RunWith(RobolectricTestRunner::class)
class ReactPropAnnotationSetterTest {
interface ViewManagerUpdatesReceiver {
fun onBooleanSetterCalled(value: Boolean)
fun onIntSetterCalled(value: Int)
fun onDoubleSetterCalled(value: Double)
fun onFloatSetterCalled(value: Float)
fun onStringSetterCalled(value: String?)
fun onBoxedBooleanSetterCalled(value: Boolean?)
fun onBoxedIntSetterCalled(value: Int?)
fun onArraySetterCalled(value: ReadableArray?)
fun onMapSetterCalled(value: ReadableMap?)
fun onFloatGroupPropSetterCalled(index: Int, value: Float)
fun onIntGroupPropSetterCalled(index: Int, value: Int)
fun onBoxedIntGroupPropSetterCalled(index: Int, value: Int?)
}
@Suppress("UNUSED_PARAMETER")
private inner class ViewManagerUnderTest(
val viewManagerUpdatesReceiver: ViewManagerUpdatesReceiver
) : ViewManager<View, ReactShadowNode<*>>() {
override fun getName() = "RedpandasLivestreamVideoView"
override fun createShadowNodeInstance(): ReactShadowNode<*> =
error("This method should not be executed as a part of this test")
override fun getShadowNodeClass(): Class<out ReactShadowNode<*>> = ReactShadowNode::class.java
override fun createViewInstance(reactContext: ThemedReactContext): View =
error("This method should not be executed as a part of this test")
override fun updateExtraData(root: View, extraData: Any) =
error("This method should not be executed as a part of this test")
@ReactProp(name = "boolProp")
fun setBoolProp(v: View?, value: Boolean) {
viewManagerUpdatesReceiver.onBooleanSetterCalled(value)
}
@ReactProp(name = "boolPropWithDefault", defaultBoolean = true)
fun setBoolPropWithDefault(v: View?, value: Boolean) {
viewManagerUpdatesReceiver.onBooleanSetterCalled(value)
}
@ReactProp(name = "intProp")
fun setIntProp(v: View?, value: Int) {
viewManagerUpdatesReceiver.onIntSetterCalled(value)
}
@ReactProp(name = "intPropWithDefault", defaultInt = 7168)
fun setIntPropWithDefault(v: View?, value: Int) {
viewManagerUpdatesReceiver.onIntSetterCalled(value)
}
@ReactProp(name = "floatProp")
fun setFloatProp(v: View?, value: Float) {
viewManagerUpdatesReceiver.onFloatSetterCalled(value)
}
@ReactProp(name = "floatPropWithDefault", defaultFloat = 14.0f)
fun setFloatPropWithDefault(v: View?, value: Float) {
viewManagerUpdatesReceiver.onFloatSetterCalled(value)
}
@ReactProp(name = "doubleProp")
fun setDoubleProp(v: View?, value: Double) {
viewManagerUpdatesReceiver.onDoubleSetterCalled(value)
}
@ReactProp(name = "doublePropWithDefault", defaultDouble = -88.0)
fun setDoublePropWithDefault(v: View?, value: Double) {
viewManagerUpdatesReceiver.onDoubleSetterCalled(value)
}
@ReactProp(name = "stringProp")
fun setStringProp(v: View?, value: String?) {
viewManagerUpdatesReceiver.onStringSetterCalled(value)
}
@ReactProp(name = "boxedBoolProp")
fun setBoxedBoolProp(v: View?, value: Boolean?) {
viewManagerUpdatesReceiver.onBoxedBooleanSetterCalled(value)
}
@ReactProp(name = "boxedIntProp")
fun setBoxedIntProp(v: View?, value: Int?) {
viewManagerUpdatesReceiver.onBoxedIntSetterCalled(value)
}
@ReactProp(name = "arrayProp")
fun setArrayProp(v: View?, value: ReadableArray?) {
viewManagerUpdatesReceiver.onArraySetterCalled(value)
}
@ReactProp(name = "mapProp")
fun setMapProp(v: View?, value: ReadableMap?) {
viewManagerUpdatesReceiver.onMapSetterCalled(value)
}
@ReactPropGroup(names = ["floatGroupPropFirst", "floatGroupPropSecond"])
fun setFloatGroupProp(v: View?, index: Int, value: Float) {
viewManagerUpdatesReceiver.onFloatGroupPropSetterCalled(index, value)
}
@ReactPropGroup(
names = ["floatGroupPropWithDefaultFirst", "floatGroupPropWithDefaultSecond"],
defaultFloat = -100.0f)
fun setFloatGroupPropWithDefault(v: View?, index: Int, value: Float) {
viewManagerUpdatesReceiver.onFloatGroupPropSetterCalled(index, value)
}
@ReactPropGroup(names = ["intGroupPropFirst", "intGroupPropSecond"])
fun setIntGroupProp(v: View?, index: Int, value: Int) {
viewManagerUpdatesReceiver.onIntGroupPropSetterCalled(index, value)
}
@ReactPropGroup(
names = ["intGroupPropWithDefaultFirst", "intGroupPropWithDefaultSecond"], defaultInt = 555)
fun setIntGroupPropWithDefault(v: View?, index: Int, value: Int) {
viewManagerUpdatesReceiver.onIntGroupPropSetterCalled(index, value)
}
@ReactPropGroup(names = ["boxedIntGroupPropFirst", "boxedIntGroupPropSecond"])
fun setBoxedIntGroupProp(v: View?, index: Int, value: Int?) {
viewManagerUpdatesReceiver.onBoxedIntGroupPropSetterCalled(index, value)
}
}
private lateinit var viewManager: ViewManagerUnderTest
private lateinit var updatesReceiverMock: ViewManagerUpdatesReceiver
private lateinit var targetView: View
@Before
fun setup() {
updatesReceiverMock = Mockito.mock(ViewManagerUpdatesReceiver::class.java)
viewManager = ViewManagerUnderTest(updatesReceiverMock)
targetView = View(RuntimeEnvironment.getApplication())
}
@Test
fun testBooleanSetter() {
viewManager.updateProperties(targetView, buildStyles("boolProp", true))
Mockito.verify(updatesReceiverMock).onBooleanSetterCalled(true)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boolProp", false))
Mockito.verify(updatesReceiverMock).onBooleanSetterCalled(false)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boolProp", null))
Mockito.verify(updatesReceiverMock).onBooleanSetterCalled(false)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boolPropWithDefault", false))
Mockito.verify(updatesReceiverMock).onBooleanSetterCalled(false)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boolPropWithDefault", null))
Mockito.verify(updatesReceiverMock).onBooleanSetterCalled(true)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testIntSetter() {
viewManager.updateProperties(targetView, buildStyles("intProp", 13))
Mockito.verify(updatesReceiverMock).onIntSetterCalled(13)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intProp", null))
Mockito.verify(updatesReceiverMock).onIntSetterCalled(0)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intProp", -7.4))
Mockito.verify(updatesReceiverMock).onIntSetterCalled(-7)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intPropWithDefault", -1))
Mockito.verify(updatesReceiverMock).onIntSetterCalled(-1)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intPropWithDefault", null))
Mockito.verify(updatesReceiverMock).onIntSetterCalled(7168)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testDoubleSetter() {
viewManager.updateProperties(targetView, buildStyles("doubleProp", 13.0))
Mockito.verify(updatesReceiverMock).onDoubleSetterCalled(13.0)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("doubleProp", null))
Mockito.verify(updatesReceiverMock).onDoubleSetterCalled(0.0)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("doublePropWithDefault", -1.0))
Mockito.verify(updatesReceiverMock).onDoubleSetterCalled(-1.0)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("doublePropWithDefault", null))
Mockito.verify(updatesReceiverMock).onDoubleSetterCalled(-88.0)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testFloatSetter() {
viewManager.updateProperties(targetView, buildStyles("floatProp", 13.0))
Mockito.verify(updatesReceiverMock).onFloatSetterCalled(13.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("floatProp", null))
Mockito.verify(updatesReceiverMock).onFloatSetterCalled(0.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("floatPropWithDefault", -1.0))
Mockito.verify(updatesReceiverMock).onFloatSetterCalled(-1.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("floatPropWithDefault", null))
Mockito.verify(updatesReceiverMock).onFloatSetterCalled(14.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testStringSetter() {
viewManager.updateProperties(targetView, buildStyles("stringProp", "someRandomString"))
Mockito.verify(updatesReceiverMock).onStringSetterCalled("someRandomString")
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("stringProp", null))
Mockito.verify(updatesReceiverMock).onStringSetterCalled(null)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testBoxedBooleanSetter() {
viewManager.updateProperties(targetView, buildStyles("boxedBoolProp", true))
Mockito.verify(updatesReceiverMock).onBoxedBooleanSetterCalled(java.lang.Boolean.TRUE)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boxedBoolProp", false))
Mockito.verify(updatesReceiverMock).onBoxedBooleanSetterCalled(java.lang.Boolean.FALSE)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boxedBoolProp", null))
Mockito.verify(updatesReceiverMock).onBoxedBooleanSetterCalled(null)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testBoxedIntSetter() {
viewManager.updateProperties(targetView, buildStyles("boxedIntProp", 55))
Mockito.verify(updatesReceiverMock).onBoxedIntSetterCalled(55)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boxedIntProp", 1))
Mockito.verify(updatesReceiverMock).onBoxedIntSetterCalled(1)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boxedIntProp", null))
Mockito.verify(updatesReceiverMock).onBoxedIntSetterCalled(null)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testArraySetter() {
val array: ReadableArray = JavaOnlyArray()
viewManager.updateProperties(targetView, buildStyles("arrayProp", array))
Mockito.verify(updatesReceiverMock).onArraySetterCalled(array)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("arrayProp", null))
Mockito.verify(updatesReceiverMock).onArraySetterCalled(null)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testMapSetter() {
val map: ReadableMap = JavaOnlyMap()
viewManager.updateProperties(targetView, buildStyles("mapProp", map))
Mockito.verify(updatesReceiverMock).onMapSetterCalled(map)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("mapProp", null))
Mockito.verify(updatesReceiverMock).onMapSetterCalled(null)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testFloatGroupSetter() {
viewManager.updateProperties(targetView, buildStyles("floatGroupPropFirst", 11.0))
Mockito.verify(updatesReceiverMock).onFloatGroupPropSetterCalled(0, 11.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("floatGroupPropSecond", -111.0))
Mockito.verify(updatesReceiverMock).onFloatGroupPropSetterCalled(1, -111.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("floatGroupPropSecond", null))
Mockito.verify(updatesReceiverMock).onFloatGroupPropSetterCalled(1, 0.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("floatGroupPropWithDefaultFirst", null))
Mockito.verify(updatesReceiverMock).onFloatGroupPropSetterCalled(0, -100.0f)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testIntGroupSetter() {
viewManager.updateProperties(targetView, buildStyles("intGroupPropFirst", -7))
Mockito.verify(updatesReceiverMock).onIntGroupPropSetterCalled(0, -7)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intGroupPropSecond", -77))
Mockito.verify(updatesReceiverMock).onIntGroupPropSetterCalled(1, -77)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intGroupPropSecond", null))
Mockito.verify(updatesReceiverMock).onIntGroupPropSetterCalled(1, 0)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intGroupPropWithDefaultFirst", 5))
Mockito.verify(updatesReceiverMock).onIntGroupPropSetterCalled(0, 5)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intGroupPropWithDefaultFirst", null))
Mockito.verify(updatesReceiverMock).onIntGroupPropSetterCalled(0, 555)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("intGroupPropWithDefaultSecond", null))
Mockito.verify(updatesReceiverMock).onIntGroupPropSetterCalled(1, 555)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test
fun testStringGroupSetter() {
viewManager.updateProperties(targetView, buildStyles("boxedIntGroupPropFirst", -7))
Mockito.verify(updatesReceiverMock).onBoxedIntGroupPropSetterCalled(0, -7)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boxedIntGroupPropSecond", 12345))
Mockito.verify(updatesReceiverMock).onBoxedIntGroupPropSetterCalled(1, 12345)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
viewManager.updateProperties(targetView, buildStyles("boxedIntGroupPropSecond", null))
Mockito.verify(updatesReceiverMock).onBoxedIntGroupPropSetterCalled(1, null)
Mockito.verifyNoMoreInteractions(updatesReceiverMock)
Mockito.reset(updatesReceiverMock)
}
@Test(expected = JSApplicationIllegalArgumentException::class)
fun testFailToUpdateBoolPropWithMap() {
viewManager.updateProperties(targetView, buildStyles("boolProp", JavaOnlyMap()))
}
@Test(expected = JSApplicationIllegalArgumentException::class)
fun testFailToUpdateStringPropWithDouble() {
viewManager.updateProperties(targetView, buildStyles("stringProp", 14.5))
}
@Test(expected = JSApplicationIllegalArgumentException::class)
fun testFailToUpdateDoublePropWithString() {
viewManager.updateProperties(targetView, buildStyles("doubleProp", "hello"))
}
@Test(expected = JSApplicationIllegalArgumentException::class)
fun testFailToUpdateArrayPropWithBool() {
viewManager.updateProperties(targetView, buildStyles("arrayProp", false))
}
@Test(expected = JSApplicationIllegalArgumentException::class)
fun testFailToUpdateMapPropWithArray() {
viewManager.updateProperties(targetView, buildStyles("mapProp", JavaOnlyArray()))
}
companion object {
fun buildStyles(vararg keysAndValues: Any?) = ReactStylesDiffMap(JavaOnlyMap.of(*keysAndValues))
}
}

Просмотреть файл

@ -59,7 +59,7 @@ public class ReactPropForShadowNodeSetterTest {
void onBoxedIntGroupPropSetterCalled(int index, Integer value);
}
public static ReactStylesDiffMap buildStyles(Object... keysAndValues) {
private ReactStylesDiffMap buildStyles(Object... keysAndValues) {
return new ReactStylesDiffMap(JavaOnlyMap.of(keysAndValues));
}