mirror of
https://github.com/Mezeporta/Erupe.git
synced 2026-03-22 15:43:49 +01:00
Add unit tests across multiple packages: - byteframe: SetBE/SetLE byte order switching - config: Mode.String() for all safe version ranges - mhfpacket: 28 Parse methods, 5 Build methods, empty packet builds, variable-length packets, NOT IMPLEMENTED error paths, UpdateWarehouse - network: PacketID.String() for known IDs, out-of-range, and all valid - channelserver: handleMsgMhfGetPaperData (6 switch cases), grpToGR (11 input values), gacha handlers, TimeGameAbsolute, equipSkinHistSize (4 config branches), guild mission handlers, dumpSaveData disabled path - entranceserver: makeHeader with various inputs
247 lines
6.3 KiB
Go
247 lines
6.3 KiB
Go
package channelserver
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"erupe-ce/network/mhfpacket"
|
|
)
|
|
|
|
// =============================================================================
|
|
// handleMsgMhfGetPaperData: 565-line pure data serialization function.
|
|
// Tests all switch cases: 0, 5, 6, >1000 (known & unknown), default <1000.
|
|
// =============================================================================
|
|
|
|
func TestHandleMsgMhfGetPaperData_Case0(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
handleMsgMhfGetPaperData(session, &mhfpacket.MsgMhfGetPaperData{
|
|
AckHandle: 1,
|
|
Unk2: 0,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
if len(p.data) == 0 {
|
|
t.Error("case 0: response should have data")
|
|
}
|
|
default:
|
|
t.Error("case 0: no response queued")
|
|
}
|
|
}
|
|
|
|
func TestHandleMsgMhfGetPaperData_Case5(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
handleMsgMhfGetPaperData(session, &mhfpacket.MsgMhfGetPaperData{
|
|
AckHandle: 1,
|
|
Unk2: 5,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
if len(p.data) == 0 {
|
|
t.Error("case 5: response should have data")
|
|
}
|
|
default:
|
|
t.Error("case 5: no response queued")
|
|
}
|
|
}
|
|
|
|
func TestHandleMsgMhfGetPaperData_Case6(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
handleMsgMhfGetPaperData(session, &mhfpacket.MsgMhfGetPaperData{
|
|
AckHandle: 1,
|
|
Unk2: 6,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
if len(p.data) == 0 {
|
|
t.Error("case 6: response should have data")
|
|
}
|
|
default:
|
|
t.Error("case 6: no response queued")
|
|
}
|
|
}
|
|
|
|
func TestHandleMsgMhfGetPaperData_GreaterThan1000_KnownKey(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
// 6001 is a known key in paperGiftData
|
|
handleMsgMhfGetPaperData(session, &mhfpacket.MsgMhfGetPaperData{
|
|
AckHandle: 1,
|
|
Unk2: 6001,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
if len(p.data) == 0 {
|
|
t.Error(">1000 known: response should have data")
|
|
}
|
|
default:
|
|
t.Error(">1000 known: no response queued")
|
|
}
|
|
}
|
|
|
|
func TestHandleMsgMhfGetPaperData_GreaterThan1000_UnknownKey(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
// 9999 is not a known key in paperGiftData
|
|
handleMsgMhfGetPaperData(session, &mhfpacket.MsgMhfGetPaperData{
|
|
AckHandle: 1,
|
|
Unk2: 9999,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
// Even unknown keys should produce a response (empty earth succeed)
|
|
_ = p
|
|
default:
|
|
t.Error(">1000 unknown: no response queued")
|
|
}
|
|
}
|
|
|
|
func TestHandleMsgMhfGetPaperData_DefaultUnknownLessThan1000(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
// Unknown type < 1000, hits default case then falls to else branch
|
|
handleMsgMhfGetPaperData(session, &mhfpacket.MsgMhfGetPaperData{
|
|
AckHandle: 1,
|
|
Unk2: 99,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
_ = p
|
|
default:
|
|
t.Error("default <1000: no response queued")
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// handleMsgMhfGetGachaPlayHistory and handleMsgMhfPlayFreeGacha
|
|
// =============================================================================
|
|
|
|
func TestHandleMsgMhfGetGachaPlayHistory(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
handleMsgMhfGetGachaPlayHistory(session, &mhfpacket.MsgMhfGetGachaPlayHistory{
|
|
AckHandle: 1,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
if len(p.data) == 0 {
|
|
t.Error("response should have data")
|
|
}
|
|
default:
|
|
t.Error("no response queued")
|
|
}
|
|
}
|
|
|
|
func TestHandleMsgMhfPlayFreeGacha(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
handleMsgMhfPlayFreeGacha(session, &mhfpacket.MsgMhfPlayFreeGacha{
|
|
AckHandle: 1,
|
|
})
|
|
|
|
select {
|
|
case p := <-session.sendPackets:
|
|
if len(p.data) == 0 {
|
|
t.Error("response should have data")
|
|
}
|
|
default:
|
|
t.Error("no response queued")
|
|
}
|
|
}
|
|
|
|
// Seibattle handlers: GetBreakSeibatuLevelReward, GetFixedSeibatuRankingTable,
|
|
// ReadLastWeekBeatRanking, ReadBeatLevelAllRanking, ReadBeatLevelMyRanking
|
|
// are already tested in handlers_misc_test.go and handlers_tower_test.go.
|
|
|
|
// =============================================================================
|
|
// grpToGR: pure function, no dependencies
|
|
// =============================================================================
|
|
|
|
func TestGrpToGR(t *testing.T) {
|
|
tests := []struct {
|
|
name string
|
|
input int
|
|
expected uint16
|
|
}{
|
|
{"zero", 0, 1},
|
|
{"low_value", 500, 2},
|
|
{"first_bracket", 1000, 2},
|
|
{"mid_bracket", 208750, 51},
|
|
{"second_bracket", 300000, 62},
|
|
{"high_value", 593400, 100},
|
|
{"third_bracket", 700000, 113},
|
|
{"very_high", 993400, 150},
|
|
{"above_993400", 1000000, 150},
|
|
{"fourth_bracket", 1400900, 200},
|
|
{"max_bracket", 11345900, 900},
|
|
}
|
|
|
|
for _, tt := range tests {
|
|
t.Run(tt.name, func(t *testing.T) {
|
|
got := grpToGR(tt.input)
|
|
if got != tt.expected {
|
|
t.Errorf("grpToGR(%d) = %d, want %d", tt.input, got, tt.expected)
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// dumpSaveData: test disabled path
|
|
// =============================================================================
|
|
|
|
func TestDumpSaveData_Disabled(t *testing.T) {
|
|
server := createMockServer()
|
|
server.erupeConfig.SaveDumps.Enabled = false
|
|
session := createMockSession(1, server)
|
|
|
|
// Should return immediately without error
|
|
dumpSaveData(session, []byte{0x01, 0x02, 0x03}, "test")
|
|
}
|
|
|
|
// =============================================================================
|
|
// TimeGameAbsolute
|
|
// =============================================================================
|
|
|
|
func TestTimeGameAbsolute(t *testing.T) {
|
|
result := TimeGameAbsolute()
|
|
|
|
// TimeGameAbsolute returns (adjustedUnix - 2160) % 5760
|
|
// Result should be in range [0, 5760)
|
|
if result >= 5760 {
|
|
t.Errorf("TimeGameAbsolute() = %d, should be < 5760", result)
|
|
}
|
|
}
|
|
|
|
// =============================================================================
|
|
// handleMsgSysAuthData: empty handler
|
|
// =============================================================================
|
|
|
|
func TestHandleMsgSysAuthData(t *testing.T) {
|
|
server := createMockServer()
|
|
session := createMockSession(1, server)
|
|
|
|
defer func() {
|
|
if r := recover(); r != nil {
|
|
t.Errorf("handleMsgSysAuthData panicked: %v", r)
|
|
}
|
|
}()
|
|
handleMsgSysAuthData(session, nil)
|
|
}
|