Files
ut-agones/internal/quake3/client/client_test.go
2025-07-27 23:35:04 +02:00

160 lines
3.0 KiB
Go

package client
import (
"fmt"
"reflect"
"testing"
)
func TestNew(t *testing.T) {
tests := []struct {
host string
port int
shouldWork bool
}{
{"localhost", 27960, true},
{"something.invalid", 27960, false},
{"locahost", 0, false},
{"locahost", 99999, false},
}
for _, tt := range tests {
testname := fmt.Sprintf("%s:%d->%t", tt.host, tt.port, tt.shouldWork)
t.Run(testname, func(t *testing.T) {
_, err := New(tt.host, tt.port)
success := err == nil
if tt.shouldWork && !success || !tt.shouldWork && success {
t.Errorf(
"Expected success=%t / was %t (err=%v)",
tt.shouldWork, success,
err,
)
}
})
}
}
func TestClose(t *testing.T) {
c := mustNew(t)
if err := c.Close(); err != nil {
t.Errorf("Error while closing client: %v", err)
}
}
func TestParseAsMap(t *testing.T) {
res := parseAsMap(
[]byte(
"\xff\xff\xff\xff" + `infoResponse
\modversion\4.3.4\game\q3ut4\auth\1\pure\1\gametype\0\sv_maxclients\10\bots\0\clients\0\mapname\ut4_casa\hostname\test\protocol\68`,
),
)
exp := map[string]string{
"modversion": "4.3.4",
"game": "q3ut4",
"auth": "1",
"pure": "1",
"gametype": "0",
"sv_maxclients": "10",
"bots": "0",
"clients": "0",
"mapname": "ut4_casa",
"hostname": "test",
"protocol": "68",
}
if !reflect.DeepEqual(exp, res) {
t.Errorf(
"Result mismatch: expected %v, was %v",
exp, res,
)
}
}
func TestParsePlayers(t *testing.T) {
res, err := parsePlayers(
[]byte(
"\xff\xff\xff\xff" + `statusResponse
\g_gametype\0\timelimit\20`,
),
)
if err != nil {
t.Errorf("Failed to parse players: %v", err)
}
exp := []Player{}
if !reflect.DeepEqual(exp, res) {
t.Errorf(
"Result mismatch: expected %v, was %v",
exp, res,
)
}
tests := []struct {
name string
dataStr string
expected []Player
}{
{
name: "nobody",
dataStr: "\xff\xff\xff\xff" + `statusResponse
\g_gametype\0\timelimit\20`,
expected: []Player{},
},
{
name: "oneplayer",
dataStr: "\xff\xff\xff\xff" + `statusResponse
\g_gametype\0\timelimit\20
-1 5 "The!_oneandonly"`,
expected: []Player{
{
Name: "The!_oneandonly",
Score: -1,
Ping: 5,
},
},
},
{
name: "twoplayers",
dataStr: "\xff\xff\xff\xff" + `statusResponse
\g_gametype\0\timelimit\20
0 0 "fooplayer"
3 0 "barplayer"`,
expected: []Player{
{
Name: "fooplayer",
Score: 0,
Ping: 0,
},
{
Name: "barplayer",
Score: 3,
Ping: 0,
},
},
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
res, err := parsePlayers([]byte(tt.dataStr))
if err != nil {
t.Errorf("Failed to parse players: %v", err)
}
if !reflect.DeepEqual(tt.expected, res) {
t.Errorf(
"Result mismatch: expected %v, was %v",
tt.expected, res,
)
}
})
}
}
func mustNew(t *testing.T) *Q3Client {
c, err := New("localhost", 27960)
if err != nil {
t.Errorf("Failed to create client: %v", err)
}
return c
}