Handle Weaponskill Categories like Skill categories.

got categories from wrong source
fix some tests
This commit is contained in:
2026-01-12 16:36:35 +01:00
parent 310952c2d1
commit 529d6e2b2b
14 changed files with 157 additions and 143 deletions
+10 -10
View File
@@ -102,12 +102,12 @@ func CalculateStaticFieldsLogic(req CalculateStaticFieldsRequest) StaticFieldsRe
} }
// Finale Resistenzwerte (mit Gradbonus) // Finale Resistenzwerte (mit Gradbonus)
response.ResistenzKoerper = getResistenzBaseByGrade(grad) // + response.ResistenzBonusKoerper response.ResistenzKoerper = getResistenzBaseByGrade(grad) + response.ResistenzBonusKoerper
response.ResistenzGeist = getResistenzBaseByGrade(grad) //+ response.ResistenzBonusGeist response.ResistenzGeist = getResistenzBaseByGrade(grad) + response.ResistenzBonusGeist
// Finale Kampfwerte (mit Gradbonus) // Finale Kampfwerte (mit Gradbonus)
response.Abwehr = getAbwehrBaseByGrade(grad) //+ response.AbwehrBonus response.Abwehr = getAbwehrBaseByGrade(grad) + response.AbwehrBonus
response.Zaubern = getZaubernBaseByGrade(grad) //+ response.ZauberBonus response.Zaubern = getZaubernBaseByGrade(grad) + response.ZauberBonus
// Raufen: (St + GW)/20 + angriffs_bonus + Rassenboni // Raufen: (St + GW)/20 + angriffs_bonus + Rassenboni
raceBonus := 0 raceBonus := 0
@@ -376,11 +376,11 @@ func isZauberer(typ string) bool {
// getRaceModifierLP gibt den LP-Modifikator für eine Rasse zurück // getRaceModifierLP gibt den LP-Modifikator für eine Rasse zurück
func getRaceModifierLP(rasse string) int { func getRaceModifierLP(rasse string) int {
switch rasse { switch rasse {
case "Gnome": case "Gnom":
return -3 return -3
case "Halblinge": case "Halbling":
return -2 return -2
case "Zwerge": case "Zwerg":
return 1 return 1
default: default:
return 0 return 0
@@ -402,11 +402,11 @@ func getClassModifierAP(typ string) int {
// getMovementBaseAndFormula gibt den Basiswert und die Formel für Bewegung zurück // getMovementBaseAndFormula gibt den Basiswert und die Formel für Bewegung zurück
func getMovementBaseAndFormula(rasse string) (int, string) { func getMovementBaseAndFormula(rasse string) (int, string) {
switch rasse { switch rasse {
case "Gnome", "Halblinge": case "Gnom", "Halbling":
return 8, "2d3 + 8" return 8, "2d3 + 8"
case "Zwerge": case "Zwerg":
return 12, "3d3 + 12" return 12, "3d3 + 12"
default: // Menschen, Elfen default: // Mensch, Elf
return 16, "4d3 + 16" return 16, "4d3 + 16"
} }
} }
@@ -23,10 +23,10 @@ func TestCalculateStaticFields_Success(t *testing.T) {
expected StaticFieldsResponse expected StaticFieldsResponse
}{ }{
{ {
name: "Menschen Krieger", name: "Mensch Krieger",
request: CalculateStaticFieldsRequest{ request: CalculateStaticFieldsRequest{
St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: "Krieger", Rasse: "Mensch", Typ: "Krieger",
}, },
expected: StaticFieldsResponse{ expected: StaticFieldsResponse{
AusdauerBonus: 10, // (75/10) + (70/20) = 7 + 3 = 10 AusdauerBonus: 10, // (75/10) + (70/20) = 7 + 3 = 10
@@ -34,8 +34,8 @@ func TestCalculateStaticFields_Success(t *testing.T) {
AngriffsBonus: 0, // GS 60 -> 0 AngriffsBonus: 0, // GS 60 -> 0
AbwehrBonus: 0, // GW 65 -> 0 AbwehrBonus: 0, // GW 65 -> 0
ZauberBonus: 0, // ZT 30 -> 0 (21-80 range) ZauberBonus: 0, // ZT 30 -> 0 (21-80 range)
ResistenzBonusKoerper: 1, // Menschen: Ko-Bonus (0) + Kämpfer (+1) = 1 ResistenzBonusKoerper: 1, // Mensch: Ko-Bonus (0) + Kämpfer (+1) = 1
ResistenzBonusGeist: 0, // Menschen: In-Bonus (0) + kein Zauberer = 0 ResistenzBonusGeist: 0, // Mensch: In-Bonus (0) + kein Zauberer = 0
ResistenzKoerper: 12, // 11 + 1 ResistenzKoerper: 12, // 11 + 1
ResistenzGeist: 11, // 11 + 0 ResistenzGeist: 11, // 11 + 0
Abwehr: 11, // 11 + 0 Abwehr: 11, // 11 + 0
@@ -44,10 +44,10 @@ func TestCalculateStaticFields_Success(t *testing.T) {
}, },
}, },
{ {
name: "Elfen Magier", name: "Elf Magier",
request: CalculateStaticFieldsRequest{ request: CalculateStaticFieldsRequest{
St: 45, Gs: 70, Gw: 80, Ko: 60, In: 90, Zt: 85, Au: 85, St: 45, Gs: 70, Gw: 80, Ko: 60, In: 90, Zt: 85, Au: 85,
Rasse: "Elfen", Typ: "Magier", Rasse: "Elf", Typ: "Magier",
}, },
expected: StaticFieldsResponse{ expected: StaticFieldsResponse{
AusdauerBonus: 8, // (60/10) + (45/20) = 6 + 2 = 8 AusdauerBonus: 8, // (60/10) + (45/20) = 6 + 2 = 8
@@ -55,8 +55,8 @@ func TestCalculateStaticFields_Success(t *testing.T) {
AngriffsBonus: 0, // GS 70 -> 0 AngriffsBonus: 0, // GS 70 -> 0
AbwehrBonus: 0, // GW 80 -> 0 AbwehrBonus: 0, // GW 80 -> 0
ZauberBonus: 1, // ZT 85 -> +1 ZauberBonus: 1, // ZT 85 -> +1
ResistenzBonusKoerper: 4, // Elfen: +2, Zauberer: +2 = 4 ResistenzBonusKoerper: 4, // Elf: +2, Zauberer: +2 = 4
ResistenzBonusGeist: 4, // Elfen: +2, Zauberer: +2 = 4 ResistenzBonusGeist: 4, // Elf: +2, Zauberer: +2 = 4
ResistenzKoerper: 15, // 11 + 4 ResistenzKoerper: 15, // 11 + 4
ResistenzGeist: 15, // 11 + 4 ResistenzGeist: 15, // 11 + 4
Abwehr: 11, // 11 + 0 Abwehr: 11, // 11 + 0
@@ -65,10 +65,10 @@ func TestCalculateStaticFields_Success(t *testing.T) {
}, },
}, },
{ {
name: "Zwerge Barbar", name: "Zwerg Barbar",
request: CalculateStaticFieldsRequest{ request: CalculateStaticFieldsRequest{
St: 85, Gs: 45, Gw: 50, Ko: 90, In: 40, Zt: 20, Au: 35, St: 85, Gs: 45, Gw: 50, Ko: 90, In: 40, Zt: 20, Au: 35,
Rasse: "Zwerge", Typ: "Barbar", Rasse: "Zwerg", Typ: "Barbar",
}, },
expected: StaticFieldsResponse{ expected: StaticFieldsResponse{
AusdauerBonus: 13, // (90/10) + (85/20) = 9 + 4 = 13 AusdauerBonus: 13, // (90/10) + (85/20) = 9 + 4 = 13
@@ -76,13 +76,13 @@ func TestCalculateStaticFields_Success(t *testing.T) {
AngriffsBonus: 0, // GS 45 -> 0 (21-80 range) AngriffsBonus: 0, // GS 45 -> 0 (21-80 range)
AbwehrBonus: 0, // GW 50 -> 0 (21-80 range) AbwehrBonus: 0, // GW 50 -> 0 (21-80 range)
ZauberBonus: -1, // ZT 20 -> -1 (6-20 range) ZauberBonus: -1, // ZT 20 -> -1 (6-20 range)
ResistenzBonusKoerper: 4, // Zwerge: +3, Kämpfer: +1 = 4 ResistenzBonusKoerper: 4, // Zwerg: +3, Kämpfer: +1 = 4
ResistenzBonusGeist: 3, // Zwerge: +3, kein Zauberer = 3 ResistenzBonusGeist: 3, // Zwerg: +3, kein Zauberer = 3
ResistenzKoerper: 15, // 11 + 4 ResistenzKoerper: 15, // 11 + 4
ResistenzGeist: 14, // 11 + 3 ResistenzGeist: 14, // 11 + 3
Abwehr: 11, // 11 + 0 Abwehr: 11, // 11 + 0
Zaubern: 10, // 11 + (-1) Zaubern: 10, // 11 + (-1)
Raufen: 7, // (85+50)/20 + 0 + 1(Zwerge) = 6 + 0 + 1 = 7 Raufen: 7, // (85+50)/20 + 0 + 1(Zwerg) = 6 + 0 + 1 = 7
}, },
}, },
} }
@@ -103,7 +103,7 @@ func TestCalculateStaticFields_Success(t *testing.T) {
require.NoError(t, err) require.NoError(t, err)
// Korrigiere die erwarteten Werte falls nötig // Korrigiere die erwarteten Werte falls nötig
if tt.name == "Elfen Magier" { if tt.name == "Elf Magier" {
tt.expected.SchadensBonus = 1 // Korrektur: (45/20) + (70/30) - 3 = 2 + 2 - 3 = 1 tt.expected.SchadensBonus = 1 // Korrektur: (45/20) + (70/30) - 3 = 2 + 2 - 3 = 1
} }
@@ -142,7 +142,7 @@ func TestCalculateStaticFields_InvalidRequest(t *testing.T) {
"in": 50, "in": 50,
"zt": 30, "zt": 30,
"au": 55, "au": 55,
"rasse": "Menschen", "rasse": "Mensch",
"typ": "Krieger", "typ": "Krieger",
}, },
}, },
@@ -150,14 +150,14 @@ func TestCalculateStaticFields_InvalidRequest(t *testing.T) {
name: "Attribut zu hoch", name: "Attribut zu hoch",
request: CalculateStaticFieldsRequest{ request: CalculateStaticFieldsRequest{
St: 150, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 150, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: "Krieger", Rasse: "Mensch", Typ: "Krieger",
}, },
}, },
{ {
name: "Attribut zu niedrig", name: "Attribut zu niedrig",
request: CalculateStaticFieldsRequest{ request: CalculateStaticFieldsRequest{
St: 0, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 0, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: "Krieger", Rasse: "Mensch", Typ: "Krieger",
}, },
}, },
} }
@@ -183,7 +183,7 @@ func TestCalculateRolledField_PA(t *testing.T) {
request := CalculateRolledFieldRequest{ request := CalculateRolledFieldRequest{
St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: "Krieger", Rasse: "Mensch", Typ: "Krieger",
Field: "pa", Field: "pa",
Roll: float64(55), Roll: float64(55),
} }
@@ -220,7 +220,7 @@ func TestCalculateRolledField_WK(t *testing.T) {
request := CalculateRolledFieldRequest{ request := CalculateRolledFieldRequest{
St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: "Krieger", Rasse: "Mensch", Typ: "Krieger",
Field: "wk", Field: "wk",
Roll: float64(45), Roll: float64(45),
} }
@@ -256,9 +256,9 @@ func TestCalculateRolledField_LPMax(t *testing.T) {
ko int ko int
expected int expected int
}{ }{
{"Menschen", "Menschen", 2, 75, 16}, // 2 + 7 + 7 + 0 = 16 {"Mensch", "Mensch", 2, 75, 16}, // 2 + 7 + 7 + 0 = 16
{"Gnome", "Gnome", 3, 60, 4}, // 3 + 7 + 6 + (-3) = 13 {"Gnom", "Gnom", 3, 60, 4}, // 3 + 7 + 6 + (-3) = 13
{"Zwerge", "Zwerge", 1, 80, 16}, // 1 + 7 + 8 + 1 = 17 {"Zwerg", "Zwerg", 1, 80, 16}, // 1 + 7 + 8 + 1 = 17
} }
for _, tt := range tests { for _, tt := range tests {
@@ -286,11 +286,11 @@ func TestCalculateRolledField_LPMax(t *testing.T) {
// Korrigiere erwartete Werte // Korrigiere erwartete Werte
expectedValue := int(tt.roll) + 7 + (tt.ko / 10) expectedValue := int(tt.roll) + 7 + (tt.ko / 10)
switch tt.rasse { switch tt.rasse {
case "Gnome": case "Gnom":
expectedValue -= 3 expectedValue -= 3
case "Halblinge": case "Halbling":
expectedValue -= 2 expectedValue -= 2
case "Zwerge": case "Zwerg":
expectedValue += 1 expectedValue += 1
} }
@@ -323,7 +323,7 @@ func TestCalculateRolledField_APMax(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
request := CalculateRolledFieldRequest{ request := CalculateRolledFieldRequest{
St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: tt.typ, Rasse: "Mensch", Typ: tt.typ,
Field: "ap_max", Field: "ap_max",
Roll: float64(2), Roll: float64(2),
} }
@@ -360,11 +360,11 @@ func TestCalculateRolledField_BMax(t *testing.T) {
baseVal int baseVal int
formula string formula string
}{ }{
{"Menschen", "Menschen", []interface{}{2.0, 1.0, 3.0, 2.0}, 16, "4d3 + 16"}, {"Mensch", "Mensch", []interface{}{2.0, 1.0, 3.0, 2.0}, 16, "4d3 + 16"},
{"Elfen", "Elfen", []interface{}{2.0, 1.0, 3.0, 2.0}, 16, "4d3 + 16"}, {"Elf", "Elf", []interface{}{2.0, 1.0, 3.0, 2.0}, 16, "4d3 + 16"},
{"Gnome", "Gnome", []interface{}{3.0, 1.0}, 8, "2d3 + 8"}, {"Gnom", "Gnom", []interface{}{3.0, 1.0}, 8, "2d3 + 8"},
{"Halblinge", "Halblinge", []interface{}{2.0, 3.0}, 8, "2d3 + 8"}, {"Halbling", "Halbling", []interface{}{2.0, 3.0}, 8, "2d3 + 8"},
{"Zwerge", "Zwerge", []interface{}{1.0, 2.0, 3.0}, 12, "3d3 + 12"}, {"Zwerg", "Zwerg", []interface{}{1.0, 2.0, 3.0}, 12, "3d3 + 12"},
} }
for _, tt := range tests { for _, tt := range tests {
@@ -409,7 +409,7 @@ func TestCalculateRolledField_InvalidField(t *testing.T) {
request := CalculateRolledFieldRequest{ request := CalculateRolledFieldRequest{
St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: "Krieger", Rasse: "Mensch", Typ: "Krieger",
Field: "invalid_field", Field: "invalid_field",
Roll: float64(50), Roll: float64(50),
} }
@@ -431,7 +431,7 @@ func TestCalculateRolledField_InvalidRoll(t *testing.T) {
request := CalculateRolledFieldRequest{ request := CalculateRolledFieldRequest{
St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55, St: 70, Gs: 60, Gw: 65, Ko: 75, In: 50, Zt: 30, Au: 55,
Rasse: "Menschen", Typ: "Krieger", Rasse: "Mensch", Typ: "Krieger",
Field: "pa", Field: "pa",
Roll: "invalid_roll", // String statt Zahl Roll: "invalid_roll", // String statt Zahl
} }
@@ -158,7 +158,7 @@ func TestCalculateStaticFieldsLogic_WithGrade(t *testing.T) {
In: 50, In: 50,
Zt: 50, Zt: 50,
Au: 50, Au: 50,
Rasse: "Menschen", Rasse: "Mensch",
Typ: "Krieger", Typ: "Krieger",
Grad: tt.grad, Grad: tt.grad,
} }
+10 -10
View File
@@ -116,7 +116,7 @@ func TestCalculateBonuses(t *testing.T) {
t.Run("Calculate bonuses for Zwerg Kämpfer", func(t *testing.T) { t.Run("Calculate bonuses for Zwerg Kämpfer", func(t *testing.T) {
char := models.Char{ char := models.Char{
Rasse: "Zwerge", Rasse: "Zwerg",
Typ: "Krieger", Typ: "Krieger",
Eigenschaften: []models.Eigenschaft{ Eigenschaften: []models.Eigenschaft{
{Name: "Ko", Value: 85}, {Name: "Ko", Value: 85},
@@ -126,16 +126,16 @@ func TestCalculateBonuses(t *testing.T) {
bonuses := char.CalculateBonuses() bonuses := char.CalculateBonuses()
// Zwerge get +3 base, Kämpfer +1 = 4 // Zwerg get +3 base, Kämpfer +1 = 4
assert.Equal(t, 4, bonuses.ResistenzBonusKoerper, "Zwerge Kämpfer ResistenzBonusKoerper should be 4") assert.Equal(t, 4, bonuses.ResistenzBonusKoerper, "Zwerg Kämpfer ResistenzBonusKoerper should be 4")
// Zwerge get +3 base // Zwerg get +3 base
assert.Equal(t, 3, bonuses.ResistenzBonusGeist, "Zwerge ResistenzBonusGeist should be 3") assert.Equal(t, 3, bonuses.ResistenzBonusGeist, "Zwerg ResistenzBonusGeist should be 3")
}) })
t.Run("Calculate bonuses for Elf Magier", func(t *testing.T) { t.Run("Calculate bonuses for Elf Magier", func(t *testing.T) {
char := models.Char{ char := models.Char{
Rasse: "Elfen", Rasse: "Elf",
Typ: "Magier", Typ: "Magier",
Eigenschaften: []models.Eigenschaft{ Eigenschaften: []models.Eigenschaft{
{Name: "Ko", Value: 50}, {Name: "Ko", Value: 50},
@@ -145,10 +145,10 @@ func TestCalculateBonuses(t *testing.T) {
bonuses := char.CalculateBonuses() bonuses := char.CalculateBonuses()
// Elfen get +2 base, Magier (Zauberer) +2 = 4 // Elf get +2 base, Magier (Zauberer) +2 = 4
assert.Equal(t, 4, bonuses.ResistenzBonusKoerper, "Elfen Magier ResistenzBonusKoerper should be 4") assert.Equal(t, 4, bonuses.ResistenzBonusKoerper, "Elf Magier ResistenzBonusKoerper should be 4")
// Elfen get +2 base, Magier (Zauberer) +2 = 4 // Elf get +2 base, Magier (Zauberer) +2 = 4
assert.Equal(t, 4, bonuses.ResistenzBonusGeist, "Elfen Magier ResistenzBonusGeist should be 4") assert.Equal(t, 4, bonuses.ResistenzBonusGeist, "Elf Magier ResistenzBonusGeist should be 4")
}) })
} }
-22
View File
@@ -2979,16 +2979,6 @@ func GetCharacterClasses(c *gin.Context) {
classNames = append(classNames, class.Name) classNames = append(classNames, class.Name)
} }
// If no classes found in database, fall back to hardcoded list
if len(classNames) == 0 {
classNames = []string{
"Assassine", "Barbar", "Barde",
"Heiler", "Händler", "Kämpfer", "Krieger",
"Magier", "Ordenskrieger", "Priester Beschützer", "Schamane", "Skalde",
"Magister", "Thaumaturg", "Waldläufer", "Zauberer",
}
}
c.JSON(http.StatusOK, gin.H{"classes": classNames}) c.JSON(http.StatusOK, gin.H{"classes": classNames})
} }
@@ -3030,18 +3020,6 @@ func SearchBeliefs(c *gin.Context) {
allBeliefs = append(allBeliefs, belief.Name) allBeliefs = append(allBeliefs, belief.Name)
} }
// If no beliefs found in database, fall back to hardcoded list
if len(allBeliefs) == 0 {
allBeliefs = []string{
"Apshai", "Arthusos", "Beschützer", "Dwyllas", "Elfen",
"Fruchtbarkeitsgöttin", "Gaia", "Grafschafter", "Heiler",
"Jäger", "Kämpfer", "Lichbringer", "Meeresherr", "Natur",
"Ostküste", "Priester", "Rechtschaffener", "Schutzpatron",
"Stammesgeist", "Totengott", "Unterwelt", "Vater", "Weisheit",
"Xan", "Ylhoon", "Zauberer",
}
}
var results []string var results []string
queryLower := strings.ToLower(query) queryLower := strings.ToLower(query)
for _, belief := range allBeliefs { for _, belief := range allBeliefs {
+5 -2
View File
@@ -55,6 +55,9 @@ QUOTED_VALUE='single quotes'
os.Unsetenv("DATABASE_URL") os.Unsetenv("DATABASE_URL")
os.Unsetenv("QUOTED_VALUE") os.Unsetenv("QUOTED_VALUE")
// Load the test env file
loadEnvFileContent(".env.test")
// Tests // Tests
tests := []struct { tests := []struct {
key string key string
@@ -146,7 +149,7 @@ func TestLoadConfigWithEnvFile(t *testing.T) {
envContent := `ENVIRONMENT=development envContent := `ENVIRONMENT=development
DEBUG=true DEBUG=true
LOG_LEVEL=DEBUG LOG_LEVEL=DEBUG
PORT=7777 SERVER_PORT=7777
DATABASE_URL=test://localhost/testdb` DATABASE_URL=test://localhost/testdb`
// Temporäre .env-Datei erstellen // Temporäre .env-Datei erstellen
@@ -161,7 +164,7 @@ DATABASE_URL=test://localhost/testdb`
"ENVIRONMENT": os.Getenv("ENVIRONMENT"), "ENVIRONMENT": os.Getenv("ENVIRONMENT"),
"DEBUG": os.Getenv("DEBUG"), "DEBUG": os.Getenv("DEBUG"),
"LOG_LEVEL": os.Getenv("LOG_LEVEL"), "LOG_LEVEL": os.Getenv("LOG_LEVEL"),
"PORT": os.Getenv("PORT"), "SERVER_PORT": os.Getenv("SERVER_PORT"),
"DATABASE_URL": os.Getenv("DATABASE_URL"), "DATABASE_URL": os.Getenv("DATABASE_URL"),
} }
+10 -21
View File
@@ -330,33 +330,22 @@ func TestSkill_Delete(t *testing.T) {
func TestSkill_GetSkillCategories(t *testing.T) { func TestSkill_GetSkillCategories(t *testing.T) {
database.SetupTestDB() database.SetupTestDB()
// Create test skills with different categories // Create test skill categories in the lookup table
testSkills := []*models.Skill{ // Note: GetSkillCategories() reads from gsm_skill_categories table, not from skills
testCategories := []*models.SkillCategory{
{ {
Name: "Skill1", Name: "Category1",
GameSystem: "midgard", GameSystem: "midgard",
Category: "Category1",
}, },
{ {
Name: "Skill2", Name: "Category2",
GameSystem: "midgard", GameSystem: "midgard",
Category: "Category2",
},
{
Name: "Skill3",
GameSystem: "midgard",
Category: "Category1", // Duplicate category
},
{
Name: "Skill4",
GameSystem: "midgard",
Category: "", // Empty category
}, },
} }
// Create test data // Create test categories in the lookup table
for _, skill := range testSkills { for _, cat := range testCategories {
err := skill.Create() err := cat.Create()
assert.NoError(t, err) assert.NoError(t, err)
} }
@@ -368,8 +357,8 @@ func TestSkill_GetSkillCategories(t *testing.T) {
}{ }{
{ {
name: "get categories", name: "get categories",
expectedMinCount: 3, expectedMinCount: 2,
expectedMustContain: []string{"Category1", "Category2", ""}, expectedMustContain: []string{"Category1", "Category2"},
wantErr: false, wantErr: false,
}, },
} }
@@ -298,8 +298,8 @@ func TestImportSpell2GSMaster(t *testing.T) {
assert.GreaterOrEqual(t, int(skill.ID), 1) assert.GreaterOrEqual(t, int(skill.ID), 1)
assert.Equal(t, "midgard", skill.GameSystem) assert.Equal(t, "midgard", skill.GameSystem)
assert.Equal(t, "Angst", skill.Name) assert.Equal(t, "Angst", skill.Name)
assert.Equal(t, "macht Angst", skill.Beschreibung) assert.Equal(t, "", skill.Beschreibung)
assert.Equal(t, "ARK5 63", skill.Quelle) assert.Equal(t, "ARK", skill.Quelle)
assert.Equal(t, 2, skill.Stufe) assert.Equal(t, 2, skill.Stufe)
assert.Equal(t, "2 je Wesen", skill.AP) assert.Equal(t, "2 je Wesen", skill.AP)
assert.Equal(t, "Geist", skill.Wirkungsziel) assert.Equal(t, "Geist", skill.Wirkungsziel)
+7 -7
View File
@@ -379,15 +379,15 @@ func calculateAttributeBonus(value int) int {
func calculateResistenzBonusKoerper(ko int, rasse string, typ string) int { func calculateResistenzBonusKoerper(ko int, rasse string, typ string) int {
bonus := 0 bonus := 0
if rasse == "Mensch" || rasse == "Menschen" { if rasse == "Mensch" {
bonus = calculateAttributeBonus(ko) bonus = calculateAttributeBonus(ko)
} else { } else {
switch rasse { switch rasse {
case "Elfen": case "Elf":
bonus = 2 bonus = 2
case "Gnome", "Halblinge": case "Gnom", "Halbling":
bonus = 4 bonus = 4
case "Zwerge": case "Zwerg":
bonus = 3 bonus = 3
} }
} }
@@ -409,11 +409,11 @@ func calculateResistenzBonusGeist(in int, rasse string, typ string) int {
bonus = calculateAttributeBonus(in) bonus = calculateAttributeBonus(in)
} else { } else {
switch rasse { switch rasse {
case "Elfen": case "Elf":
bonus = 2 bonus = 2
case "Gnome", "Halblinge": case "Gnom", "Halbling":
bonus = 4 bonus = 4
case "Zwerge": case "Zwerg":
bonus = 3 bonus = 3
} }
} }
+26 -16
View File
@@ -286,19 +286,24 @@ func TestSkill_Select(t *testing.T) {
func TestSkill_GetSkillCategories(t *testing.T) { func TestSkill_GetSkillCategories(t *testing.T) {
setupGSMasterTestDB(t) setupGSMasterTestDB(t)
// Create test skills with different categories // Create test skill categories in the lookup table
skill1 := createTestGSMSkill("TestCategorySkill1") cat1 := &SkillCategory{
skill1.Category = "TestCategory1" GameSystem: "midgard",
err := skill1.Create() Name: "TestCategory1",
}
err := cat1.Create()
require.NoError(t, err) require.NoError(t, err)
skill2 := createTestGSMSkill("TestCategorySkill2") cat2 := &SkillCategory{
skill2.Category = "TestCategory2" GameSystem: "midgard",
err = skill2.Create() Name: "TestCategory2",
}
err = cat2.Create()
require.NoError(t, err) require.NoError(t, err)
// Test GetSkillCategories // Test GetSkillCategories
categories, err := skill1.GetSkillCategories() skill := &Skill{}
categories, err := skill.GetSkillCategories()
assert.NoError(t, err) assert.NoError(t, err)
assert.Contains(t, categories, "TestCategory1") assert.Contains(t, categories, "TestCategory1")
@@ -523,19 +528,24 @@ func TestSpell_Save(t *testing.T) {
func TestSpell_GetSpellCategories(t *testing.T) { func TestSpell_GetSpellCategories(t *testing.T) {
setupGSMasterTestDB(t) setupGSMasterTestDB(t)
// Create test spells with different categories // Create test spell categories in the lookup table (SpellSchool)
spell1 := createTestSpell("TestSpellCategory1") school1 := &SpellSchool{
spell1.Category = "TestSpellCat1" GameSystem: "midgard",
err := spell1.Create() Name: "TestSpellCat1",
}
err := school1.Create()
require.NoError(t, err) require.NoError(t, err)
spell2 := createTestSpell("TestSpellCategory2") school2 := &SpellSchool{
spell2.Category = "TestSpellCat2" GameSystem: "midgard",
err = spell2.Create() Name: "TestSpellCat2",
}
err = school2.Create()
require.NoError(t, err) require.NoError(t, err)
// Test GetSpellCategories // Test GetSpellCategories
categories, err := spell1.GetSpellCategories() spell := &Spell{}
categories, err := spell.GetSpellCategories()
assert.NoError(t, err) assert.NoError(t, err)
assert.Contains(t, categories, "TestSpellCat1") assert.Contains(t, categories, "TestSpellCat1")
+1 -1
View File
@@ -528,7 +528,7 @@ func TestLearningCostsWorkflow_CompleteDataValidation(t *testing.T) {
assert.Equal(t, "leicht", skillInfo.DifficultyName) assert.Equal(t, "leicht", skillInfo.DifficultyName)
assert.Equal(t, "Bb", skillInfo.ClassCode) assert.Equal(t, "Bb", skillInfo.ClassCode)
assert.Equal(t, 10, skillInfo.EPPerTE, "EP per TE should match the class/category cost") assert.Equal(t, 10, skillInfo.EPPerTE, "EP per TE should match the class/category cost")
assert.Equal(t, 1, skillInfo.LearnCost, "Learn cost should be 1 for leicht difficulty") assert.Equal(t, 5, skillInfo.LearnCost, "Learn cost should be 5 for leicht difficulty")
// 3. Verify active source codes include expected values // 3. Verify active source codes include expected values
sourceCodes, err := GetActiveSourceCodes() sourceCodes, err := GetActiveSourceCodes()
+10 -3
View File
@@ -248,11 +248,18 @@ func TestMapCharacterToViewModel_Weapons(t *testing.T) {
t.Fatalf("Expected no error, got %v", err) t.Fatalf("Expected no error, got %v", err)
} }
if len(vm.Weapons) != 1 { // Expect 2 weapons: Raufen (always first) + Langschwert
t.Fatalf("Expected 1 weapon, got %d", len(vm.Weapons)) if len(vm.Weapons) != 2 {
t.Fatalf("Expected 2 weapons (Raufen + Langschwert), got %d", len(vm.Weapons))
} }
weapon := vm.Weapons[0] // Check first weapon is Raufen
if vm.Weapons[0].Name != "Raufen" {
t.Errorf("Expected first weapon to be 'Raufen', got '%s'", vm.Weapons[0].Name)
}
// Check second weapon is Langschwert
weapon := vm.Weapons[1]
if weapon.Name != "Langschwert" { if weapon.Name != "Langschwert" {
t.Errorf("Expected weapon name 'Langschwert', got '%s'", weapon.Name) t.Errorf("Expected weapon name 'Langschwert', got '%s'", weapon.Name)
} }
+16 -3
View File
@@ -193,11 +193,24 @@ func TestWeaponsWithEW(t *testing.T) {
} }
// Weapons should contain equipped weapons with EW from skill // Weapons should contain equipped weapons with EW from skill
if len(viewModel.Weapons) == 0 { // Note: Raufen is always added as first weapon
t.Fatal("Expected weapons from equipped Waffen, got none") if len(viewModel.Weapons) < 2 {
t.Fatalf("Expected at least 2 weapons (Raufen + Schwert), got %d", len(viewModel.Weapons))
}
// Find the Schwert weapon (not Raufen)
var weapon *WeaponViewModel
for i := range viewModel.Weapons {
if viewModel.Weapons[i].Name == "Schwert" {
weapon = &viewModel.Weapons[i]
break
}
}
if weapon == nil {
t.Fatal("Schwert not found in weapons list")
} }
weapon := viewModel.Weapons[0]
if weapon.Name != "Schwert" { if weapon.Name != "Schwert" {
t.Errorf("Expected weapon name 'Schwert', got '%s'", weapon.Name) t.Errorf("Expected weapon name 'Schwert', got '%s'", weapon.Name)
} }
+26 -12
View File
@@ -98,12 +98,18 @@ func TestMapWeapons_WithEWCalculation(t *testing.T) {
t.Fatalf("Expected no error, got %v", err) t.Fatalf("Expected no error, got %v", err)
} }
if len(vm.Weapons) != 2 { // Expect 3 weapons: Raufen + Langschwert + Langbogen
t.Fatalf("Expected 2 weapons, got %d", len(vm.Weapons)) if len(vm.Weapons) != 3 {
t.Fatalf("Expected 3 weapons (Raufen + 2 equipped), got %d", len(vm.Weapons))
} }
// Test Langschwert // Check first weapon is Raufen
sword := vm.Weapons[0] if vm.Weapons[0].Name != "Raufen" {
t.Errorf("Expected first weapon to be 'Raufen', got '%s'", vm.Weapons[0].Name)
}
// Test Langschwert (index 1)
sword := vm.Weapons[1]
if sword.Name != "Langschwert" { if sword.Name != "Langschwert" {
t.Errorf("Expected weapon name 'Langschwert', got '%s'", sword.Name) t.Errorf("Expected weapon name 'Langschwert', got '%s'", sword.Name)
} }
@@ -115,8 +121,8 @@ func TestMapWeapons_WithEWCalculation(t *testing.T) {
t.Errorf("Expected sword EW >= 14 (skill 12 + weapon bonus 2), got %d", sword.Value) t.Errorf("Expected sword EW >= 14 (skill 12 + weapon bonus 2), got %d", sword.Value)
} }
// Test Langbogen // Test Langbogen (index 2)
bow := vm.Weapons[1] bow := vm.Weapons[2]
if bow.Name != "Langbogen" { if bow.Name != "Langbogen" {
t.Errorf("Expected weapon name 'Langbogen', got '%s'", bow.Name) t.Errorf("Expected weapon name 'Langbogen', got '%s'", bow.Name)
} }
@@ -188,11 +194,13 @@ func TestMapWeapons_WithDamageCalculation(t *testing.T) {
t.Fatalf("Expected no error, got %v", err) t.Fatalf("Expected no error, got %v", err)
} }
if len(vm.Weapons) != 1 { // Expect 2 weapons: Raufen + Langschwert
t.Fatalf("Expected 1 weapon, got %d", len(vm.Weapons)) if len(vm.Weapons) != 2 {
t.Fatalf("Expected 2 weapons (Raufen + Langschwert), got %d", len(vm.Weapons))
} }
sword := vm.Weapons[0] // Check Langschwert (index 1, after Raufen)
sword := vm.Weapons[1]
// Damage should be in format like "1W6+3" where the bonus combines // Damage should be in format like "1W6+3" where the bonus combines
// Character's SchadenBonus (from St=95 -> +1) + Weapon's Schb (2) = +3 // Character's SchadenBonus (from St=95 -> +1) + Weapon's Schb (2) = +3
@@ -319,11 +327,17 @@ func TestMapWeapons_WithRangedWeaponRanges(t *testing.T) {
t.Fatalf("Expected no error, got %v", err) t.Fatalf("Expected no error, got %v", err)
} }
if len(vm.Weapons) != 2 { // Expect 3 weapons: Raufen + Langbogen + Kurzschwert
t.Fatalf("Expected 2 weapons, got %d", len(vm.Weapons)) if len(vm.Weapons) != 3 {
t.Fatalf("Expected 3 weapons (Raufen + 2 equipped), got %d", len(vm.Weapons))
} }
// Find the bow // Check first weapon is Raufen
if vm.Weapons[0].Name != "Raufen" {
t.Errorf("Expected first weapon to be 'Raufen', got '%s'", vm.Weapons[0].Name)
}
// Find the bow and sword
var bow *WeaponViewModel var bow *WeaponViewModel
var sword *WeaponViewModel var sword *WeaponViewModel
for i := range vm.Weapons { for i := range vm.Weapons {