react-native-reanimated-carousel
Version:
Simple carousel component.fully implemented using Reanimated 2.Infinitely scrolling, very smooth.
2 lines • 18.2 kB
JavaScript
var _react=_interopRequireWildcard(require("react"));var _reactNativeReanimated=require("react-native-reanimated");var _reactHooks=require("@testing-library/react-hooks");var _reactNative=require("react-native");var _store=require("../store");var _useCarouselController=require("./useCarouselController");var _jsxRuntime=require("react/jsx-runtime");var _this=this,_jsxFileName="/home/runner/work/react-native-reanimated-carousel/react-native-reanimated-carousel/src/hooks/useCarouselController.test.tsx";function _getRequireWildcardCache(nodeInterop){if(typeof WeakMap!=="function")return null;var cacheBabelInterop=new WeakMap();var cacheNodeInterop=new WeakMap();return(_getRequireWildcardCache=function _getRequireWildcardCache(nodeInterop){return nodeInterop?cacheNodeInterop:cacheBabelInterop;})(nodeInterop);}function _interopRequireWildcard(obj,nodeInterop){if(!nodeInterop&&obj&&obj.__esModule){return obj;}if(obj===null||typeof obj!=="object"&&typeof obj!=="function"){return{default:obj};}var cache=_getRequireWildcardCache(nodeInterop);if(cache&&cache.has(obj)){return cache.get(obj);}var newObj={};var hasPropertyDescriptor=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var key in obj){if(key!=="default"&&Object.prototype.hasOwnProperty.call(obj,key)){var desc=hasPropertyDescriptor?Object.getOwnPropertyDescriptor(obj,key):null;if(desc&&(desc.get||desc.set)){Object.defineProperty(newObj,key,desc);}else{newObj[key]=obj[key];}}}newObj.default=obj;if(cache){cache.set(obj,newObj);}return newObj;}jest.mock("react-native-reanimated",function(){var mockRunOnJS=jest.fn(function(fn){return function(){return fn.apply(void 0,arguments);};});var mockAnimatedReaction=jest.fn(function(deps,cb){var depsResult=deps();cb(depsResult);return function(){};});return{useSharedValue:jest.fn(function(initialValue){return{value:initialValue};}),useDerivedValue:jest.fn(function(callback){return{value:callback()};}),useAnimatedReaction:mockAnimatedReaction,withTiming:jest.fn(function(toValue,config,callback){if(callback)callback(true);return toValue;}),runOnJS:mockRunOnJS,mockAnimatedReaction:mockAnimatedReaction,mockRunOnJS:mockRunOnJS,Easing:{bezier:function bezier(){return{factory:function factory(){return 0;}};}}};});var _jest$requireMock=jest.requireMock("react-native-reanimated"),mockAnimatedReaction=_jest$requireMock.mockAnimatedReaction,mockRunOnJS=_jest$requireMock.mockRunOnJS;jest.mock("react",function(){var originalModule=jest.requireActual("react");return Object.assign({},originalModule,{useRef:jest.fn(function(initialValue){return{current:initialValue};}),useImperativeHandle:jest.fn(function(ref,createHandle){return createHandle();})});});var mockGlobalState={props:{overscrollEnabled:true,loop:true,pagingEnabled:true,snapEnabled:true,enabled:true,scrollAnimationDuration:500,withAnimation:undefined,dataLength:5,data:Array.from({length:5},function(_,i){return i;}),width:300,height:300,renderItem:function renderItem(){return(0,_jsxRuntime.jsx)(_reactNative.View,{style:{flex:1}});},autoFillData:false,defaultIndex:0,autoPlayInterval:0,rawData:[],rawDataLength:0},common:{size:300,validLength:5},layout:{containerSize:{value:{width:300,height:300}},itemDimensions:{value:{}},updateItemDimensions:jest.fn(),updateContainerSize:jest.fn()}};var wrapper=function wrapper(_ref){var children=_ref.children;return(0,_jsxRuntime.jsx)(_store.GlobalStateContext.Provider,{value:mockGlobalState,children:children});};describe("useCarouselController",function(){var mockHandlerOffset;var ref;var defaultProps;beforeEach(function(){jest.clearAllMocks();mockHandlerOffset=(0,_reactNativeReanimated.useSharedValue)(0);ref=(0,_react.useRef)(null);defaultProps={ref:ref,size:300,loop:true,dataLength:5,handlerOffset:mockHandlerOffset,autoFillData:false,duration:300};mockHandlerOffset.value=0;mockAnimatedReaction.mockImplementation(function(deps,cb){var depsResult=deps();cb(depsResult);return function(){};});});it("should initialize with default index",function(){mockHandlerOffset.value=-600;var _renderHook=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{defaultIndex:2}));},{wrapper:wrapper}),result=_renderHook.result;expect(result.current.getCurrentIndex()).toBe(2);});it("should move to next slide",function(){var _renderHook2=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook2.result;(0,_reactHooks.act)(function(){result.current.next();});expect(mockHandlerOffset.value).toBe(-300);});it("should move to previous slide",function(){var _renderHook3=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook3.result;(0,_reactHooks.act)(function(){result.current.prev();});expect(mockHandlerOffset.value).toBe(300);});it("should handle loop behavior correctly",function(){var _renderHook4=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:true}));},{wrapper:wrapper}),result=_renderHook4.result;(0,_reactHooks.act)(function(){result.current.scrollTo({index:4});});(0,_reactHooks.act)(function(){result.current.next();});expect(mockHandlerOffset.value).toBe(-1500);});it("should prevent movement when loop is disabled and at bounds",function(){var _renderHook5=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:false}));},{wrapper:wrapper}),result=_renderHook5.result;(0,_reactHooks.act)(function(){result.current.prev();});expect(mockHandlerOffset.value).toBe(0);(0,_reactHooks.act)(function(){result.current.scrollTo({index:4});});(0,_reactHooks.act)(function(){result.current.next();});expect(mockHandlerOffset.value).toBe(-1200);});it("should scroll to specific index",function(){var _renderHook6=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook6.result;(0,_reactHooks.act)(function(){result.current.scrollTo({index:3});});expect(mockHandlerOffset.value).toBe(-900);});it("should handle animation callbacks",function(){var onFinished=jest.fn();var _renderHook7=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook7.result;(0,_reactHooks.act)(function(){result.current.next({animated:true,onFinished:onFinished});});expect(onFinished).toHaveBeenCalled();});it("should respect animation duration",function(){var _renderHook8=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{duration:500}));},{wrapper:wrapper}),result=_renderHook8.result;var onFinished=jest.fn();(0,_reactHooks.act)(function(){result.current.next({animated:true,onFinished:onFinished});});expect(onFinished).toHaveBeenCalled();});it("should handle non-animated transitions",function(){var _renderHook9=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook9.result;(0,_reactHooks.act)(function(){result.current.scrollTo({index:2,animated:false});});expect(mockHandlerOffset.value).toBe(-600);});it("should handle multiple slide movements",function(){var _renderHook10=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook10.result;(0,_reactHooks.act)(function(){result.current.next({count:2});});expect(mockHandlerOffset.value).toBe(-600);});it("should handle animated reactions correctly",function(){(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper});expect(mockAnimatedReaction).toHaveBeenCalled();expect(mockRunOnJS).toHaveBeenCalled();});it("should handle runOnJS correctly",function(){var _renderHook11=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook11.result;(0,_reactHooks.act)(function(){result.current.next();});expect(mockRunOnJS).toHaveBeenCalled();});});describe("useCarouselController imperative handle",function(){var mockHandlerOffset;var ref;var defaultProps;beforeEach(function(){jest.clearAllMocks();mockHandlerOffset=(0,_reactNativeReanimated.useSharedValue)(0);ref=(0,_react.useRef)(null);defaultProps={ref:ref,size:300,loop:true,dataLength:5,handlerOffset:mockHandlerOffset,autoFillData:false,duration:300};mockHandlerOffset.value=0;});it("should maintain correct index through imperative calls",function(){var _renderHook12=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook12.result;var createHandle=_react.useImperativeHandle.mock.calls[0][1];var handle=createHandle();(0,_reactHooks.act)(function(){handle.next();handle.next();});expect(handle.getCurrentIndex()).toBe(2);(0,_reactHooks.act)(function(){handle.prev();});expect(handle.getCurrentIndex()).toBe(1);(0,_reactHooks.act)(function(){handle.scrollTo({index:3});});expect(handle.getCurrentIndex()).toBe(3);});it("should handle animation callbacks through imperative calls",function(){var _renderHook13=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook13.result;var onFinished=jest.fn();var createHandle=_react.useImperativeHandle.mock.calls[0][1];var handle=createHandle();(0,_reactHooks.act)(function(){handle.next({animated:true,onFinished:onFinished});});expect(onFinished).toHaveBeenCalled();});it("should respect loop settings through imperative calls",function(){var _renderHook14=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:false}));},{wrapper:wrapper}),result=_renderHook14.result;var createHandle=_react.useImperativeHandle.mock.calls[0][1];var handle=createHandle();(0,_reactHooks.act)(function(){handle.scrollTo({index:4});handle.next();});expect(handle.getCurrentIndex()).toBe(4);(0,_reactHooks.act)(function(){handle.scrollTo({index:0});handle.prev();});expect(handle.getCurrentIndex()).toBe(0);});it("should handle multiple slide movements through imperative calls",function(){var _renderHook15=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook15.result;var createHandle=_react.useImperativeHandle.mock.calls[0][1];var handle=createHandle();(0,_reactHooks.act)(function(){handle.next({count:2});});expect(handle.getCurrentIndex()).toBe(2);expect(mockHandlerOffset.value).toBe(-600);});});describe("useCarouselController edge cases and uncovered lines",function(){var mockHandlerOffset;var ref;var defaultProps;beforeEach(function(){jest.clearAllMocks();mockHandlerOffset=(0,_reactNativeReanimated.useSharedValue)(0);ref=(0,_react.useRef)(null);defaultProps={ref:ref,size:300,loop:false,dataLength:5,handlerOffset:mockHandlerOffset,autoFillData:false,duration:300};mockHandlerOffset.value=0;});it("should handle next() without animation - uncovered line 213-214",function(){var _renderHook16=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook16.result;var onFinished=jest.fn();(0,_reactHooks.act)(function(){result.current.next({animated:false,onFinished:onFinished});});expect(mockHandlerOffset.value).toBe(-300);expect(onFinished).toHaveBeenCalled();});it("should handle prev() without animation - uncovered line 245-246",function(){var _renderHook17=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:true}));},{wrapper:wrapper}),result=_renderHook17.result;(0,_reactHooks.act)(function(){result.current.next({animated:false});});var onFinished=jest.fn();(0,_reactHooks.act)(function(){result.current.prev({animated:false,onFinished:onFinished});});expect(Math.abs(mockHandlerOffset.value)).toBe(0);expect(onFinished).toHaveBeenCalled();});it("should handle scrollTo() without animation when target equals current index - uncovered line 265",function(){var _renderHook18=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook18.result;(0,_reactHooks.act)(function(){result.current.next({animated:false});});var onFinished=jest.fn();(0,_reactHooks.act)(function(){result.current.scrollTo({index:1,animated:false,onFinished:onFinished});});expect(onFinished).not.toHaveBeenCalled();expect(mockHandlerOffset.value).toBe(-300);});it("should handle scrollTo() without animation - uncovered line 294-296",function(){var _renderHook19=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:true}));},{wrapper:wrapper}),result=_renderHook19.result;var onFinished=jest.fn();(0,_reactHooks.act)(function(){result.current.scrollTo({index:2,animated:false,onFinished:onFinished});});expect(mockHandlerOffset.value).toBe(-600);expect(onFinished).toHaveBeenCalled();});it("should handle scrollTo() with count parameter - uncovered line 321-326",function(){var _renderHook20=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook20.result;(0,_reactHooks.act)(function(){result.current.scrollTo({count:-2});});expect(mockHandlerOffset.value).toBe(0);(0,_reactHooks.act)(function(){result.current.scrollTo({count:2});});expect(mockHandlerOffset.value).toBe(-600);});it("should handle scrollTo() with invalid count (should return early)",function(){var _renderHook21=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook21.result;(0,_reactHooks.act)(function(){result.current.scrollTo({count:0});});expect(mockHandlerOffset.value).toBe(0);});it("should handle overscroll protection when overscrollEnabled is false",function(){var restrictedGlobalState=Object.assign({},mockGlobalState,{props:Object.assign({},mockGlobalState.props,{overscrollEnabled:false}),layout:Object.assign({},mockGlobalState.layout,{containerSize:{value:{width:300,height:300}}})});var restrictedWrapper=function restrictedWrapper(_ref2){var children=_ref2.children;return(0,_jsxRuntime.jsx)(_store.GlobalStateContext.Provider,{value:restrictedGlobalState,children:children});};var _renderHook22=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:false,dataLength:4}));},{wrapper:restrictedWrapper}),result=_renderHook22.result;(0,_reactHooks.act)(function(){result.current.scrollTo({index:2,animated:false});});(0,_reactHooks.act)(function(){result.current.next();});expect(typeof mockHandlerOffset.value).toBe("number");});it("should call onScrollStart and onScrollEnd callbacks",function(){var onScrollStart=jest.fn();var onScrollEnd=jest.fn();var _renderHook23=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{onScrollStart:onScrollStart,onScrollEnd:onScrollEnd}));},{wrapper:wrapper}),result=_renderHook23.result;(0,_reactHooks.act)(function(){result.current.next({animated:true});});expect(onScrollStart).toHaveBeenCalled();expect(onScrollEnd).toHaveBeenCalled();});it("should handle disabled carousel (empty data)",function(){var _renderHook24=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{dataLength:0}));},{wrapper:wrapper}),result=_renderHook24.result;(0,_reactHooks.act)(function(){result.current.next();});expect(mockHandlerOffset.value).toBe(0);});it("should handle autoFillData with computedRealIndexWithAutoFillData",function(){var _renderHook25=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{autoFillData:true,dataLength:3}));},{wrapper:wrapper}),result=_renderHook25.result;(0,_reactHooks.act)(function(){result.current.next();});var currentIndex=result.current.getCurrentIndex();expect(typeof currentIndex).toBe("number");});it("should handle fixed direction in scrollTo",function(){var _renderHook26=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:true,fixedDirection:1}));},{wrapper:wrapper}),result=_renderHook26.result;(0,_reactHooks.act)(function(){result.current.scrollTo({index:3,animated:false});});expect(mockHandlerOffset.value).toBe(-900);});it("should handle complex loop calculations in scrollTo",function(){var _renderHook27=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:true}));},{wrapper:wrapper}),result=_renderHook27.result;mockHandlerOffset.value=-1800;(0,_reactHooks.act)(function(){result.current.scrollTo({index:1,animated:false});});expect(typeof mockHandlerOffset.value).toBe("number");});it("should get shared index correctly",function(){var _renderHook28=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(defaultProps);},{wrapper:wrapper}),result=_renderHook28.result;var sharedIndex=result.current.getSharedIndex();expect(typeof sharedIndex).toBe("number");});it("should handle currentFixedPage calculation for non-loop mode",function(){var _renderHook29=(0,_reactHooks.renderHook)(function(){return(0,_useCarouselController.useCarouselController)(Object.assign({},defaultProps,{loop:false}));},{wrapper:wrapper}),result=_renderHook29.result;mockHandlerOffset.value=-450;(0,_reactHooks.act)(function(){result.current.next();});expect(typeof mockHandlerOffset.value).toBe("number");});});
//# sourceMappingURL=useCarouselController.test.js.map