package entity import ( "path/filepath" "testing" ) // TestBreed 动物繁殖:成年+冷却完成 → 幼崽;冷却中拒绝;上限拒绝(动物体系.md §3)。 func TestBreed(t *testing.T) { m := NewManager() w := flatWorld{} a := m.Spawn(KindAnimal, 0.5, 63, 0.5) a.Data = &Animal{} b := m.Spawn(KindAnimal, 1.5, 63, 0.5) b.Data = &Animal{} baby := m.Breed(a, b, w) if baby == nil { t.Fatal("应繁殖出幼崽") } if d, ok := baby.Data.(*Animal); !ok || d.GrowthTicks == 0 { t.Fatalf("幼崽数据异常: %+v", baby.Data) } // 冷却中:拒绝 if m.Breed(a, b, w) != nil { t.Fatal("冷却中不应繁殖") } // 冷却恢复后可再次繁殖 ad := a.Data.(*Animal) ad.BreedCooldown = 0 bd := b.Data.(*Animal) bd.BreedCooldown = 0 if m.Breed(a, b, w) == nil { t.Fatal("冷却结束后应能繁殖") } } // TestBreedCap 每区块上限(动物体系.md §7 防无限繁殖)。 func TestBreedCap(t *testing.T) { m := NewManager() w := flatWorld{} a := m.Spawn(KindAnimal, 0.5, 63, 0.5) a.Data = &Animal{} b := m.Spawn(KindAnimal, 1.5, 63, 0.5) b.Data = &Animal{} for i := 0; i < 12; i++ { m.Spawn(KindAnimal, 2.5, 63, 2.5+float64(i)) } if m.Breed(a, b, w) != nil { t.Fatal("超上限不应繁殖") } } // TestLoadTrades 交易表解析与职业查询(村民系统.md §7)。 func TestLoadTrades(t *testing.T) { tbl, err := LoadTrades(filepath.Join("..", "..", "assets", "config", "villager_trades.json")) if err != nil { t.Fatalf("加载交易表失败: %v", err) } if offers := tbl.OffersFor(0); len(offers) != 2 { t.Fatalf("农民交易期望 2 条,实际 %d", len(offers)) } if offers := tbl.OffersFor(2); len(offers) != 2 || offers[0].Buy != "coal" { t.Fatalf("铁匠交易异常: %+v", offers) } }