/**
* 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.animated;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.Callback;
import com.facebook.react.bridge.JavaOnlyArray;
import com.facebook.react.bridge.JavaOnlyMap;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ReactStylesDiffMap;
import com.facebook.react.uimanager.UIImplementation;
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.events.Event;
import com.facebook.react.uimanager.events.EventDispatcher;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.ArgumentCaptor;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PowerMockIgnore;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.rule.PowerMockRule;
import org.robolectric.RobolectricTestRunner;
import static org.fest.assertions.api.Assertions.assertThat;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.atMost;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
/**
* Tests the animated nodes graph traversal algorithm from {@link NativeAnimatedNodesManager}.
*/
@PrepareForTest({Arguments.class})
@RunWith(RobolectricTestRunner.class)
@PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "android.*"})
public class NativeAnimatedNodeTraversalTest {
private static long FRAME_LEN_NANOS = 1000000000L / 60L;
private static long INITIAL_FRAME_TIME_NANOS = 14599233201256L; /* random */
@Rule
public PowerMockRule rule = new PowerMockRule();
private long mFrameTimeNanos;
private UIManagerModule mUIManagerMock;
private UIImplementation mUIImplementationMock;
private EventDispatcher mEventDispatcherMock;
private NativeAnimatedNodesManager mNativeAnimatedNodesManager;
private long nextFrameTime() {
return mFrameTimeNanos += FRAME_LEN_NANOS;
}
@Before
public void setUp() {
PowerMockito.mockStatic(Arguments.class);
PowerMockito.when(Arguments.createArray()).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return new JavaOnlyArray();
}
});
PowerMockito.when(Arguments.createMap()).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return new JavaOnlyMap();
}
});
mFrameTimeNanos = INITIAL_FRAME_TIME_NANOS;
mUIManagerMock = mock(UIManagerModule.class);
mUIImplementationMock = mock(UIImplementation.class);
mEventDispatcherMock = mock(EventDispatcher.class);
PowerMockito.when(mUIManagerMock.getUIImplementation()).thenAnswer(new Answer<UIImplementation>() {
@Override
public UIImplementation answer(InvocationOnMock invocation) throws Throwable {
return mUIImplementationMock;
}
});
PowerMockito.when(mUIManagerMock.getEventDispatcher()).thenAnswer(new Answer<EventDispatcher>() {
@Override
public EventDispatcher answer(InvocationOnMock invocation) throws Throwable {
return mEventDispatcherMock;
}
});
PowerMockito.when(mUIManagerMock.getConstants()).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
return MapBuilder.of("customDirectEventTypes", MapBuilder.newHashMap());
}
});
mNativeAnimatedNodesManager = new NativeAnimatedNodesManager(mUIManagerMock);
}
/**
* Generates a simple animated nodes graph and attaches the props node to a given {@param viewTag}
* Parameter {@param opacity} is used as a initial value for the "opacity" attribute.
*
* Nodes are connected as follows (nodes IDs in parens):
* ValueNode(1) -> StyleNode(2) -> PropNode(3)
*/
private void createSimpleAnimatedViewWithOpacity(int viewTag, double opacity) {
mNativeAnimatedNodesManager.createAnimatedNode(
1,
JavaOnlyMap.of("type", "value", "value", opacity, "offset", 0d));
mNativeAnimatedNodesManager.createAnimatedNode(
2,
JavaOnlyMap.of("type", "style", "style", JavaOnlyMap.of("opacity", 1)));
mNativeAnimatedNodesManager.createAnimatedNode(
3,
JavaOnlyMap.of("type", "props", "props", JavaOnlyMap.of("style", 2)));
mNativeAnimatedNodesManager.connectAnimatedNodes(1, 2);
mNativeAnimatedNodesManager.connectAnimatedNodes(2, 3);
mNativeAnimatedNodesManager.connectAnimatedNodeToView(3, viewTag);
}
@Test
public void testFramesAnimation() {
createSimpleAnimatedViewWithOpacity(1000, 0d);
JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d);
Callback animationCallback = mock(Callback.class);
mNativeAnimatedNodesManager.startAnimatingNode(
1,
1,
JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d),
animationCallback);
ArgumentCaptor<ReactStylesDiffMap> stylesCaptor =
ArgumentCaptor.forClass(ReactStylesDiffMap.class);
reset(mUIImplementationMock);
mNativeAnimatedNodesManager.runUpdates(nextFrameTime());
verify(mUIImplementationMock).synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture());
assertThat(stylesCaptor.getValue().getDouble("opacity", Double.NaN)).isEqualTo(0);
for (int i = 0; i < frames.size(); i++) {
reset(mUIImplementationMock);
mNativeAnimatedNodesManager.runUpdates(nextFrameTime());
verify(mUIImplementationMock)
.synchronouslyUpdateViewOnUIThread(eq(1000), stylesCaptor.capture());
assertThat(stylesCaptor.getValue().getDouble("opacity", Double.NaN))
.isEqualTo(frames.getDouble(i));
}
reset(mUIImplementationMock);
mNativeAnimatedNodesManager.runUpdates(nextFrameTime());
verifyNoMoreInteractions(mUIImplementationMock);
}
@Test
public void testNodeValueListenerIfNotListening() {
int nodeId = 1;
createSimpleAnimatedViewWithOpacity(1000, 0d);
JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d);
Callback animationCallback = mock(Callback.class);
AnimatedNodeValueListener valueListener = mock(AnimatedNodeValueListener.class);
mNativeAnimatedNodesManager.startListeningToAnimatedNodeValue(nodeId, valueListener);
mNativeAnimatedNodesManager.startAnimatingNode(
1,
nodeId,
JavaOnlyMap.of("type", "frames", "frames", frames, "toValue", 1d),
animationCallback);
mNativeAnimatedNodesManager.runUpdates(nextFrameTime());
verify(valueListener).onValueUpdate(eq(0d));
mNativeAnimatedNodesManager.stopListeningToAnimatedNodeValue(nodeId);
reset(valueListener);
mNativeAnimatedNodesManager.runUpdates(nextFrameTime());
verifyNoMoreInteractions(valueListener);
}
@Test
public void testNodeValueListenerIfListening() {
int nodeId = 1;
createSimpleAnimatedViewWithOpacity(1000, 0d);
JavaOnlyArray frames = JavaOnlyArray.of(0d, 0.2d, 0.4d, 0.6d, 0.8d, 1d);
Callback animationCallback = mock(Callback.class);
AnimatedNodeValueListener valueListener = mock(AnimatedNodeValueListener.class);
mNativeAnimatedNodesMana
没有合适的资源?快使用搜索试试~ 我知道了~
react-native-0.42.0-rc.0.zip
共2000个文件
js:861个
h:372个
java:314个
需积分: 0 0 下载量 155 浏览量
2024-08-29
15:52:25
上传
评论
收藏 21.88MB ZIP 举报
温馨提示
一个使用 React 构建 app 应用程序的框架 A framework for building native applications using React
资源推荐
资源详情
资源评论
收起资源包目录
react-native-0.42.0-rc.0.zip (2000个子文件)
Yoga.c 138KB
YGNodeList.c 2KB
JSCExecutor.cpp 27KB
YGJNI.cpp 21KB
NativeToJsBridge.cpp 13KB
JSCTracing.cpp 12KB
CatalystInstanceImpl.cpp 11KB
LocalString.cpp 9KB
Value.cpp 9KB
jscexecutor.cpp 9KB
fbjni.cpp 8KB
Exceptions.cpp 8KB
JSCPerfLogging.cpp 8KB
CxxMessageQueue.cpp 7KB
JSCHelpers.cpp 7KB
MethodInvoker.cpp 7KB
MicroProfiler.cpp 7KB
JavaModuleWrapper.cpp 6KB
OnLoad.cpp 6KB
OnLoad.cpp 6KB
Instance.cpp 6KB
jni_helpers.cpp 6KB
CxxNativeModule.cpp 6KB
JSCWrapper.cpp 6KB
InspectorController.cpp 5KB
methodcall.cpp 5KB
ReadableNativeMap.cpp 5KB
ConsoleAgent.cpp 5KB
Inspector.cpp 5KB
JSDispatcher.cpp 4KB
JSCWebWorker.cpp 4KB
jsarg_helpers.cpp 4KB
ProxyExecutor.cpp 4KB
ModuleRegistry.cpp 4KB
SampleCxxModule.cpp 4KB
Environment.cpp 3KB
ReadableNativeArray.cpp 3KB
JSLoader.cpp 3KB
CxxMessageQueueTest.cpp 3KB
value.cpp 3KB
lyra.cpp 3KB
glog_init.cpp 3KB
JSIndexedRAMBundle.cpp 3KB
JMessageQueueThread.cpp 3KB
JInspector.cpp 3KB
Unicode.cpp 3KB
WritableNativeMap.cpp 3KB
Executor.cpp 3KB
JniJSModulesUnbundle.cpp 2KB
LegacyRuntimeAgent.cpp 2KB
ByteBuffer.cpp 2KB
JSCLegacyProfiler.cpp 2KB
log.cpp 2KB
Countable.cpp 2KB
MethodCall.cpp 2KB
WritableNativeArray.cpp 2KB
Protocol.cpp 2KB
Hybrid.cpp 2KB
JSCNativeModules.cpp 2KB
CxxModuleWrapper.cpp 2KB
JSCLegacyTracing.cpp 2KB
JSCPerfStats.cpp 2KB
NativeCommon.cpp 2KB
LegacyDispatcher.cpp 2KB
LegacyScriptDebugServer.cpp 2KB
LegacyDebuggerAgent.cpp 1KB
jsbigstring.cpp 1KB
Agent.cpp 1KB
JSCMemory.cpp 1KB
WeakReference.cpp 1KB
assert.cpp 1KB
LegacyAgents.cpp 1KB
RecoverableErrorTest.cpp 1KB
jsclogging.cpp 1KB
JSLogging.cpp 1008B
NativeArray.cpp 970B
JSCSamplingProfiler.cpp 938B
References.cpp 928B
LegacyInspectorEnvironment.cpp 902B
JSBundleType.cpp 891B
PageAgent.cpp 810B
onload.cpp 751B
JExecutorToken.cpp 742B
NativeMap.cpp 692B
OnLoad.cpp 603B
Error.cpp 519B
Platform.cpp 493B
InspectorAgent.cpp 449B
JSCUtils.cpp 362B
Dummy.cpp 143B
Util.cpp 121B
Dispatcher.cpp 82B
react-native.css 30KB
style.css 1KB
jni.h 51KB
CoreClasses.h 21KB
References.h 20KB
CoreClasses-inl.h 19KB
Meta-inl.h 17KB
References-inl.h 14KB
共 2000 条
- 1
- 2
- 3
- 4
- 5
- 6
- 20
资源评论
a3737337
- 粉丝: 0
- 资源: 2869
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于Java语言的文件共享与AES加密的Web端设计源码
- 基于Html和JavaScript的图片展示设计源码
- 基于Python开发的智慧养老系统算法端设计源码
- 基于Python和CSS的Chrome插件英雄榜中文说明书设计源码
- 基于Java与Vue的大连商务局项目设计源码及跨语言技术整合
- 基于Java、HTML、CSS和JavaScript的儿童玩具市场网页设计源码
- 基于Odoo框架的图书管理、待办事项、省市联动及养老机构三级联动设计源码
- 基于Java和HTML的micro-play网络有声小说播放器设计源码
- 基于Java的高考志愿填报系统后端设计源码
- 基于Java语言的在线问卷调查系统后端代码设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功