/**
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
package com.facebook.react.uimanager;
import java.util.Map;
import android.view.View;
import com.facebook.react.uimanager.annotations.ReactProp;
import com.facebook.react.uimanager.annotations.ReactPropGroup;
import org.junit.Test;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.robolectric.RobolectricTestRunner;
/**
* Test that verifies that spec of methods annotated with @ReactProp in {@link ReactShadowNode} is
* correct
*/
@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
public class ReactPropForShadowNodeSpecTest {
@Rule
public PowerMockRule rule = new PowerMockRule();
private static class BaseViewManager extends ViewManager {
private final Class<? extends ReactShadowNode> mShadowNodeClass;
private BaseViewManager(Class<? extends ReactShadowNode> shadowNodeClass) {
mShadowNodeClass = shadowNodeClass;
}
@Override
public String getName() {
return "IgnoredName";
}
@Override
public ReactShadowNode createShadowNodeInstance() {
return null;
}
@Override
public Class getShadowNodeClass() {
return mShadowNodeClass;
}
@Override
protected View createViewInstance(ThemedReactContext reactContext) {
return null;
}
@Override
public void updateExtraData(View root, Object extraData) {
}
}
@Test(expected = RuntimeException.class)
public void testMethodWithWrongNumberOfParams() {
new BaseViewManager(new ReactShadowNode() {
@ReactProp(name = "prop")
public void setterWithIncorrectNumberOfArgs(boolean value, int anotherValue) {
}
}.getClass()).getNativeProps();
}
@Test(expected = RuntimeException.class)
public void testMethodWithTooFewParams() {
new BaseViewManager(new ReactShadowNode() {
@ReactProp(name = "prop")
public void setterWithNoArgs() {
}
}.getClass()).getNativeProps();
}
@Test(expected = RuntimeException.class)
public void testUnsupportedValueType() {
new BaseViewManager(new ReactShadowNode() {
@ReactProp(name = "prop")
public void setterWithMap(Map value) {
}
}.getClass()).getNativeProps();
}
@Test(expected = RuntimeException.class)
public void testGroupInvalidNumberOfParams() {
new BaseViewManager(new ReactShadowNode() {
@ReactPropGroup(names = {"prop1", "prop2"})
public void setterWithTooManyParams(int index, float value, boolean bool) {
}
}.getClass()).getNativeProps();
}
@Test(expected = RuntimeException.class)
public void testGroupTooFewParams() {
new BaseViewManager(new ReactShadowNode() {
@ReactPropGroup(names = {"prop1", "prop2"})
public void setterWithTooManyParams(int index) {
}
}.getClass()).getNativeProps();
}
@Test(expected = RuntimeException.class)
public void testGroupNoIndexParam() {
new BaseViewManager(new ReactShadowNode() {
@ReactPropGroup(names = {"prop1", "prop2"})
public void setterWithTooManyParams(float value, boolean bool) {
}
}.getClass()).getNativeProps();
}
}