rx-sandbox
Version:
Marble diagram DSL based test suite for RxJS 6/7
73 lines • 3.99 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.constructSubscriptionMarble = void 0;
const ObservableMarbleToken_1 = require("../marbles/ObservableMarbleToken");
const SubscriptionMarbleToken_1 = require("../marbles/SubscriptionMarbleToken");
const MAX_FRAME_LENGTH = 30;
/**
* @internal
*/
const constructSubscriptionMarble = ({ subscribedFrame, unsubscribedFrame, }) => {
const marble = Array.from(Array(MAX_FRAME_LENGTH + 1)).map(() => ObservableMarbleToken_1.ObservableMarbleToken.TIMEFRAME);
let frameString = '';
let subscribeExpandingTimeFrame = Number.POSITIVE_INFINITY;
if (subscribedFrame !== Number.POSITIVE_INFINITY) {
if (subscribedFrame > MAX_FRAME_LENGTH) {
//replace start of marble into `---...${n}...---^`, where
//n makes subscription frame with prefix, postfix expand token (3, 3 - 6 in total)
//then remain whole marble length as max frame length
subscribeExpandingTimeFrame = subscribedFrame - 6;
marble.unshift(...Array.from(`---...${subscribeExpandingTimeFrame}...---^`));
const idx = marble.lastIndexOf(SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE) + 1;
while (marble.length > MAX_FRAME_LENGTH + 1) {
marble.splice(idx, 1);
}
}
else {
marble[subscribedFrame] = SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE;
}
const frameIdx = marble.lastIndexOf(SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE);
while (frameString.length < frameIdx) {
frameString += ' ';
}
frameString += subscribedFrame;
}
if (unsubscribedFrame !== Number.POSITIVE_INFINITY) {
if (unsubscribedFrame > MAX_FRAME_LENGTH) {
const isSubscribed = subscribedFrame !== Number.POSITIVE_INFINITY;
const remaningFrame = isSubscribed
? MAX_FRAME_LENGTH - marble.lastIndexOf(SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE) - 1
: MAX_FRAME_LENGTH;
const unsubscribeExpandTimeFrame = isSubscribed
? unsubscribedFrame - subscribedFrame + 1 - remaningFrame + 6
: unsubscribedFrame + 1 - MAX_FRAME_LENGTH + 6;
let expandedFrame = `...${unsubscribeExpandTimeFrame}...---!`;
let count = expandedFrame.length;
// If in-range subscription collides to expanding token, preserve it though it increases length
const availableTimeFrame = MAX_FRAME_LENGTH - count;
if (marble.lastIndexOf(SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE) > availableTimeFrame) {
const exceedFrameCount = marble.lastIndexOf(SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE) - availableTimeFrame;
expandedFrame = `...${unsubscribeExpandTimeFrame - exceedFrameCount}...---!`;
}
count = expandedFrame.length;
while (count-- > 0 && marble[marble.length - 1] !== SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE) {
marble.pop();
}
marble.push(...Array.from(expandedFrame));
}
else {
marble[unsubscribedFrame] = SubscriptionMarbleToken_1.SubscriptionMarbleToken.UNSUBSCRIBE;
}
const frameIdx = marble.lastIndexOf(SubscriptionMarbleToken_1.SubscriptionMarbleToken.UNSUBSCRIBE);
while (frameString.length < frameIdx) {
frameString += ' ';
}
frameString += unsubscribedFrame;
//strip timeframe after unsubscription
marble.splice(marble.indexOf(SubscriptionMarbleToken_1.SubscriptionMarbleToken.UNSUBSCRIBE) + 1);
}
const marbleString = marble.join('');
return { marbleString, frameString };
};
exports.constructSubscriptionMarble = constructSubscriptionMarble;
//# sourceMappingURL=constructSubscriptionMarble.js.map