UNPKG

@ray-core/runtime

Version:

Ray 是一个全新的基于 React 的小程序开发框架

499 lines (498 loc) 19.8 kB
"use strict"; var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __read = (this && this.__read) || function (o, n) { var m = typeof Symbol === "function" && o[Symbol.iterator]; if (!m) return o; var i = m.call(o), r, ar = [], e; try { while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value); } catch (error) { e = { error: error }; } finally { try { if (r && !r.done && (m = i["return"])) m.call(i); } finally { if (e) throw e.error; } } return ar; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var React = __importStar(require("react")); require("./helpers/setupGlobals"); var createPageConfig_1 = __importDefault(require("../createPageConfig")); var src_1 = require("../../src"); var framework_shared_1 = require("@ray-core/framework-shared"); var View_1 = __importDefault(require("./helpers/View")); var Page_1 = __importDefault(require("./helpers/Page")); var TEST_PAGE = 'pages/test/index'; describe('page', function () { beforeAll(function () { framework_shared_1.RuntimeOptions.apply({ appEvents: [ 'onLaunch', 'onShow', 'onHide', 'onShareAppMessage', 'onPageNotFound', 'onError', 'onUnhandledRejection', 'onThemeChange', ], pageEvents: { 'pages/test/only/onshow': ['onShow'], 'pages/test/index': [ 'onShow', 'onHide', 'onPullDownRefresh', 'onPullIntercept', 'onReachBottom', 'onPageScroll', 'onShareAppMessage', 'onShareTimeline', 'onTitleClick', 'onOptionMenuClick', 'onPopMenuClick', 'onReady', 'onResize', 'onTabItemTap', ], }, }); }); afterAll(function () { framework_shared_1.RuntimeOptions.reset(); }); it('create page config', function () { var Foo = function () { return React.createElement(View_1.default, null, "foo"); }; var page = (0, Page_1.default)((0, createPageConfig_1.default)(Foo, TEST_PAGE)); getApp().onLaunch(); page.load(); expect(page.config.wrapper).not.toBeNull(); }); describe('hooks', function () { it('works', function () { var log = []; var Foo = function () { (0, src_1.usePageEvent)('onLoad', function () { log.push('useLoad'); }); (0, src_1.usePageEvent)('onUnload', function () { log.push('useUnload'); }); (0, src_1.usePageEvent)('onReady', function () { log.push('useReady'); }); (0, src_1.usePageEvent)('onShow', function () { log.push('useShow'); }); (0, src_1.usePageEvent)('onHide', function () { log.push('useHide'); }); (0, src_1.usePageEvent)('onPullDownRefresh', function () { log.push('usePullDownRefresh'); }); (0, src_1.usePageEvent)('onReachBottom', function () { log.push('useReachBottom'); }); (0, src_1.usePageEvent)('onPageScroll', function () { log.push('usePageScroll'); }); (0, src_1.usePageEvent)('onShareAppMessage', function (object) { log.push(object.from); log.push('useShareAppMessage'); return {}; }); (0, src_1.usePageEvent)('onShareTimeline', function (object) { log.push(object.from); log.push('useShareTimeline'); return {}; }); (0, src_1.usePageEvent)('onTitleClick', function () { log.push('useTitleClick'); }); (0, src_1.usePageEvent)('onOptionMenuClick', function () { log.push('useOptionMenuClick'); }); (0, src_1.usePageEvent)('onPopMenuClick', function () { log.push('usePopMenuClick'); }); (0, src_1.usePageEvent)('onPullIntercept', function () { log.push('usePullIntercept'); }); (0, src_1.usePageEvent)('onBack', function () { log.push('useEventOnBack'); }); (0, src_1.usePageEvent)('onKeyboardHeight', function () { log.push('useEventOnKeyboardHeight'); }); (0, src_1.usePageEvent)('onTabItemTap', function () { log.push('useEventOnTabItemTap'); }); (0, src_1.usePageEvent)('beforeTabItemTap', function () { log.push('useEventBeforeTabItemTap'); }); (0, src_1.usePageEvent)('onResize', function () { log.push('useEventOnResize'); }); (0, src_1.usePageEvent)('onShow', function () { log.push('useEventOnShow'); }); return React.createElement(View_1.default, null, "foo"); }; var page = (0, Page_1.default)((0, createPageConfig_1.default)(Foo, TEST_PAGE)); page.load(); page.ready(); page.pullDownRefresh(); page.pullIntercept(); page.reachBottom(); page.pageScroll(); page.shareAppMessage(); page.shareTimeline(); page.titleClick(); page.optionMenuClick(); page.popMenuClick(); page.back(); page.keyboardHeight(); page.tabItemTap(); page.beforeTabItemTap(); page.resize(); page.hide(); page.unload(); expect(log).toEqual([ 'useLoad', 'useShow', 'useEventOnShow', 'useReady', 'usePullDownRefresh', 'usePullIntercept', 'useReachBottom', 'usePageScroll', 'menu', 'useShareAppMessage', 'menu', 'useShareTimeline', 'useTitleClick', 'useOptionMenuClick', 'usePopMenuClick', 'useEventOnBack', 'useEventOnKeyboardHeight', 'useEventOnTabItemTap', // 测试了微信和阿里两个hook,所以有两个 'useEventOnTabItemTap', 'useEventBeforeTabItemTap', 'useEventOnResize', // 测试了微信和阿里两个hook,所以有两个 'useEventOnResize', 'useHide', 'useUnload', ]); }); it('works in component', function () { var log = []; var Foo = function () { (0, src_1.usePageEvent)('onShow', function () { log.push('onShow'); }); return React.createElement(View_1.default, null, "foo"); }; var Bar = function () { return React.createElement(Foo, null); }; var page = (0, Page_1.default)((0, createPageConfig_1.default)(Bar, TEST_PAGE)); page.load(); expect(log).toEqual(['onShow']); }); it('register once', function () { var log = []; var foo = React.createRef(); var Foo = React.forwardRef(function (props, ref) { var forceUpdate = React.useState(0)[1]; (0, src_1.usePageEvent)('onShow', function () { log.push('onShow'); }); (0, src_1.usePageEvent)('onShareAppMessage', function () { log.push('onShareAppMessage'); }); React.useImperativeHandle(ref, function () { return ({ forceUpdate: forceUpdate, }); }); return React.createElement(View_1.default, null, "foo"); }); var page = (0, Page_1.default)((0, createPageConfig_1.default)(function () { return React.createElement(Foo, { ref: foo }); }, TEST_PAGE)); page.load(); foo.current.forceUpdate(); page.shareAppMessage(); expect(log).toEqual(['onShow', 'onShareAppMessage']); }); it('call once with child hook', function () { var log = []; var foo = React.createRef(); var Child = function () { var _a = __read(React.useState(0), 2), count = _a[0], setCount = _a[1]; (0, src_1.usePageEvent)('onShow', function () { log.push('child onShow'); setCount(count + 1); }); return React.createElement(View_1.default, null, "Child"); }; var Foo = React.forwardRef(function (props, ref) { (0, src_1.usePageEvent)('onShow', function () { log.push('foo onShow'); }); return (React.createElement(View_1.default, null, React.createElement(Child, null))); }); var page = (0, Page_1.default)((0, createPageConfig_1.default)(function () { return React.createElement(Foo, { ref: foo }); }, TEST_PAGE)); page.load(); expect(log).toEqual(['child onShow', 'foo onShow']); }); }); it('lifecycle methods', function () { var log = []; var Foo = /** @class */ (function (_super) { __extends(Foo, _super); function Foo() { return _super !== null && _super.apply(this, arguments) || this; } Foo.prototype.componentWillMount = function () { log.push('componentWillMount'); }; Foo.prototype.componentDidMount = function () { log.push('componentDidMount'); }; Foo.prototype.componentWillUnmount = function () { log.push('componentWillUnmount'); }; Foo.prototype.onLoad = function () { log.push('onLoad'); }; Foo.prototype.onUnload = function () { log.push('onUnload'); }; Foo.prototype.onShow = function () { log.push('onShow'); }; Foo.prototype.onHide = function () { log.push('onHide'); }; Foo.prototype.onPullDownRefresh = function () { log.push('onPullDownRefresh'); }; Foo.prototype.onReachBottom = function () { log.push('onReachBottom'); }; Foo.prototype.onPageScroll = function () { log.push('onPageScroll'); }; Foo.prototype.onShareAppMessage = function (object) { log.push(object.from); log.push('onShareAppMessage'); }; Foo.prototype.onShareTimeline = function (object) { log.push(object.from); log.push('onShareTimeline'); }; Foo.prototype.onTitleClick = function () { log.push('onTitleClick'); }; Foo.prototype.onOptionMenuClick = function () { log.push('onOptionMenuClick'); }; Foo.prototype.onPopMenuClick = function () { log.push('onPopMenuClick'); }; Foo.prototype.onPullIntercept = function () { log.push('onPullIntercept'); }; Foo.prototype.onResize = function () { log.push('onResize'); }; Foo.prototype.onTabItemTap = function () { log.push('onTabItemTap'); }; Foo.prototype.onKeyboardHeight = function () { log.push('onKeyboardHeight'); }; Foo.prototype.onBack = function () { log.push('onBack'); }; Foo.prototype.beforeTabItemTap = function () { log.push('beforeTabItemTap'); }; Foo.prototype.render = function () { return React.createElement(View_1.default, null, "foo"); }; return Foo; }(React.Component)); var page = (0, Page_1.default)((0, createPageConfig_1.default)(Foo, TEST_PAGE)); page.load(); page.pullDownRefresh(); page.pullIntercept(); page.reachBottom(); page.pageScroll(); page.shareAppMessage(); page.shareTimeline(); page.titleClick(); page.optionMenuClick(); page.popMenuClick(); page.hide(); page.back(); page.keyboardHeight(); page.beforeTabItemTap(); page.tabItemTap(); page.resize(); page.unload(); expect(log).toEqual([ 'componentWillMount', 'componentDidMount', 'onLoad', 'onShow', 'onPullDownRefresh', 'onPullIntercept', 'onReachBottom', 'onPageScroll', 'menu', 'onShareAppMessage', 'menu', 'onShareTimeline', 'onTitleClick', 'onOptionMenuClick', 'onPopMenuClick', 'onHide', 'onBack', 'onKeyboardHeight', 'beforeTabItemTap', 'onTabItemTap', 'onTabItemTap', 'onResize', 'onResize', 'onUnload', 'componentWillUnmount', ]); }); it('hooks methods', function (done) { var log = []; var Foo = function () { React.useEffect(function () { log.push('componentDidMount'); return function () { log.push('componentWillUnmount'); expect(log).toEqual(['componentDidMount', 'componentWillUnmount']); done(); }; }, []); return React.createElement(View_1.default, null, "foo"); }; var page = (0, Page_1.default)((0, createPageConfig_1.default)(Foo, TEST_PAGE)); page.load(); page.unload(); }); it('call useEffect', function (done) { var Foo = React.forwardRef(function (props, ref) { var log = React.useRef([]); var times = React.useRef(0); var _a = __read(React.useState(1), 2), v1 = _a[0], upV1 = _a[1]; var _b = __read(React.useState(1), 2), v2 = _b[0], upV2 = _b[1]; React.useEffect(function () { log.current.push('foo didMount'); return function () { expect(times.current).toEqual(2); expect(log.current).toEqual(['foo onShow', 'foo didMount']); done(); }; }, []); React.useEffect(function updateTimes() { times.current += 1; }, [v1, v2]); (0, src_1.usePageEvent)('onShow', function updateState() { upV1(2); upV2(2); log.current.push('foo onShow'); }); return React.createElement(View_1.default, null, "useEffect"); }); var page = (0, Page_1.default)((0, createPageConfig_1.default)(function () { return React.createElement(Foo, null); }, TEST_PAGE)); page.load(); page.unload(); }); it('call events batchedUpdates', function (done) { var Foo = React.forwardRef(function (props, ref) { var log = React.useRef([]); var times = React.useRef(0); var _a = __read(React.useState(1), 2), v1 = _a[0], upV1 = _a[1]; var _b = __read(React.useState(1), 2), v2 = _b[0], upV2 = _b[1]; var up = function (event) { expect(event.stopPropagation).toBeTruthy(); upV1(2); upV2(2); }; React.useEffect(function () { log.current.push('foo didMount'); return function () { expect(times.current).toEqual(2); expect(log.current).toEqual(['foo onShow', 'foo didMount']); done(); }; }, []); React.useEffect(function updateTimes() { times.current += 1; }, [v1, v2]); (0, src_1.usePageEvent)('onShow', function updateState() { log.current.push('foo onShow'); }); return React.createElement(View_1.default, { onClick: up }, "useEffect"); }); var page = (0, Page_1.default)((0, createPageConfig_1.default)(function () { return React.createElement(Foo, null); }, TEST_PAGE)); page.load(); var fnKey = Object.keys(page.config).find(function (key) { return key.endsWith('onClick'); }); var fn = page.config[fnKey]; fn({ stopPropagation: function () { // mock event }, }); setTimeout(function () { page.unload(); }, 300); }); });