From f6b22583c816d2ca406e438aedaaf9a2524d99a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Sat, 17 Feb 2024 19:06:38 +0100 Subject: [PATCH] Add Conditions --- .../AddTransitionConditions.spec.ts | 41 +++++++++++++++++++ .../conditions/ConditionTrainer.ts | 4 ++ .../conditions/TransitionConditionTrainer.ts | 24 +++++++++++ .../gamesystems/transitions/Transition.ts | 15 +++++-- 4 files changed, 80 insertions(+), 4 deletions(-) create mode 100644 e2e/game-model/gamesystems/conditions/AddTransitionConditions.spec.ts create mode 100644 e2e/game-model/gamesystems/conditions/TransitionConditionTrainer.ts diff --git a/e2e/game-model/gamesystems/conditions/AddTransitionConditions.spec.ts b/e2e/game-model/gamesystems/conditions/AddTransitionConditions.spec.ts new file mode 100644 index 0000000..c9fb7a9 --- /dev/null +++ b/e2e/game-model/gamesystems/conditions/AddTransitionConditions.spec.ts @@ -0,0 +1,41 @@ + +import { test, expect } from '@playwright/test'; +import {ScriptAccountCondition} from "../../../../src/app/game-model/gamesystems/conditions/ScriptAccountCondition"; +import {ScriptAccount} from "../../../../src/app/game-model/scriptAccounts/ScriptAccount"; +import exp = require("node:constants"); +import {ConditionTrainer} from "./ConditionTrainer"; +import {Conditional} from "@angular/compiler"; +import {TransitionConditionTrainer} from "./TransitionConditionTrainer"; +import {transition} from "@angular/animations"; +test.describe('Test Adding Conditions To Transitions', () => { + + test("Test adding not contradicting Conditions", async () => { + const transition = TransitionConditionTrainer.withTransitionWithCondition(); + const condition = ScriptAccountCondition.constructScriptAccountCondition(new ScriptAccount("Test", ""), -200, -100); + + transition.addScriptAccountCondition(condition); + expect(transition.scriptAccountConditions.length).toEqual(2); + expect(transition.scriptAccountConditions.includes(condition)).toBeTruthy(); + }) + + test("Test adding contradicting Conditions", async () => { + const transition = TransitionConditionTrainer.withTransitionWithCondition(); + const condition = ConditionTrainer.withContradictingCondition(transition.scriptAccountConditions[0]); + + transition.addScriptAccountCondition(condition) + expect(transition.scriptAccountConditions.length).toEqual(1); + expect(transition.scriptAccountConditions.includes(condition)).toBeFalsy(); + }) + + test("Test expanding Conditions", async () => { + const transition = TransitionConditionTrainer.withTransitionWithCondition(); + const condition = ConditionTrainer.withExpendingCondition(transition.scriptAccountConditions[0]); + + transition.addScriptAccountCondition(condition); + expect(transition.scriptAccountConditions.length).toEqual(1); + expect(transition.scriptAccountConditions.includes(condition)).toBeFalsy(); + expect(transition.scriptAccountConditions[0].minValue).toEqual(-10) + expect(transition.scriptAccountConditions[0].maxValue).toEqual(20) + }) + +}); diff --git a/e2e/game-model/gamesystems/conditions/ConditionTrainer.ts b/e2e/game-model/gamesystems/conditions/ConditionTrainer.ts index ac7b947..ea4587c 100644 --- a/e2e/game-model/gamesystems/conditions/ConditionTrainer.ts +++ b/e2e/game-model/gamesystems/conditions/ConditionTrainer.ts @@ -10,4 +10,8 @@ export class ConditionTrainer { static withContradictingCondition(condition: ScriptAccountCondition): ScriptAccountCondition { return ScriptAccountCondition.constructScriptAccountCondition(condition.scriptAccount, condition.minValue-20, condition.minValue-10); } + + static withExpendingCondition(condition: ScriptAccountCondition): ScriptAccount { + return ScriptAccountCondition.constructScriptAccountCondition(condition.scriptAccount, condition.minValue-10, condition.maxValue+10); + } } diff --git a/e2e/game-model/gamesystems/conditions/TransitionConditionTrainer.ts b/e2e/game-model/gamesystems/conditions/TransitionConditionTrainer.ts new file mode 100644 index 0000000..ba97347 --- /dev/null +++ b/e2e/game-model/gamesystems/conditions/TransitionConditionTrainer.ts @@ -0,0 +1,24 @@ +import {SimpleState} from "../../../../src/app/game-model/gamesystems/states/SimpleState"; +import {SimpleTransition} from "../../../../src/app/game-model/gamesystems/transitions/SimpleTransition"; +import {ScriptAccount} from "../../../../src/app/game-model/scriptAccounts/ScriptAccount"; +import {ScriptAccountCondition} from "../../../../src/app/game-model/gamesystems/conditions/ScriptAccountCondition"; +export class TransitionConditionTrainer { + static withTransitionWithoutConditions() { + const startingState = new SimpleState("StartingState", ""); + const endingState = new SimpleState("EndingState", ""); + + return new SimpleTransition(startingState, endingState); + } + + static withTransitionWithCondition() { + const startingState = new SimpleState("StartingState", ""); + const endingState = new SimpleState("EndingState", ""); + + const transition = new SimpleTransition(startingState, endingState); + + const scriptAccount = new ScriptAccount("ScriptAccount", ""); + transition.scriptAccountConditions.push(ScriptAccountCondition.constructScriptAccountCondition(scriptAccount, 0, 10)!) + + return transition; + } +} diff --git a/src/app/game-model/gamesystems/transitions/Transition.ts b/src/app/game-model/gamesystems/transitions/Transition.ts index 48e9170..e4a5e39 100644 --- a/src/app/game-model/gamesystems/transitions/Transition.ts +++ b/src/app/game-model/gamesystems/transitions/Transition.ts @@ -40,14 +40,21 @@ export abstract class Transition> { } addScriptAccountCondition(scriptAccountCondition: ScriptAccountCondition) { - + const existingScriptAccountCondition = this.findScriptAccountConditionByScriptAccount(scriptAccountCondition.scriptAccount); + if(existingScriptAccountCondition != undefined) { + if(!existingScriptAccountCondition.isContradicting(scriptAccountCondition)) { + existingScriptAccountCondition.extendCondition(scriptAccountCondition) + } + } else { + this.scriptAccountConditions.push(scriptAccountCondition); + } } removeScriptAccountCondition(scriptAccount: ScriptAccount) { - + this.scriptAccountConditions = this.scriptAccountConditions.filter(condition => condition.scriptAccount !== scriptAccount); } - findScriptAccountConditionByScriptAccount(scriptAccount: ScriptAccount) { - + findScriptAccountConditionByScriptAccount(scriptAccount: ScriptAccount): ScriptAccountCondition | undefined { + return this.scriptAccountConditions.find(condition => condition.scriptAccount === scriptAccount); } }