implement game turn logic

This commit is contained in:
2026-11-02 21:24:32 +03:00
parent 153dc74ff6
commit 189b027a11
7 changed files with 896 additions and 13 deletions
@@ -262,3 +262,90 @@ func TestValidateShips(t *testing.T) {
}
})
}
func TestFireRoundtrip(t *testing.T) {
data := BuildFire(3, 7)
opcode, args, err := ParseMessage(data)
if err != nil {
t.Fatalf("ParseMessage: %v", err)
}
if opcode != OpFire {
t.Fatalf("opcode = %d, want %d", opcode, OpFire)
}
x, y, err := ParseFire(args)
if err != nil {
t.Fatalf("ParseFire: %v", err)
}
if x != 3 || y != 7 {
t.Fatalf("got (%d, %d), want (3, 7)", x, y)
}
}
func TestParseFireErrors(t *testing.T) {
t.Run("wrong argument count", func(t *testing.T) {
_, args, _ := ParseMessage([]byte(`[6, 1]`))
if _, _, err := ParseFire(args); err == nil {
t.Fatal("expected error for 1 argument")
}
_, args3, _ := ParseMessage([]byte(`[6, 1, 2, 3]`))
if _, _, err := ParseFire(args3); err == nil {
t.Fatal("expected error for 3 arguments")
}
})
t.Run("x not integer", func(t *testing.T) {
_, args, _ := ParseMessage([]byte(`[6, "a", 2]`))
if _, _, err := ParseFire(args); err == nil {
t.Fatal("expected error for string x")
}
})
t.Run("y not integer", func(t *testing.T) {
_, args, _ := ParseMessage([]byte(`[6, 1, true]`))
if _, _, err := ParseFire(args); err == nil {
t.Fatal("expected error for bool y")
}
})
}
func TestFireResultRoundtrip(t *testing.T) {
data := BuildFireResult(5, FireResultSunk)
opcode, args, err := ParseMessage(data)
if err != nil {
t.Fatalf("ParseMessage: %v", err)
}
if opcode != OpFireResult {
t.Fatalf("opcode = %d, want %d", opcode, OpFireResult)
}
seq, result, err := ParseFireResult(args)
if err != nil {
t.Fatalf("ParseFireResult: %v", err)
}
if seq != 5 || result != FireResultSunk {
t.Fatalf("got seq=%d, result=%d, want seq=5, result=%d", seq, result, FireResultSunk)
}
}
func TestParseFireResultErrors(t *testing.T) {
t.Run("wrong argument count", func(t *testing.T) {
_, args, _ := ParseMessage([]byte(`[7, 1]`))
if _, _, err := ParseFireResult(args); err == nil {
t.Fatal("expected error for 1 argument")
}
})
t.Run("seq not int64", func(t *testing.T) {
_, args, _ := ParseMessage([]byte(`[7, "str", 1]`))
if _, _, err := ParseFireResult(args); err == nil {
t.Fatal("expected error for string seq")
}
})
t.Run("result not int", func(t *testing.T) {
_, args, _ := ParseMessage([]byte(`[7, 1, "hit"]`))
if _, _, err := ParseFireResult(args); err == nil {
t.Fatal("expected error for string result")
}
})
}