diff --git a/src/TibiaKillstatistics.go b/src/TibiaKillstatistics.go index ebb350f..569053e 100644 --- a/src/TibiaKillstatistics.go +++ b/src/TibiaKillstatistics.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/PuerkitoBio/goquery" + "golang.org/x/net/html" ) // Child of KillStatistics @@ -53,25 +54,17 @@ func TibiaKillstatisticsImpl(world string, BoxContentHTML string, url string) (K // Running query over each div ReaderHTML.Find("#KillStatisticsTable .TableContent tr.Odd,tr.Even").Each(func(index int, s *goquery.Selection) { - DataColumns := s.Find("td").Nodes + // Extract kill statistics from table row + killStats := extractKillStatistics(s.Find("td").Nodes) - KillStatisticsLastDayKilledPlayers := TibiaDataStringToInteger(DataColumns[1].FirstChild.Data) - TotalLastDayKilledPlayers += KillStatisticsLastDayKilledPlayers - KillStatisticsLastDayKilledByPlayers := TibiaDataStringToInteger(DataColumns[2].FirstChild.Data) - TotalLastDayKilledByPlayers += KillStatisticsLastDayKilledByPlayers - KillStatisticsLastWeekKilledPlayers := TibiaDataStringToInteger(DataColumns[3].FirstChild.Data) - TotalLastWeekKilledPlayers += KillStatisticsLastWeekKilledPlayers - KillStatisticsLastWeekKilledByPlayers := TibiaDataStringToInteger(DataColumns[4].FirstChild.Data) - TotalLastWeekKilledByPlayers += KillStatisticsLastWeekKilledByPlayers + // Accumulate totals + TotalLastDayKilledPlayers += killStats.LastDayKilledPlayers + TotalLastDayKilledByPlayers += killStats.LastDayKilledByPlayers + TotalLastWeekKilledPlayers += killStats.LastWeekKilledPlayers + TotalLastWeekKilledByPlayers += killStats.LastWeekKilledByPlayers // Append new Entry item to KillStatisticsData - KillStatisticsData = append(KillStatisticsData, Entry{ - Race: TibiaDataSanitizeEscapedString(DataColumns[0].FirstChild.Data), - LastDayKilledPlayers: KillStatisticsLastDayKilledPlayers, - LastDayKilledByPlayers: KillStatisticsLastDayKilledByPlayers, - LastWeekKilledPlayers: KillStatisticsLastWeekKilledPlayers, - LastWeekKilledByPlayers: KillStatisticsLastWeekKilledByPlayers, - }) + KillStatisticsData = append(KillStatisticsData, killStats) }) // @@ -97,3 +90,18 @@ func TibiaKillstatisticsImpl(world string, BoxContentHTML string, url string) (K }, }, nil } + +// Helper function to extract and convert kill statistics +func extractKillStatistics(dataColumns []*html.Node) Entry { + if len(dataColumns) < 5 { + // Not enough columns; return zero-value Entry + return Entry{} + } + return Entry{ + Race: TibiaDataSanitizeEscapedString(dataColumns[0].FirstChild.Data), + LastDayKilledPlayers: TibiaDataStringToInteger(dataColumns[1].FirstChild.Data), + LastDayKilledByPlayers: TibiaDataStringToInteger(dataColumns[2].FirstChild.Data), + LastWeekKilledPlayers: TibiaDataStringToInteger(dataColumns[3].FirstChild.Data), + LastWeekKilledByPlayers: TibiaDataStringToInteger(dataColumns[4].FirstChild.Data), + } +} diff --git a/src/TibiaKillstatistics_test.go b/src/TibiaKillstatistics_test.go index f835283..f3597e3 100644 --- a/src/TibiaKillstatistics_test.go +++ b/src/TibiaKillstatistics_test.go @@ -6,6 +6,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/tibiadata/tibiadata-api-go/src/static" + "golang.org/x/net/html" ) func TestAntica(t *testing.T) { @@ -73,3 +74,99 @@ func BenchmarkAntica(b *testing.B) { assert.Equal("Antica", anticaJson.KillStatistics.World) } } + +func TestExtractKillStatistics(t *testing.T) { + // Create mock HTML nodes for testing + raceNode := &html.Node{ + FirstChild: &html.Node{ + Data: "Dragon", + }, + } + + lastDayKilledPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "150", + }, + } + + lastDayKilledByPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "25", + }, + } + + lastWeekKilledPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "1200", + }, + } + + lastWeekKilledByPlayersNode := &html.Node{ + FirstChild: &html.Node{ + Data: "85", + }, + } + + // Create dataColumns slice + dataColumns := []*html.Node{ + raceNode, + lastDayKilledPlayersNode, + lastDayKilledByPlayersNode, + lastWeekKilledPlayersNode, + lastWeekKilledByPlayersNode, + } + + // Call the function + result := extractKillStatistics(dataColumns) + + // Define expected values + expected := Entry{ + Race: "Dragon", + LastDayKilledPlayers: 150, + LastDayKilledByPlayers: 25, + LastWeekKilledPlayers: 1200, + LastWeekKilledByPlayers: 85, + } + + // Assert results + assert.Equal(t, expected, result) +} + +// Test with edge cases +func TestExtractKillStatisticsEdgeCases(t *testing.T) { + // Test with empty strings + emptyNode := &html.Node{ + FirstChild: &html.Node{ + Data: "", + }, + } + + // Test with zero values + zeroNode := &html.Node{ + FirstChild: &html.Node{ + Data: "0", + }, + } + + dataColumns := []*html.Node{ + emptyNode, // Race + zeroNode, // LastDayKilledPlayers + zeroNode, // LastDayKilledByPlayers + zeroNode, // LastWeekKilledPlayers + zeroNode, // LastWeekKilledByPlayers + } + + result := extractKillStatistics(dataColumns) + + if result.Race != "" { + t.Errorf("Empty race: got %v, want empty string", result.Race) + } + + if result.LastDayKilledPlayers != 0 { + t.Errorf("Zero last day killed players: got %v, want 0", result.LastDayKilledPlayers) + } + + if result.LastWeekKilledByPlayers != 0 { + t.Errorf("Zero last week killed by players: got %v, want 0", result.LastWeekKilledByPlayers) + } +}