mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-02 17:47:21 +08:00
Open sourced SwipeRefreshLayoutRecordingModule
Reviewed By: dmmiller Differential Revision: D3264212 fb-gh-sync-id: 8790200a0d3c47050d6a91c906854b3a55640829 fbshipit-source-id: 8790200a0d3c47050d6a91c906854b3a55640829
This commit is contained in:
committed by
Facebook Github Bot 7
parent
a1ba0918ab
commit
457e348081
@@ -5,31 +5,41 @@ include_defs('//ReactAndroid/DEFS')
|
||||
SANDCASTLE_FLAKY = [
|
||||
'ReactHorizontalScrollViewTestCase.java',
|
||||
'ReactScrollViewTestCase.java',
|
||||
'ReactSwipeRefreshLayoutTestCase.java',
|
||||
'TestIdTestCase.java',
|
||||
]
|
||||
|
||||
deps = [
|
||||
react_native_integration_tests_target('java/com/facebook/react/testing:testing'),
|
||||
react_native_target('java/com/facebook/react/bridge:bridge'),
|
||||
react_native_target('java/com/facebook/react/uimanager:uimanager'),
|
||||
react_native_target('java/com/facebook/react/views/picker:picker'),
|
||||
react_native_target('java/com/facebook/react/views/swiperefresh:swiperefresh'),
|
||||
react_native_target('java/com/facebook/react:react'),
|
||||
react_native_target('java/com/facebook/react/common:common'),
|
||||
react_native_target('java/com/facebook/react/views/progressbar:progressbar'),
|
||||
react_native_target('java/com/facebook/react/views/recyclerview:recyclerview'),
|
||||
react_native_target('java/com/facebook/react/views/scroll:scroll'),
|
||||
react_native_target('java/com/facebook/react/views/slider:slider'),
|
||||
react_native_target('java/com/facebook/react/views/text:text'),
|
||||
react_native_target('java/com/facebook/react/views/textinput:textinput'),
|
||||
react_native_target('java/com/facebook/react/views/view:view'),
|
||||
react_native_dep('third-party/android/support/v4:lib-support-v4'),
|
||||
]
|
||||
|
||||
android_library(
|
||||
name = 'tests',
|
||||
srcs = glob(['**/*.java']),
|
||||
deps = [
|
||||
react_native_integration_tests_target('java/com/facebook/react/testing:testing'),
|
||||
react_native_target('java/com/facebook/react/bridge:bridge'),
|
||||
react_native_target('java/com/facebook/react/uimanager:uimanager'),
|
||||
react_native_target('java/com/facebook/react/views/picker:picker'),
|
||||
],
|
||||
visibility = [
|
||||
'PUBLIC',
|
||||
],
|
||||
deps = deps,
|
||||
)
|
||||
|
||||
android_library(
|
||||
name = 'stable-tests',
|
||||
srcs = glob(['**/*.java'], excludes=SANDCASTLE_FLAKY),
|
||||
deps = [
|
||||
react_native_integration_tests_target('java/com/facebook/react/testing:testing'),
|
||||
react_native_target('java/com/facebook/react/bridge:bridge'),
|
||||
react_native_target('java/com/facebook/react/uimanager:uimanager'),
|
||||
react_native_target('java/com/facebook/react/views/picker:picker'),
|
||||
],
|
||||
deps = deps,
|
||||
visibility = [
|
||||
'PUBLIC',
|
||||
],
|
||||
|
||||
@@ -0,0 +1,104 @@
|
||||
/**
|
||||
* Copyright (c) 2014-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.tests;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import com.facebook.react.testing.ReactAppInstrumentationTestCase;
|
||||
import com.facebook.react.testing.ReactInstanceSpecForTest;
|
||||
import com.facebook.react.bridge.BaseJavaModule;
|
||||
import com.facebook.react.bridge.JavaScriptModule;
|
||||
import com.facebook.react.bridge.ReactMethod;
|
||||
import com.facebook.react.views.swiperefresh.ReactSwipeRefreshLayout;
|
||||
|
||||
/**
|
||||
* Test case for {@link ReactSwipeRefreshLayout}.
|
||||
*/
|
||||
public class ReactSwipeRefreshLayoutTestCase extends ReactAppInstrumentationTestCase {
|
||||
|
||||
private class SwipeRefreshLayoutRecordingModule extends BaseJavaModule {
|
||||
private int mCount = 0;
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return "SwipeRefreshLayoutRecordingModule";
|
||||
}
|
||||
|
||||
@ReactMethod
|
||||
public void onRefresh() {
|
||||
mCount++;
|
||||
}
|
||||
|
||||
public int getCount() {
|
||||
return mCount;
|
||||
}
|
||||
}
|
||||
|
||||
private interface SwipeRefreshLayoutTestModule extends JavaScriptModule {
|
||||
void setRows(int rows);
|
||||
}
|
||||
|
||||
private final SwipeRefreshLayoutRecordingModule mRecordingModule =
|
||||
new SwipeRefreshLayoutRecordingModule();
|
||||
|
||||
@Override
|
||||
protected String getReactApplicationKeyUnderTest() {
|
||||
return "SwipeRefreshLayoutTestApp";
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReactInstanceSpecForTest createReactInstanceSpecForTest() {
|
||||
return super.createReactInstanceSpecForTest()
|
||||
.addNativeModule(mRecordingModule)
|
||||
.addJSModule(SwipeRefreshLayoutTestModule.class);
|
||||
}
|
||||
|
||||
public void testRefreshNoScroll() {
|
||||
View refreshLayout = getViewAtPath(0);
|
||||
|
||||
createGestureGenerator()
|
||||
.startGesture(refreshLayout.getWidth() / 2, 10)
|
||||
.dragTo(refreshLayout.getWidth() / 2, refreshLayout.getHeight() / 2, 100, 1000)
|
||||
.endGesture();
|
||||
waitForBridgeAndUIIdle();
|
||||
assertEquals(1, mRecordingModule.getCount());
|
||||
}
|
||||
|
||||
public void testRefreshScroll() {
|
||||
View refreshLayout = getViewAtPath(0);
|
||||
|
||||
getReactContext().getJSModule(SwipeRefreshLayoutTestModule.class).setRows(100);
|
||||
|
||||
createGestureGenerator()
|
||||
.startGesture(refreshLayout.getWidth() / 2, 10)
|
||||
.dragTo(refreshLayout.getWidth() / 2, refreshLayout.getHeight() / 2, 100, 1000)
|
||||
.endGesture();
|
||||
waitForBridgeAndUIIdle();
|
||||
assertEquals(1, mRecordingModule.getCount());
|
||||
}
|
||||
|
||||
public void testNoRefreshAfterScroll() {
|
||||
View refreshLayout = getViewAtPath(0);
|
||||
|
||||
getReactContext().getJSModule(SwipeRefreshLayoutTestModule.class).setRows(100);
|
||||
|
||||
createGestureGenerator()
|
||||
.startGesture(refreshLayout.getWidth() / 2, refreshLayout.getHeight() / 2)
|
||||
.dragTo(refreshLayout.getWidth() / 2, 10, 100, 1000)
|
||||
.endGesture();
|
||||
waitForBridgeAndUIIdle();
|
||||
createGestureGenerator()
|
||||
.startGesture(refreshLayout.getWidth() / 2, 10)
|
||||
.dragTo(refreshLayout.getWidth() / 2, refreshLayout.getHeight() / 2, 100, 1000)
|
||||
.endGesture();
|
||||
waitForBridgeAndUIIdle();
|
||||
assertEquals(0, mRecordingModule.getCount());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
/**
|
||||
* Copyright (c) 2014-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.tests;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import android.view.View;
|
||||
|
||||
import com.facebook.react.views.picker.ReactDropdownPickerManager;
|
||||
import com.facebook.react.testing.ReactAppInstrumentationTestCase;
|
||||
import com.facebook.react.testing.ReactInstanceSpecForTest;
|
||||
import com.facebook.react.testing.ReactTestHelper;
|
||||
|
||||
|
||||
/**
|
||||
* Tests that the 'testID' property can be set on various views.
|
||||
* The 'testID' property is used to locate views in UI tests.
|
||||
*/
|
||||
public class TestIdTestCase extends ReactAppInstrumentationTestCase {
|
||||
|
||||
@Override
|
||||
protected String getReactApplicationKeyUnderTest() {
|
||||
return "TestIdTestApp";
|
||||
}
|
||||
|
||||
private final List<String> viewTags = Arrays.asList(
|
||||
"Image",
|
||||
"ProgressBar",
|
||||
"ScrollView",
|
||||
"Horizontal ScrollView",
|
||||
"Dropdown Picker",
|
||||
"Dialog Picker",
|
||||
"Switch",
|
||||
"Text",
|
||||
"TouchableBounce",
|
||||
"TouchableHighlight",
|
||||
"TouchableOpacity",
|
||||
"TouchableWithoutFeedback",
|
||||
"Toolbar",
|
||||
"TextInput",
|
||||
"View",
|
||||
"WebView",
|
||||
"ScrollView Item (same id used for all items)");
|
||||
|
||||
public void testPropertyIsSetForViews() {
|
||||
for (String tag : viewTags) {
|
||||
View viewWithTag = ReactTestHelper.getViewWithReactTestId(
|
||||
getActivity().getRootView(),
|
||||
tag);
|
||||
assertNotNull(
|
||||
"View with testID tag " + tag + " was not found. Check TestIdTestModule.js.",
|
||||
viewWithTag);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
/**
|
||||
* Copyright (c) 2014-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.tests;
|
||||
|
||||
import android.graphics.Color;
|
||||
import android.text.style.ForegroundColorSpan;
|
||||
import android.util.TypedValue;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.EditText;
|
||||
|
||||
import com.facebook.react.bridge.JavaScriptModule;
|
||||
import com.facebook.react.common.SystemClock;
|
||||
import com.facebook.react.testing.ReactAppInstrumentationTestCase;
|
||||
import com.facebook.react.testing.ReactInstanceSpecForTest;
|
||||
import com.facebook.react.uimanager.PixelUtil;
|
||||
import com.facebook.react.uimanager.UIManagerModule;
|
||||
import com.facebook.react.uimanager.events.EventDispatcher;
|
||||
import com.facebook.react.views.textinput.ReactEditText;
|
||||
import com.facebook.react.views.textinput.ReactTextChangedEvent;
|
||||
import com.facebook.react.views.textinput.ReactTextInputEvent;
|
||||
|
||||
/**
|
||||
* Test to verify that TextInput renders correctly
|
||||
*/
|
||||
public class TextInputTestCase extends ReactAppInstrumentationTestCase {
|
||||
|
||||
private interface TextInputTestModule extends JavaScriptModule {
|
||||
void setValueRef(String ref, String value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the actual height of the text input is not dependant on the font size of the text
|
||||
* within.
|
||||
*/
|
||||
public void testTextInputMeasurements() {
|
||||
View textInputViewHeightSet = getViewByTestId("textInput1");
|
||||
EditText textInputViewNoHeight = getViewByTestId("textInput2");
|
||||
|
||||
int expectedHeight = Math.round(PixelUtil.toPixelFromDIP(30));
|
||||
assertEquals(expectedHeight, textInputViewHeightSet.getHeight());
|
||||
|
||||
EditText editText = new EditText(textInputViewNoHeight.getContext());
|
||||
editText.setTextSize(
|
||||
TypedValue.COMPLEX_UNIT_PX,
|
||||
(float) Math.ceil(PixelUtil.toPixelFromSP(21.f)));
|
||||
editText.setPadding(0, 0, 0, 0);
|
||||
int measureSpec = View.MeasureSpec.makeMeasureSpec(
|
||||
ViewGroup.LayoutParams.WRAP_CONTENT,
|
||||
View.MeasureSpec.UNSPECIFIED);
|
||||
editText.measure(measureSpec, measureSpec);
|
||||
|
||||
assertEquals(editText.getMeasuredHeight(), textInputViewNoHeight.getHeight());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the cursor moves to the end of the word.
|
||||
*/
|
||||
public void testTextInputCursorPosition() throws Throwable {
|
||||
final EditText textInputWithText = getViewByTestId("textInput3");
|
||||
|
||||
runTestOnUiThread(
|
||||
new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
textInputWithText.setSelection(3);
|
||||
}
|
||||
});
|
||||
getReactContext().getJSModule(TextInputTestModule.class)
|
||||
.setValueRef("textInput3", "Some other value");
|
||||
waitForBridgeAndUIIdle();
|
||||
|
||||
assertEquals(4, textInputWithText.getSelectionStart());
|
||||
assertEquals(4, textInputWithText.getSelectionEnd());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the colors are applied to new text
|
||||
*/
|
||||
public void testTextInputColors() throws Throwable {
|
||||
String testIDs[] = new String[] {"textInput4", "textInput5", "textInput6"};
|
||||
|
||||
for (String testID : testIDs) {
|
||||
getReactContext().getJSModule(TextInputTestModule.class).setValueRef(testID, "NewText");
|
||||
}
|
||||
waitForBridgeAndUIIdle();
|
||||
|
||||
for (String testID : testIDs) {
|
||||
ReactEditText reactEditText = getViewByTestId(testID);
|
||||
assertEquals(
|
||||
Color.GREEN,
|
||||
reactEditText.getText().getSpans(0, 1, ForegroundColorSpan.class)[0]
|
||||
.getForegroundColor());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that the mentions input has colors displayed correctly.
|
||||
*/
|
||||
public void testMetionsInputColors() throws Throwable {
|
||||
EventDispatcher eventDispatcher =
|
||||
getReactContext().getNativeModule(UIManagerModule.class).getEventDispatcher();
|
||||
ReactEditText reactEditText = getViewByTestId("tokenizedInput");
|
||||
String newText = "#Things and more #things";
|
||||
int contentWidth = reactEditText.getWidth();
|
||||
int contentHeight = reactEditText.getHeight();
|
||||
int start = 0;
|
||||
int count = newText.length();
|
||||
|
||||
eventDispatcher.dispatchEvent(
|
||||
new ReactTextChangedEvent(
|
||||
reactEditText.getId(),
|
||||
SystemClock.nanoTime(),
|
||||
newText.toString(),
|
||||
(int) PixelUtil.toDIPFromPixel(contentWidth),
|
||||
(int) PixelUtil.toDIPFromPixel(contentHeight),
|
||||
reactEditText.incrementAndGetEventCounter()));
|
||||
|
||||
eventDispatcher.dispatchEvent(
|
||||
new ReactTextInputEvent(
|
||||
reactEditText.getId(),
|
||||
SystemClock.nanoTime(),
|
||||
newText.toString(),
|
||||
"",
|
||||
start,
|
||||
start + count - 1));
|
||||
waitForBridgeAndUIIdle();
|
||||
|
||||
ForegroundColorSpan[] spans = reactEditText
|
||||
.getText().getSpans(0, reactEditText.getText().length(), ForegroundColorSpan.class);
|
||||
assertEquals(2, spans.length);
|
||||
assertEquals(spans[0].getForegroundColor(), spans[1].getForegroundColor());
|
||||
assertEquals(0, reactEditText.getText().getSpanStart(spans[1]));
|
||||
assertEquals(7, reactEditText.getText().getSpanEnd(spans[1]));
|
||||
assertEquals(newText.length() - 7, reactEditText.getText().getSpanStart(spans[0]));
|
||||
assertEquals(newText.length(), reactEditText.getText().getSpanEnd(spans[0]));
|
||||
|
||||
String moreText = "andsuch ";
|
||||
String previousText = newText;
|
||||
newText += moreText;
|
||||
count = moreText.length();
|
||||
start = previousText.length();
|
||||
|
||||
eventDispatcher.dispatchEvent(
|
||||
new ReactTextChangedEvent(
|
||||
reactEditText.getId(),
|
||||
SystemClock.nanoTime(),
|
||||
newText.toString(),
|
||||
(int) PixelUtil.toDIPFromPixel(contentWidth),
|
||||
(int) PixelUtil.toDIPFromPixel(contentHeight),
|
||||
reactEditText.incrementAndGetEventCounter()));
|
||||
|
||||
eventDispatcher.dispatchEvent(
|
||||
new ReactTextInputEvent(
|
||||
reactEditText.getId(),
|
||||
SystemClock.nanoTime(),
|
||||
moreText,
|
||||
"",
|
||||
start,
|
||||
start + count - 1));
|
||||
waitForBridgeAndUIIdle();
|
||||
|
||||
spans = reactEditText.getText()
|
||||
.getSpans(0, reactEditText.getText().length(), ForegroundColorSpan.class);
|
||||
assertEquals(2, spans.length);
|
||||
assertEquals(spans[0].getForegroundColor(), spans[1].getForegroundColor());
|
||||
assertEquals(0, reactEditText.getText().getSpanStart(spans[1]));
|
||||
assertEquals(7, reactEditText.getText().getSpanEnd(spans[1]));
|
||||
assertEquals(newText.length() - 15, reactEditText.getText().getSpanStart(spans[0]));
|
||||
assertEquals(newText.length() - 1, reactEditText.getText().getSpanEnd(spans[0]));
|
||||
|
||||
moreText = "morethings";
|
||||
previousText = newText;
|
||||
newText += moreText;
|
||||
count = moreText.length();
|
||||
start = previousText.length();
|
||||
|
||||
eventDispatcher.dispatchEvent(
|
||||
new ReactTextChangedEvent(
|
||||
reactEditText.getId(),
|
||||
SystemClock.nanoTime(),
|
||||
newText.toString(),
|
||||
(int) PixelUtil.toDIPFromPixel(contentWidth),
|
||||
(int) PixelUtil.toDIPFromPixel(contentHeight),
|
||||
reactEditText.incrementAndGetEventCounter()));
|
||||
|
||||
eventDispatcher.dispatchEvent(
|
||||
new ReactTextInputEvent(
|
||||
reactEditText.getId(),
|
||||
SystemClock.nanoTime(),
|
||||
moreText,
|
||||
"",
|
||||
start,
|
||||
start + count - 1));
|
||||
waitForBridgeAndUIIdle();
|
||||
|
||||
spans = reactEditText.getText()
|
||||
.getSpans(0, reactEditText.getText().length(), ForegroundColorSpan.class);
|
||||
assertEquals(spans[0].getForegroundColor(), spans[1].getForegroundColor());
|
||||
assertEquals(2, spans.length);
|
||||
assertEquals(0, reactEditText.getText().getSpanStart(spans[1]));
|
||||
assertEquals(7, reactEditText.getText().getSpanEnd(spans[1]));
|
||||
assertEquals(newText.length() - 25, reactEditText.getText().getSpanStart(spans[0]));
|
||||
assertEquals(newText.length() - 11, reactEditText.getText().getSpanEnd(spans[0]));
|
||||
}
|
||||
|
||||
@Override
|
||||
protected ReactInstanceSpecForTest createReactInstanceSpecForTest() {
|
||||
return super.createReactInstanceSpecForTest()
|
||||
.addJSModule(TextInputTestModule.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getReactApplicationKeyUnderTest() {
|
||||
return "TextInputTestApp";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user