package game import ( "testing" "time" "gitea.boner.be/bdnugget/goonscape/game/testutils" "gitea.boner.be/bdnugget/goonscape/types" pb "gitea.boner.be/bdnugget/goonserver/actions" rl "github.com/gen2brain/raylib-go/raylib" "github.com/stretchr/testify/assert" ) func TestChat_AddMessage(t *testing.T) { chat := NewChat() // Test adding single message chat.AddMessage(1, "Hello") assert.Equal(t, 1, len(chat.messages)) assert.Equal(t, int32(1), chat.messages[0].PlayerID) assert.Equal(t, "Hello", chat.messages[0].Content) // Test message limit for i := 0; i < maxMessages+10; i++ { chat.AddMessage(1, "spam") } assert.Equal(t, maxMessages, len(chat.messages)) assert.Equal(t, "spam", chat.messages[len(chat.messages)-1].Content) } func TestChat_HandleServerMessages(t *testing.T) { chat := NewChat() mockGame := &Game{ Player: &types.Player{ID: 1}, OtherPlayers: map[int32]*types.Player{ 2: {ID: 2}, }, } chat.userData = mockGame messages := []*pb.ChatMessage{ { PlayerId: 1, Username: "player1", Content: "test1", Timestamp: time.Now().UnixNano(), }, { PlayerId: 2, Username: "player2", Content: "test2", Timestamp: time.Now().UnixNano(), }, } chat.HandleServerMessages(messages) assert.Equal(t, 2, len(chat.messages)) assert.Equal(t, "test1", chat.messages[0].Content) assert.Equal(t, "test2", chat.messages[1].Content) // Test duplicate message prevention chat.HandleServerMessages(messages) assert.Equal(t, 2, len(chat.messages)) } func TestChat_Update(t *testing.T) { t.Parallel() done := make(chan bool) go func() { game, cleanup := setupTestEnvironment(t) defer cleanup() chat := game.Chat // Test starting chat testutils.SimulateKeyPress(rl.KeyT) msg, sent := chat.Update() assert.True(t, chat.isTyping) assert.False(t, sent) assert.Empty(t, msg) // Test typing message testutils.SimulateCharInput('h') msg, sent = chat.Update() testutils.SimulateCharInput('i') msg, sent = chat.Update() assert.Equal(t, 2, len(chat.inputBuffer)) assert.False(t, sent) assert.Empty(t, msg) // Test sending message testutils.SimulateKeyPress(rl.KeyEnter) msg, sent = chat.Update() assert.True(t, sent) assert.Equal(t, "hi", msg) assert.False(t, chat.isTyping) done <- true }() select { case <-done: // Test completed successfully case <-time.After(5 * time.Second): t.Fatal("Test timed out") } }