267
expect(getResponderId()).toBe('two');
268
expect(log).toEqual(['two responder start']);
269
});
270
+
271
+it('handles events without target', () => {
272
+ var EventEmitter = RCTEventEmitter.register.mock.calls[0][0];
273
+ var View = createReactNativeComponentClass({
274
+ validAttributes: {id: true},
275
+ uiViewClassName: 'View',
276
+ });
277
+
278
+ function getViewById(id) {
279
+ return UIManager.createView.mock.calls.find(
280
+ args => args[3] && args[3].id === id,
281
+ )[0];
282
+ }
283
+
284
+ function getResponderId() {
285
+ const responder = ResponderEventPlugin._getResponder();
286
+ if (responder === null) {
287
+ return null;
288
+ }
289
+ const props = typeof responder.tag === 'number'
290
+ ? responder.memoizedProps
291
+ : responder._currentElement.props;
292
+ return props ? props.id : null;
293
+ }
294
+
295
+ var log = [];
296
+
297
+ function render(renderFirstComponent) {
298
+ ReactNative.render(
299
+ <View id="parent">
300
+ <View key={1}>
301
+ {renderFirstComponent
302
+ ? <View
303
+ id="one"
304
+ onResponderEnd={() => log.push('one responder end')}
305
+ onResponderStart={() => log.push('one responder start')}
306
+ onStartShouldSetResponder={() => true}
307
+ />
308
+ : null}
309
+ </View>
310
+ <View key={2}>
311
+ <View
312
+ id="two"
313
+ onResponderEnd={() => log.push('two responder end')}
314
+ onResponderStart={() => log.push('two responder start')}
315
+ onStartShouldSetResponder={() => true}
316
+ />
317
+ </View>
318
+ </View>,
319
+ 1,
320
+ );
321
+ }
322
+
323
+ render(true);
324
+
325
+ EventEmitter.receiveTouches(
326
+ 'topTouchStart',
327
+ [{target: getViewById('one'), identifier: 17}],
328
+ [0],
329
+ );
330
+
331
+ // Unmounting component 'one'.
332
+ render(false);
333
+
334
+ EventEmitter.receiveTouches(
335
+ 'topTouchEnd',
336
+ [{target: getViewById('one'), identifier: 17}],
337
+ [0],
338
+ );
339
+
340
+ expect(getResponderId()).toBe(null);
341
+
342
+ EventEmitter.receiveTouches(
343
+ 'topTouchStart',
344
+ [{target: getViewById('two'), identifier: 18}],
345
+ [0],
346
+ );
347
+
348
+ expect(getResponderId()).toBe('two');
349
+
350
+ EventEmitter.receiveTouches(
351
+ 'topTouchEnd',
352
+ [{target: getViewById('two'), identifier: 18}],
353
+ [0],
354
+ );
355
+
356
+ expect(getResponderId()).toBe(null);
357
+
358
+ expect(log).toEqual([
359
+ 'one responder start',
360
+ 'two responder start',
361
+ 'two responder end',
362
+ ]);
363
+});