From 457e3480819279ab50007e0d57568ed628ea672c Mon Sep 17 00:00:00 2001 From: Konstantin Raev Date: Thu, 5 May 2016 08:17:02 -0700 Subject: [PATCH] Open sourced SwipeRefreshLayoutRecordingModule Reviewed By: dmmiller Differential Revision: D3264212 fb-gh-sync-id: 8790200a0d3c47050d6a91c906854b3a55640829 fbshipit-source-id: 8790200a0d3c47050d6a91c906854b3a55640829 --- .../java/com/facebook/react/tests/BUCK | 34 ++- .../ReactSwipeRefreshLayoutTestCase.java | 104 ++++++++ .../facebook/react/tests/TestIdTestCase.java | 62 +++++ .../react/tests/TextInputTestCase.java | 223 ++++++++++++++++++ .../js/SwipeRefreshLayoutTestModule.js | 90 +++++++ ReactAndroid/src/androidTest/js/TestBundle.js | 24 +- .../src/androidTest/js/TestIdTestModule.js | 135 +++++++++++ .../src/androidTest/js/TextInputTestModule.js | 170 +++++++++++++ scripts/run-android-local-integration-test.sh | 5 +- scripts/run-android-local-unit-tests.sh | 2 + 10 files changed, 832 insertions(+), 17 deletions(-) create mode 100644 ReactAndroid/src/androidTest/java/com/facebook/react/tests/ReactSwipeRefreshLayoutTestCase.java create mode 100644 ReactAndroid/src/androidTest/java/com/facebook/react/tests/TestIdTestCase.java create mode 100644 ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java create mode 100644 ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js create mode 100644 ReactAndroid/src/androidTest/js/TestIdTestModule.js create mode 100644 ReactAndroid/src/androidTest/js/TextInputTestModule.js diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/BUCK b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/BUCK index 1f32528600a..7c678f8fa83 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/BUCK +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/BUCK @@ -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', ], diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/ReactSwipeRefreshLayoutTestCase.java b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/ReactSwipeRefreshLayoutTestCase.java new file mode 100644 index 00000000000..1026be3c759 --- /dev/null +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/ReactSwipeRefreshLayoutTestCase.java @@ -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()); + } + +} diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TestIdTestCase.java b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TestIdTestCase.java new file mode 100644 index 00000000000..527e355c0e4 --- /dev/null +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TestIdTestCase.java @@ -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 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); + } + } +} diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java new file mode 100644 index 00000000000..9558a5d912a --- /dev/null +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/TextInputTestCase.java @@ -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"; + } +} diff --git a/ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js b/ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js new file mode 100644 index 00000000000..7a8e6f5224c --- /dev/null +++ b/ReactAndroid/src/androidTest/js/SwipeRefreshLayoutTestModule.js @@ -0,0 +1,90 @@ +/** + * Copyright (c) 2013-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. + * + * @providesModule SwipeRefreshLayoutTestModule + */ + +'use strict'; + +var BatchedBridge = require('BatchedBridge'); +var React = require('React'); +var RecordingModule = require('NativeModules').SwipeRefreshLayoutRecordingModule; +var ScrollView = require('ScrollView'); +var PullToRefreshViewAndroid = require('PullToRefreshViewAndroid'); +var Text = require('Text'); +var TouchableWithoutFeedback = require('TouchableWithoutFeedback'); +var View = require('View'); + +var Row = React.createClass({ + getInitialState: function() { + return { + clicks: 0, + }; + }, + + render: function() { + return ( + + + + {this.state.clicks + ' clicks'} + + + + ); + }, + + _onPress: function() { + this.setState({clicks: this.state.clicks + 1}); + }, +}); + +var app = null; +var SwipeRefreshLayoutTestApp = React.createClass({ + getInitialState: function() { + return { + rows: 2, + }; + }, + + componentDidMount: function() { + app = this; + }, + + render: function() { + var rows = []; + for (var i = 0; i < this.state.rows; i++) { + rows.push(); + } + return ( + RecordingModule.onRefresh()}> + + {rows} + + + ); + }, +}); + +var SwipeRefreshLayoutTestModule = { + SwipeRefreshLayoutTestApp, + setRows: function(rows) { + if (app != null) { + app.setState({rows}); + } + } +}; + +BatchedBridge.registerCallableModule( + 'SwipeRefreshLayoutTestModule', + SwipeRefreshLayoutTestModule +); + +module.exports = SwipeRefreshLayoutTestModule; diff --git a/ReactAndroid/src/androidTest/js/TestBundle.js b/ReactAndroid/src/androidTest/js/TestBundle.js index 05c71eb9fb2..22476ff7b2a 100644 --- a/ReactAndroid/src/androidTest/js/TestBundle.js +++ b/ReactAndroid/src/androidTest/js/TestBundle.js @@ -15,15 +15,13 @@ console.disableYellowBox = true; // Include modules used by integration tests require('ScrollViewTestModule'); require('PickerAndroidTestModule'); +require('SwipeRefreshLayoutTestModule'); +require('TextInputTestModule'); // Define catalyst test apps used in integration tests var AppRegistry = require('AppRegistry'); var apps = [ -{ - appKey: 'ScrollViewTestApp', - component: () => require('ScrollViewTestModule').ScrollViewTestApp, -}, { appKey: 'HorizontalScrollViewTestApp', component: () => require('ScrollViewTestModule').HorizontalScrollViewTestApp, @@ -32,7 +30,25 @@ var apps = [ appKey: 'PickerAndroidTestApp', component: () => require('PickerAndroidTestModule').PickerAndroidTestApp, }, +{ + appKey: 'ScrollViewTestApp', + component: () => require('ScrollViewTestModule').ScrollViewTestApp, +}, +{ + appKey: 'SwipeRefreshLayoutTestApp', + component: () => require('SwipeRefreshLayoutTestModule').SwipeRefreshLayoutTestApp +}, +{ + appKey: 'TextInputTestApp', + component: () => require('TextInputTestModule').TextInputTestApp +}, +{ + appKey: 'TestIdTestApp', + component: () => require('TestIdTestModule').TestIdTestApp +}, + ]; + module.exports = apps; AppRegistry.registerConfig(apps); diff --git a/ReactAndroid/src/androidTest/js/TestIdTestModule.js b/ReactAndroid/src/androidTest/js/TestIdTestModule.js new file mode 100644 index 00000000000..8ad181d0925 --- /dev/null +++ b/ReactAndroid/src/androidTest/js/TestIdTestModule.js @@ -0,0 +1,135 @@ +/** + * Copyright (c) 2013-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. + * + * @providesModule TestIdTestModule + */ + +'use strict'; + +var Image = require('Image'); +var ProgressBarAndroid = require('ProgressBarAndroid'); +var React = require('React'); +var ScrollView = require('ScrollView'); +var Picker = require('Picker'); +var StyleSheet = require('StyleSheet'); +var SwitchAndroid = require('SwitchAndroid'); +var Text = require('Text'); +var TextInput = require('TextInput'); +var ToolbarAndroid = require('ToolbarAndroid'); +var TouchableBounce = require('TouchableBounce'); +var TouchableHighlight = require('TouchableHighlight'); +var TouchableOpacity = require('TouchableOpacity'); +var TouchableWithoutFeedback = require('TouchableWithoutFeedback'); +var View = require('View'); +var WebView = require('WebView'); + +/** + * All the views implemented on Android, each with the testID property set. + * We test that: + * - The app renders fine + * - The testID property is passed to the native views + */ +var TestIdTestApp = React.createClass({ + render: function() { + return ( + + + + + + + + Item 1 + Item 2 + + + + Item 1 + Item 2 + + + + + + + + + + + + + text + + + + + + + TouchableBounce + + + + TouchableHighlight + + + + TouchableOpacity + + + + + TouchableWithoutFeedback + + + + + + } + style={styles.base} + /> + + + ); + }, +}); + +var styles = StyleSheet.create({ + base: { + width: 150, + height: 50, + }, +}); + +module.exports = { + TestIdTestApp: TestIdTestApp, +}; diff --git a/ReactAndroid/src/androidTest/js/TextInputTestModule.js b/ReactAndroid/src/androidTest/js/TextInputTestModule.js new file mode 100644 index 00000000000..d4e7cc0da36 --- /dev/null +++ b/ReactAndroid/src/androidTest/js/TextInputTestModule.js @@ -0,0 +1,170 @@ +/** + * Copyright (c) 2013-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. + * + * @providesModule TextInputTestModule + */ + +"use strict"; + +var BatchedBridge = require('BatchedBridge'); +var React = require('React'); +var StyleSheet = require('StyleSheet'); +var Text = require('Text'); +var TextInput = require('TextInput'); +var View = require('View'); + +var app; + +class TokenizedTextExample extends React.Component { + constructor(props) { + super(props); + this.state = {text: ''}; + } + render() { + + //define delimiter + let delimiter = /\s+/; + + //split string + let _text = this.state.text; + let token, index, parts = []; + while (_text) { + delimiter.lastIndex = 0; + token = delimiter.exec(_text); + if (token === null) { + break; + } + index = token.index; + if (token[0].length === 0) { + index = 1; + } + parts.push(_text.substr(0, index)); + parts.push(token[0]); + index = index + token[0].length; + _text = _text.slice(index); + } + parts.push(_text); + + //highlight hashtags + parts = parts.map((text) => { + if (/^#/.test(text)) { + return {text}; + } else { + return text; + } + }); + + return ( + + { + this.setState({text}); + }}> + {parts} + + + ); + } +} + +var TextInputTestApp = React.createClass({ + componentDidMount: function() { + app = this; + }, + + render: function() { + return ( + + + + + + + + + + ); + }, +}); + +var styles = StyleSheet.create({ + container: { + padding: 5, + margin: 10, + }, + textInputHeight: { + fontSize: 21, + height: 30, + }, + textInput: { + fontSize: 21, + padding: 0, + }, + hashtag: { + color: 'blue', + fontWeight: 'bold', + }, +}); + +var TextInputTestModule = { + TextInputTestApp, + setValueRef: function(ref, value) { + app.refs[ref].setNativeProps({ + text: value, + }); + }, +}; + +BatchedBridge.registerCallableModule( + 'TextInputTestModule', + TextInputTestModule +); + +module.exports = TextInputTestModule; diff --git a/scripts/run-android-local-integration-test.sh b/scripts/run-android-local-integration-test.sh index 42701088ad3..ca60756a6f2 100755 --- a/scripts/run-android-local-integration-test.sh +++ b/scripts/run-android-local-integration-test.sh @@ -3,6 +3,8 @@ # Runs all Android integration tests locally. # See http://facebook.github.io/react-native/docs/testing.html +set -e + which buck > /dev/null || { echo "React Native uses the Buck build tool to run tests. Please install Buck: https://buckbuild.com/setup/install.html"; exit 1; @@ -13,6 +15,7 @@ echo "Compiling native code..." echo "Building JS bundle..." node local-cli/cli.js bundle --platform android --dev true --entry-file ReactAndroid/src/androidTest/js/TestBundle.js --bundle-output ReactAndroid/src/androidTest/assets/AndroidTestBundle.js echo "Installing test app on the device..." +buck fetch ReactAndroid/src/androidTest/buck-runner:instrumentation-tests buck install ReactAndroid/src/androidTest/buck-runner:instrumentation-tests echo "Running integration tests..." -./scripts/run-android-instrumentation-tests.sh com.facebook.react.tests +adb shell am instrument -w com.facebook.react.tests/android.support.test.runner.AndroidJUnitRunner diff --git a/scripts/run-android-local-unit-tests.sh b/scripts/run-android-local-unit-tests.sh index fcebcb5cc55..6dc98511188 100755 --- a/scripts/run-android-local-unit-tests.sh +++ b/scripts/run-android-local-unit-tests.sh @@ -3,6 +3,8 @@ # Runs all Android unit tests locally. # See http://facebook.github.io/react-native/docs/testing.html +set -e + which buck > /dev/null || { echo "React Native uses the Buck build tool to run tests. Please install Buck: https://buckbuild.com/setup/install.html"; exit 1;