Find Gamesystems By Name in GameModel
All checks were successful
E2E Testing / test (push) Successful in 1m27s
All checks were successful
E2E Testing / test (push) Successful in 1m27s
This commit is contained in:
parent
f55e8dde3d
commit
b4cc5304fd
50
e2e/game-model/gamesystems/FindGamesystem.spec.ts
Normal file
50
e2e/game-model/gamesystems/FindGamesystem.spec.ts
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
import { BrowserContext, ElectronApplication, Page, _electron as electron } from 'playwright';
|
||||||
|
import { test, expect } from '@playwright/test';
|
||||||
|
import * as PATH from 'path';
|
||||||
|
import {GameModel} from "../../../src/app/game-model/GameModel";
|
||||||
|
import {Gamesystem} from "../../src/app/game-model/gamesystems/Gamesystem";
|
||||||
|
import {ScriptAccount} from "../../../src/app/game-model/scriptAccounts/ScriptAccount";
|
||||||
|
import {ModelComponentType} from "../../../src/app/game-model/ModelComponentType";
|
||||||
|
import {SimpleGamesystem} from "../../../src/app/game-model/gamesystems/SimpleGamesystem";
|
||||||
|
import exp = require("node:constants");
|
||||||
|
import {end} from "electron-debug";
|
||||||
|
import {GamesystemTrainer} from "./GamesystemTrainer";
|
||||||
|
test.describe('Test Find Gamesystems', () => {
|
||||||
|
const GAMEMODELNAME: string = "GameModel";
|
||||||
|
const SIMPLEGAMESYSTEM_NAME: string = "Simple Gamesystem";
|
||||||
|
|
||||||
|
|
||||||
|
test('Find null or undefined Gamesystem', async () => {
|
||||||
|
const gameModel = new GameModel(GAMEMODELNAME);
|
||||||
|
expect(gameModel.findGamesystem(null)).toBeUndefined();
|
||||||
|
expect(gameModel.findGamesystem(undefined)).toBeUndefined();
|
||||||
|
})
|
||||||
|
|
||||||
|
test('Find non existend Gamesystem', async () => {
|
||||||
|
const gameModel = new GameModel(GAMEMODELNAME);
|
||||||
|
expect(gameModel.findGamesystem("Gamesystem")).toBeUndefined();
|
||||||
|
})
|
||||||
|
|
||||||
|
test("Find existend simple Gamesystem on top layer", async () => {
|
||||||
|
const gameModel = new GameModel(GAMEMODELNAME);
|
||||||
|
const gamesystem = new SimpleGamesystem(SIMPLEGAMESYSTEM_NAME);
|
||||||
|
gameModel.addGamesystem(gamesystem);
|
||||||
|
|
||||||
|
expect(gameModel.findGamesystem(SIMPLEGAMESYSTEM_NAME)).toBeDefined();
|
||||||
|
expect(gameModel.findGamesystem(SIMPLEGAMESYSTEM_NAME)).toEqual(gamesystem);
|
||||||
|
})
|
||||||
|
|
||||||
|
test('Find existent product gamesystem on top layer', async () => {
|
||||||
|
const gameModel = GamesystemTrainer.givenGameModelWithProductGamesytemOnTopLayer();
|
||||||
|
const result = gameModel.findGamesystem(GamesystemTrainer.TOP_PRODUCT_GAMESYSTEM_NAME);
|
||||||
|
expect(result).toBeDefined();
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
|
test('Find existent simple gamesystem on lower layer', async () => {
|
||||||
|
const gameModel = GamesystemTrainer.givenGameModelWithProductGamesytemOnTopLayer();
|
||||||
|
const result = gameModel.findGamesystem(GamesystemTrainer.SIMPLEGAMESYSTEMNAME);
|
||||||
|
expect(result).toBeDefined();
|
||||||
|
|
||||||
|
})
|
||||||
|
});
|
37
e2e/game-model/gamesystems/GamesystemTrainer.ts
Normal file
37
e2e/game-model/gamesystems/GamesystemTrainer.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
import {GameModel} from "../../../src/app/game-model/GameModel";
|
||||||
|
import {SimpleGamesystem} from "../../../src/app/game-model/gamesystems/SimpleGamesystem";
|
||||||
|
import {ProductGamesystem} from "../../../src/app/game-model/gamesystems/ProductGamesystem";
|
||||||
|
|
||||||
|
export class GamesystemTrainer {
|
||||||
|
|
||||||
|
static GAMEMODELNAME: string = "GAMEMODEL";
|
||||||
|
static SIMPLEGAMESYSTEMNAME: string = "SIMPLE GAMESYSTEM";
|
||||||
|
static TOP_PRODUCT_GAMESYSTEM_NAME: string = "Top Product Gamesystem"
|
||||||
|
|
||||||
|
static SIMPLEGAMESYSTEM2: string = "Simple Gamesystem Leaf 2";
|
||||||
|
static givenEmptyGameModel() {
|
||||||
|
return new GameModel(GamesystemTrainer.GAMEMODELNAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
static givenGameModelWithSimpleGamesystemOnTopLayer() {
|
||||||
|
const gameModel = new GameModel(GamesystemTrainer.GAMEMODELNAME);
|
||||||
|
const gamesytem = new SimpleGamesystem(GamesystemTrainer.SIMPLEGAMESYSTEMNAME);
|
||||||
|
gameModel.addGamesystem(gamesytem);
|
||||||
|
|
||||||
|
return gameModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
static givenGameModelWithProductGamesytemOnTopLayer() {
|
||||||
|
const gameModel = new GameModel(GamesystemTrainer.GAMEMODELNAME);
|
||||||
|
const productGamesystem = new ProductGamesystem(this.TOP_PRODUCT_GAMESYSTEM_NAME);
|
||||||
|
const leaf1 = new SimpleGamesystem(this.SIMPLEGAMESYSTEMNAME);
|
||||||
|
const leaf2 = new SimpleGamesystem(this.SIMPLEGAMESYSTEM2);
|
||||||
|
productGamesystem.innerGamesystems.push(leaf1);
|
||||||
|
productGamesystem.innerGamesystems.push(leaf2);
|
||||||
|
gameModel.addGamesystem(productGamesystem);
|
||||||
|
|
||||||
|
return gameModel;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -1,5 +1,8 @@
|
|||||||
import {Gamesystem} from "./gamesystems/Gamesystem";
|
import {Gamesystem} from "./gamesystems/Gamesystem";
|
||||||
import {ScriptAccount} from "./scriptAccounts/ScriptAccount";
|
import {ScriptAccount} from "./scriptAccounts/ScriptAccount";
|
||||||
|
import {Transition} from "./gamesystems/Transition";
|
||||||
|
import {State} from "./gamesystems/State";
|
||||||
|
import {ProductGamesystem} from "./gamesystems/ProductGamesystem";
|
||||||
|
|
||||||
export class GameModel {
|
export class GameModel {
|
||||||
private readonly _gameModelName: string
|
private readonly _gameModelName: string
|
||||||
@ -48,4 +51,19 @@ export class GameModel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
findGamesystem(gamesystemName: string) {
|
||||||
|
const gamesystemQueue : Gamesystem<State<any>, Transition<any>>[] = [];
|
||||||
|
this.gamesystems.forEach(gamesystem => gamesystemQueue.push(gamesystem));
|
||||||
|
|
||||||
|
while(gamesystemQueue.length > 0) {
|
||||||
|
const currentGamesystem = gamesystemQueue.shift()!;
|
||||||
|
if(currentGamesystem.componentName == gamesystemName) {
|
||||||
|
return currentGamesystem;
|
||||||
|
} else if(currentGamesystem instanceof ProductGamesystem) {
|
||||||
|
const currentProductGamesystem = currentGamesystem as ProductGamesystem;
|
||||||
|
currentProductGamesystem.innerGamesystems.forEach(gamesystem => gamesystemQueue.push(gamesystem));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,14 +1,17 @@
|
|||||||
<mat-tree [dataSource]="dataSource" [treeControl]="treeControl">
|
<mat-tree [dataSource]="dataSource" [treeControl]="treeControl" (contextmenu)="onContextMenu($event)">
|
||||||
<!-- This is the tree node template for leaf nodes -->
|
<!-- This is the tree node template for leaf nodes -->
|
||||||
<mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding>
|
<mat-tree-node *matTreeNodeDef="let node" matTreeNodePadding matTreeNodePaddingIndent="10" [ngClass]="selectedGamesystem === node ? 'selected-node':''"
|
||||||
|
(click)="onSelectGamesystem(node)" (contextmenu)="onSelectGamesystem(node)" (dblclick)="openGamesystemEditor(node)">
|
||||||
<!-- use a disabled button to provide padding for tree leaf -->
|
<!-- use a disabled button to provide padding for tree leaf -->
|
||||||
<button mat-icon-button disabled></button>
|
<button mat-icon-button class="small-icon-button" [disabled]="true"></button>
|
||||||
{{node.name}}
|
{{node.name}}
|
||||||
</mat-tree-node>
|
</mat-tree-node>
|
||||||
<!-- This is the tree node template for expandable nodes -->
|
<!-- This is the tree node template for expandable nodes -->
|
||||||
<mat-tree-node *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding>
|
<mat-tree-node *matTreeNodeDef="let node;when: hasChild" matTreeNodePadding matTreeNodePaddingIndent="10"
|
||||||
|
(click)="onSelectGamesystem(node)" (contextmenu)="onSelectGamesystem(node)" [ngClass]="selectedGamesystem === node ? 'selected-node':''"
|
||||||
|
(dblclick)="openGamesystemEditor(node)">
|
||||||
<button mat-icon-button matTreeNodeToggle
|
<button mat-icon-button matTreeNodeToggle
|
||||||
[attr.aria-label]="'Toggle ' + node.name">
|
[attr.aria-label]="'Toggle ' + node.name" class="small-icon-button">
|
||||||
<mat-icon class="mat-icon-rtl-mirror">
|
<mat-icon class="mat-icon-rtl-mirror">
|
||||||
{{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
|
{{treeControl.isExpanded(node) ? 'expand_more' : 'chevron_right'}}
|
||||||
</mat-icon>
|
</mat-icon>
|
||||||
|
@ -0,0 +1,40 @@
|
|||||||
|
.mat-tree-node {
|
||||||
|
min-height: 1.8em !important;
|
||||||
|
height: 1.8em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.small-icon-button {
|
||||||
|
width: 26px !important;
|
||||||
|
height: 26px !important;
|
||||||
|
padding: 0px !important;
|
||||||
|
display: inline-flex !important;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
margin-left: 5px;
|
||||||
|
margin-bottom: 2px;
|
||||||
|
|
||||||
|
& > *[role=img] {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
font-size: 18px;
|
||||||
|
|
||||||
|
svg {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.mat-mdc-button-touch-target {
|
||||||
|
width: 22px !important;
|
||||||
|
height: 22px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.small-icon-button mat-icon {
|
||||||
|
color: whitesmoke;
|
||||||
|
}
|
||||||
|
|
||||||
|
.selected-node {
|
||||||
|
background-color: #545456
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
import {Component, Input, OnInit} from '@angular/core';
|
import {Component, EventEmitter, Input, OnInit, Output} from '@angular/core';
|
||||||
import {Gamesystem} from "../../game-model/gamesystems/Gamesystem";
|
import {Gamesystem} from "../../game-model/gamesystems/Gamesystem";
|
||||||
import {State} from "../../game-model/gamesystems/State";
|
import {State} from "../../game-model/gamesystems/State";
|
||||||
import {Transition} from "../../game-model/gamesystems/Transition";
|
import {Transition} from "../../game-model/gamesystems/Transition";
|
||||||
@ -15,6 +15,7 @@ import {MatIcon} from "@angular/material/icon";
|
|||||||
import {MatIconButton} from "@angular/material/button";
|
import {MatIconButton} from "@angular/material/button";
|
||||||
import {SimpleGamesystem} from "../../game-model/gamesystems/SimpleGamesystem";
|
import {SimpleGamesystem} from "../../game-model/gamesystems/SimpleGamesystem";
|
||||||
import {GameModel} from "../../game-model/GameModel";
|
import {GameModel} from "../../game-model/GameModel";
|
||||||
|
import {ElectronService} from "../../core/services";
|
||||||
|
|
||||||
|
|
||||||
interface FlatNode {
|
interface FlatNode {
|
||||||
@ -30,6 +31,8 @@ interface FlatNode {
|
|||||||
export class GamescriptOverviewComponent implements OnInit {
|
export class GamescriptOverviewComponent implements OnInit {
|
||||||
|
|
||||||
@Input('gameModel') gameModel: GameModel | undefined
|
@Input('gameModel') gameModel: GameModel | undefined
|
||||||
|
@Output('openGamesystemEditor') openGamesystemEmitter : EventEmitter<Gamesystem<State<any>, Transition<any>>> = new EventEmitter<Gamesystem<State<any>, Transition<any>>>();
|
||||||
|
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.dataSource.data = this.gameModel!.gamesystems;
|
this.dataSource.data = this.gameModel!.gamesystems;
|
||||||
@ -56,13 +59,15 @@ export class GamescriptOverviewComponent implements OnInit {
|
|||||||
);
|
);
|
||||||
|
|
||||||
dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
|
dataSource = new MatTreeFlatDataSource(this.treeControl, this.treeFlattener);
|
||||||
|
selectedGamesystem: FlatNode | undefined;
|
||||||
|
|
||||||
constructor() {
|
constructor(private electronService: ElectronService) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hasChild = (_: number, node: FlatNode) => node.expandable;
|
hasChild = (_: number, node: FlatNode) => node.expandable;
|
||||||
|
|
||||||
|
|
||||||
isSimpleGamesystem(gamesystem: Gamesystem<State<any>, Transition<any>>) {
|
isSimpleGamesystem(gamesystem: Gamesystem<State<any>, Transition<any>>) {
|
||||||
return gamesystem instanceof SimpleGamesystem;
|
return gamesystem instanceof SimpleGamesystem;
|
||||||
}
|
}
|
||||||
@ -70,4 +75,16 @@ export class GamescriptOverviewComponent implements OnInit {
|
|||||||
isProductGamesystem(gamesystem: Gamesystem<State<any>, Transition<any>>) {
|
isProductGamesystem(gamesystem: Gamesystem<State<any>, Transition<any>>) {
|
||||||
return gamesystem instanceof ProductGamesystem;
|
return gamesystem instanceof ProductGamesystem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onSelectGamesystem(node: FlatNode) {
|
||||||
|
this.selectedGamesystem = node;
|
||||||
|
}
|
||||||
|
|
||||||
|
onContextMenu(event: MouseEvent) {
|
||||||
|
this.electronService.ipcRenderer.send('context-menu', {x: event.x, y: event.y});
|
||||||
|
}
|
||||||
|
|
||||||
|
openGamesystemEditor(node: FlatNode) {
|
||||||
|
const gamesystem: Gamesystem<State<any>, Transition<any>>| undefined= this.gameModel!.findGamesystem(node.name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user