@ray-core/runtime
Version:
Ray 是一个全新的基于 React 的小程序开发框架
203 lines (202 loc) • 7.41 kB
JavaScript
;
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 createCallbackProxy_1 = require("../SyntheticEvent/createCallbackProxy");
var VNode_1 = __importDefault(require("../VNode"));
var Container_1 = __importDefault(require("../Container"));
var SyntheticEventTester = /** @class */ (function () {
function SyntheticEventTester(params) {
var _this = this;
this.callbacks = [];
var container = new Container_1.default({});
var root = new VNode_1.default({
type: 'view',
container: container,
});
params.reverse().reduce(function (parent, _a, index) {
var _b = __read(_a, 2), cb = _b[0], event = _b[1];
var node = new VNode_1.default({
type: 'view',
container: container,
props: {},
});
var callback = (0, createCallbackProxy_1.createCallbackProxy)(event, node, cb || (function () { return void 0; }));
if (cb) {
node.props[event] = callback;
}
_this.callbacks.unshift(cb ? callback : null);
node.parent = parent;
return node;
}, root);
}
SyntheticEventTester.prototype.trigger = function () {
this.callbacks.forEach(function (cb) { return cb && cb({}); });
};
return SyntheticEventTester;
}());
describe('synthetic event', function () {
describe('stop propagation', function () {
it('only accept valid type', function () {
var onTap = function () { return void 0; };
var node = new VNode_1.default({
type: 'view',
container: new Container_1.default({}),
props: {},
});
var newOnTap = (0, createCallbackProxy_1.createCallbackProxy)('onClick', node, onTap);
expect(onTap).not.toBe(newOnTap);
var catchTap = function () { return void 0; };
var newCatchTap = (0, createCallbackProxy_1.createCallbackProxy)('catchClick', node, catchTap);
expect(catchTap).toBe(newCatchTap);
});
it('normal', function () {
var first = jest.fn();
var second = jest.fn();
var third = jest.fn();
var callbacks = [
[first, 'onClick'],
[second, 'onClick'],
[third, 'onClick'],
];
var tester = new SyntheticEventTester(callbacks);
tester.trigger();
expect(first).toBeCalled();
expect(second).toBeCalled();
expect(third).toBeCalled();
});
it('works if no event param', function () {
var onTap = function () { return void 0; };
var node = new VNode_1.default({
type: 'view',
container: new Container_1.default({}),
props: {},
});
var newOnTap = (0, createCallbackProxy_1.createCallbackProxy)('onClick', node, onTap);
expect(function () { return newOnTap(); }).not.toThrow();
});
it('each type works independent', function () {
var first = jest.fn();
var second = jest.fn();
var third = jest.fn();
var callbacks = [
[
function (e) {
e.stopPropagation();
first();
},
'onClick',
],
[third, 'onClick'],
[second, 'onTouchStart'],
];
var tester = new SyntheticEventTester(callbacks);
tester.trigger();
expect(first).toBeCalled();
expect(second).toBeCalled();
expect(third).not.toBeCalled();
tester.trigger();
expect(first).toBeCalled();
expect(second).toBeCalled();
expect(third).not.toBeCalled();
});
it('stop at first', function () {
var first = jest.fn();
var second = jest.fn();
var third = jest.fn();
var callbacks = [
[
function (e) {
e.stopPropagation();
first();
},
'onClick',
],
[second, 'onClick'],
[third, 'onClick'],
];
var tester = new SyntheticEventTester(callbacks);
tester.trigger();
expect(first).toBeCalled();
expect(second).not.toBeCalled();
expect(third).not.toBeCalled();
tester.trigger();
expect(first).toBeCalled();
expect(second).not.toBeCalled();
expect(third).not.toBeCalled();
});
it('stop at middle', function () {
var first = jest.fn();
var second = jest.fn();
var third = jest.fn();
var callbacks = [
[first, 'onClick'],
[null, 'onClick'],
[
function (e) {
e.stopPropagation();
second();
},
'onClick',
],
[null, 'onClick'],
[third, 'onClick'],
[null, 'onClick'],
];
var tester = new SyntheticEventTester(callbacks);
tester.trigger();
expect(first).toBeCalled();
expect(second).toBeCalled();
expect(third).not.toBeCalled();
tester.trigger();
expect(first).toBeCalled();
expect(second).toBeCalled();
expect(third).not.toBeCalled();
});
it('stop at last', function () {
var first = jest.fn();
var second = jest.fn();
var third = jest.fn();
var callbacks = [
[first, 'onClick'],
[null, 'onClick'],
[second, 'onClick'],
[null, 'onClick'],
[
function (e) {
e.stopPropagation();
third();
},
'onClick',
],
[null, 'onClick'],
];
var tester = new SyntheticEventTester(callbacks);
tester.trigger();
expect(first).toBeCalled();
expect(second).toBeCalled();
expect(third).toBeCalled();
tester.trigger();
expect(first).toBeCalled();
expect(second).toBeCalled();
expect(third).toBeCalled();
});
});
});