From 69d35d70cbfeff40a24b252366e6dd8c36fdcf9b Mon Sep 17 00:00:00 2001 From: strausr Date: Sun, 17 Apr 2022 14:41:59 +0300 Subject: [PATCH] Add condiotional Action from/to Json --- .../unit/fromJson/condition.fromJson.test.ts | 37 +++++++++++++++++ .../unit/toJson/conditional.toJson.test.ts | 40 +++++++++++++++++++ src/actions/conditional.ts | 17 ++++++++ src/internal/fromJson.ts | 4 +- .../models/IConditionalActionModel.ts | 10 +++++ 5 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 __TESTS__/unit/fromJson/condition.fromJson.test.ts create mode 100644 __TESTS__/unit/toJson/conditional.toJson.test.ts create mode 100644 src/internal/models/IConditionalActionModel.ts diff --git a/__TESTS__/unit/fromJson/condition.fromJson.test.ts b/__TESTS__/unit/fromJson/condition.fromJson.test.ts new file mode 100644 index 00000000..8c794af5 --- /dev/null +++ b/__TESTS__/unit/fromJson/condition.fromJson.test.ts @@ -0,0 +1,37 @@ +import {fromJson} from "../../../src/internal/fromJson"; +import {Transformation} from "../../../src"; +import {Resize} from "../../../src/actions/resize"; + +describe('condition.fromJson', () => { + it('should generate a transformation string from condition action', function () { + const widthTx = new Transformation().addAction('w_100'); + const transformation = fromJson({ + actions: [ + { + actionType: 'ifCondition', + expression: 'ar >= 1.0', + transformation: widthTx + } + ] + }); + + expect(transformation.toString()).toStrictEqual('if_ar_gte_1.0/w_100/if_end'); + }); + + it('should generate a transformation string from condition action with otherwise', function () { + const widthTx = new Transformation().addAction('w_100'); + const otherwiseTx = new Transformation().resize(Resize.scale(50)); + const transformation = fromJson({ + actions: [ + { + actionType: 'ifCondition', + expression: 'ar >= 1.0', + transformation: widthTx, + otherwise: otherwiseTx + } + ] + }); + + expect(transformation.toString()).toStrictEqual('if_ar_gte_1.0/w_100/if_else/c_scale,w_50/if_end'); + }); +}); \ No newline at end of file diff --git a/__TESTS__/unit/toJson/conditional.toJson.test.ts b/__TESTS__/unit/toJson/conditional.toJson.test.ts new file mode 100644 index 00000000..ebcabdcc --- /dev/null +++ b/__TESTS__/unit/toJson/conditional.toJson.test.ts @@ -0,0 +1,40 @@ +import {Conditional} from "../../../src/actions/conditional"; +import {Transformation} from "../../../src"; +import {Resize} from "../../../src/actions/resize"; + + +describe('Conditional.toJson', ()=>{ + it('Conditional with transformation', () => { + const conditionalTx = new Transformation().addAction( + Conditional.ifCondition('ar >= 1.0', new Transformation().addAction('w_100'))); + const transformation = new Transformation().addAction('w_100'); + expect(conditionalTx.toJson()).toStrictEqual({ + actions: [ + { + actionType: 'ifCondition', + expression: 'ar >= 1.0', + transformation: transformation + } + ] + }); + }); + + it('Conditional with if/else combination', () => { + const conditionalTx = new Transformation().addAction( + Conditional.ifCondition('ar >= 1.0', new Transformation().resize(Resize.scale(50))) + .otherwise(new Transformation().resize(Resize.scale(200)))); + const transformation = new Transformation().resize(Resize.scale(50)); + const otherwise = new Transformation().resize(Resize.scale(200)); + + expect(conditionalTx.toJson()).toStrictEqual({ + actions: [ + { + actionType: 'ifCondition', + expression: 'ar >= 1.0', + transformation: transformation, + otherwise: otherwise + } + ] + }); + }); +}); \ No newline at end of file diff --git a/src/actions/conditional.ts b/src/actions/conditional.ts index f477b45c..92cd55a6 100644 --- a/src/actions/conditional.ts +++ b/src/actions/conditional.ts @@ -1,6 +1,8 @@ import {Action} from "../internal/Action.js"; import {expression} from "../qualifiers/expression.js"; import {Transformation} from "../transformation/Transformation.js"; +import {IConditionalActionModel} from "../internal/models/IConditionalActionModel.js"; +import {IActionModel} from "../internal/models/IActionModel.js"; /** * Sets up a conditional transformation. @@ -35,6 +37,7 @@ import {Transformation} from "../transformation/Transformation.js"; * // Transformation will contain `if_ar_gte_1.0/w_100/if_end` */ class ConditionalAction extends Action{ + protected _actionModel: IConditionalActionModel = {actionType: "ifCondition"}; private ifTx: Transformation; private elseTx: Transformation; private exp: string; @@ -48,6 +51,8 @@ class ConditionalAction extends Action{ super(); this.exp = exp; this.ifTx = ifTx; + this._actionModel.expression = exp; + this._actionModel.transformation = ifTx; } /** @@ -57,6 +62,7 @@ class ConditionalAction extends Action{ */ otherwise(elseTx: Transformation): this { this.elseTx = elseTx; + this._actionModel.otherwise = elseTx; return this; } @@ -68,6 +74,17 @@ class ConditionalAction extends Action{ `if_end` ].filter((a) => a).join('/'); } + + static fromJson(actionModel: IActionModel): ConditionalAction { + const {expression, transformation, otherwise} = (actionModel as IConditionalActionModel); + + // We are using this() to allow inheriting classes to use super.fromJson.apply(this, [actionModel]) + // This allows the inheriting classes to determine the class to be created + const result = new this(expression, transformation); + otherwise && result.otherwise(otherwise); + + return result; + } } diff --git a/src/internal/fromJson.ts b/src/internal/fromJson.ts index 40255577..7e4d9577 100644 --- a/src/internal/fromJson.ts +++ b/src/internal/fromJson.ts @@ -56,6 +56,7 @@ import ToAnimatedAction from "../actions/transcode/ToAnimatedAction.js"; import {FadeInEffectAction} from "../actions/effect/leveled/FadeIn.js"; import {FadeOutEffectAction} from "../actions/effect/leveled/FadeOut.js"; import {VideoCodecAction} from "../actions/transcode/VideoCodecAction.js"; +import {ConditionalAction} from "../actions/conditional.js"; const ActionModelMap: Record = { scale: ResizeScaleAction, @@ -122,7 +123,8 @@ const ActionModelMap: Record = { toAnimated: ToAnimatedAction, fadeIn: FadeInEffectAction, fadeOut: FadeOutEffectAction, - videoCodec: VideoCodecAction + videoCodec: VideoCodecAction, + ifCondition: ConditionalAction }; /** diff --git a/src/internal/models/IConditionalActionModel.ts b/src/internal/models/IConditionalActionModel.ts new file mode 100644 index 00000000..1cea8478 --- /dev/null +++ b/src/internal/models/IConditionalActionModel.ts @@ -0,0 +1,10 @@ +import {IActionModel} from "./IActionModel.js"; +import {Transformation} from "../../transformation/Transformation.js"; + +interface IConditionalActionModel extends IActionModel { + expression?: string; + transformation?: Transformation; + otherwise?: Transformation; +} + +export {IConditionalActionModel}; \ No newline at end of file