@ray-core/runtime
Version:
Ray 是一个全新的基于 React 的小程序开发框架
499 lines (498 loc) • 19.8 kB
JavaScript
;
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);
});
});