/** * Copyright (c) Facebook, Inc. and its affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. * * @emails oncall+recoil * @flow strict-local * @format */ 'use strict'; import type { RecoilState, RecoilValue } from 'Recoil_RecoilValue'; import type { Store } from 'Recoil_State'; const React = require('React'); const { useEffect } = require('React'); const ReactDOM = require('ReactDOM'); const { act } = require('ReactTestUtils'); const { graph } = require('../core/Recoil_Graph'); const { RecoilRoot, sendEndOfBatchNotifications_FOR_TESTING } = require('../core/Recoil_RecoilRoot.react'); const { makeEmptyStoreState } = require('../core/Recoil_State'); const { useRecoilValue, useResetRecoilState, useSetRecoilState } = require('../hooks/Recoil_Hooks'); const selector = require('../recoil_values/Recoil_selector'); const invariant = require('../util/Recoil_invariant'); const nullthrows = require('../util/Recoil_nullthrows'); const stableStringify = require('../util/Recoil_stableStringify'); // TODO Use Snapshot for testing instead of this thunk? declare function makeStore(): Store; declare class ErrorBoundary extends React.Component<{ children: React.Node | null, ... }, { hasError: boolean, ... }> { state: any, static getDerivedStateFromError(_error: any): any, render(): any, } declare function createReactRoot(container: any, contents: any): any; declare function renderElements(elements: ?React.Node): HTMLDivElement; declare function renderElementsWithSuspenseCount(elements: ?React.Node): [HTMLDivElement, JestMockFn<[], void>]; //////////////////////////////////////// // Useful RecoilValue nodes for testing //////////////////////////////////////// let id = 0; declare var errorThrowingAsyncSelector: (msg: any, dep: ?RecoilValue) => any; declare var resolvingAsyncSelector: (value: T) => any; declare var loadingAsyncSelector: () => any; declare function asyncSelector(dep?: RecoilValue): [RecoilValue, (T) => void, (Error) => void]; ////////////////////////////////// // Useful Components for testing ////////////////////////////////// declare function ReadsAtom(arg0: { atom: RecoilValue }): React.Node; // Returns a tuple: [ // Component, // setValue(T), // resetValue() // ] declare function componentThatReadsAndWritesAtom(atom: RecoilState): [() => React.Node, (T) => void, () => void]; declare function flushPromisesAndTimers(): Promise; module.exports = { makeStore, renderElements, renderElementsWithSuspenseCount, ReadsAtom, componentThatReadsAndWritesAtom, errorThrowingAsyncSelector, resolvingAsyncSelector, loadingAsyncSelector, asyncSelector, flushPromisesAndTimers };