function makeNativeSimulator(eventType) {
  return function(domComponentOrNode, nativeEventData) {
    var fakeNativeEvent = new Event(eventType);
    assign(fakeNativeEvent, nativeEventData);
    if (ReactTestUtils.isDOMComponent(domComponentOrNode)) {
      ReactTestUtils.simulateNativeEventOnDOMComponent(
        eventType,
        domComponentOrNode,
        fakeNativeEvent
      );
    } else if (!!domComponentOrNode.tagName) {
      // Will allow on actual dom nodes.
      ReactTestUtils.simulateNativeEventOnNode(
        eventType,
        domComponentOrNode,
        fakeNativeEvent
      );
    }
  };
}
Exports:

- `ReactTestUtils.SimulateNative.click(Element/ReactDOMComponent)`
- `ReactTestUtils.SimulateNative.mouseMove(Element/ReactDOMComponent)`
- `ReactTestUtils.SimulateNative.mouseIn/ReactDOMComponent)`
- `ReactTestUtils.SimulateNative.mouseOut(Element/ReactDOMComponent)`
- ... (All keys from `EventConstants.topLevelTypes`)

Note: Top level event types are a subset of the entire set of handler types
(which include a broader set of "synthetic" events). For example, onDragDone
is a synthetic event. Except when testing an event plugin or React's event
handling code specifically, you probably want to use ReactTestUtils.Simulate
to dispatch synthetic events.