UNPKG

@mic-rexjs/usecases-react

Version:

React-based solution for use usecases of Clean Architecture

2,850 lines 117 kB
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _wrapAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/wrapAsyncGenerator"));
var _awaitAsyncGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/awaitAsyncGenerator"));
var _asyncGeneratorDelegate2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncGeneratorDelegate"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
var _jsxRuntime = require("react/jsx-runtime");
var _ = require(".");
var _useDepsKey = require("../useDepsKey");
var _globals = require("@jest/globals");
var _usecases = require("@mic-rexjs/usecases");
var _dom = require("@testing-library/dom");
var _react = require("@testing-library/react");
var _ahooks = require("ahooks");
var _react2 = require("react");
var _reactDom = require("react-dom");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, "return": function _return(r) { var n = this.s["return"]; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, "throw": function _throw(r) { var n = this.s["return"]; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); }
var EXT_1 = '.png';
var EXT_2 = '.jpg';
var PATH_1 = "hello".concat(EXT_1);
var PATH_2 = "hello".concat(EXT_2);
var PARENT_BUTTON_TEXT = 'parent button';
var CHILD_BUTTON_TEXT = 'child button';
var defaultFile = {
  path: '',
  ext: '',
  size: 0
};
var fileUseCase = function fileUseCase() {
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var entityReducers = (0, _usecases.entityUseCase)();
  var _options$pathPrefix = options.pathPrefix,
    pathPrefix = _options$pathPrefix === void 0 ? '' : _options$pathPrefix,
    onPathChange = options.onPathChange;
  var init = function init(entity) {
    var newEntity = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultFile;
    return /*#__PURE__*/_regenerator["default"].mark(function _callee() {
      return _regenerator["default"].wrap(function (_context3) {
        while (1) switch (_context3.prev = _context3.next) {
          case 0:
            _context3.next = 1;
            return function () {
              return newEntity;
            };
          case 1:
          case "end":
            return _context3.stop();
        }
      }, _callee);
    })();
  };
  var setPath = /*#__PURE__*/_regenerator["default"].mark(function setPath(entity, path) {
    var _path$match, oldPath, newPath;
    return _regenerator["default"].wrap(function (_context4) {
      while (1) switch (_context4.prev = _context4.next) {
        case 0:
          oldPath = entity.path;
          newPath = pathPrefix + path;
          _context4.next = 1;
          return _objectSpread(_objectSpread({}, entity), {}, {
            path: newPath,
            ext: ((_path$match = path.match(/\.[^.]+$/)) === null || _path$match === void 0 ? void 0 : _path$match[0]) || ''
          });
        case 1:
          onPathChange === null || onPathChange === void 0 || onPathChange(newPath, oldPath);
        case 2:
        case "end":
          return _context4.stop();
      }
    }, setPath);
  });
  var readFile = /*#__PURE__*/function () {
    var _ref8 = (0, _wrapAsyncGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(entity, path) {
      var size;
      return _regenerator["default"].wrap(function (_context5) {
        while (1) switch (_context5.prev = _context5.next) {
          case 0:
            size = 2000;
            return _context5.delegateYield((0, _asyncGeneratorDelegate2["default"])(_asyncIterator(setPath(entity, path)), _awaitAsyncGenerator2["default"]), "t0", 1);
          case 1:
            _context5.next = 2;
            return (0, _awaitAsyncGenerator2["default"])(Promise.resolve(null));
          case 2:
            _context5.next = 3;
            return function (oldEntity) {
              return _objectSpread(_objectSpread({}, oldEntity), {}, {
                size: size
              });
            };
          case 3:
            return _context5.abrupt("return", size);
          case 4:
          case "end":
            return _context5.stop();
        }
      }, _callee2);
    }));
    return function readFile(_x, _x2) {
      return _ref8.apply(this, arguments);
    };
  }();
  var isImage = function isImage(entity) {
    var ext = entity.ext;
    return [EXT_1, EXT_2].includes(ext);
  };
  return _objectSpread(_objectSpread({}, entityReducers), {}, {
    init: init,
    setPath: setPath,
    readFile: readFile,
    isImage: isImage
  });
};
var subtractionReducer = _globals.jest.fn(function (value1, value2) {
  return value1 - value2;
});
var mathUseCase = function mathUseCase() {
  var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
  var _options$extraValue = options.extraValue,
    extraValue = _options$extraValue === void 0 ? 0 : _options$extraValue;
  var add = function add(value1, value2) {
    return value1 + value2 + extraValue;
  };
  return {
    add: add,
    subtraction: subtractionReducer
  };
};
var fieldPathUseCase = function fieldPathUseCase() {
  return (0, _usecases.entityUseCase)();
};
var Child = function Child(_ref) {
  var _ref$textPrefix = _ref.textPrefix,
    textPrefix = _ref$textPrefix === void 0 ? '' : _ref$textPrefix,
    onUpdate = _ref.onUpdate,
    onPathChange = _ref.onPathChange,
    onUndefinedEntity = _ref.onUndefinedEntity;
  var _useUseCase = (0, _.useUseCase)(fileUseCase),
    _useUseCase2 = (0, _slicedToArray2["default"])(_useUseCase, 2),
    file = _useUseCase2[0],
    setPath = _useUseCase2[1].setPath;
  var _ref2 = file || {},
    path = _ref2.path,
    ext = _ref2.ext;
  var onClick = function onClick() {
    setPath(PATH_2);
  };
  var undefinedEntity = (0, _ahooks.useMemoizedFn)(function () {
    onUndefinedEntity === null || onUndefinedEntity === void 0 || onUndefinedEntity();
  });
  (0, _ahooks.useUpdateEffect)(function () {
    onUpdate === null || onUpdate === void 0 || onUpdate();
  });
  (0, _react2.useEffect)(function () {
    if (file === void 0) {
      undefinedEntity();
    }
  }, [file, undefinedEntity]);
  var pathChange = (0, _ahooks.useMemoizedFn)(function () {
    onPathChange === null || onPathChange === void 0 || onPathChange(path);
  });
  (0, _ahooks.useUpdateEffect)(pathChange, [path, pathChange]);
  return (0, _jsxRuntime.jsxs)("div", {
    children: [(0, _jsxRuntime.jsxs)("main", {
      children: ["child path: ", path, (0, _jsxRuntime.jsx)("br", {}), "child ext: ", ext]
    }), (0, _jsxRuntime.jsx)("footer", {
      children: (0, _jsxRuntime.jsx)("button", {
        onClick: onClick,
        children: textPrefix + CHILD_BUTTON_TEXT
      })
    })]
  });
};
var Parent = function Parent(_ref3) {
  var children = _ref3.children,
    onUpdate = _ref3.onUpdate,
    onSetPath = _ref3.onSetPath;
  var _useUseCase3 = (0, _.useUseCase)(defaultFile, fileUseCase),
    _useUseCase4 = (0, _slicedToArray2["default"])(_useUseCase3, 3),
    _useUseCase4$ = _useUseCase4[0],
    path = _useUseCase4$.path,
    ext = _useUseCase4$.ext,
    setPath = _useUseCase4[1].setPath,
    Provider = _useUseCase4[2];
  var onClick = function onClick() {
    setPath((onSetPath === null || onSetPath === void 0 ? void 0 : onSetPath()) || '');
  };
  (0, _ahooks.useUpdateEffect)(function () {
    onUpdate === null || onUpdate === void 0 || onUpdate();
  });
  return (0, _jsxRuntime.jsx)(Provider, {
    children: (0, _jsxRuntime.jsxs)("div", {
      children: [(0, _jsxRuntime.jsxs)("header", {
        children: ["parent path: ", path, (0, _jsxRuntime.jsx)("br", {}), "parent ext: ", ext]
      }), (0, _jsxRuntime.jsx)("main", {
        children: children
      }), (0, _jsxRuntime.jsx)("footer", {
        children: (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: PARENT_BUTTON_TEXT
        })
      })]
    })
  });
};
var MathParent = function MathParent(_ref4) {
  var _ref4$extraValue = _ref4.extraValue,
    extraValue = _ref4$extraValue === void 0 ? 0 : _ref4$extraValue,
    onUpdate = _ref4.onUpdate;
  var _useUseCase5 = (0, _.useUseCase)(mathUseCase, {
      extraValue: extraValue
    }, [extraValue]),
    add = _useUseCase5.add;
  var onClick = function onClick() {
    add(1, 2);
  };
  (0, _ahooks.useUpdateEffect)(function () {
    onUpdate === null || onUpdate === void 0 || onUpdate();
  });
  return (0, _jsxRuntime.jsx)("div", {
    children: (0, _jsxRuntime.jsx)("button", {
      onClick: onClick,
      children: PARENT_BUTTON_TEXT
    })
  });
};
var useDeepCompareUpdate = function useDeepCompareUpdate(callback, deps) {
  var isFirstRef = (0, _react2.useRef)(true);
  var memoizedCallback = (0, _ahooks.useMemoizedFn)(callback);
  var depsKey = (0, _useDepsKey.useDepsKey)(deps);
  (0, _react2.useEffect)(function () {
    return function () {
      isFirstRef.current = false;
    };
  });
  (0, _ahooks.useDeepCompareEffect)(function () {
    if (isFirstRef.current) {
      return;
    }
    memoizedCallback();
  }, [depsKey, memoizedCallback]);
};
(0, _globals.beforeEach)(function () {
  subtractionReducer.mockClear();
});
(0, _globals.describe)('useUseCase', function () {
  (0, _globals.describe)('`useUseCase` should work the same as `useRootCoreCollection`', function () {
    (0, _globals.test)('check context type', function () {
      var _renderHook = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook.result;
      var cores = result.current;
      (0, _globals.expect)(Array.isArray(cores)).toBe(true);
      (0, _globals.expect)(cores).toHaveLength(3);
    });
    (0, _globals.test)('`entity` should equal `defaultFile`', function () {
      var _renderHook2 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook2.result;
      var cores = result.current;
      var _cores = (0, _slicedToArray2["default"])(cores, 1),
        entity = _cores[0];
      (0, _globals.expect)(entity).toEqual(defaultFile);
    });
    (0, _globals.test)('Should return the `EntityStore.value` if root entity has not changed', function () {
      var _renderHook3 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook3.result;
      var collection = result.current;
      var _collection = (0, _slicedToArray2["default"])(collection, 2),
        setPath = _collection[1].setPath;
      (0, _react.act)(function () {
        setPath(PATH_1);
      });
      (0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1,
        ext: EXT_1
      }));
    });
    (0, _globals.test)('Should return the root entity if root entity has changed', function () {
      var file = defaultFile;
      var _renderHook4 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(file, fileUseCase);
        }),
        result = _renderHook4.result,
        rerender = _renderHook4.rerender;
      file = _objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_2
      });
      rerender();
      (0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_2
      }));
      // 渲染多一次,避免第二次渲染的 `entity` 没变化而取错缓存的情况
      rerender();
      (0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_2
      }));
    });
    (0, _globals.test)('Should return the root entity if root entity has changed even with entity state changed', function () {
      var file = defaultFile;
      var _renderHook5 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(file, fileUseCase);
        }),
        result = _renderHook5.result;
      var collection = result.current;
      var _collection2 = (0, _slicedToArray2["default"])(collection, 2),
        setPath = _collection2[1].setPath;
      (0, _react.act)(function () {
        file = _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_2
        });
        setPath(PATH_1);
      });
      (0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_2
      }));
    });
    (0, _globals.test)('Should support entity initializer', function () {
      var file = defaultFile;
      var _renderHook6 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(function () {
            return file;
          }, fileUseCase);
        }),
        result = _renderHook6.result;
      var _result$current = (0, _slicedToArray2["default"])(result.current, 1),
        currentFile = _result$current[0];
      (0, _globals.expect)(currentFile).toEqual(file);
    });
    (0, _globals.test)('Should support entity initializer with generator', function () {
      var file = defaultFile;
      var onChange = _globals.jest.fn();
      var _renderHook7 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(function () {
            var currentFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
            return /*#__PURE__*/_regenerator["default"].mark(function _callee3() {
              return _regenerator["default"].wrap(function (_context6) {
                while (1) switch (_context6.prev = _context6.next) {
                  case 0:
                    _context6.next = 1;
                    return _objectSpread(_objectSpread({}, currentFile), {}, {
                      size: 5000
                    });
                  case 1:
                  case "end":
                    return _context6.stop();
                }
              }, _callee3);
            })();
          }, fileUseCase, {
            onChange: onChange
          });
        }),
        result = _renderHook7.result;
      var _result$current2 = (0, _slicedToArray2["default"])(result.current, 1),
        currentFile = _result$current2[0];
      (0, _globals.expect)(currentFile).toEqual(_objectSpread(_objectSpread({}, file), {}, {
        size: 5000
      }));
      (0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
    });
    (0, _globals.test)('Should support entity initializer with async callback generator', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee7() {
      var file, onChange, onUpate, _Promise$withResolver, promise, resolve, _renderHook8, result, _result$current3, currentFile1, newFile1, newFile2, newFile3;
      return _regenerator["default"].wrap(function (_context0) {
        while (1) switch (_context0.prev = _context0.next) {
          case 0:
            file = defaultFile;
            onChange = _globals.jest.fn();
            onUpate = _globals.jest.fn();
            _Promise$withResolver = Promise.withResolvers(), promise = _Promise$withResolver.promise, resolve = _Promise$withResolver.resolve;
            _renderHook8 = (0, _react.renderHook)(function () {
              (0, _react2.useEffect)(function () {
                onUpate();
              });
              return (0, _.useUseCase)(function () {
                var entity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
                return /*#__PURE__*/_regenerator["default"].mark(function _callee5() {
                  var newEntity1, newEntity2;
                  return _regenerator["default"].wrap(function (_context8) {
                    while (1) switch (_context8.prev = _context8.next) {
                      case 0:
                        _context8.next = 1;
                        return _objectSpread(_objectSpread({}, entity), {}, {
                          size: 1
                        });
                      case 1:
                        newEntity1 = _context8.sent;
                        _context8.next = 2;
                        return _objectSpread(_objectSpread({}, newEntity1), {}, {
                          size: newEntity1.size + 1
                        });
                      case 2:
                        _context8.next = 3;
                        return /*#__PURE__*/function () {
                          var _ref0 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee4(currentEntity) {
                            return _regenerator["default"].wrap(function (_context7) {
                              while (1) switch (_context7.prev = _context7.next) {
                                case 0:
                                  _context7.next = 1;
                                  return promise;
                                case 1:
                                  return _context7.abrupt("return", _objectSpread(_objectSpread({}, currentEntity), {}, {
                                    size: currentEntity.size + 1
                                  }));
                                case 2:
                                case "end":
                                  return _context7.stop();
                              }
                            }, _callee4);
                          }));
                          return function (_x3) {
                            return _ref0.apply(this, arguments);
                          };
                        }();
                      case 3:
                        newEntity2 = _context8.sent;
                        _context8.next = 4;
                        return _objectSpread(_objectSpread({}, newEntity2), {}, {
                          size: newEntity2.size + 1
                        });
                      case 4:
                      case "end":
                        return _context8.stop();
                    }
                  }, _callee5);
                })();
              }, fileUseCase, {
                onChange: onChange
              });
            }), result = _renderHook8.result;
            _result$current3 = (0, _slicedToArray2["default"])(result.current, 1), currentFile1 = _result$current3[0];
            newFile1 = _objectSpread(_objectSpread({}, file), {}, {
              size: 2
            });
            (0, _globals.expect)(currentFile1).toEqual(newFile1);
            (0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
            (0, _globals.expect)(onUpate).toHaveBeenCalledTimes(1);
            _context0.next = 1;
            return (0, _react.act)(/*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee6() {
              return _regenerator["default"].wrap(function (_context9) {
                while (1) switch (_context9.prev = _context9.next) {
                  case 0:
                    resolve();
                    _context9.next = 1;
                    return promise;
                  case 1:
                  case "end":
                    return _context9.stop();
                }
              }, _callee6);
            })));
          case 1:
            newFile2 = _objectSpread(_objectSpread({}, file), {}, {
              size: 3
            });
            newFile3 = _objectSpread(_objectSpread({}, file), {}, {
              size: 4
            });
            (0, _globals.expect)(onChange).toHaveBeenCalledTimes(2);
            (0, _globals.expect)(onUpate).toHaveBeenCalledTimes(2);
            (0, _globals.expect)(onChange).toHaveBeenNthCalledWith(1, newFile2, newFile1);
            (0, _globals.expect)(onChange).toHaveBeenNthCalledWith(2, newFile3, newFile2);
          case 2:
          case "end":
            return _context0.stop();
        }
      }, _callee7);
    })));
    (0, _globals.test)('Entity initializer should provide the current entity', function () {
      var updateIndex = 0;
      var file = defaultFile;
      var onFile = _globals.jest.fn();
      var _renderHook9 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(function (currentFile) {
            onFile(currentFile);
            return currentFile !== null && currentFile !== void 0 ? currentFile : file;
          }, fileUseCase, {}, [updateIndex++]);
        }),
        result = _renderHook9.result;
      var _result$current4 = (0, _slicedToArray2["default"])(result.current, 2),
        setPath1 = _result$current4[1].setPath;
      (0, _globals.expect)(onFile).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onFile).toHaveBeenCalledWith(void 0);
      (0, _react.act)(function () {
        setPath1(PATH_1);
      });
      var _result$current5 = (0, _slicedToArray2["default"])(result.current, 2),
        setPath2 = _result$current5[1].setPath;
      (0, _globals.expect)(onFile).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(onFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, file), {}, {
        ext: EXT_1,
        path: PATH_1
      }));
      (0, _react.act)(function () {
        setPath2(PATH_2);
      });
      (0, _globals.expect)(onFile).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(onFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, file), {}, {
        ext: EXT_2,
        path: PATH_2
      }));
    });
    (0, _globals.test)('Do not update entity when the initializer has yielded some constant entity properties', function () {
      var updateIndex = 0;
      var _renderHook0 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(/*#__PURE__*/_regenerator["default"].mark(function _callee8() {
            return _regenerator["default"].wrap(function (_context1) {
              while (1) switch (_context1.prev = _context1.next) {
                case 0:
                  _context1.next = 1;
                  return defaultFile;
                case 1:
                  _context1.next = 2;
                  return {
                    path: PATH_1
                  };
                case 2:
                case "end":
                  return _context1.stop();
              }
            }, _callee8);
          }), fileUseCase, {}, [updateIndex++]);
        }),
        result = _renderHook0.result;
      var current1 = result.current;
      var _current = (0, _slicedToArray2["default"])(current1, 2),
        entity1 = _current[0],
        setEntity = _current[1].setEntity;
      (0, _globals.expect)(entity1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1
      }));
      (0, _react.act)(function () {
        setEntity({
          path: PATH_2
        });
      });
      var current2 = result.current;
      var _current2 = (0, _slicedToArray2["default"])(current2, 1),
        entity2 = _current2[0];
      (0, _globals.expect)(entity2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_2
      }));
    });
    (0, _globals.test)('Should update entity when the initializer has returned some cconstant entity properties after `setEntity`', function () {
      var updateIndex = 0;
      var _renderHook1 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(/*#__PURE__*/_regenerator["default"].mark(function _callee9() {
            return _regenerator["default"].wrap(function (_context10) {
              while (1) switch (_context10.prev = _context10.next) {
                case 0:
                  _context10.next = 1;
                  return defaultFile;
                case 1:
                  return _context10.abrupt("return", {
                    path: PATH_1
                  });
                case 2:
                case "end":
                  return _context10.stop();
              }
            }, _callee9);
          }), fileUseCase, {}, [updateIndex++]);
        }),
        result = _renderHook1.result;
      var current1 = result.current;
      var _current3 = (0, _slicedToArray2["default"])(current1, 2),
        entity1 = _current3[0],
        setEntity = _current3[1].setEntity;
      (0, _globals.expect)(entity1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1
      }));
      (0, _react.act)(function () {
        setEntity({
          path: PATH_2
        });
      });
      var current2 = result.current;
      var _current4 = (0, _slicedToArray2["default"])(current2, 1),
        entity2 = _current4[0];
      (0, _globals.expect)(entity2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1
      }));
    });
    (0, _globals.test)('Entity property accessors should be reserved in initializer', function () {
      var updateIndex = 0;
      var defaultFileWithAccessors = _objectSpread(_objectSpread({}, defaultFile), {}, {
        get text() {
          var path = this.path;
          return "xyz-".concat(path);
        }
      });
      var _renderHook10 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(/*#__PURE__*/_regenerator["default"].mark(function _callee0() {
            return _regenerator["default"].wrap(function (_context11) {
              while (1) switch (_context11.prev = _context11.next) {
                case 0:
                  _context11.next = 1;
                  return defaultFileWithAccessors;
                case 1:
                  _context11.next = 2;
                  return {
                    path: PATH_1
                  };
                case 2:
                case "end":
                  return _context11.stop();
              }
            }, _callee0);
          }), fileUseCase, {}, [updateIndex++]);
        }),
        result = _renderHook10.result;
      var current1 = result.current;
      var _current5 = (0, _slicedToArray2["default"])(current1, 2),
        entity1 = _current5[0],
        setEntity = _current5[1].setEntity;
      (0, _globals.expect)(entity1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1,
        text: "xyz-".concat(PATH_1)
      }));
      (0, _react.act)(function () {
        setEntity({
          path: PATH_2
        });
      });
      var current2 = result.current;
      var _current6 = (0, _slicedToArray2["default"])(current2, 1),
        entity2 = _current6[0];
      (0, _globals.expect)(entity2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_2,
        text: "xyz-".concat(PATH_2)
      }));
    });
    (0, _globals.test)('Entity property getter should always return the same object if nothing changed after component update', function () {
      var updateTimes = 0;
      var data = {
        x: 1,
        get obj() {
          return {};
        }
      };
      var _renderHook11 = (0, _react.renderHook)(function () {
          var collection = (0, _.useUseCase)(data, _usecases.entityUseCase);
          var _collection3 = (0, _slicedToArray2["default"])(collection, 1),
            obj = _collection3[0].obj;
          (0, _react2.useMemo)(function () {
            void obj;
            updateTimes++;
          }, [obj]);
          return collection;
        }),
        rerender = _renderHook11.rerender;
      (0, _globals.expect)(updateTimes).toEqual(1);
      (0, _react.act)(function () {
        rerender();
      });
      (0, _globals.expect)(updateTimes).toEqual(1);
    });
    (0, _globals.test)('Entity property getter should always return a new object if something changed after component update', function () {
      var updateTimes = 0;
      var data = {
        x: 1,
        get obj() {
          return {};
        }
      };
      var _renderHook12 = (0, _react.renderHook)(function () {
          var collection = (0, _.useUseCase)(data, _usecases.entityUseCase);
          var _collection4 = (0, _slicedToArray2["default"])(collection, 1),
            obj = _collection4[0].obj;
          (0, _react2.useMemo)(function () {
            void obj;
            updateTimes++;
          }, [obj]);
          return collection;
        }),
        result = _renderHook12.result;
      var current = result.current;
      var _current7 = (0, _slicedToArray2["default"])(current, 2),
        setEntity = _current7[1].setEntity;
      (0, _globals.expect)(updateTimes).toEqual(1);
      (0, _react.act)(function () {
        setEntity({
          x: 2
        });
      });
      (0, _globals.expect)(updateTimes).toEqual(2);
    });
    (0, _globals.test)('Entity initializer should provide the first argument with current entity when deps has change.', function () {
      var entityArg;
      var times = 0;
      var file = defaultFile;
      var _renderHook13 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(function () {
            var entity = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : file;
            var path = entity.path;
            entityArg = entity;
            return _objectSpread(_objectSpread({}, entity), {}, {
              path: path + '1'
            });
          }, fileUseCase, {}, [times++]);
        }),
        result = _renderHook13.result;
      var collection1 = result.current;
      var _collection5 = (0, _slicedToArray2["default"])(collection1, 2),
        currentFile1 = _collection5[0],
        setPath = _collection5[1].setPath;
      (0, _globals.expect)(entityArg).toEqual(defaultFile);
      (0, _globals.expect)(currentFile1).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: '1'
      }));
      (0, _react.act)(function () {
        setPath('2');
      });
      var collection2 = result.current;
      var _collection6 = (0, _slicedToArray2["default"])(collection2, 1),
        currentFile2 = _collection6[0];
      (0, _globals.expect)(entityArg).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: '2'
      }));
      (0, _globals.expect)(currentFile2).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: '21'
      }));
    });
    (0, _globals.test)('`reducers` should be returned as an object', function () {
      var _renderHook14 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook14.result;
      var cores = result.current;
      var _cores2 = (0, _slicedToArray2["default"])(cores, 2),
        reducers = _cores2[1];
      (0, _globals.expect)((0, _typeof2["default"])(reducers)).toBe('object');
    });
    (0, _globals.test)('`Provider` should be returned as a function', function () {
      var _renderHook15 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook15.result;
      var cores = result.current;
      var _cores3 = (0, _slicedToArray2["default"])(cores, 3),
        Provider = _cores3[2];
      (0, _globals.expect)((0, _typeof2["default"])(Provider)).toBe('function');
    });
    (0, _globals.test)('`usecase` should be called only once if deps has not provided', function () {
      var mockUseCase = _globals.jest.fn(fileUseCase);
      var _renderHook16 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, mockUseCase);
        }),
        result = _renderHook16.result,
        rerender = _renderHook16.rerender;
      var cores = result.current;
      var _cores4 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores4[1].setEntity;
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
      (0, _react.act)(function () {
        setEntity(_objectSpread({}, defaultFile));
      });
      rerender();
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('`usecase` should be called only once if deps has not changed', function () {
      var mockUseCase = _globals.jest.fn(fileUseCase);
      var _renderHook17 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [1, 'x']);
        }),
        result = _renderHook17.result,
        rerender = _renderHook17.rerender;
      var cores = result.current;
      var _cores5 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores5[1].setEntity;
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
      (0, _react.act)(function () {
        setEntity(_objectSpread({}, defaultFile));
      });
      rerender();
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('`usecase` should be called if deps has changed', function () {
      var i = 0;
      var mockUseCase = _globals.jest.fn(fileUseCase);
      var _renderHook18 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [i++, 'x']);
        }),
        result = _renderHook18.result,
        rerender = _renderHook18.rerender;
      var cores = result.current;
      var _cores6 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores6[1].setEntity;
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
      (0, _react.act)(function () {
        setEntity(_objectSpread({}, defaultFile));
      });
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
      rerender();
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(2);
    });
    (0, _globals.test)('after call non-generator reducer, it should not trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook19 = (0, _react.renderHook)(function () {
          var context = (0, _.useUseCase)(defaultFile, fileUseCase);
          var _context = (0, _slicedToArray2["default"])(context, 2),
            reducers = _context[1];
          var isImage = reducers.isImage;
          var update = (0, _ahooks.useUpdate)();
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [context]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [context]);
          return function (shouldUpdate) {
            isImage();
            if (!shouldUpdate) {
              return;
            }
            update();
          };
        }),
        result = _renderHook19.result;
      (0, _react.act)(function () {
        result.current();
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        result.current(true);
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
    });
    (0, _globals.test)('after `yield entity`, it should trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var _renderHook20 = (0, _react.renderHook)(function () {
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          });
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook20.result;
      var cores = result.current;
      var _cores7 = (0, _slicedToArray2["default"])(cores, 2),
        entity = _cores7[0],
        reducers = _cores7[1];
      var setPath = reducers.setPath,
        setEntity = reducers.setEntity;
      (0, _react.act)(function () {
        setPath(PATH_1);
        setEntity({
          size: 5000
        });
      });
      (0, _globals.expect)(result.current).not.toBe(cores);
      (0, _globals.expect)(result.current[0]).not.toBe(entity);
      (0, _globals.expect)(result.current[1]).not.toBe(reducers);
      (0, _globals.expect)(result.current[1].setPath).not.toBe(setPath);
      (0, _globals.expect)(result.current[0]).toEqual(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1,
        ext: EXT_1,
        size: 5000
      }));
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('after `yield entity` on async mode, it should trigger update', /*#__PURE__*/(0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee1() {
      var onUpdate, _renderHook21, result, cores, _cores8, entity, reducers, readFile, promise;
      return _regenerator["default"].wrap(function (_context12) {
        while (1) switch (_context12.prev = _context12.next) {
          case 0:
            onUpdate = _globals.jest.fn();
            _renderHook21 = (0, _react.renderHook)(function () {
              (0, _ahooks.useUpdateEffect)(function () {
                onUpdate();
              });
              return (0, _.useUseCase)(defaultFile, fileUseCase);
            }), result = _renderHook21.result;
            cores = result.current;
            _cores8 = (0, _slicedToArray2["default"])(cores, 2), entity = _cores8[0], reducers = _cores8[1];
            readFile = reducers.readFile;
            promise = (0, _react.act)(function () {
              return readFile(PATH_1);
            });
            (0, _globals.expect)(result.current).toBe(cores);
            (0, _globals.expect)(result.current).toEqual(cores);
            (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
            _context12.next = 1;
            return promise;
          case 1:
            (0, _globals.expect)(result.current[0]).not.toBe(entity);
            (0, _globals.expect)(result.current[1]).not.toBe(reducers);
            (0, _globals.expect)(result.current[1].readFile).not.toBe(readFile);
            (0, _globals.expect)(result.current[0].path).toBe(PATH_1);
            (0, _globals.expect)(result.current[0].ext).toBe(EXT_1);
            (0, _globals.expect)(result.current[0].size).toBe(2000);
            (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
          case 2:
          case "end":
            return _context12.stop();
        }
      }, _callee1);
    })));
    (0, _globals.test)('after `yield entity` callbacks, it should trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var _renderHook22 = (0, _react.renderHook)(function () {
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          });
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook22.result;
      var cores = result.current;
      var _cores9 = (0, _slicedToArray2["default"])(cores, 2),
        reducers = _cores9[1];
      var init = reducers.init;
      (0, _react.act)(function () {
        init(_objectSpread(_objectSpread({}, defaultFile), {}, {
          size: 5000
        }));
      });
      (0, _globals.expect)(result.current[0].size).toBe(5000);
      (0, _globals.expect)(result.current[1]).not.toBe(reducers);
      (0, _globals.expect)(result.current[1].init).not.toBe(init);
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('reducer call should be cached if component is at rendering phase', function () {
      var buttonText = 'button';
      var addReducer = _globals.jest.fn(function (entity, substring) {
        return entity + substring;
      });
      var stringUseCase = function stringUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          add: addReducer
        });
      };
      var CacheTestComponent = function CacheTestComponent() {
        var _useUseCase6 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase7 = (0, _slicedToArray2["default"])(_useUseCase6, 2),
          add = _useUseCase7[1].add;
        var update = (0, _ahooks.useUpdate)();
        var onClick = function onClick() {
          update();
        };
        add('x');
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: buttonText
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('x');
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('reducer call should not be cached if component is not at rendering phase', function () {
      var buttonText = 'button';
      var addReducer = _globals.jest.fn(function (entity, substring) {
        return entity + substring;
      });
      var stringUseCase = function stringUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          add: addReducer
        });
      };
      var CacheTestComponent = function CacheTestComponent() {
        var _useUseCase8 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase9 = (0, _slicedToArray2["default"])(_useUseCase8, 2),
          add = _useUseCase9[1].add;
        var onClick = function onClick() {
          add('x');
        };
        (0, _ahooks.useMount)(function () {
          add('x');
          add('x');
        });
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: buttonText
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(1, '', 'x');
      (0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
    });
    (0, _globals.test)('reducer call should not be cached if entity or parameters have changed', function () {
      var count = 0;
      var addedText = 'x';
      var setButtonText = 'button';
      var updateButtonText = 'update';
      var addReducer = _globals.jest.fn(function (entity, substring) {
        return entity + substring;
      });
      var stringUseCase = function stringUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          add: addReducer
        });
      };
      var CacheTestComponent = function CacheTestComponent() {
        var _useUseCase0 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase1 = (0, _slicedToArray2["default"])(_useUseCase0, 2),
          _useUseCase1$ = _useUseCase1[1],
          add = _useUseCase1$.add,
          setEntity = _useUseCase1$.setEntity;
        var update = (0, _ahooks.useUpdate)();
        add(addedText);
        var onSet = function onSet() {
          setEntity("".concat(count++));
        };
        var onUpdate = function onUpdate() {
          update();
        };
        return (0, _jsxRuntime.jsxs)("div", {
          children: [(0, _jsxRuntime.jsx)("button", {
            onClick: onSet,
            children: setButtonText
          }), (0, _jsxRuntime.jsx)("button", {
            onClick: onUpdate,
            children: updateButtonText
          })]
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
      _dom.fireEvent.click(_dom.screen.getByText(setButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
      addedText = 'y';
      _dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
      _dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
    });
    (0, _globals.test)('`options.onChange` should be trigger when entity has changed', function () {
      var onChange = _globals.jest.fn();
      var _renderHook23 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            onChange: onChange
          });
        }),
        result = _renderHook23.result;
      var cores = result.current;
      var _cores0 = (0, _slicedToArray2["default"])(cores, 2),
        reducers = _cores0[1];
      var setPath = reducers.setPath;
      (0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        setPath(PATH_1);
      });
      (0, _globals.expect)(onChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onChange).toHaveBeenLastCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1,
        ext: EXT_1
      }), defaultFile);
    });
    (0, _globals.test)('`options.onChange` should always trigger the latest one', function () {
      var onChange1 = _globals.jest.fn();
      var onChange2 = _globals.jest.fn();
      var onChange = onChange1;
      var _renderHook24 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            onChange: onChange
          }, []);
        }),
        result = _renderHook24.result;
      var cores = result.current;
      var _cores1 = (0, _slicedToArray2["default"])(cores, 2),
        reducers = _cores1[1];
      var setPath = reducers.setPath;
      (0, _globals.expect)(onChange1).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        setPath(PATH_1);
        onChange = onChange2;
      });
      (0, _globals.expect)(onChange2).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onChange1).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onChange1).toHaveBeenLastCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1,
        ext: EXT_1
      }), defaultFile);
      (0, _react.act)(function () {
        setPath(PATH_2);
      });
      (0, _globals.expect)(onChange1).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onChange2).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onChange2).toHaveBeenLastCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_2,
        ext: EXT_2
      }), _objectSpread(_objectSpread({}, defaultFile), {}, {
        path: PATH_1,
        ext: EXT_1
      }));
    });
    (0, _globals.test)('`options.options` should override rest options', function () {
      var _renderHook25 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            pathPrefix: 'xyz/',
            options: {
              pathPrefix: '123/'
            }
          });
        }),
        result = _renderHook25.result;
      var cores = result.current;
      var _cores10 = (0, _slicedToArray2["default"])(cores, 2),
        path = _cores10[0].path,
        reducers = _cores10[1];
      var setPath = reducers.setPath;
      (0, _globals.expect)(path).toBe('');
      (0, _react.act)(function () {
        setPath(PATH_1);
      });
      (0, _globals.expect)(result.current[0].path).toBe('123/' + PATH_1);
    });
    (0, _globals.test)('Option functions: use `T` (not `S`) when `S extends T`', function () {
      var testUseCase = function testUseCase() {
        var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
        var entityReducers = (0, _usecases.entityUseCase)();
        void options;
        return _objectSpread({}, entityReducers);
      };
      (0, _react.renderHook)(function () {
        (0, _.useUseCase)(defaultFile, testUseCase, {
          onUpdate: function onUpdate(data) {
            void data;
            return Promise.reject();
          }
        });
      });
      // 这个测试仅仅是为了确保类型不会报错,不验证实际逻辑
      (0, _globals.expect)(1).toBe(1);
    });
    (0, _globals.test)('when `options` has changed, it should not trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook26 = (0, _react.renderHook)(function () {
          var _useState = (0, _react2.useState)('user/'),
            _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
            pathPrefix = _useState2[0],
            setPathPrefix = _useState2[1];
          var context = (0, _.useUseCase)(defaultFile, fileUseCase, {
            pathPrefix: pathPrefix
          });
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [context]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [context]);
          return setPathPrefix;
        }),
        result = _renderHook26.result;
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        result.current('my/');
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
    });
    (0, _globals.test)('when `deps` has changed, it should trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook27 = (0, _react.renderHook)(function () {
          var _useState3 = (0, _react2.useState)('user/'),
            _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
            pathPrefix = _useState4[0],
            setPathPrefix = _useState4[1];
          var context = (0, _.useUseCase)(defaultFile, fileUseCase, {
            pathPrefix: pathPrefix
          }, [pathPrefix]);
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [context]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [context]);
          return setPathPrefix;
        }),
        result = _renderHook27.result;
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        result.current('my/');
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('empty `deps` should not trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook28 = (0, _react.renderHook)(function () {
          var _useState5 = (0, _react2.useState)('user/'),
            _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
            pathPrefix = _useState6[0],
            setPathPrefix = _useState6[1];
          var context = (0, _.useUseCase)(defaultFile, fileUseCase, {
            pathPrefix: pathPrefix
          }, []);
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [context]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [context]);
          return setPathPrefix;
        }),
        result = _renderHook28.result;
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        result.current('my/');
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
    });
    (0, _globals.test)("should call latest functions of usecase options even deps has not change", function () {
      var onPathChange1 = _globals.jest.fn();
      var onPathChange2 = _globals.jest.fn();
      var onPathChange = onPathChange1;
      var _renderHook29 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            onPathChange: onPathChange
          });
        }),
        result = _renderHook29.result;
      var context = result.current;
      var _context2 = (0, _slicedToArray2["default"])(context, 2),
        setPath = _context2[1].setPath;
      (0, _react.act)(function () {
        setPath(PATH_1);
        onPathChange = onPathChange2;
      });
      (0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange2).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onPathChange1).toHaveBeenLastCalledWith(PATH_1, '');
      (0, _react.act)(function () {
        setPath(PATH_2);
      });
      (0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange2).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange2).toHaveBeenLastCalledWith(PATH_2, PATH_1);
    });
    (0, _globals.test)('`options.watch` should be trigger after entity changed', function () {
      var onPathChange = _globals.jest.fn();
      var onSizeChange = _globals.jest.fn();
      var _renderHook30 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            watch: {
              path: onPathChange,
              size: onSizeChange
            }
          });
        }),
        result = _renderHook30.result;
      var cores = result.current;
      var _cores11 = (0, _slicedToArray2["default"])(cores, 2),
        setPath = _cores11[1].setPath;
      (0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        setPath(PATH_1);
      });
      (0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
        fieldPaths: ['path'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_1,
          ext: EXT_1
        }),
        oldEntity: defaultFile,
        newValue: PATH_1,
        oldValue: ''
      });
    });
    (0, _globals.test)('`options.watch` should be trigger after update entity by entity initializer', function () {
      var onPathChange = _globals.jest.fn();
      var _renderHook31 = (0, _react.renderHook)(function () {
          var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
          return (0, _.useUseCase)(function () {
            var currentFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
            return _objectSpread(_objectSpread({}, currentFile), {}, {
              path: path
            });
          }, fileUseCase, {
            watch: {
              path: onPathChange
            }
          }, [path]);
        }),
        rerender = _renderHook31.rerender;
      (0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        rerender(PATH_1);
      });
      (0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
        fieldPaths: ['path'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_1
        }),
        oldEntity: defaultFile,
        newValue: PATH_1,
        oldValue: ''
      });
      (0, _react.act)(function () {
        rerender(PATH_2);
      });
      (0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
        fieldPaths: ['path'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_2
        }),
        oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_1
        }),
        newValue: PATH_2,
        oldValue: PATH_1
      });
    });
    (0, _globals.test)('`options.watch` should be trigger after update entity by entity initializer at child component', function () {
      var onPathChange = _globals.jest.fn();
      var TestChild = function TestChild() {
        (0, _.useUseCase)(fileUseCase, {
          watch: {
            path: onPathChange
          }
        });
        return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
      };
      var TestParent = function TestParent(_ref5) {
        var file = _ref5.file;
        var path = file.path;
        var _useUseCase10 = (0, _.useUseCase)(function () {
            var currentFile = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : defaultFile;
            return _objectSpread(_objectSpread({}, currentFile), {}, {
              path: path
            });
          }, fileUseCase, {}, [path]),
          _useUseCase11 = (0, _slicedToArray2["default"])(_useUseCase10, 3),
          Provider = _useUseCase11[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(TestChild, {})
        });
      };
      var _render = (0, _react.render)((0, _jsxRuntime.jsx)(TestParent, {
          file: _objectSpread({}, defaultFile)
        })),
        rerender = _render.rerender;
      (0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        rerender((0, _jsxRuntime.jsx)(TestParent, {
          file: _objectSpread(_objectSpread({}, defaultFile), {}, {
            path: PATH_1
          })
        }));
      });
      (0, _globals.expect)(onPathChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
        fieldPaths: ['path'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_1
        }),
        oldEntity: defaultFile,
        newValue: PATH_1,
        oldValue: ''
      });
      (0, _react.act)(function () {
        rerender((0, _jsxRuntime.jsx)(TestParent, {
          file: _objectSpread(_objectSpread({}, defaultFile), {}, {
            path: PATH_2
          })
        }));
      });
      (0, _globals.expect)(onPathChange).toHaveBeenLastCalledWith({
        fieldPaths: ['path'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_2
        }),
        oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_1
        }),
        newValue: PATH_2,
        oldValue: PATH_1
      });
    });
    (0, _globals.test)('`options.watch` should trigger the latest one', function () {
      var onPathChange1 = _globals.jest.fn();
      var onPathChange2 = _globals.jest.fn();
      var onPathChange = onPathChange1;
      var _renderHook32 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            watch: {
              path: onPathChange
            }
          });
        }),
        result = _renderHook32.result;
      var cores = result.current;
      var _cores12 = (0, _slicedToArray2["default"])(cores, 2),
        _cores12$ = _cores12[1],
        setPath = _cores12$.setPath,
        setEntity = _cores12$.setEntity;
      (0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        setPath(PATH_1);
        setEntity({
          size: 5000
        });
        onPathChange = onPathChange2;
      });
      (0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange1).toHaveBeenLastCalledWith({
        fieldPaths: ['path'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_1,
          ext: EXT_1
        }),
        oldEntity: defaultFile,
        newValue: PATH_1,
        oldValue: ''
      });
      (0, _react.act)(function () {
        setPath('');
      });
      (0, _globals.expect)(onPathChange1).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange2).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange2).toHaveBeenLastCalledWith({
        fieldPaths: ['path'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          size: 5000
        }),
        oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          path: PATH_1,
          ext: EXT_1,
          size: 5000
        }),
        newValue: '',
        oldValue: PATH_1
      });
    });
    (0, _globals.test)('`options.watch` should work with array field path of array', function () {
      var initialData = {};
      var onExtChange = _globals.jest.fn();
      var onSizeChange = _globals.jest.fn();
      var _renderHook33 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(initialData, fieldPathUseCase, {
            watch: {
              'list.ext': onExtChange,
              'list.size': onSizeChange
            }
          });
        }),
        result = _renderHook33.result;
      var cores = result.current;
      var _cores13 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores13[1].setEntity;
      (0, _react.act)(function () {
        setEntity({
          list: [defaultFile]
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
        fieldPaths: ['list', '0', 'ext'],
        newEntity: {
          list: [defaultFile]
        },
        oldEntity: {},
        newValue: '',
        oldValue: void 0
      });
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledWith({
        fieldPaths: ['list', '0', 'size'],
        newEntity: {
          list: [defaultFile]
        },
        oldEntity: {},
        newValue: 0,
        oldValue: void 0
      });
      (0, _react.act)(function () {
        setEntity({
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          })]
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
        fieldPaths: ['list', '0', 'ext'],
        newEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          })]
        },
        oldEntity: {
          list: [defaultFile]
        },
        newValue: EXT_1,
        oldValue: ''
      });
      (0, _react.act)(function () {
        setEntity({
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          })]
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
        fieldPaths: ['list', '1', 'ext'],
        newEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          })]
        },
        oldEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          })]
        },
        newValue: EXT_2,
        oldValue: void 0
      });
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledWith({
        fieldPaths: ['list', '1', 'size'],
        newEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          })]
        },
        oldEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          })]
        },
        newValue: 0,
        oldValue: void 0
      });
      (0, _react.act)(function () {
        setEntity({
          nestedList: []
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(2);
      (0, _react.act)(function () {
        setEntity(function () {
          return {
            list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
              ext: EXT_2
            }), _objectSpread(_objectSpread({}, defaultFile), {}, {
              ext: EXT_1
            }), defaultFile]
          };
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(6);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(4, {
        fieldPaths: ['list', '0', 'ext'],
        newEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile],
          nestedList: []
        },
        oldEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          })],
          nestedList: []
        },
        newValue: EXT_2,
        oldValue: EXT_1
      });
      (0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(5, {
        fieldPaths: ['list', '1', 'ext'],
        newEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile],
          nestedList: []
        },
        oldEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          })],
          nestedList: []
        },
        newValue: EXT_1,
        oldValue: EXT_2
      });
      (0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(6, {
        fieldPaths: ['list', '2', 'ext'],
        newEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile],
          nestedList: []
        },
        oldEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          })],
          nestedList: []
        },
        newValue: '',
        oldValue: void 0
      });
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledWith({
        fieldPaths: ['list', '2', 'size'],
        newEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile],
          nestedList: []
        },
        oldEntity: {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          })],
          nestedList: []
        },
        newValue: 0,
        oldValue: void 0
      });
      (0, _react.act)(function () {
        setEntity(function () {
          return {
            list: []
          };
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(9);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(6);
      var newEntity1 = {
        list: [],
        nestedList: []
      };
      (0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(7, {
        fieldPaths: ['list', '0', 'ext'],
        newEntity: newEntity1,
        oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile]
        }),
        newValue: void 0,
        oldValue: EXT_2
      });
      (0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(8, {
        fieldPaths: ['list', '1', 'ext'],
        newEntity: newEntity1,
        oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile]
        }),
        newValue: void 0,
        oldValue: EXT_1
      });
      (0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(9, {
        fieldPaths: ['list', '2', 'ext'],
        newEntity: newEntity1,
        oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile]
        }),
        newValue: void 0,
        oldValue: ''
      });
      (0, _globals.expect)(onSizeChange).toHaveBeenNthCalledWith(4, {
        fieldPaths: ['list', '0', 'size'],
        newEntity: newEntity1,
        oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile]
        }),
        newValue: void 0,
        oldValue: 0
      });
      (0, _globals.expect)(onSizeChange).toHaveBeenNthCalledWith(5, {
        fieldPaths: ['list', '1', 'size'],
        newEntity: newEntity1,
        oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile]
        }),
        newValue: void 0,
        oldValue: 0
      });
      (0, _globals.expect)(onSizeChange).toHaveBeenNthCalledWith(6, {
        fieldPaths: ['list', '2', 'size'],
        newEntity: newEntity1,
        oldEntity: _objectSpread(_objectSpread({}, newEntity1), {}, {
          list: [_objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_2
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            ext: EXT_1
          }), defaultFile]
        }),
        newValue: void 0,
        oldValue: 0
      });
    });
    (0, _globals.test)('`options.watch` should work with field path of array length', function () {
      var defaultList = [];
      var onEntityLengthChange = _globals.jest.fn();
      var onListLengthChange = _globals.jest.fn();
      var lengthUseCase = function lengthUseCase() {
        return (0, _usecases.entityUseCase)();
      };
      var _renderHook34 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultList, lengthUseCase, {
            watch: {
              length: onEntityLengthChange,
              'list.length': onListLengthChange
            }
          });
        }),
        result = _renderHook34.result;
      var cores = result.current;
      var _cores14 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores14[1].setEntity;
      (0, _globals.expect)(onEntityLengthChange).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onListLengthChange).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        setEntity([{
          list: [defaultFile, defaultFile]
        }]);
      });
      (0, _globals.expect)(onEntityLengthChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onListLengthChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onEntityLengthChange).toHaveBeenCalledWith({
        fieldPaths: ['length'],
        newEntity: [{
          list: [defaultFile, defaultFile]
        }],
        oldEntity: [],
        newValue: 1,
        oldValue: 0
      });
      (0, _globals.expect)(onListLengthChange).toHaveBeenCalledWith({
        fieldPaths: ['0', 'list', 'length'],
        newEntity: [{
          list: [defaultFile, defaultFile]
        }],
        oldEntity: [],
        newValue: 2,
        oldValue: void 0
      });
    });
    (0, _globals.test)('`options.watch` should work with field path of nested array', function () {
      var initialData = {};
      var onChange = _globals.jest.fn();
      var _renderHook35 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(initialData, fieldPathUseCase, {
            watch: {
              'nestedList.size': onChange
            }
          });
        }),
        result = _renderHook35.result;
      var cores = result.current;
      var _cores15 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores15[1].setEntity;
      (0, _globals.expect)(onChange).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        setEntity({
          nestedList: [[[defaultFile]]]
        });
      });
      (0, _globals.expect)(onChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onChange).toHaveBeenCalledWith({
        fieldPaths: ['nestedList', '0', '0', '0', 'size'],
        newEntity: {
          nestedList: [[[defaultFile]]]
        },
        oldEntity: {},
        newValue: 0,
        oldValue: void 0
      });
      (0, _react.act)(function () {
        setEntity({
          nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 100
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 200
          })]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 300
          })]]]
        });
      });
      (0, _globals.expect)(onChange).toHaveBeenCalledTimes(4);
      (0, _globals.expect)(onChange).toHaveBeenNthCalledWith(2, {
        fieldPaths: ['nestedList', '0', '0', '0', 'size'],
        newEntity: {
          nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 100
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 200
          })]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 300
          })]]]
        },
        oldEntity: {
          nestedList: [[[defaultFile]]]
        },
        newValue: 100,
        oldValue: 0
      });
      (0, _globals.expect)(onChange).toHaveBeenNthCalledWith(3, {
        fieldPaths: ['nestedList', '0', '0', '1', 'size'],
        newEntity: {
          nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 100
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 200
          })]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 300
          })]]]
        },
        oldEntity: {
          nestedList: [[[defaultFile]]]
        },
        newValue: 200,
        oldValue: void 0
      });
      (0, _globals.expect)(onChange).toHaveBeenNthCalledWith(4, {
        fieldPaths: ['nestedList', '1', '0', '0', 'size'],
        newEntity: {
          nestedList: [[[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 100
          }), _objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 200
          })]], [[_objectSpread(_objectSpread({}, defaultFile), {}, {
            size: 300
          })]]]
        },
        oldEntity: {
          nestedList: [[[defaultFile]]]
        },
        newValue: 300,
        oldValue: void 0
      });
    });
    (0, _globals.test)('`options.watch` should work with field path of object', function () {
      var initialData = {};
      var onExtChange = _globals.jest.fn();
      var onSizeChange = _globals.jest.fn();
      var _renderHook36 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(initialData, fieldPathUseCase, {
            watch: {
              'obj.file.ext': onExtChange,
              'obj.file.size': onSizeChange
            }
          });
        }),
        result = _renderHook36.result;
      var cores = result.current;
      var _cores16 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores16[1].setEntity;
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        setEntity({
          obj: {
            file: {
              ext: EXT_1
            }
          }
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
        fieldPaths: ['obj', 'file', 'ext'],
        newEntity: {
          obj: {
            file: {
              ext: EXT_1
            }
          }
        },
        oldEntity: {},
        newValue: EXT_1,
        oldValue: void 0
      });
      (0, _react.act)(function () {
        setEntity(function () {
          return {
            obj: {
              file: {}
            }
          };
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
        fieldPaths: ['obj', 'file', 'ext'],
        newEntity: {
          obj: {
            file: {}
          }
        },
        oldEntity: {
          obj: {
            file: {
              ext: EXT_1
            }
          }
        },
        newValue: void 0,
        oldValue: EXT_1
      });
    });
    (0, _globals.test)('multiple `Provider` should work', function () {
      var onNumberMount = _globals.jest.fn();
      var onStringMount = _globals.jest.fn();
      var onBooleanMount = _globals.jest.fn();
      var numberUseCase = function numberUseCase() {
        return (0, _usecases.entityUseCase)();
      };
      var stringUseCase = function stringUseCase() {
        return (0, _usecases.entityUseCase)();
      };
      var booleanUseCase = function booleanUseCase() {
        return (0, _usecases.entityUseCase)();
      };
      var TestChildComponent = function TestChildComponent() {
        var _useUseCase12 = (0, _.useUseCase)(numberUseCase),
          _useUseCase13 = (0, _slicedToArray2["default"])(_useUseCase12, 1),
          numberValue = _useUseCase13[0];
        var _useUseCase14 = (0, _.useUseCase)(stringUseCase),
          _useUseCase15 = (0, _slicedToArray2["default"])(_useUseCase14, 1),
          stringValue = _useUseCase15[0];
        var _useUseCase16 = (0, _.useUseCase)(booleanUseCase),
          _useUseCase17 = (0, _slicedToArray2["default"])(_useUseCase16, 1),
          booleanValue = _useUseCase17[0];
        (0, _ahooks.useMount)(function () {
          onNumberMount(numberValue);
          onStringMount(stringValue);
          onBooleanMount(booleanValue);
        });
        return null;
      };
      var TestParentComponent = function TestParentComponent() {
        var _useUseCase18 = (0, _.useUseCase)(11, numberUseCase),
          _useUseCase19 = (0, _slicedToArray2["default"])(_useUseCase18, 3),
          NumberProvider = _useUseCase19[2];
        var _useUseCase20 = (0, _.useUseCase)('hello', stringUseCase),
          _useUseCase21 = (0, _slicedToArray2["default"])(_useUseCase20, 3),
          StringProvider = _useUseCase21[2];
        var _useUseCase22 = (0, _.useUseCase)(true, booleanUseCase),
          _useUseCase23 = (0, _slicedToArray2["default"])(_useUseCase22, 3),
          BooleanProvider = _useUseCase23[2];
        return (0, _jsxRuntime.jsx)(NumberProvider, {
          "with": [StringProvider, BooleanProvider],
          children: (0, _jsxRuntime.jsx)(TestChildComponent, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(TestParentComponent, {}));
      (0, _globals.expect)(onNumberMount).toHaveBeenCalledWith(11);
      (0, _globals.expect)(onStringMount).toHaveBeenCalledWith('hello');
      (0, _globals.expect)(onBooleanMount).toHaveBeenCalledWith(true);
    });
    (0, _globals.test)('`bindEntity` should be called when component mount', function () {
      var bindEntity = _globals.jest.fn(function (entity) {
        void entity;
      });
      var testUseCase = function testUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          bindEntity: bindEntity
        });
      };
      (0, _react.renderHook)(function () {
        var _useUseCase24 = (0, _.useUseCase)(5, testUseCase),
          _useUseCase25 = (0, _slicedToArray2["default"])(_useUseCase24, 2),
          setEntity = _useUseCase25[1].setEntity;
        (0, _ahooks.useMount)(function () {
          setEntity(100);
        });
      });
      (0, _globals.expect)(bindEntity).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(bindEntity).toHaveBeenCalledWith(5);
    });
    (0, _globals.test)('`unbindEntity` should be called when component unmount', function () {
      var unbindEntity = _globals.jest.fn(function (entity) {
        void entity;
      });
      var testUseCase = function testUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          unbindEntity: unbindEntity
        });
      };
      var _renderHook37 = (0, _react.renderHook)(function () {
          var _useUseCase26 = (0, _.useUseCase)(5, testUseCase),
            _useUseCase27 = (0, _slicedToArray2["default"])(_useUseCase26, 2),
            setEntity = _useUseCase27[1].setEntity;
          (0, _ahooks.useMount)(function () {
            setEntity(100);
          });
        }),
        unmount = _renderHook37.unmount;
      (0, _globals.expect)(unbindEntity).toHaveBeenCalledTimes(0);
      unmount();
      (0, _globals.expect)(unbindEntity).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(unbindEntity).toHaveBeenCalledWith(100);
    });
  });
  (0, _globals.describe)('`useUseCase` should work the same as `useContextualCoreCollection`', function () {
    (0, _globals.test)('Provider should be returned in child component', function () {
      var onCore = _globals.jest.fn();
      var TestChild = function TestChild() {
        var core = (0, _.useUseCase)(fileUseCase);
        var length = core.length;
        var _core = (0, _slicedToArray2["default"])(core, 3),
          file = _core[0],
          Provider = _core[2];
        (0, _react2.useEffect)(function () {
          onCore(file, length, (0, _typeof2["default"])(Provider));
        });
        return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
      };
      var TestParent = function TestParent() {
        var _useUseCase28 = (0, _.useUseCase)(function () {
            return _objectSpread(_objectSpread({}, defaultFile), {}, {
              ext: EXT_1
            });
          }, fileUseCase),
          _useUseCase29 = (0, _slicedToArray2["default"])(_useUseCase28, 3),
          Provider = _useUseCase29[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(TestChild, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(TestParent, {}));
      (0, _globals.expect)(onCore).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        ext: EXT_1
      }), 3, 'function');
    });
    (0, _globals.test)('Provider should work in child component or popup component', function () {
      var onChange = _globals.jest.fn();
      var onRootFile = _globals.jest.fn();
      var onPopupFile = _globals.jest.fn();
      var buttonText = 'button';
      var Popup = function Popup() {
        var _useUseCase30 = (0, _.useUseCase)(fileUseCase),
          _useUseCase31 = (0, _slicedToArray2["default"])(_useUseCase30, 2),
          file = _useUseCase31[0],
          setEntity = _useUseCase31[1].setEntity;
        var onClick = function onClick() {
          setEntity({
            ext: EXT_2
          });
        };
        (0, _react2.useEffect)(function () {
          onPopupFile(file);
        }, [file]);
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: buttonText
        });
      };
      var TestChild = function TestChild() {
        var _useUseCase32 = (0, _.useUseCase)(fileUseCase),
          _useUseCase33 = (0, _slicedToArray2["default"])(_useUseCase32, 3),
          Provider = _useUseCase33[2];
        return (0, _reactDom.createPortal)((0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(Popup, {})
        }), document.body);
      };
      var TestParent = function TestParent() {
        var _useUseCase34 = (0, _.useUseCase)(function () {
            return _objectSpread(_objectSpread({}, defaultFile), {}, {
              ext: EXT_1
            });
          }, fileUseCase, {
            onChange: onChange
          }),
          _useUseCase35 = (0, _slicedToArray2["default"])(_useUseCase34, 3),
          file = _useUseCase35[0],
          Provider = _useUseCase35[2];
        (0, _react2.useEffect)(function () {
          onRootFile(file);
        }, [file]);
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(TestChild, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(TestParent, {}));
      (0, _globals.expect)(onRootFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        ext: EXT_1
      }));
      (0, _globals.expect)(onPopupFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        ext: EXT_1
      }));
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(onRootFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        ext: EXT_2
      }));
      (0, _globals.expect)(onPopupFile).toHaveBeenCalledWith(_objectSpread(_objectSpread({}, defaultFile), {}, {
        ext: EXT_2
      }));
    });
    (0, _globals.test)('Should trigger Parent & Child to update', function () {
      var onParentUpdate = _globals.jest.fn();
      var onChildUpdate = _globals.jest.fn();
      var onPathChange = _globals.jest.fn();
      var onUndefinedEntity = _globals.jest.fn();
      var onSetPath = _globals.jest.fn(function () {
        return PATH_1;
      });
      (0, _react.render)((0, _jsxRuntime.jsx)("div", {
        children: (0, _jsxRuntime.jsx)(Parent, {
          onSetPath: onSetPath,
          onUpdate: onParentUpdate,
          children: (0, _jsxRuntime.jsx)(Child, {
            onUpdate: onChildUpdate,
            onPathChange: onPathChange,
            onUndefinedEntity: onUndefinedEntity
          })
        })
      }));
      _dom.fireEvent.click(_dom.screen.getByText(PARENT_BUTTON_TEXT));
      (0, _globals.expect)(onSetPath).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onParentUpdate).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onChildUpdate).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onPathChange).toHaveBeenCalledWith(PATH_1);
      _dom.fireEvent.click(_dom.screen.getByText(CHILD_BUTTON_TEXT));
      (0, _globals.expect)(onSetPath).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onParentUpdate).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(onChildUpdate).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(onPathChange).toHaveBeenCalledWith(PATH_2);
      (0, _globals.expect)(onUndefinedEntity).toHaveBeenCalledTimes(0);
    });
    (0, _globals.test)('`usecase` should not be called at child component', function () {
      var mockUseCase = _globals.jest.fn(fileUseCase);
      var A = function A() {
        (0, _.useUseCase)(mockUseCase);
        return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
      };
      var B = function B() {
        var _useUseCase36 = (0, _.useUseCase)(defaultFile, mockUseCase),
          _useUseCase37 = (0, _slicedToArray2["default"])(_useUseCase36, 3),
          Provider = _useUseCase37[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('reducer call should be cached if component is at rendering phase in child components', function () {
      var buttonText = 'button';
      var addReducer = _globals.jest.fn(function (entity, substring) {
        return entity + substring;
      });
      var stringUseCase = function stringUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          add: addReducer
        });
      };
      var A = function A() {
        var _useUseCase38 = (0, _.useUseCase)(stringUseCase),
          _useUseCase39 = (0, _slicedToArray2["default"])(_useUseCase38, 2),
          add = _useUseCase39[1].add;
        var update = (0, _ahooks.useUpdate)();
        var onClick = function onClick() {
          update();
        };
        add('x');
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: buttonText
        });
      };
      var B = function B() {
        var _useUseCase40 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase41 = (0, _slicedToArray2["default"])(_useUseCase40, 3),
          Provider = _useUseCase41[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('x');
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('reducer call should not be cached if component is not at rendering phase in child components', function () {
      var buttonText = 'button';
      var addReducer = _globals.jest.fn(function (entity, substring) {
        return entity + substring;
      });
      var stringUseCase = function stringUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          add: addReducer
        });
      };
      var A = function A() {
        var _useUseCase42 = (0, _.useUseCase)(stringUseCase),
          _useUseCase43 = (0, _slicedToArray2["default"])(_useUseCase42, 2),
          add = _useUseCase43[1].add;
        var onClick = function onClick() {
          add('x');
        };
        (0, _ahooks.useMount)(function () {
          add('x');
          add('x');
        });
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: buttonText
        });
      };
      var B = function B() {
        var _useUseCase44 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase45 = (0, _slicedToArray2["default"])(_useUseCase44, 3),
          Provider = _useUseCase45[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(1, '', 'x');
      (0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(2, '', 'x');
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(addReducer).toHaveBeenNthCalledWith(3, '', 'x');
    });
    (0, _globals.test)('reducer call should not be cached if entity or parameters have changed in child components', function () {
      var count = 0;
      var addedText = 'x';
      var setButtonText = 'button';
      var updateButtonText = 'update';
      var addReducer = _globals.jest.fn(function (entity, substring) {
        return entity + substring;
      });
      var stringUseCase = function stringUseCase() {
        var entityReducers = (0, _usecases.entityUseCase)();
        return _objectSpread(_objectSpread({}, entityReducers), {}, {
          add: addReducer
        });
      };
      var A = function A() {
        var _useUseCase46 = (0, _.useUseCase)(stringUseCase),
          _useUseCase47 = (0, _slicedToArray2["default"])(_useUseCase46, 2),
          _useUseCase47$ = _useUseCase47[1],
          add = _useUseCase47$.add,
          setEntity = _useUseCase47$.setEntity;
        var update = (0, _ahooks.useUpdate)();
        add(addedText);
        var onSet = function onSet() {
          setEntity("".concat(count++));
        };
        var onUpdate = function onUpdate() {
          update();
        };
        return (0, _jsxRuntime.jsxs)("div", {
          children: [(0, _jsxRuntime.jsx)("button", {
            onClick: onSet,
            children: setButtonText
          }), (0, _jsxRuntime.jsx)("button", {
            onClick: onUpdate,
            children: updateButtonText
          })]
        });
      };
      var B = function B() {
        var _useUseCase48 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase49 = (0, _slicedToArray2["default"])(_useUseCase48, 3),
          Provider = _useUseCase49[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
      _dom.fireEvent.click(_dom.screen.getByText(setButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
      addedText = 'y';
      _dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
      _dom.fireEvent.click(_dom.screen.getByText(updateButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
    });
    (0, _globals.test)('`options.onChange` event should be trigger in orders', function () {
      var changeTimes = 0;
      var updateChangeTimes = function updateChangeTimes() {
        return ++changeTimes;
      };
      var onChangeA = _globals.jest.fn(updateChangeTimes);
      var onChangeB = _globals.jest.fn(updateChangeTimes);
      var onChangeC = _globals.jest.fn(updateChangeTimes);
      var buttonText = 'my button';
      var A = function A(_ref6) {
        var children = _ref6.children;
        (0, _.useUseCase)(fileUseCase, {
          onChange: onChangeA
        });
        return (0, _jsxRuntime.jsx)(_react2.Fragment, {
          children: children
        });
      };
      var B = function B() {
        (0, _.useUseCase)(fileUseCase, {
          onChange: onChangeB
        });
        return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
      };
      var C = function C() {
        var _useUseCase50 = (0, _.useUseCase)(defaultFile, fileUseCase, {
            onChange: onChangeC
          }),
          _useUseCase51 = (0, _slicedToArray2["default"])(_useUseCase50, 3),
          setPath = _useUseCase51[1].setPath,
          Provider = _useUseCase51[2];
        var onFirstClick = function onFirstClick() {
          setPath(PATH_1);
        };
        return (0, _jsxRuntime.jsxs)(Provider, {
          children: [(0, _jsxRuntime.jsx)(A, {
            children: (0, _jsxRuntime.jsx)(B, {})
          }), (0, _jsxRuntime.jsx)("button", {
            onClick: onFirstClick,
            children: buttonText
          })]
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(C, {}));
      (0, _globals.expect)(changeTimes).toBe(0);
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
      (0, _globals.expect)(onChangeB).toHaveReturnedWith(3);
      (0, _globals.expect)(onChangeC).toHaveReturnedWith(1);
    });
    (0, _globals.test)('`options.onChange` should always trigger the latest one in child components', function () {
      var onFirstChange = _globals.jest.fn();
      var onSecondChange = _globals.jest.fn();
      var onChange = onFirstChange;
      var firstButtonText = 'first button';
      var secondButtonText = 'second button';
      var A = function A() {
        var _useUseCase52 = (0, _.useUseCase)(fileUseCase, {
            onChange: onChange
          }),
          _useUseCase53 = (0, _slicedToArray2["default"])(_useUseCase52, 2),
          setPath = _useUseCase53[1].setPath;
        var onFirstClick = function onFirstClick() {
          setPath(PATH_1);
          onChange = onSecondChange;
        };
        var onSecondClick = function onSecondClick() {
          setPath('');
        };
        return (0, _jsxRuntime.jsxs)(_react2.Fragment, {
          children: [(0, _jsxRuntime.jsx)("button", {
            onClick: onFirstClick,
            children: firstButtonText
          }), (0, _jsxRuntime.jsx)("button", {
            onClick: onSecondClick,
            children: secondButtonText
          })]
        });
      };
      var B = function B() {
        var _useUseCase54 = (0, _.useUseCase)(defaultFile, fileUseCase),
          _useUseCase55 = (0, _slicedToArray2["default"])(_useUseCase54, 3),
          Provider = _useUseCase55[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(0);
      _dom.fireEvent.click(_dom.screen.getByText(firstButtonText));
      (0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondChange).toHaveBeenCalledTimes(0);
      _dom.fireEvent.click(_dom.screen.getByText(secondButtonText));
      (0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondChange).toHaveBeenLastCalledWith(defaultFile, _objectSpread(_objectSpread({}, defaultFile), {}, {
        ext: EXT_1,
        path: PATH_1
      }));
    });
    (0, _globals.test)('`options.watch` should be trigger at child elements', function () {
      var onExtChange = _globals.jest.fn();
      var firstButtonText = 'first button';
      var A = function A() {
        var _useUseCase56 = (0, _.useUseCase)(fileUseCase, {
            watch: {
              ext: onExtChange
            }
          }),
          _useUseCase57 = (0, _slicedToArray2["default"])(_useUseCase56, 2),
          setPath = _useUseCase57[1].setPath;
        var onFirstClick = function onFirstClick() {
          setPath(PATH_1);
        };
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onFirstClick,
          children: firstButtonText
        });
      };
      var B = function B() {
        var _useUseCase58 = (0, _.useUseCase)(defaultFile, fileUseCase, {}),
          _useUseCase59 = (0, _slicedToArray2["default"])(_useUseCase58, 3),
          Provider = _useUseCase59[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(0);
      _dom.fireEvent.click(_dom.screen.getByText(firstButtonText));
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onExtChange).toHaveBeenLastCalledWith({
        fieldPaths: ['ext'],
        newEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          ext: EXT_1,
          path: PATH_1
        }),
        oldEntity: defaultFile,
        newValue: EXT_1,
        oldValue: ''
      });
    });
    (0, _globals.test)('`options.watch` should be trigger in orders', function () {
      var changeTimes = 0;
      var updateChangeTimes = function updateChangeTimes(e) {
        void e;
        return ++changeTimes;
      };
      var onChangeA = _globals.jest.fn(updateChangeTimes);
      var onChangeB = _globals.jest.fn(updateChangeTimes);
      var onChangeC = _globals.jest.fn(updateChangeTimes);
      var buttonText = 'my button';
      var A = function A(_ref7) {
        var children = _ref7.children;
        (0, _.useUseCase)(fileUseCase, {
          watch: {
            ext: onChangeA
          }
        });
        return (0, _jsxRuntime.jsx)(_react2.Fragment, {
          children: children
        });
      };
      var B = function B() {
        (0, _.useUseCase)(fileUseCase, {
          watch: {
            ext: onChangeB
          }
        });
        return (0, _jsxRuntime.jsx)(_react2.Fragment, {});
      };
      var C = function C() {
        var _useUseCase60 = (0, _.useUseCase)(defaultFile, fileUseCase, {
            watch: {
              ext: onChangeC
            }
          }),
          _useUseCase61 = (0, _slicedToArray2["default"])(_useUseCase60, 3),
          setPath = _useUseCase61[1].setPath,
          Provider = _useUseCase61[2];
        var onFirstClick = function onFirstClick() {
          setPath(PATH_1);
        };
        return (0, _jsxRuntime.jsxs)(Provider, {
          children: [(0, _jsxRuntime.jsx)(A, {
            children: (0, _jsxRuntime.jsx)(B, {})
          }), (0, _jsxRuntime.jsx)("button", {
            onClick: onFirstClick,
            children: buttonText
          })]
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(C, {}));
      (0, _globals.expect)(changeTimes).toBe(0);
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
      (0, _globals.expect)(onChangeB).toHaveReturnedWith(3);
      (0, _globals.expect)(onChangeC).toHaveReturnedWith(1);
    });
    (0, _globals.test)('`options.watch` should trigger the latest one in child components', function () {
      var onFirstExtChange = _globals.jest.fn();
      var onSecondExtChange = _globals.jest.fn();
      var onExtChange = onFirstExtChange;
      var firstButtonText = 'first button';
      var secondButtonText = 'second button';
      var A = function A() {
        var _useUseCase62 = (0, _.useUseCase)(fileUseCase, {
            watch: {
              ext: onExtChange
            }
          }),
          _useUseCase63 = (0, _slicedToArray2["default"])(_useUseCase62, 2),
          setPath = _useUseCase63[1].setPath;
        var onFirstClick = function onFirstClick() {
          setPath(PATH_1);
          onExtChange = onSecondExtChange;
        };
        var onSecondClick = function onSecondClick() {
          setPath('');
        };
        return (0, _jsxRuntime.jsxs)(_react2.Fragment, {
          children: [(0, _jsxRuntime.jsx)("button", {
            onClick: onFirstClick,
            children: firstButtonText
          }), (0, _jsxRuntime.jsx)("button", {
            onClick: onSecondClick,
            children: secondButtonText
          })]
        });
      };
      var B = function B() {
        var _useUseCase64 = (0, _.useUseCase)(defaultFile, fileUseCase),
          _useUseCase65 = (0, _slicedToArray2["default"])(_useUseCase64, 3),
          Provider = _useUseCase65[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(0);
      _dom.fireEvent.click(_dom.screen.getByText(firstButtonText));
      (0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondExtChange).toHaveBeenCalledTimes(0);
      _dom.fireEvent.click(_dom.screen.getByText(secondButtonText));
      (0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondExtChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondExtChange).toHaveBeenLastCalledWith({
        fieldPaths: ['ext'],
        newEntity: defaultFile,
        oldEntity: _objectSpread(_objectSpread({}, defaultFile), {}, {
          ext: EXT_1,
          path: PATH_1
        }),
        newValue: '',
        oldValue: EXT_1
      });
    });
  });
  (0, _globals.describe)('`useUseCase` should work the same as `useReducers`', function () {
    (0, _globals.test)('`entity` should equal `defaultFile`', function () {
      var _renderHook38 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mathUseCase);
        }),
        result = _renderHook38.result;
      var reducers = result.current;
      (0, _globals.expect)(Array.isArray(reducers)).toBe(false);
    });
    (0, _globals.test)('returned reducer should work', function () {
      var _renderHook39 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mathUseCase);
        }),
        result = _renderHook39.result;
      var reducers = result.current;
      var add = reducers.add;
      (0, _globals.expect)(add(1, 2)).toBe(3);
    });
    (0, _globals.test)('`usecase` should be called only once if deps has not provided', function () {
      var mockUseCase = _globals.jest.fn(mathUseCase);
      var _renderHook40 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mockUseCase);
        }),
        rerender = _renderHook40.rerender;
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
      rerender();
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('`usecase` should be called only once if deps has not changed', function () {
      var mockUseCase = _globals.jest.fn(mathUseCase);
      var _renderHook41 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mockUseCase, {}, [1, 'x']);
        }),
        rerender = _renderHook41.rerender;
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
      rerender();
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('`usecase` should be called if deps has changed', function () {
      var i = 0;
      var mockUseCase = _globals.jest.fn(mathUseCase);
      var _renderHook42 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mockUseCase, {}, [i++, 'x']);
        }),
        rerender = _renderHook42.rerender;
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(1);
      rerender();
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(2);
    });
    (0, _globals.test)('reducer call should not be cached if component is at rendering phase', function () {
      var buttonText = 'button';
      var CacheTestComponent = function CacheTestComponent() {
        var _useUseCase66 = (0, _.useUseCase)(mathUseCase),
          subtraction = _useUseCase66.subtraction;
        var update = (0, _ahooks.useUpdate)();
        var onClick = function onClick() {
          update();
        };
        subtraction(5, 3);
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: buttonText
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledWith(5, 3);
      (0, _globals.expect)(subtractionReducer).toHaveReturnedWith(2);
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(3);
    });
    (0, _globals.test)('reducer call should not be cached if component is not at rendering phase', function () {
      var buttonText = 'button';
      var CacheTestComponent = function CacheTestComponent() {
        var _useUseCase67 = (0, _.useUseCase)(mathUseCase),
          subtraction = _useUseCase67.subtraction;
        var onClick = function onClick() {
          subtraction(5, 3);
        };
        (0, _ahooks.useMount)(function () {
          subtraction(5, 3);
          subtraction(5, 3);
        });
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onClick,
          children: buttonText
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(CacheTestComponent, {}));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(subtractionReducer).toHaveBeenNthCalledWith(1, 5, 3);
      (0, _globals.expect)(subtractionReducer).toHaveNthReturnedWith(1, 2);
      (0, _globals.expect)(subtractionReducer).toHaveBeenNthCalledWith(2, 5, 3);
      (0, _globals.expect)(subtractionReducer).toHaveNthReturnedWith(2, 2);
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(subtractionReducer).toHaveBeenNthCalledWith(3, 5, 3);
      (0, _globals.expect)(subtractionReducer).toHaveNthReturnedWith(3, 2);
    });
    (0, _globals.test)('reducer call should not be cached if parameters have changed', function () {
      var count = 0;
      var buttonText = 'button';
      var StringUseCaseTestComponent = function StringUseCaseTestComponent() {
        var _useUseCase68 = (0, _.useUseCase)(mathUseCase),
          subtraction = _useUseCase68.subtraction;
        var update = (0, _ahooks.useUpdate)();
        subtraction(5, count++);
        var onUpdate = function onUpdate() {
          update();
        };
        return (0, _jsxRuntime.jsx)("div", {
          children: (0, _jsxRuntime.jsx)("button", {
            onClick: onUpdate,
            children: buttonText
          })
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(StringUseCaseTestComponent, {}));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledWith(5, 0);
      _dom.fireEvent.click(_dom.screen.getByText(buttonText));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledWith(5, 1);
      (0, _globals.expect)(subtractionReducer).toHaveReturnedWith(4);
    });
    (0, _globals.test)('`options.extraValue` should be added after call `add` method', function () {
      var _renderHook43 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mathUseCase, {
            extraValue: 5
          });
        }),
        result = _renderHook43.result;
      var reducers = result.current;
      var add = reducers.add;
      (0, _globals.expect)(add(1, 2)).toBe(8);
    });
    (0, _globals.test)('when `options` has changed, it should not trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook44 = (0, _react.renderHook)(function () {
          var _useState7 = (0, _react2.useState)(0),
            _useState8 = (0, _slicedToArray2["default"])(_useState7, 2),
            extraValue = _useState8[0],
            setExtraValue = _useState8[1];
          var reducers = (0, _.useUseCase)(mathUseCase, {
            extraValue: extraValue
          });
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [reducers]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [reducers]);
          return setExtraValue;
        }),
        result = _renderHook44.result;
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        result.current(3);
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
    });
    (0, _globals.test)('when `deps` change, it should update reducers', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook45 = (0, _react.renderHook)(function () {
          var _useState9 = (0, _react2.useState)(0),
            _useState0 = (0, _slicedToArray2["default"])(_useState9, 2),
            extraValue = _useState0[0],
            setExtraValue = _useState0[1];
          var reducers = (0, _.useUseCase)(mathUseCase, {
            extraValue: extraValue
          }, [extraValue]);
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [reducers]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [reducers]);
          return setExtraValue;
        }),
        result = _renderHook45.result;
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        result.current(3);
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(1);
    });
    (0, _globals.test)('empty `deps` should not update reducers', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook46 = (0, _react.renderHook)(function () {
          var _useState1 = (0, _react2.useState)(0),
            _useState10 = (0, _slicedToArray2["default"])(_useState1, 2),
            extraValue = _useState10[0],
            setExtraValue = _useState10[1];
          var reducers = (0, _.useUseCase)(mathUseCase, {
            extraValue: extraValue
          }, []);
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [reducers]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [reducers]);
          return setExtraValue;
        }),
        result = _renderHook46.result;
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
      (0, _react.act)(function () {
        result.current(3);
      });
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onDeepUpdate).toHaveBeenCalledTimes(0);
    });
    (0, _globals.test)('should not trigger update', function () {
      var onUpdate = _globals.jest.fn();
      (0, _react.render)((0, _jsxRuntime.jsx)(MathParent, {
        onUpdate: onUpdate
      }));
      _dom.fireEvent.click(_dom.screen.getByText(PARENT_BUTTON_TEXT));
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
    });
  });
});