Files
bd2/go/internal/server/gamedata/talent_growth_test.go
T

111 lines
3.9 KiB
Go

package gamedata
import (
"database/sql"
"os"
"testing"
"bd2server/internal/server/wire"
)
func TestTalentGrowthDesignJoinsCharacterAndUsesCumulativeExperience(t *testing.T) {
db, err := sql.Open("sqlite", ":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.Exec("CREATE TABLE TalentTable (id INTEGER PRIMARY KEY, ProtoBuf BLOB); CREATE TABLE CharTable (id INTEGER PRIMARY KEY, ProtoBuf BLOB); CREATE TABLE TalentGrowthTable (groupId INTEGER,id INTEGER,ProtoBuf BLOB,PRIMARY KEY(groupId,id))"); err != nil {
t.Fatal(err)
}
talent := testVarintField(testVarintField(nil, 6, 904), 11, 5)
character := testVarintField(nil, 18, 904)
if _, err := db.Exec("INSERT INTO TalentTable VALUES (?,?)", 904, talent); err != nil {
t.Fatal(err)
}
if _, err := db.Exec("INSERT INTO CharTable VALUES (?,?)", 140, character); err != nil {
t.Fatal(err)
}
needs := []uint64{14, 28, 404, 1008}
gold := []uint64{1000, 2000, 4000, 10000}
for level, need := range needs {
growth := testPackedField(nil, 2, 1, gold[level])
growth = testPackedField(growth, 3, uint64(level+3), 0)
growth = testPackedField(growth, 4, 8, 4)
growth = testVarintField(growth, 6, need)
if _, err := db.Exec("INSERT INTO TalentGrowthTable VALUES (?,?,?)", 904, level+1, growth); err != nil {
t.Fatal(err)
}
}
if _, err := db.Exec("INSERT INTO TalentGrowthTable VALUES (?,?,?)", 904, 5, testVarintField(nil, 5, 5)); err != nil {
t.Fatal(err)
}
design, err := loadTalentGrowthDesign(db)
if err != nil {
t.Fatal(err)
}
rule, err := design.UpgradeRule(140, 3)
if err != nil {
t.Fatal(err)
}
if rule.TalentID != 904 || rule.GrowthGroup != 904 || rule.MaxLevel != 5 || rule.RequiredTotalExp != 446 {
t.Fatalf("rule=%+v", rule)
}
want := []PromotionCost{{Type: 8, ID: 5, Count: 1}, {Type: 4, Count: 4000}}
if len(rule.Costs) != len(want) || rule.Costs[0] != want[0] || rule.Costs[1] != want[1] {
t.Fatalf("costs=%+v want=%+v", rule.Costs, want)
}
if _, err := design.UpgradeRule(140, 5); err == nil {
t.Fatal("max-level talent was upgradeable")
}
}
func TestTalentGrowthDesignRejectsMismatchedCostArrays(t *testing.T) {
db, err := sql.Open("sqlite", ":memory:")
if err != nil {
t.Fatal(err)
}
defer db.Close()
if _, err := db.Exec("CREATE TABLE TalentTable (id INTEGER PRIMARY KEY, ProtoBuf BLOB); CREATE TABLE CharTable (id INTEGER PRIMARY KEY, ProtoBuf BLOB); CREATE TABLE TalentGrowthTable (groupId INTEGER,id INTEGER,ProtoBuf BLOB,PRIMARY KEY(groupId,id))"); err != nil {
t.Fatal(err)
}
talent := testVarintField(testVarintField(nil, 6, 9), 11, 2)
character := testVarintField(nil, 18, 9)
broken := testPackedField(testPackedField(nil, 2, 1, 1000), 3, 3)
broken = testPackedField(broken, 4, 8, 4)
broken = wire.AppendVarint(broken, 6, 10)
if _, err := db.Exec("INSERT INTO TalentTable VALUES (?,?)", 9, talent); err != nil {
t.Fatal(err)
}
if _, err := db.Exec("INSERT INTO CharTable VALUES (?,?)", 1, character); err != nil {
t.Fatal(err)
}
if _, err := db.Exec("INSERT INTO TalentGrowthTable VALUES (?,?,?)", 9, 1, broken); err != nil {
t.Fatal(err)
}
if _, err := loadTalentGrowthDesign(db); err == nil {
t.Fatal("mismatched talent costs were accepted")
}
}
func TestTalentGrowthAgainstInstalledCurrentVersion(t *testing.T) {
root := os.Getenv("BD2_REAL_GAMEDATA")
if root == "" {
t.Skip("set BD2_REAL_GAMEDATA for installed GameData integration test")
}
design, err := LoadTalentGrowthDesign(root, "20260923193640")
if err != nil {
t.Fatal(err)
}
rule, err := design.UpgradeRule(140, 1)
if err != nil {
t.Fatal(err)
}
want := []PromotionCost{{Type: 8, ID: 3, Count: 1}, {Type: 4, Count: 1000}}
if rule.TalentID != 904 || rule.MaxLevel != 5 || rule.RequiredTotalExp != 14 || len(rule.Costs) != 2 || rule.Costs[0] != want[0] || rule.Costs[1] != want[1] {
t.Fatalf("installed rule=%+v", rule)
}
if _, err := design.UpgradeRule(10140, 1); err == nil {
t.Fatal("the current max-level-one talent was upgradeable")
}
}