rx-sandbox
Version:
Marble diagram DSL based test suite for RxJS 6/7
151 lines • 6.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.observableTokenParseReducer = exports.subscriptionTokenParseReducer = void 0;
const TestMessage_1 = require("../message/TestMessage");
const coreInternalImport_1 = require("../utils/coreInternalImport");
const ObservableMarbleToken_1 = require("./ObservableMarbleToken");
const SubscriptionMarbleToken_1 = require("./SubscriptionMarbleToken");
/**
* Translate single token in marble diagram to correct metadata
* @param {any} token Single char in marble diagram
* @param {{ [key: string]: T }} [value] Custom value for marble value
* @param {boolean} [materializeInnerObservables] Flatten inner observables in cold observable. False by default.
*/
const getMarbleTokenValue = (token, value, materializeInnerObservables) => {
const customValue = value && token in value ? value[token] : token;
return materializeInnerObservables && customValue instanceof coreInternalImport_1.ColdObservable ? customValue.messages : customValue;
};
const timeFrameExpandTokenHandler = (acc, frameTimeFactor) => {
const ret = Object.assign({}, acc);
ret.expandingTokenCount += 1;
//When token reaches ...xxx..., clean up state
if (ret.expandingTokenCount === 6) {
ret.expandingValue.splice(0);
ret.expandingTokenCount = 0;
}
//When first ending token arrives ...xxx. , parse values and adjust timeframe
if (ret.expandingTokenCount === 4) {
if (ret.expandingValue.length === 0) {
throw new Error(`There isn't value to expand timeframe`);
}
const expandedFrame = parseInt(ret.expandingValue.join(''), 10);
ret.currentTimeFrame += expandedFrame * frameTimeFactor;
}
return ret;
};
const validateTimeFrameToken = (acc) => {
if (acc.expandingTokenCount > 0 || acc.simultaneousGrouped) {
throw new Error('Incorret timeframe specified');
}
};
const validateSimultaneousGroupToken = (acc) => {
if (acc.simultaneousGrouped) {
throw new Error('Cannot nest grouped value');
}
};
const increaseTimeFrame = (acc, frameTimeFactor) => {
const ret = Object.assign({}, acc);
ret.currentTimeFrame += 1 * frameTimeFactor;
return ret;
};
/**
* @internal
* Reducer to traverse Observable marble diagram to generate TestMessage metadata.
* @param value Custom values for marble values
* @param error Custom error
* @param materializeInnerObservables Flatten inner observable if available
* @param frameTimeFactor Custom timeframe factor
*/
const observableTokenParseReducer = (value, error, materializeInnerObservables, frameTimeFactor, maxFrame) => (acc, token) => {
if (acc.currentTimeFrame >= maxFrame) {
return acc;
}
let message = null;
switch (token) {
case ObservableMarbleToken_1.ObservableMarbleToken.TIMEFRAME:
validateTimeFrameToken(acc);
acc = increaseTimeFrame(acc, frameTimeFactor);
break;
case ObservableMarbleToken_1.ObservableMarbleToken.ERROR:
message = (0, TestMessage_1.error)(acc.currentTimeFrame, error || '#');
break;
case ObservableMarbleToken_1.ObservableMarbleToken.COMPLETE:
message = (0, TestMessage_1.complete)(acc.currentTimeFrame);
break;
case ObservableMarbleToken_1.ObservableMarbleToken.TIMEFRAME_EXPAND:
acc = timeFrameExpandTokenHandler(acc, frameTimeFactor);
break;
case ObservableMarbleToken_1.ObservableMarbleToken.SIMULTANEOUS_START:
validateSimultaneousGroupToken(acc);
acc.simultaneousGrouped = true;
break;
case ObservableMarbleToken_1.ObservableMarbleToken.SIMULTANEOUS_END:
acc = increaseTimeFrame(acc, frameTimeFactor);
acc.simultaneousGrouped = false;
break;
case SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE:
acc = increaseTimeFrame(acc, frameTimeFactor);
break;
default:
if (acc.expandingTokenCount > 0) {
acc.expandingValue.push(token);
}
else {
const tokenValue = getMarbleTokenValue(token, value, materializeInnerObservables);
message = (0, TestMessage_1.next)(acc.currentTimeFrame, tokenValue);
}
}
if (!!message) {
acc.messages.push(message);
if (!acc.simultaneousGrouped) {
acc = increaseTimeFrame(acc, frameTimeFactor);
}
}
return acc;
};
exports.observableTokenParseReducer = observableTokenParseReducer;
/**
* @internal
* Reducer to traverse subscription marble diagram to generate SubscriptionLog metadata.
* @param frameTimeFactor Custom timeframe factor
*/
const subscriptionTokenParseReducer = (frameTimeFactor, maxFrame) => (acc, token) => {
if (acc.currentTimeFrame >= maxFrame) {
return acc;
}
switch (token) {
case SubscriptionMarbleToken_1.SubscriptionMarbleToken.SUBSCRIBE:
acc.subscriptionFrame = acc.currentTimeFrame;
if (!acc.simultaneousGrouped) {
acc = increaseTimeFrame(acc, frameTimeFactor);
}
break;
case SubscriptionMarbleToken_1.SubscriptionMarbleToken.UNSUBSCRIBE:
acc.unsubscriptionFrame = acc.currentTimeFrame;
break;
case ObservableMarbleToken_1.ObservableMarbleToken.TIMEFRAME_EXPAND:
acc = timeFrameExpandTokenHandler(acc, frameTimeFactor);
break;
case ObservableMarbleToken_1.ObservableMarbleToken.SIMULTANEOUS_START:
validateSimultaneousGroupToken(acc);
acc.simultaneousGrouped = true;
break;
case ObservableMarbleToken_1.ObservableMarbleToken.SIMULTANEOUS_END:
acc.simultaneousGrouped = false;
case ObservableMarbleToken_1.ObservableMarbleToken.TIMEFRAME:
validateTimeFrameToken(acc);
case ObservableMarbleToken_1.ObservableMarbleToken.ERROR:
case ObservableMarbleToken_1.ObservableMarbleToken.COMPLETE:
default:
if (acc.expandingTokenCount > 0) {
acc.expandingValue.push(token);
}
else if (!acc.simultaneousGrouped) {
acc = increaseTimeFrame(acc, frameTimeFactor);
}
break;
}
return acc;
};
exports.subscriptionTokenParseReducer = subscriptionTokenParseReducer;
//# sourceMappingURL=tokenParseReducer.js.map