add some level up tests and maybe fixes

This commit is contained in:
2026-04-05 11:19:04 +02:00
parent d6061ecb38
commit 88b0379c93
5 changed files with 145 additions and 13 deletions
@@ -8,21 +8,23 @@ import {AppDispatch, RootState} from "../../store";
import {characterSelector, setHarcosSpecialization} from "../domain-models/characterSlice"; import {characterSelector, setHarcosSpecialization} from "../domain-models/characterSlice";
function HarcosFegyverSpecializacio(props: { function HarcosFegyverSpecializacio(props: {
szint: number harcosSzint: number,
karakterSzint: number,
}) { }) {
const { const {
szint harcosSzint,
karakterSzint,
} = props } = props
const dispatch = useDispatch.withTypes<AppDispatch>()() const dispatch = useDispatch.withTypes<AppDispatch>()()
const character = useSelector.withTypes<RootState>()(characterSelector) const character = useSelector.withTypes<RootState>()(characterSelector)
const specialization = character.szintlepesek[szint-1].harcosFegyver || 'kard_hosszu' const specialization = character.szintlepesek[karakterSzint-1]?.harcosFegyver || 'kard_hosszu'
const existingSpecializations = character.szintlepesek.filter(x => x.harcosFegyver != null).map(x => x.harcosFegyver! as string) const existingSpecializations = character.szintlepesek.filter(x => x.harcosFegyver != null).map(x => x.harcosFegyver! as string)
const changeSpecialization = (specialization: string) => dispatch(setHarcosSpecialization({szint, fegyver: specialization})) const changeSpecialization = (specialization: string) => dispatch(setHarcosSpecialization({szint: karakterSzint, fegyver: specialization}))
const fegyver = GetFegyver(specialization) const fegyver = GetFegyver(specialization)
const availableFegyverek = AllowedFegyver(Osztaly2E.Harcos) const availableFegyverek = AllowedFegyver(Osztaly2E.Harcos)
const pickableFegyverek = availableFegyverek.filter(f => f.Id === specialization || existingSpecializations.filter(x => x === f.Id).length < (szint < 9 ? 1 : 2)) const pickableFegyverek = availableFegyverek.filter(f => f.Id === specialization || existingSpecializations.filter(x => x === f.Id).length < (harcosSzint < 9 ? 1 : 2))
return <> return <>
@@ -32,7 +34,7 @@ function HarcosFegyverSpecializacio(props: {
fegyverek={pickableFegyverek} fegyverek={pickableFegyverek}
selectedId={specialization} selectedId={specialization}
onChange={changeSpecialization} onChange={changeSpecialization}
dataTestId={"harcos-specialization-" + szint} dataTestId={"harcos-specialization-" + karakterSzint}
/> />
{fegyver == null && <span className='form-field-error'>Ismeretlen fegyver: {specialization}</span>} {fegyver == null && <span className='form-field-error'>Ismeretlen fegyver: {specialization}</span>}
</div> </div>
@@ -0,0 +1,69 @@
import React from "react";
import {fireEvent, render} from "@testing-library/react";
import {configureStore} from "@reduxjs/toolkit";
import {Provider} from "react-redux";
import LevelUps from "./LevelUps";
import userReducer from "../../shared/domain-models/userSlice";
import characterReducer, {setCharacter} from "../domain-models/characterSlice";
import {AllowedFegyver} from "../domain-models/allowed-fegyver";
import {Osztaly2E} from "../domain-models/osztaly2E";
import {ChangeOsztalyAtSzint, DefaultKarakter, Karakter2E} from "../domain-models/karakter2E";
import {LevelUp} from "../domain-models/szintlepes";
function applyLevelUp(karakter: Karakter2E): Karakter2E {
let next: Karakter2E | undefined;
LevelUp(karakter, updated => {
next = updated;
});
expect(next).toBeDefined();
return next as Karakter2E;
}
describe("LevelUps Harcos specialization indexing", () => {
it("updates specialization on the selected character level for multiclass", async () => {
const level1Tolvaj: Karakter2E = {
...DefaultKarakter,
szint: 1,
szintlepesek: [{
osztaly: Osztaly2E.Tolvaj,
HProll: 6,
}],
tolvajKepzettsegek: [],
varazslatok: [],
};
const level2Auto = applyLevelUp(level1Tolvaj);
const karakter = ChangeOsztalyAtSzint(level2Auto, Osztaly2E.Harcos, 2);
const store = configureStore({
reducer: {
user: userReducer,
character2E: characterReducer,
},
});
store.dispatch(setCharacter(karakter));
const sut = render(
<Provider store={store}>
<LevelUps
karakter={store.getState().character2E}
changeKarakter={(updated) => store.dispatch(setCharacter(updated))}
/>
</Provider>
);
const selector = await sut.findByTestId("harcos-specialization-2");
const currentSpec = karakter.szintlepesek[1]?.harcosFegyver;
const nextSpec = AllowedFegyver(Osztaly2E.Harcos)
.map(x => x.Id)
.find(id => id !== currentSpec);
expect(nextSpec).toBeDefined();
fireEvent.change(selector, {target: {value: nextSpec as string}});
const stateAfter = store.getState().character2E;
expect(stateAfter.szintlepesek[0]?.harcosFegyver).toBeUndefined();
expect(stateAfter.szintlepesek[1]?.harcosFegyver).toBe(nextSpec);
});
});
@@ -57,7 +57,7 @@ function LevelUp(props: {
{szint % 4 === 0 && {szint % 4 === 0 &&
<TulajdonsagNoveles <TulajdonsagNoveles
tulajdonsagok={karakter.tulajdonsagok} tulajdonsagok={karakter.tulajdonsagok}
tulajdonsagNoveles={karakter.szintlepesek[szint-1].tulajdonsagNoveles!} tulajdonsagNoveles={karakter.szintlepesek[szint-1]!.tulajdonsagNoveles!}
changeTulajdonsagNoveles={changeTulajdonsagNoveles} changeTulajdonsagNoveles={changeTulajdonsagNoveles}
dataTestId={`tulajdonsag-${szint}`} dataTestId={`tulajdonsag-${szint}`}
/>} />}
@@ -69,12 +69,13 @@ function LevelUp(props: {
/> />
{osztaly === Osztaly2E.Harcos && harcosSzint % 2 === 1 && {osztaly === Osztaly2E.Harcos && harcosSzint % 2 === 1 &&
<HarcosFegyverSpecializacio <HarcosFegyverSpecializacio
szint={harcosSzint} harcosSzint={harcosSzint}
karakterSzint={szint}
/> />
} }
{osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 && {osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 &&
<KalozKritikus <KalozKritikus
kritFegyverId={szintlepes.kalozKritikus!} kritFegyverId={szintlepes!.kalozKritikus!}
existingKrits={karakter.szintlepesek.map(x => x.kalozKritikus)} existingKrits={karakter.szintlepesek.map(x => x.kalozKritikus)}
changeKrit={changeKalozKritikus} changeKrit={changeKalozKritikus}
szint={kalozSzint} szint={kalozSzint}
@@ -82,12 +83,12 @@ function LevelUp(props: {
} }
{osztaly === Osztaly2E.Tolvaj {osztaly === Osztaly2E.Tolvaj
&& (tolvajSzint === 5 || tolvajSzint === 9) && (tolvajSzint === 5 || tolvajSzint === 9)
&& szintlepes.tolvajExtraKepzettseg != null && && szintlepes?.tolvajExtraKepzettseg != null &&
<div className='row m-2'> <div className='row m-2'>
<label className='col-md-2 col-sm-3 col-form-label'>Extra képzettség</label> <label className='col-md-2 col-sm-3 col-form-label'>Extra képzettség</label>
<KepzettsegSelector <KepzettsegSelector
selected={Kepzettsegek[szintlepes.tolvajExtraKepzettseg]} selected={Kepzettsegek[szintlepes!.tolvajExtraKepzettseg]}
kepzettsegek={[Kepzettsegek[szintlepes.tolvajExtraKepzettseg], ...GetAvailableKepzettsegek(karakter)]} kepzettsegek={[Kepzettsegek[szintlepes!.tolvajExtraKepzettseg], ...GetAvailableKepzettsegek(karakter)]}
dataTestId={`tolvaj-extra-kepzettseg-${szint}`} dataTestId={`tolvaj-extra-kepzettseg-${szint}`}
changeKepzettseg={changeExtraTolvajKepzettseg} changeKepzettseg={changeExtraTolvajKepzettseg}
/> />
@@ -0,0 +1,60 @@
import {ChangeOsztalyAtSzint, DefaultKarakter, Karakter2E} from "./karakter2E";
import {Osztaly2E} from "./osztaly2E";
import {LevelUp} from "./szintlepes";
function applyLevelUp(karakter: Karakter2E): Karakter2E {
let next: Karakter2E | undefined;
LevelUp(karakter, updated => {
next = updated;
});
expect(next).toBeDefined();
return next as Karakter2E;
}
function level1Tolvaj(): Karakter2E {
return {
...DefaultKarakter,
szint: 1,
szintlepesek: [{
osztaly: Osztaly2E.Tolvaj,
HProll: 6,
}],
tolvajKepzettsegek: [],
varazslatok: [],
};
}
describe("Harcos specialization in multiclass level-ups", () => {
it("adds a specialization when first Harcos level is gained at character level 2", () => {
const afterLevel2 = applyLevelUp(level1Tolvaj());
const multiclassed = ChangeOsztalyAtSzint(afterLevel2, Osztaly2E.Harcos, 2);
const secondLevel = multiclassed.szintlepesek[1];
expect(secondLevel?.osztaly).toBe(Osztaly2E.Harcos);
expect(secondLevel?.harcosFegyver).toBeDefined();
});
it("does not add a specialization on even Harcos class level", () => {
const afterLevel2 = applyLevelUp(level1Tolvaj());
const multiclassed = ChangeOsztalyAtSzint(afterLevel2, Osztaly2E.Harcos, 2);
const afterLevel3 = applyLevelUp(multiclassed);
const thirdLevel = afterLevel3.szintlepesek[2];
expect(thirdLevel?.osztaly).toBe(Osztaly2E.Harcos);
expect(thirdLevel?.harcosFegyver).toBeUndefined();
});
it("adds the next specialization on odd Harcos class level after multiclass", () => {
const afterLevel2 = applyLevelUp(level1Tolvaj());
const multiclassed = ChangeOsztalyAtSzint(afterLevel2, Osztaly2E.Harcos, 2);
const afterLevel3 = applyLevelUp(multiclassed);
const afterLevel4 = applyLevelUp(afterLevel3);
const firstHarcosSpec = multiclassed.szintlepesek[1]?.harcosFegyver;
const thirdHarcosLevelSpec = afterLevel4.szintlepesek[3]?.harcosFegyver;
expect(firstHarcosSpec).toBeDefined();
expect(thirdHarcosLevelSpec).toBeDefined();
expect(thirdHarcosLevelSpec).not.toBe(firstHarcosSpec);
});
});
@@ -109,7 +109,7 @@ function CreateCharacter2E(props: {
<h4 className='col align-self-center'>Tanult</h4> <h4 className='col align-self-center'>Tanult</h4>
</div> </div>
<OsztalySelector2E /> <OsztalySelector2E />
{karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos && <HarcosFegyverSpecializacio szint={1}/>} {karakter.szintlepesek[0].osztaly === Osztaly2E.Harcos && <HarcosFegyverSpecializacio harcosSzint={1} karakterSzint={1}/>}
<KarakterKepzettsegek /> <KarakterKepzettsegek />
<hr/> <hr/>
{/* 1. szinten */} {/* 1. szinten */}