mirror of
https://github.com/morbalint/kemkas.git
synced 2026-07-18 11:23:47 +00:00
add some level up tests and maybe fixes (#86)
* add some level up tests and maybe fixes * address review comments * fix tolvaj multiclass * tolvaj level 9 kepzettseg
This commit is contained in:
@@ -8,21 +8,23 @@ import {AppDispatch, RootState} from "../../store";
|
||||
import {characterSelector, setHarcosSpecialization} from "../domain-models/characterSlice";
|
||||
|
||||
function HarcosFegyverSpecializacio(props: {
|
||||
szint: number
|
||||
harcosSzint: number,
|
||||
karakterSzint: number,
|
||||
}) {
|
||||
const {
|
||||
szint
|
||||
harcosSzint,
|
||||
karakterSzint,
|
||||
} = props
|
||||
|
||||
const dispatch = useDispatch.withTypes<AppDispatch>()()
|
||||
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 changeSpecialization = (specialization: string) => dispatch(setHarcosSpecialization({szint, fegyver: specialization}))
|
||||
const changeSpecialization = (specialization: string) => dispatch(setHarcosSpecialization({szint: karakterSzint, fegyver: specialization}))
|
||||
|
||||
const fegyver = GetFegyver(specialization)
|
||||
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 <>
|
||||
@@ -32,7 +34,7 @@ function HarcosFegyverSpecializacio(props: {
|
||||
fegyverek={pickableFegyverek}
|
||||
selectedId={specialization}
|
||||
onChange={changeSpecialization}
|
||||
dataTestId={"harcos-specialization-" + szint}
|
||||
dataTestId={"harcos-specialization-" + karakterSzint}
|
||||
/>
|
||||
{fegyver == null && <span className='form-field-error'>Ismeretlen fegyver: {specialization}</span>}
|
||||
</div>
|
||||
|
||||
@@ -0,0 +1,248 @@
|
||||
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";
|
||||
import {GetAvailableKepzettsegek} from "../domain-models/kepzettsegek2E";
|
||||
|
||||
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);
|
||||
});
|
||||
|
||||
it("does not render tulajdonsag selector at level 4 when all abilities are maxed", () => {
|
||||
const maxedCharacter: Karakter2E = {
|
||||
...DefaultKarakter,
|
||||
szint: 1,
|
||||
tulajdonsagok: {
|
||||
t_ero: 18,
|
||||
t_ugy: 18,
|
||||
t_egs: 18,
|
||||
t_int: 18,
|
||||
t_bol: 18,
|
||||
t_kar: 18,
|
||||
},
|
||||
szintlepesek: [{
|
||||
osztaly: Osztaly2E.Pap,
|
||||
HProll: 8,
|
||||
}],
|
||||
tolvajKepzettsegek: [],
|
||||
varazslatok: [],
|
||||
};
|
||||
|
||||
const level2 = applyLevelUp(maxedCharacter);
|
||||
const level3 = applyLevelUp(level2);
|
||||
const level4 = applyLevelUp(level3);
|
||||
|
||||
expect(level4.szintlepesek[3]?.tulajdonsagNoveles).toBeUndefined();
|
||||
|
||||
const store = configureStore({
|
||||
reducer: {
|
||||
user: userReducer,
|
||||
character2E: characterReducer,
|
||||
},
|
||||
});
|
||||
store.dispatch(setCharacter(level4));
|
||||
|
||||
const sut = render(
|
||||
<Provider store={store}>
|
||||
<LevelUps
|
||||
karakter={store.getState().character2E}
|
||||
changeKarakter={(updated) => store.dispatch(setCharacter(updated))}
|
||||
/>
|
||||
</Provider>
|
||||
);
|
||||
|
||||
expect(sut.queryByTestId("tulajdonsag-4")).toBeNull();
|
||||
});
|
||||
|
||||
it("does not render kaloz krit selector when tengeresz milestone exists but krit is missing", () => {
|
||||
const inconsistentTengeresz: Karakter2E = {
|
||||
...DefaultKarakter,
|
||||
szint: 3,
|
||||
szintlepesek: [
|
||||
{
|
||||
osztaly: Osztaly2E.Tengeresz,
|
||||
HProll: 10,
|
||||
},
|
||||
{
|
||||
osztaly: Osztaly2E.Tengeresz,
|
||||
HProll: 5,
|
||||
},
|
||||
{
|
||||
osztaly: Osztaly2E.Tengeresz,
|
||||
HProll: 7,
|
||||
}
|
||||
],
|
||||
tolvajKepzettsegek: [],
|
||||
varazslatok: [],
|
||||
};
|
||||
|
||||
const store = configureStore({
|
||||
reducer: {
|
||||
user: userReducer,
|
||||
character2E: characterReducer,
|
||||
},
|
||||
});
|
||||
store.dispatch(setCharacter(inconsistentTengeresz));
|
||||
|
||||
const sut = render(
|
||||
<Provider store={store}>
|
||||
<LevelUps
|
||||
karakter={store.getState().character2E}
|
||||
changeKarakter={(updated) => store.dispatch(setCharacter(updated))}
|
||||
/>
|
||||
</Provider>
|
||||
);
|
||||
|
||||
expect(sut.queryByTestId("kaloz-krit-3")).toBeNull();
|
||||
});
|
||||
|
||||
it("shows and updates Tolvaj extra skill on multiclass Tolvaj level 5", async () => {
|
||||
const multiclassTolvaj: Karakter2E = {
|
||||
...DefaultKarakter,
|
||||
szint: 6,
|
||||
szintlepesek: [
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 6 },
|
||||
{ osztaly: Osztaly2E.Harcos, HProll: 10 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 4 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 5 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 6 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 3, tolvajExtraKepzettseg: "k_meregkeveres" },
|
||||
],
|
||||
tolvajKepzettsegek: ["k_alcazas", "k_csapdak", "k_egyensulyozas", "k_hamisitas"],
|
||||
varazslatok: [],
|
||||
};
|
||||
|
||||
const store = configureStore({
|
||||
reducer: {
|
||||
user: userReducer,
|
||||
character2E: characterReducer,
|
||||
},
|
||||
});
|
||||
store.dispatch(setCharacter(multiclassTolvaj));
|
||||
|
||||
const sut = render(
|
||||
<Provider store={store}>
|
||||
<LevelUps
|
||||
karakter={store.getState().character2E}
|
||||
changeKarakter={(updated) => store.dispatch(setCharacter(updated))}
|
||||
/>
|
||||
</Provider>
|
||||
);
|
||||
|
||||
const selector = await sut.findByTestId("tolvaj-extra-kepzettseg-6");
|
||||
const nextKepzettseg = GetAvailableKepzettsegek(multiclassTolvaj)
|
||||
.map(x => x.Id)
|
||||
.find(id => id !== multiclassTolvaj.szintlepesek[5]?.tolvajExtraKepzettseg);
|
||||
|
||||
expect(nextKepzettseg).toBeDefined();
|
||||
fireEvent.change(selector, {target: {value: nextKepzettseg as string}});
|
||||
|
||||
const stateAfter = store.getState().character2E;
|
||||
expect(stateAfter.szintlepesek[5]?.tolvajExtraKepzettseg).toBe(nextKepzettseg);
|
||||
expect(stateAfter.szintlepesek[4]?.tolvajExtraKepzettseg).toBeUndefined();
|
||||
});
|
||||
|
||||
it("at Tolvaj level 9 selector includes class-restricted non-Tolvaj skills", async () => {
|
||||
const tolvajLevel9: Karakter2E = {
|
||||
...DefaultKarakter,
|
||||
szint: 9,
|
||||
szintlepesek: [
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 6 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 5 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 4 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 3 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 2, tolvajExtraKepzettseg: "k_meregkeveres" },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 4 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 5 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 3 },
|
||||
{ osztaly: Osztaly2E.Tolvaj, HProll: 6, tolvajExtraKepzettseg: "k_alkimia" },
|
||||
],
|
||||
tolvajKepzettsegek: ["k_alcazas", "k_csapdak", "k_egyensulyozas", "k_hamisitas"],
|
||||
varazslatok: [],
|
||||
};
|
||||
|
||||
const store = configureStore({
|
||||
reducer: {
|
||||
user: userReducer,
|
||||
character2E: characterReducer,
|
||||
},
|
||||
});
|
||||
store.dispatch(setCharacter(tolvajLevel9));
|
||||
|
||||
const sut = render(
|
||||
<Provider store={store}>
|
||||
<LevelUps
|
||||
karakter={store.getState().character2E}
|
||||
changeKarakter={(updated) => store.dispatch(setCharacter(updated))}
|
||||
/>
|
||||
</Provider>
|
||||
);
|
||||
|
||||
const selector = await sut.findByTestId("tolvaj-extra-kepzettseg-9");
|
||||
const arcaneOption = selector.querySelector('option[value="k_csillagjoslas"]');
|
||||
expect(arcaneOption).not.toBeNull();
|
||||
|
||||
fireEvent.change(selector, {target: {value: "k_csillagjoslas"}});
|
||||
expect(store.getState().character2E.szintlepesek[8]?.tolvajExtraKepzettseg).toBe("k_csillagjoslas");
|
||||
});
|
||||
});
|
||||
@@ -41,6 +41,8 @@ function LevelUp(props: {
|
||||
const kalozSzint = classLevels[Osztaly2E.Tengeresz]
|
||||
const tolvajSzint = classLevels[Osztaly2E.Tolvaj]
|
||||
const szintlepes = karakter.szintlepesek[szint-1];
|
||||
const tulajdonsagNoveles = szintlepes?.tulajdonsagNoveles;
|
||||
const kalozKritikus = szintlepes?.kalozKritikus;
|
||||
|
||||
return <div>
|
||||
<div className='row mt-3'>
|
||||
@@ -54,10 +56,10 @@ function LevelUp(props: {
|
||||
osztalySzint={classLevels[osztaly]}
|
||||
dataTestId={`osztaly-${szint}`}
|
||||
/>}
|
||||
{szint % 4 === 0 &&
|
||||
{szint % 4 === 0 && tulajdonsagNoveles != null &&
|
||||
<TulajdonsagNoveles
|
||||
tulajdonsagok={karakter.tulajdonsagok}
|
||||
tulajdonsagNoveles={karakter.szintlepesek[szint-1].tulajdonsagNoveles!}
|
||||
tulajdonsagNoveles={tulajdonsagNoveles}
|
||||
changeTulajdonsagNoveles={changeTulajdonsagNoveles}
|
||||
dataTestId={`tulajdonsag-${szint}`}
|
||||
/>}
|
||||
@@ -69,12 +71,13 @@ function LevelUp(props: {
|
||||
/>
|
||||
{osztaly === Osztaly2E.Harcos && harcosSzint % 2 === 1 &&
|
||||
<HarcosFegyverSpecializacio
|
||||
szint={harcosSzint}
|
||||
harcosSzint={harcosSzint}
|
||||
karakterSzint={szint}
|
||||
/>
|
||||
}
|
||||
{osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 &&
|
||||
{osztaly === Osztaly2E.Tengeresz && kalozSzint % 3 === 0 && kalozKritikus != null &&
|
||||
<KalozKritikus
|
||||
kritFegyverId={szintlepes.kalozKritikus!}
|
||||
kritFegyverId={kalozKritikus}
|
||||
existingKrits={karakter.szintlepesek.map(x => x.kalozKritikus)}
|
||||
changeKrit={changeKalozKritikus}
|
||||
szint={kalozSzint}
|
||||
@@ -82,12 +85,17 @@ function LevelUp(props: {
|
||||
}
|
||||
{osztaly === Osztaly2E.Tolvaj
|
||||
&& (tolvajSzint === 5 || tolvajSzint === 9)
|
||||
&& szintlepes.tolvajExtraKepzettseg != null &&
|
||||
&& szintlepes?.tolvajExtraKepzettseg != null &&
|
||||
<div className='row m-2'>
|
||||
<label className='col-md-2 col-sm-3 col-form-label'>Extra képzettség</label>
|
||||
<KepzettsegSelector
|
||||
selected={Kepzettsegek[szintlepes.tolvajExtraKepzettseg]}
|
||||
kepzettsegek={[Kepzettsegek[szintlepes.tolvajExtraKepzettseg], ...GetAvailableKepzettsegek(karakter)]}
|
||||
selected={Kepzettsegek[szintlepes!.tolvajExtraKepzettseg]}
|
||||
kepzettsegek={[
|
||||
Kepzettsegek[szintlepes!.tolvajExtraKepzettseg],
|
||||
...GetAvailableKepzettsegek(karakter, {
|
||||
ignoreClassRestrictions: tolvajSzint === 9,
|
||||
})
|
||||
]}
|
||||
dataTestId={`tolvaj-extra-kepzettseg-${szint}`}
|
||||
changeKepzettseg={changeExtraTolvajKepzettseg}
|
||||
/>
|
||||
@@ -100,16 +108,19 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
|
||||
const {karakter, changeKarakter} = props;
|
||||
|
||||
const tulajdonsagokAtSzint = (szint: number) => TulajdonsagokTotal({...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint)})
|
||||
const szintlepesAt = (szint: number) => karakter.szintlepesek[szint-1]!
|
||||
|
||||
const changeRolledHPAtSzint = (szint: number) => (newHProll: number) => {
|
||||
changeKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {...karakter.szintlepesek[szint-1], HProll: newHProll})})
|
||||
const szintlepes = szintlepesAt(szint)
|
||||
changeKarakter({...karakter, szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {...szintlepes, HProll: newHProll})})
|
||||
console.log(karakter)
|
||||
}
|
||||
const changeTulajdonsagNovelesAtSzint = (szint: number) => {
|
||||
return (t: Tulajdonsag2E) => {
|
||||
const szintlepes = szintlepesAt(szint)
|
||||
changeKarakter({...karakter,
|
||||
szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {
|
||||
...karakter.szintlepesek[szint-1],
|
||||
...szintlepes,
|
||||
tulajdonsagNoveles: t
|
||||
})
|
||||
})
|
||||
@@ -118,10 +129,11 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
|
||||
|
||||
const changeKalozKritikusAtSzint = (szint: number) => {
|
||||
return (krit: string) => {
|
||||
const szintlepes = szintlepesAt(szint)
|
||||
changeKarakter({
|
||||
...karakter,
|
||||
szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {
|
||||
...karakter.szintlepesek[szint-1],
|
||||
...szintlepes,
|
||||
kalozKritikus: krit
|
||||
})
|
||||
})
|
||||
@@ -130,10 +142,11 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
|
||||
|
||||
const changeExtraTolvajKepzettseg = (szint: number) => {
|
||||
return (k: KepzettsegId) => {
|
||||
const szintlepes = szintlepesAt(szint)
|
||||
changeKarakter({
|
||||
...karakter,
|
||||
szintlepesek: arraySetN(karakter.szintlepesek, szint-1, {
|
||||
...karakter.szintlepesek[szint-1],
|
||||
...szintlepes,
|
||||
tolvajExtraKepzettseg: k,
|
||||
})
|
||||
})
|
||||
@@ -144,10 +157,13 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
|
||||
|
||||
return <>
|
||||
{levels.slice(1).map(szint =>
|
||||
{
|
||||
const szintlepes = szintlepesAt(szint)
|
||||
return (
|
||||
<LevelUp
|
||||
key={`level-up-${szint}`}
|
||||
szint={szint}
|
||||
osztaly={karakter.szintlepesek[szint-1].osztaly}
|
||||
osztaly={szintlepes.osztaly}
|
||||
karakter={{...karakter, szintlepesek: karakter.szintlepesek.slice(0, szint) ,tulajdonsagok: tulajdonsagokAtSzint(szint)}}
|
||||
changeTulajdonsagNoveles={changeTulajdonsagNovelesAtSzint(szint)}
|
||||
changeRolledHP={changeRolledHPAtSzint(szint)}
|
||||
@@ -155,6 +171,8 @@ export function LevelUps(props: {karakter: Karakter2E, changeKarakter: (inputs:
|
||||
changeOsztaly={(o) => changeKarakter(ChangeOsztalyAtSzint(karakter, o, szint))}
|
||||
changeExtraTolvajKepzettseg={changeExtraTolvajKepzettseg(szint)}
|
||||
/>
|
||||
)
|
||||
}
|
||||
)}
|
||||
</>
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user