UNPKG

@mic-rexjs/usecases-react

Version:

React-based solution for use usecases of Clean Architecture

2,153 lines 88.2 kB
"use strict";

var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
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 _jsxRuntime = require("react/jsx-runtime");
var _usecases = require("@mic-rexjs/usecases");
var _globals = require("@jest/globals");
var _react = require("@testing-library/react");
var _ = require(".");
var _ahooks = require("ahooks");
var _react2 = require("react");
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.objectUseCase)();
  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 _callee$(_context) {
        while (1) switch (_context.prev = _context.next) {
          case 0:
            _context.next = 2;
            return function () {
              return newEntity;
            };
          case 2:
          case "end":
            return _context.stop();
        }
      }, _callee);
    })();
  };
  var setPath = /*#__PURE__*/_regenerator["default"].mark(function setPath(entity, path) {
    var _path$match;
    var oldPath, newPath;
    return _regenerator["default"].wrap(function setPath$(_context2) {
      while (1) switch (_context2.prev = _context2.next) {
        case 0:
          oldPath = entity.path;
          newPath = pathPrefix + path;
          _context2.next = 4;
          return _objectSpread(_objectSpread({}, entity), {}, {
            path: newPath,
            ext: ((_path$match = path.match(/\.[^.]+$/)) === null || _path$match === void 0 ? void 0 : _path$match[0]) || ''
          });
        case 4:
          onPathChange === null || onPathChange === void 0 || onPathChange(newPath, oldPath);
        case 5:
        case "end":
          return _context2.stop();
      }
    }, setPath);
  });
  var readFile = /*#__PURE__*/function () {
    var _ref = (0, _wrapAsyncGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(entity, path) {
      var size;
      return _regenerator["default"].wrap(function _callee2$(_context3) {
        while (1) switch (_context3.prev = _context3.next) {
          case 0:
            size = 2000;
            return _context3.delegateYield((0, _asyncGeneratorDelegate2["default"])(_asyncIterator(setPath(entity, path)), _awaitAsyncGenerator2["default"]), "t0", 2);
          case 2:
            _context3.next = 4;
            return (0, _awaitAsyncGenerator2["default"])(Promise.resolve(null));
          case 4:
            _context3.next = 6;
            return function (oldEntity) {
              return _objectSpread(_objectSpread({}, oldEntity), {}, {
                size: size
              });
            };
          case 6:
            return _context3.abrupt("return", size);
          case 7:
          case "end":
            return _context3.stop();
        }
      }, _callee2);
    }));
    return function readFile(_x, _x2) {
      return _ref.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.objectUseCase)();
};
var Child = function Child(_ref2) {
  var _ref2$textPrefix = _ref2.textPrefix,
    textPrefix = _ref2$textPrefix === void 0 ? '' : _ref2$textPrefix,
    onUpdate = _ref2.onUpdate,
    onPathChange = _ref2.onPathChange,
    onUndefinedEntity = _ref2.onUndefinedEntity;
  var _useUseCase = (0, _.useUseCase)(fileUseCase),
    _useUseCase2 = (0, _slicedToArray2["default"])(_useUseCase, 2),
    file = _useUseCase2[0],
    setPath = _useUseCase2[1].setPath;
  var _ref3 = file || {},
    path = _ref3.path,
    ext = _ref3.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(_ref4) {
  var children = _ref4.children,
    onUpdate = _ref4.onUpdate,
    onSetPath = _ref4.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(_ref5) {
  var _ref5$extraValue = _ref5.extraValue,
    extraValue = _ref5$extraValue === void 0 ? 0 : _ref5$extraValue,
    onUpdate = _ref5.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);
  (0, _react2.useEffect)(function () {
    return function () {
      isFirstRef.current = false;
    };
  });
  _ahooks.useDeepCompareEffect.call(null, function () {
    if (isFirstRef.current) {
      return;
    }
    callback();
  }, deps);
};
(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).toBe(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)('`reducers` should be returned as an object', function () {
      var _renderHook6 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook6.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 _renderHook7 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook7.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 _renderHook8 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, mockUseCase);
        }),
        result = _renderHook8.result,
        rerender = _renderHook8.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 _renderHook9 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [1, 'x']);
        }),
        result = _renderHook9.result,
        rerender = _renderHook9.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 _renderHook10 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, mockUseCase, {}, [i++, 'x']);
        }),
        result = _renderHook10.result,
        rerender = _renderHook10.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(2);
      rerender();
      (0, _globals.expect)(mockUseCase).toHaveBeenCalledTimes(3);
    });
    (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 _renderHook11 = (0, _react.renderHook)(function () {
          var context = (0, _.useUseCase)(defaultFile, fileUseCase);
          var _context4 = (0, _slicedToArray2["default"])(context, 2),
            reducers = _context4[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 = _renderHook11.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 _renderHook12 = (0, _react.renderHook)(function () {
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          });
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook12.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 _callee3() {
      var onUpdate, _renderHook13, result, cores, _cores8, entity, reducers, readFile, promise;
      return _regenerator["default"].wrap(function _callee3$(_context5) {
        while (1) switch (_context5.prev = _context5.next) {
          case 0:
            onUpdate = _globals.jest.fn();
            _renderHook13 = (0, _react.renderHook)(function () {
              (0, _ahooks.useUpdateEffect)(function () {
                onUpdate();
              });
              return (0, _.useUseCase)(defaultFile, fileUseCase);
            }), result = _renderHook13.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);
            _context5.next = 11;
            return promise;
          case 11:
            (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 18:
          case "end":
            return _context5.stop();
        }
      }, _callee3);
    })));
    (0, _globals.test)('after `yield entity` callbacks, it should trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var _renderHook14 = (0, _react.renderHook)(function () {
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          });
          return (0, _.useUseCase)(defaultFile, fileUseCase);
        }),
        result = _renderHook14.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');
      _react.fireEvent.click(_react.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');
      _react.fireEvent.click(_react.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 _useUseCase10 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase11 = (0, _slicedToArray2["default"])(_useUseCase10, 2),
          _useUseCase11$ = _useUseCase11[1],
          add = _useUseCase11$.add,
          setEntity = _useUseCase11$.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');
      _react.fireEvent.click(_react.screen.getByText(setButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
      addedText = 'y';
      _react.fireEvent.click(_react.screen.getByText(updateButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
      _react.fireEvent.click(_react.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 _renderHook15 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            onChange: onChange
          });
        }),
        result = _renderHook15.result;
      var cores = result.current;
      var _cores10 = (0, _slicedToArray2["default"])(cores, 2),
        reducers = _cores10[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 _renderHook16 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            onChange: onChange
          }, []);
        }),
        result = _renderHook16.result;
      var cores = result.current;
      var _cores11 = (0, _slicedToArray2["default"])(cores, 2),
        reducers = _cores11[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 _renderHook17 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            pathPrefix: 'xyz/',
            options: {
              pathPrefix: '123/'
            }
          });
        }),
        result = _renderHook17.result;
      var cores = result.current;
      var _cores12 = (0, _slicedToArray2["default"])(cores, 2),
        path = _cores12[0].path,
        reducers = _cores12[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)('when `options` has changed, it should not trigger update', function () {
      var onUpdate = _globals.jest.fn();
      var onDeepUpdate = _globals.jest.fn();
      var _renderHook18 = (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 = _renderHook18.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 _renderHook19 = (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 = _renderHook19.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 _renderHook20 = (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 = _renderHook20.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 _renderHook21 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            onPathChange: onPathChange
          });
        }),
        result = _renderHook21.result;
      var context = result.current;
      var _context6 = (0, _slicedToArray2["default"])(context, 2),
        setPath = _context6[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 _renderHook22 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            watch: {
              path: onPathChange,
              size: onSizeChange
            }
          });
        }),
        result = _renderHook22.result;
      var cores = result.current;
      var _cores13 = (0, _slicedToArray2["default"])(cores, 2),
        setPath = _cores13[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 trigger the latest one', function () {
      var onPathChange1 = _globals.jest.fn();
      var onPathChange2 = _globals.jest.fn();
      var onPathChange = onPathChange1;
      var _renderHook23 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(defaultFile, fileUseCase, {
            watch: {
              path: onPathChange
            }
          });
        }),
        result = _renderHook23.result;
      var cores = result.current;
      var _cores14 = (0, _slicedToArray2["default"])(cores, 2),
        _cores14$ = _cores14[1],
        setPath = _cores14$.setPath,
        setEntity = _cores14$.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 _renderHook24 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(initialData, fieldPathUseCase, {
            watch: {
              'list.ext': onExtChange,
              'list.size': onSizeChange
            }
          });
        }),
        result = _renderHook24.result;
      var cores = result.current;
      var _cores15 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores15[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]
        },
        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]
        },
        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]
        },
        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]
        },
        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 {};
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(9);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(6);
      (0, _globals.expect)(onExtChange).toHaveBeenNthCalledWith(7, {
        fieldPaths: ['list', '0', 'ext'],
        newEntity: {},
        oldEntity: {
          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: {},
        oldEntity: {
          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: {},
        oldEntity: {
          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: {},
        oldEntity: {
          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: {},
        oldEntity: {
          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: {},
        oldEntity: {
          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 onEntityLengthChange = _globals.jest.fn();
      var onListLengthChange = _globals.jest.fn();
      var lengthUseCase = function lengthUseCase() {
        return (0, _usecases.entityUseCase)();
      };
      var _renderHook25 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)([], lengthUseCase, {
            watch: {
              length: onEntityLengthChange,
              'list.length': onListLengthChange
            }
          });
        }),
        result = _renderHook25.result;
      var cores = result.current;
      var _cores16 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores16[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 _renderHook26 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(initialData, fieldPathUseCase, {
            watch: {
              'nestedList.size': onChange
            }
          });
        }),
        result = _renderHook26.result;
      var cores = result.current;
      var _cores17 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores17[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 _renderHook27 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(initialData, fieldPathUseCase, {
            watch: {
              'obj.file.ext': onExtChange,
              'obj.file.size': onSizeChange
            }
          });
        }),
        result = _renderHook27.result;
      var cores = result.current;
      var _cores18 = (0, _slicedToArray2["default"])(cores, 2),
        setEntity = _cores18[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 {};
        });
      });
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(onSizeChange).toHaveBeenCalledTimes(0);
      (0, _globals.expect)(onExtChange).toHaveBeenCalledWith({
        fieldPaths: ['obj', 'file', 'ext'],
        newEntity: {},
        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.describe)('`useUseCase` should work the same as `useContextualCoreCollection`', function () {
    (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
          })
        })
      }));
      _react.fireEvent.click(_react.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);
      _react.fireEvent.click(_react.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 _useUseCase24 = (0, _.useUseCase)(defaultFile, mockUseCase),
          _useUseCase25 = (0, _slicedToArray2["default"])(_useUseCase24, 3),
          Provider = _useUseCase25[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 _useUseCase26 = (0, _.useUseCase)(stringUseCase),
          _useUseCase27 = (0, _slicedToArray2["default"])(_useUseCase26, 2),
          add = _useUseCase27[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 _useUseCase28 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase29 = (0, _slicedToArray2["default"])(_useUseCase28, 3),
          Provider = _useUseCase29[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');
      _react.fireEvent.click(_react.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 _useUseCase30 = (0, _.useUseCase)(stringUseCase),
          _useUseCase31 = (0, _slicedToArray2["default"])(_useUseCase30, 2),
          add = _useUseCase31[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 _useUseCase32 = (0, _.useUseCase)('', stringUseCase),
          _useUseCase33 = (0, _slicedToArray2["default"])(_useUseCase32, 3),
          Provider = _useUseCase33[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');
      _react.fireEvent.click(_react.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 _useUseCase34 = (0, _.useUseCase)(stringUseCase),
          _useUseCase35 = (0, _slicedToArray2["default"])(_useUseCase34, 2),
          _useUseCase35$ = _useUseCase35[1],
          add = _useUseCase35$.add,
          setEntity = _useUseCase35$.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 _useUseCase36 = (0, _.useUseCase)('', stringUseCase),
          _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)(addReducer).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('', 'x');
      _react.fireEvent.click(_react.screen.getByText(setButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(2);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'x');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0x');
      addedText = 'y';
      _react.fireEvent.click(_react.screen.getByText(updateButtonText));
      (0, _globals.expect)(addReducer).toHaveBeenCalledTimes(3);
      (0, _globals.expect)(addReducer).toHaveBeenCalledWith('0', 'y');
      (0, _globals.expect)(addReducer).toHaveReturnedWith('0y');
      _react.fireEvent.click(_react.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(_ref7) {
        var children = _ref7.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 _useUseCase38 = (0, _.useUseCase)(defaultFile, fileUseCase, {
            onChange: onChangeC
          }),
          _useUseCase39 = (0, _slicedToArray2["default"])(_useUseCase38, 3),
          setPath = _useUseCase39[1].setPath,
          Provider = _useUseCase39[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);
      _react.fireEvent.click(_react.screen.getByText(buttonText));
      (0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
      (0, _globals.expect)(onChangeB).toHaveReturnedWith(1);
      (0, _globals.expect)(onChangeC).toHaveReturnedWith(3);
    });
    (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 _useUseCase40 = (0, _.useUseCase)(fileUseCase, {
            onChange: onChange
          }),
          _useUseCase41 = (0, _slicedToArray2["default"])(_useUseCase40, 2),
          setPath = _useUseCase41[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 _useUseCase42 = (0, _.useUseCase)(defaultFile, fileUseCase),
          _useUseCase43 = (0, _slicedToArray2["default"])(_useUseCase42, 3),
          Provider = _useUseCase43[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(0);
      _react.fireEvent.click(_react.screen.getByText(firstButtonText));
      (0, _globals.expect)(onFirstChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondChange).toHaveBeenCalledTimes(0);
      _react.fireEvent.click(_react.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 _useUseCase44 = (0, _.useUseCase)(fileUseCase, {
            watch: {
              ext: onExtChange
            }
          }),
          _useUseCase45 = (0, _slicedToArray2["default"])(_useUseCase44, 2),
          setPath = _useUseCase45[1].setPath;
        var onFirstClick = function onFirstClick() {
          setPath(PATH_1);
        };
        return (0, _jsxRuntime.jsx)("button", {
          onClick: onFirstClick,
          children: firstButtonText
        });
      };
      var B = function B() {
        var _useUseCase46 = (0, _.useUseCase)(defaultFile, fileUseCase, {}),
          _useUseCase47 = (0, _slicedToArray2["default"])(_useUseCase46, 3),
          Provider = _useUseCase47[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(onExtChange).toHaveBeenCalledTimes(0);
      _react.fireEvent.click(_react.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(_ref8) {
        var children = _ref8.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 _useUseCase48 = (0, _.useUseCase)(defaultFile, fileUseCase, {
            watch: {
              ext: onChangeC
            }
          }),
          _useUseCase49 = (0, _slicedToArray2["default"])(_useUseCase48, 3),
          setPath = _useUseCase49[1].setPath,
          Provider = _useUseCase49[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);
      _react.fireEvent.click(_react.screen.getByText(buttonText));
      (0, _globals.expect)(onChangeA).toHaveReturnedWith(2);
      (0, _globals.expect)(onChangeB).toHaveReturnedWith(1);
      (0, _globals.expect)(onChangeC).toHaveReturnedWith(3);
    });
    (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 _useUseCase50 = (0, _.useUseCase)(fileUseCase, {
            watch: {
              ext: onExtChange
            }
          }),
          _useUseCase51 = (0, _slicedToArray2["default"])(_useUseCase50, 2),
          setPath = _useUseCase51[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 _useUseCase52 = (0, _.useUseCase)(defaultFile, fileUseCase),
          _useUseCase53 = (0, _slicedToArray2["default"])(_useUseCase52, 3),
          Provider = _useUseCase53[2];
        return (0, _jsxRuntime.jsx)(Provider, {
          children: (0, _jsxRuntime.jsx)(A, {})
        });
      };
      (0, _react.render)((0, _jsxRuntime.jsx)(B, {}));
      (0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(0);
      _react.fireEvent.click(_react.screen.getByText(firstButtonText));
      (0, _globals.expect)(onFirstExtChange).toHaveBeenCalledTimes(1);
      (0, _globals.expect)(onSecondExtChange).toHaveBeenCalledTimes(0);
      _react.fireEvent.click(_react.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 _renderHook28 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mathUseCase);
        }),
        result = _renderHook28.result;
      var reducers = result.current;
      (0, _globals.expect)(Array.isArray(reducers)).toBe(false);
    });
    (0, _globals.test)('returned reducer should work', function () {
      var _renderHook29 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mathUseCase);
        }),
        result = _renderHook29.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 _renderHook30 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mockUseCase);
        }),
        rerender = _renderHook30.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 _renderHook31 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mockUseCase, {}, [1, 'x']);
        }),
        rerender = _renderHook31.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 _renderHook32 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mockUseCase, {}, [i++, 'x']);
        }),
        rerender = _renderHook32.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 _useUseCase54 = (0, _.useUseCase)(mathUseCase),
          subtraction = _useUseCase54.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);
      _react.fireEvent.click(_react.screen.getByText(buttonText));
      (0, _globals.expect)(subtractionReducer).toHaveBeenCalledTimes(2);
      _react.fireEvent.click(_react.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 _useUseCase55 = (0, _.useUseCase)(mathUseCase),
          subtraction = _useUseCase55.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);
      _react.fireEvent.click(_react.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 _useUseCase56 = (0, _.useUseCase)(mathUseCase),
          subtraction = _useUseCase56.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);
      _react.fireEvent.click(_react.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 _renderHook33 = (0, _react.renderHook)(function () {
          return (0, _.useUseCase)(mathUseCase, {
            extraValue: 5
          });
        }),
        result = _renderHook33.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 _renderHook34 = (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 = _renderHook34.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 _renderHook35 = (0, _react.renderHook)(function () {
          var _useState9 = (0, _react2.useState)(0),
            _useState10 = (0, _slicedToArray2["default"])(_useState9, 2),
            extraValue = _useState10[0],
            setExtraValue = _useState10[1];
          var reducers = (0, _.useUseCase)(mathUseCase, {
            extraValue: extraValue
          }, [extraValue]);
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [reducers]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [reducers]);
          return setExtraValue;
        }),
        result = _renderHook35.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 _renderHook36 = (0, _react.renderHook)(function () {
          var _useState11 = (0, _react2.useState)(0),
            _useState12 = (0, _slicedToArray2["default"])(_useState11, 2),
            extraValue = _useState12[0],
            setExtraValue = _useState12[1];
          var reducers = (0, _.useUseCase)(mathUseCase, {
            extraValue: extraValue
          }, []);
          (0, _ahooks.useUpdateEffect)(function () {
            onUpdate();
          }, [reducers]);
          useDeepCompareUpdate(function () {
            onDeepUpdate();
          }, [reducers]);
          return setExtraValue;
        }),
        result = _renderHook36.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
      }));
      _react.fireEvent.click(_react.screen.getByText(PARENT_BUTTON_TEXT));
      (0, _globals.expect)(onUpdate).toHaveBeenCalledTimes(0);
    });
  });
});