// Because react context is created asynchronously, we may have to wait until it is available. // It's simpler than exposing synchronosition mechanism to notify listener than react context // creation has completed. private ReactContext waitForReactContext() { Assertions.assertNotNull(mReactInstanceManager); try { while (true) { ReactContext reactContext = mReactInstanceManager.getCurrentReactContext(); if (reactContext != null) { return reactContext; } Thread.sleep(100); } } catch (InterruptedException e) { throw new RuntimeException(e); } }
@Test public void testTouchEmitter() { ReactInstanceManager instanceManager = mock(ReactInstanceManager.class); when(instanceManager.getCurrentReactContext()).thenReturn(mReactContext); UIManagerModule uiManager = mock(UIManagerModule.class); EventDispatcher eventDispatcher = mock(EventDispatcher.class); RCTEventEmitter eventEmitterModuleMock = mock(RCTEventEmitter.class); when(mCatalystInstanceMock.getNativeModule(UIManagerModule.class)).thenReturn(uiManager); when(uiManager.getEventDispatcher()).thenReturn(eventDispatcher); int rootViewId = 7; ReactRootView rootView = new ReactRootView(mReactContext); rootView.setId(rootViewId); rootView.startReactApplication(instanceManager, ""); rootView.simulateAttachForTesting(); long ts = new Date().getTime(); // Test ACTION_DOWN event rootView.onTouchEvent(MotionEvent.obtain(100, ts, MotionEvent.ACTION_DOWN, 0, 0, 0)); ArgumentCaptor<Event> downEventCaptor = ArgumentCaptor.forClass(Event.class); verify(eventDispatcher).dispatchEvent(downEventCaptor.capture()); verifyNoMoreInteractions(eventDispatcher); downEventCaptor.getValue().dispatch(eventEmitterModuleMock); ArgumentCaptor<SimpleArray> downActionTouchesArgCaptor = ArgumentCaptor.forClass(SimpleArray.class); verify(eventEmitterModuleMock) .receiveTouches( eq("topTouchStart"), downActionTouchesArgCaptor.capture(), any(SimpleArray.class)); verifyNoMoreInteractions(eventEmitterModuleMock); assertThat(downActionTouchesArgCaptor.getValue().size()).isEqualTo(1); assertThat(downActionTouchesArgCaptor.getValue().getMap(0)) .isEqualTo( SimpleMap.of( "pageX", 0., "pageY", 0., "locationX", 0., "locationY", 0., "target", rootViewId, "timeStamp", (double) ts, "identifier", 0.)); // Test ACTION_UP event reset(eventEmitterModuleMock, eventDispatcher); ArgumentCaptor<Event> upEventCaptor = ArgumentCaptor.forClass(Event.class); ArgumentCaptor<SimpleArray> upActionTouchesArgCaptor = ArgumentCaptor.forClass(SimpleArray.class); rootView.onTouchEvent(MotionEvent.obtain(50, ts, MotionEvent.ACTION_UP, 0, 0, 0)); verify(eventDispatcher).dispatchEvent(upEventCaptor.capture()); verifyNoMoreInteractions(eventDispatcher); upEventCaptor.getValue().dispatch(eventEmitterModuleMock); verify(eventEmitterModuleMock) .receiveTouches( eq("topTouchEnd"), upActionTouchesArgCaptor.capture(), any(WritableArray.class)); verifyNoMoreInteractions(eventEmitterModuleMock); assertThat(upActionTouchesArgCaptor.getValue().size()).isEqualTo(1); assertThat(upActionTouchesArgCaptor.getValue().getMap(0)) .isEqualTo( SimpleMap.of( "pageX", 0., "pageY", 0., "locationX", 0., "locationY", 0., "target", rootViewId, "timeStamp", (double) ts, "identifier", 0.)); // Test other action reset(eventDispatcher); rootView.onTouchEvent( MotionEvent.obtain(50, new Date().getTime(), MotionEvent.ACTION_HOVER_MOVE, 0, 0, 0)); verifyNoMoreInteractions(eventDispatcher); }