diff --git a/frontend/src/first-edition/domain-models/allowed-fegyver.test.ts b/frontend/src/first-edition/domain-models/allowed-fegyver.test.ts new file mode 100644 index 0000000..34b41d8 --- /dev/null +++ b/frontend/src/first-edition/domain-models/allowed-fegyver.test.ts @@ -0,0 +1,73 @@ +import {AllowedFegyver} from "./allowed-fegyver"; +import {Osztaly} from "./osztaly"; + +describe('Allowed Fegyver calculations', () => { + + describe('varazslo fegyverek', () => { + test.each([ + [Osztaly.Varazslo], + [Osztaly.Illuzionista]])('%s fegyverek should be fixed', (osztaly: Osztaly) => { + const expected = new Set([ + 'bot', + 'bunko', + 'dobotu', + 'tor', + 'okol', + 'parittya', + ]); + const actual = AllowedFegyver(osztaly, []); + const actualSet = new Set(actual.map(f => f.Id)); + expect(actualSet.size).toEqual(expected.size) + for (const expectedKey in expected) { + expect(actualSet).toContain(expectedKey) + } + for (const actualKey in actualSet) { + expect(expected).toContain(actualKey) + } + }) + }) + + describe('Tolvaj fegyverek', () => { + it('should be fixed', () => { + const expected = new Set([ + 'rovid_ij', + 'konnyu_szamszerij', + 'nehez_szamszerij', + 'dobotu', + 'tor', + 'okol', + 'parittya', + 'szablya', + 'hosszu_kard', + 'rovid_kard' + ]); + const actual = AllowedFegyver(Osztaly.Tolvaj, []); + const actualSet = new Set(actual.map(f => f.Id)); + expect(actualSet.size).toEqual(expected.size) + for (const expectedKey in expected) { + expect(actualSet).toContain(expectedKey) + } + for (const actualKey in actualSet) { + expect(expected).toContain(actualKey) + } + }) + }) + + describe('Harcos fegyverek', () => { + it('Ijasz can use visszacsapo_ij', () => { + const actual = AllowedFegyver(Osztaly.Ijasz, []); + const actualSet = new Set(actual.map(f => f.Id)); + expect(actualSet).toContain('visszacsapo_ij') + }) + test.each([ + [['visszacsapo_ij']], + [['fattyu_kard', 'torpe_fejsze']], + ])('Harcos can use %s specializations', (specializations) => { + const actual = AllowedFegyver(Osztaly.Harcos, specializations); + const actualSet = new Set(actual.map(f => f.Id)); + for (const specialization of specializations) { + expect(actualSet).toContain(specialization) + } + }) + }) +}) \ No newline at end of file diff --git a/frontend/src/first-edition/domain-models/allowed-pancel-types.test.ts b/frontend/src/first-edition/domain-models/allowed-pancel-types.test.ts new file mode 100644 index 0000000..15bca89 --- /dev/null +++ b/frontend/src/first-edition/domain-models/allowed-pancel-types.test.ts @@ -0,0 +1,24 @@ +import {Osztaly} from "./osztaly"; +import {AllowedPancelTypes} from "./allowed-pancel-types"; + + +describe('Allowed Pancel types', () => { + test.each([ + [[Osztaly.Amazon], ['konnyu']], + [[Osztaly.Amazon, Osztaly.Barbar], ['konnyu', 'kozepes', 'nehez']], + [[Osztaly.Illuzionista], []], + [[Osztaly.Varazslo], []], + [[Osztaly.Tolvaj], ['konnyu']], + [[Osztaly.Ijasz], ['konnyu', 'kozepes']], + [[Osztaly.Kaloz], ['konnyu', 'kozepes']], + ])('%s allows %s pancel types', (osztalyok: Osztaly[], expected: string[]) => { + const actual = AllowedPancelTypes(osztalyok) + expect(actual.length).toEqual(expected.length) + for (const expectedElement of expected) { + expect(actual).toContain(expectedElement) + } + for (const actualElement of actual) { + expect(expected).toContain(actualElement) + } + }) +}) \ No newline at end of file diff --git a/frontend/src/first-edition/domain-models/kepzettsegek.test.ts b/frontend/src/first-edition/domain-models/kepzettsegek.test.ts new file mode 100644 index 0000000..7025c8d --- /dev/null +++ b/frontend/src/first-edition/domain-models/kepzettsegek.test.ts @@ -0,0 +1,154 @@ +import {KarakterDefaults} from "./karakter"; +import {Osztaly} from "./osztaly"; +import { + AvailableKezpettsegList, GetKepzettsegListaN, + GetNumberOfKepzettsegek, + SetDefaultTolvajKepzettsegek +} from "./kepzettsegek"; +import {Faj} from "./faj"; + +describe('AvailableKezpettsegList', ()=> { + + const commonKepzettsegek = ['k_allatidomitas', 'k_eloadas', 'k_ertekbecsles', 'k_gyogyitas', 'k_hajozas', + 'k_hallgatozas', 'k_lovaglas', 'k_maszas', 'k_megfigyeles', 'k_mesterseg', 'k_nyomkereses', 'k_osonas', 'k_rejtozes', + 'k_tudas', 'k_ugras', 'k_uszas'] + + test.each([ + [Osztaly.Amazon, commonKepzettsegek], + [Osztaly.Ijasz, commonKepzettsegek], + [Osztaly.Harcos, commonKepzettsegek], + [Osztaly.Kaloz, commonKepzettsegek], + [Osztaly.Barbar, commonKepzettsegek], + [Osztaly.Tolvaj, ['k_alcazas', 'k_csapdak', 'k_egyensulyozas', 'k_hamisitas', 'k_jelek_olvasasa', 'k_meregkeveres', 'k_szabadulomuveszet', 'k_zarnyitas', 'k_zsebmetszes', ...commonKepzettsegek]], + [Osztaly.Pap, ['k_varazslatismeret', 'k_koncentracio', 'k_csillagjoslas', 'k_alkimia', 'k_jelek_olvasasa', ...commonKepzettsegek]], + [Osztaly.Varazslo, ['k_varazslatismeret', 'k_koncentracio', 'k_csillagjoslas', 'k_alkimia', 'k_jelek_olvasasa', ...commonKepzettsegek]], + [Osztaly.Illuzionista, ['k_varazslatismeret', 'k_koncentracio', 'k_csillagjoslas', 'k_alkimia', 'k_jelek_olvasasa', ...commonKepzettsegek]], + ])('%s has %s', (osztaly: Osztaly, expected: string[]) => { + const availableKezpettsegList = AvailableKezpettsegList(osztaly).map(x => x.Id) + expect(availableKezpettsegList).toHaveLength(expected.length) + for (const kepzettseg of expected) { + expect(availableKezpettsegList).toContain(kepzettseg) + } + for (const kepzettseg of availableKezpettsegList) { + expect(expected).toContain(kepzettseg) + } + }) +}) + +describe('GetNumberOfKepzettsegek', () => { + test.each([ + [Faj.Birodalmi, 10, 3], + [Faj.Ember, 10, 4], + [Faj.Elf, 18, 6], + [Faj.Torpe, 3, 1], + ])('%s with %i INT has %i kepzettseg', (faj: Faj, int: number, expected: number) => { + const actual = GetNumberOfKepzettsegek(int, faj, 16) + expect(actual).toEqual(expected) + }) +}) + +describe('SetDefaultTolvajKepzettsegek', ()=> { + describe('when karakter is not a Tolvaj', () => { + it('sets tolvaj kepzettsegek to empty', () => { + // arrange + const karakter = {...KarakterDefaults} + karakter.osztaly = Osztaly.Barbar + karakter.tolvajKepzettsegek = ['k_alkimia'] + + const invocations = [] as (string[] | undefined)[] + const changeTolvajkepzettsegek = (ids?: string[]) => { + invocations.push(ids) + } + // act + SetDefaultTolvajKepzettsegek(karakter, changeTolvajkepzettsegek) + // assert + expect(invocations).toHaveLength(1) + expect(invocations[0]).toBeUndefined() + }) + }) + describe('when karakter is a Tolvaj', () => { + describe('and tolvaj kepzettsegek is empty', () => { + it('sets 4 tolvaj kepzettsegek', () => { + // arrange + const karakter = {...KarakterDefaults} + karakter.osztaly = Osztaly.Tolvaj + const invocations = [] as (string[] | undefined)[] + const changeTolvajkepzettsegek = (ids?: string[]) => { + invocations.push(ids) + } + // act + SetDefaultTolvajKepzettsegek(karakter, changeTolvajkepzettsegek) + // assert + expect(invocations).toHaveLength(1) + expect(invocations[0]).toHaveLength(4) + }) + }) + describe('and tolvaj kepzettsegek is already set', () => { + it('doesnt change anything', () => { + // arrange + const karakter = {...KarakterDefaults} + karakter.osztaly = Osztaly.Tolvaj + karakter.tolvajKepzettsegek = ['k_alkimia', 'k_hamisitas', 'k_meregkeveres', 'k_zsebmetszes'] + const invocations = [] as (string[] | undefined)[] + const changeTolvajkepzettsegek = (ids?: string[]) => { + invocations.push(ids) + } + // act + SetDefaultTolvajKepzettsegek(karakter, changeTolvajkepzettsegek) + // assert + expect(invocations).toHaveLength(0) + }) + }) + }) +}) + +describe('GetKepzettsegListaN', () => { + it("contains the Nth kepzettseg", () => { + const karakter = {...KarakterDefaults} + karakter.kepzettsegek = ['k_uszas', 'k_ugras', 'k_osonas', 'k_hallgatozas'] + const sut = GetKepzettsegListaN(karakter) + for (let i = 0; i < karakter.kepzettsegek.length; i++) { + const actual = sut(i).map(x => x.Id) + expect(actual).toContain(karakter.kepzettsegek[i]) + } + }) + it('returns Hajozas as 1st for Eszaki', ()=> { + const karakter = {...KarakterDefaults} + karakter.faj = Faj.Eszaki + karakter.kepzettsegek = ['k_uszas', 'k_ugras', 'k_osonas', 'k_hallgatozas'] + const actual = GetKepzettsegListaN(karakter)(0).map(x => x.Id) + expect(actual).toHaveLength(1) + expect(actual[0]).toEqual('k_hajozas') + }) + it('returns Lovaglas as 1st for Etuniai', ()=> { + const karakter = {...KarakterDefaults} + karakter.faj = Faj.Etuniai + karakter.kepzettsegek = ['k_uszas', 'k_ugras', 'k_osonas', 'k_hallgatozas'] + const actual = GetKepzettsegListaN(karakter)(0).map(x => x.Id) + expect(actual).toHaveLength(1) + expect(actual[0]).toEqual('k_lovaglas') + }) + it('returns Meregkeveres and Alkimia as 1st for Birodalmi', ()=> { + const karakter = {...KarakterDefaults} + karakter.faj = Faj.Birodalmi + karakter.kepzettsegek = ['k_uszas', 'k_ugras', 'k_osonas', 'k_hallgatozas'] + const actual = GetKepzettsegListaN(karakter)(0).map(x => x.Id) + expect(actual).toHaveLength(2) + expect(actual).toContain('k_meregkeveres') + expect(actual).toContain('k_alkimia') + }) + it("doesn't contains other selected kepzettsegek", () => { + const karakter = {...KarakterDefaults} + karakter.kepzettsegek = ['k_uszas', 'k_ugras', 'k_osonas', 'k_hallgatozas'] + const sut = GetKepzettsegListaN(karakter) + for (let i = 0; i < karakter.kepzettsegek.length; i++) { + const actual = sut(i).map(x => x.Id) + for (let j = 0; j < karakter.kepzettsegek.length; j++) { + if (i === j) { + continue; + } + expect(actual.indexOf(karakter.kepzettsegek[j])).toEqual(-1) + } + } + }) +}) diff --git a/frontend/src/first-edition/domain-models/kepzettsegek.ts b/frontend/src/first-edition/domain-models/kepzettsegek.ts index 0b1c744..a271440 100644 --- a/frontend/src/first-edition/domain-models/kepzettsegek.ts +++ b/frontend/src/first-edition/domain-models/kepzettsegek.ts @@ -19,7 +19,7 @@ export const KepzettsegLista: Kepzettseg[] = [ Name: 'Alkímia', Description: 'Különféle különleges anyagok, pl. savak, görögtűz, stb. kikeverésére szolgál. Használatához gyakran jól felszerelt laboratórium szükséges. Az Alkímia képzettséggel a karakter képes beazonosítani a különféle vegyi anyagokat és mérgeket, bizonyos esetekben varázsitalokat is.', Tulajdonsag: [Tulajdonsag.Intelligencia], - Osztalyok: [Osztaly.Varazslo, Osztaly.Illuzionista], + Osztalyok: [Osztaly.Varazslo, Osztaly.Illuzionista, Osztaly.Pap], }, { Id: 'k_alcazas', @@ -46,7 +46,7 @@ export const KepzettsegLista: Kepzettseg[] = [ Name: 'Csillagjóslás', Description: 'A karakter a képzettséggel egyrészt képes meghatározni a karakterek hozzávetőleges pozícióját a térképen, másrészt egyszerűbb jóslatokat készíthet.', Tulajdonsag: [Tulajdonsag.Bolcsesseg], - Osztalyok: [Osztaly.Varazslo, Osztaly.Illuzionista], + Osztalyok: [Osztaly.Varazslo, Osztaly.Illuzionista, Osztaly.Pap], }, { Id: 'k_egyensulyozas', @@ -97,14 +97,14 @@ export const KepzettsegLista: Kepzettseg[] = [ Name: 'Jelek Olvasása', Description: 'A képzettséggel a karakter el tud olvasni más nyelven írt írásokat és feliratokat.', Tulajdonsag: [Tulajdonsag.Intelligencia], - Osztalyok: [Osztaly.Tolvaj, Osztaly.Varazslo, Osztaly.Illuzionista], + Osztalyok: [Osztaly.Tolvaj, Osztaly.Varazslo, Osztaly.Illuzionista, Osztaly.Pap], }, { Id: 'k_koncentracio', Name: 'Koncentráció', Description: 'Ez a képesség arra teszi alkalmassá a varázshasználót, hogy nehéz körülmények között – sebesülten, vágtató lovon, hánykolódó hajón, stb. – is alkalmazhassa varázslatait.', Tulajdonsag: [Tulajdonsag.Bolcsesseg], - Osztalyok: [Osztaly.Varazslo, Osztaly.Illuzionista], + Osztalyok: [Osztaly.Varazslo, Osztaly.Illuzionista, Osztaly.Pap], }, { Id: 'k_lovaglas', @@ -185,7 +185,7 @@ export const KepzettsegLista: Kepzettseg[] = [ Name: 'Varázslatismeret', Description: 'A Mágiaismerettel ellentétben ez a képzettség nem a mágia elméletében, hanem a konkrét varázslatokban való ismereteket méri. Sikeres próbával a karakter azonosíthatja az elmondás alatt álló varázslatokat (NF= a mentődobás nehézsége), bizonyos mágikus effektusokat, csapdákat, stb.', Tulajdonsag: [Tulajdonsag.Intelligencia], - Osztalyok: [Osztaly.Illuzionista, Osztaly.Varazslo], + Osztalyok: [Osztaly.Illuzionista, Osztaly.Varazslo, Osztaly.Pap], }, { Id: 'k_zarnyitas',