aboutsummaryrefslogtreecommitdiff
path: root/hotline/news_test.go
diff options
context:
space:
mode:
Diffstat (limited to 'hotline/news_test.go')
-rw-r--r--hotline/news_test.go271
1 files changed, 271 insertions, 0 deletions
diff --git a/hotline/news_test.go b/hotline/news_test.go
index d1b043e..46df2e3 100644
--- a/hotline/news_test.go
+++ b/hotline/news_test.go
@@ -97,3 +97,274 @@ func TestNewsCategoryListData15_MarshalBinary(t *testing.T) {
})
}
}
+
+func TestNewsCategoryListData15_GetNewsArtListData(t *testing.T) {
+ tests := []struct {
+ name string
+ newscat NewsCategoryListData15
+ wantData NewsArtListData
+ wantErr bool
+ }{
+ {
+ name: "empty articles",
+ newscat: NewsCategoryListData15{
+ Articles: map[uint32]*NewsArtData{},
+ },
+ wantData: NewsArtListData{
+ Count: 0,
+ Name: []byte{},
+ Description: []byte{},
+ NewsArtList: []byte{},
+ },
+ wantErr: false,
+ },
+ {
+ name: "single article",
+ newscat: NewsCategoryListData15{
+ Articles: map[uint32]*NewsArtData{
+ 1: {
+ Title: "Test Title",
+ Poster: "Test Poster",
+ Date: [8]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07},
+ Data: "Test content",
+ },
+ },
+ },
+ wantData: NewsArtListData{
+ Count: 1,
+ Name: []byte{},
+ Description: []byte{},
+ },
+ wantErr: false,
+ },
+ {
+ name: "multiple articles",
+ newscat: NewsCategoryListData15{
+ Articles: map[uint32]*NewsArtData{
+ 2: {
+ Title: "Second Article",
+ Poster: "Author2",
+ Date: [8]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x08},
+ Data: "Second content",
+ },
+ 1: {
+ Title: "First Article",
+ Poster: "Author1",
+ Date: [8]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07},
+ Data: "First content",
+ },
+ },
+ },
+ wantData: NewsArtListData{
+ Count: 2,
+ Name: []byte{},
+ Description: []byte{},
+ },
+ wantErr: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ gotData, err := tt.newscat.GetNewsArtListData()
+ if (err != nil) != tt.wantErr {
+ t.Errorf("GetNewsArtListData() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ assert.Equal(t, tt.wantData.Count, gotData.Count)
+ assert.Equal(t, tt.wantData.Name, gotData.Name)
+ assert.Equal(t, tt.wantData.Description, gotData.Description)
+ if tt.wantData.Count > 0 {
+ assert.NotEmpty(t, gotData.NewsArtList)
+ }
+ })
+ }
+}
+
+func TestNewsArtData_DataSize(t *testing.T) {
+ tests := []struct {
+ name string
+ art NewsArtData
+ want [2]byte
+ }{
+ {
+ name: "empty data",
+ art: NewsArtData{Data: ""},
+ want: [2]byte{0x00, 0x00},
+ },
+ {
+ name: "short data",
+ art: NewsArtData{Data: "hello"},
+ want: [2]byte{0x00, 0x05},
+ },
+ {
+ name: "longer data",
+ art: NewsArtData{Data: "This is a longer test message with more content"},
+ want: [2]byte{0x00, 0x2F}, // 47 bytes
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ got := tt.art.DataSize()
+ assert.Equal(t, tt.want, got)
+ })
+ }
+}
+
+func TestNewsArtListData_Read(t *testing.T) {
+ tests := []struct {
+ name string
+ nald NewsArtListData
+ bufferSize int
+ wantN int
+ wantErr bool
+ }{
+ {
+ name: "empty data",
+ nald: NewsArtListData{
+ ID: [4]byte{0x00, 0x01, 0x02, 0x03},
+ Name: []byte("test"),
+ Description: []byte("desc"),
+ NewsArtList: []byte{},
+ Count: 0,
+ },
+ bufferSize: 100,
+ wantN: 18, // 4 (ID) + 4 (count) + 1 (name len) + 4 (name) + 1 (desc len) + 4 (desc) + 0 (news art list)
+ wantErr: false,
+ },
+ {
+ name: "with article list",
+ nald: NewsArtListData{
+ ID: [4]byte{0x00, 0x01, 0x02, 0x03},
+ Name: []byte("test"),
+ Description: []byte("desc"),
+ NewsArtList: []byte{0x01, 0x02, 0x03},
+ Count: 1,
+ },
+ bufferSize: 100,
+ wantN: 21, // 4 (ID) + 4 (count) + 1 (name len) + 4 (name) + 1 (desc len) + 4 (desc) + 3 (news art list)
+ wantErr: false,
+ },
+ {
+ name: "small buffer",
+ nald: NewsArtListData{
+ ID: [4]byte{0x00, 0x01, 0x02, 0x03},
+ Name: []byte("test"),
+ Description: []byte("desc"),
+ Count: 0,
+ },
+ bufferSize: 5,
+ wantN: 5,
+ wantErr: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ p := make([]byte, tt.bufferSize)
+ gotN, err := tt.nald.Read(p)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("Read() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ assert.Equal(t, tt.wantN, gotN)
+ })
+ }
+}
+
+func TestNewsArtList_Read(t *testing.T) {
+ tests := []struct {
+ name string
+ nal NewsArtList
+ bufferSize int
+ wantN int
+ wantErr bool
+ }{
+ {
+ name: "basic article",
+ nal: NewsArtList{
+ ID: [4]byte{0x00, 0x01, 0x02, 0x03},
+ TimeStamp: [8]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07},
+ ParentID: [4]byte{0x00, 0x00, 0x00, 0x00},
+ Flags: [4]byte{0x00, 0x00, 0x00, 0x00},
+ Title: []byte("Test Title"),
+ Poster: []byte("Test Poster"),
+ ArticleSize: [2]byte{0x00, 0x0A},
+ },
+ bufferSize: 100,
+ wantN: 58, // 4 (ID) + 8 (timestamp) + 4 (parent) + 4 (flags) + 2 (flavor count) + 1 (title len) + 10 (title) + 1 (poster len) + 11 (poster) + 1 (flavor len) + 10 (flavor) + 2 (article size)
+ wantErr: false,
+ },
+ {
+ name: "small buffer",
+ nal: NewsArtList{
+ ID: [4]byte{0x00, 0x01, 0x02, 0x03},
+ TimeStamp: [8]byte{0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07},
+ Title: []byte("Test"),
+ Poster: []byte("Author"),
+ },
+ bufferSize: 10,
+ wantN: 10,
+ wantErr: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ p := make([]byte, tt.bufferSize)
+ gotN, err := tt.nal.Read(p)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("Read() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ assert.Equal(t, tt.wantN, gotN)
+ })
+ }
+}
+
+func TestNewsPathScanner(t *testing.T) {
+ tests := []struct {
+ name string
+ data []byte
+ wantAdvance int
+ wantToken []byte
+ wantErr bool
+ }{
+ {
+ name: "insufficient data",
+ data: []byte{0x00, 0x01},
+ wantAdvance: 0,
+ wantToken: nil,
+ wantErr: false,
+ },
+ {
+ name: "valid token",
+ data: []byte{0x00, 0x01, 0x04, 0x74, 0x65, 0x73, 0x74}, // length 4, "test"
+ wantAdvance: 7,
+ wantToken: []byte("test"),
+ wantErr: false,
+ },
+ {
+ name: "zero length token",
+ data: []byte{0x00, 0x01, 0x00},
+ wantAdvance: 3,
+ wantToken: []byte{},
+ wantErr: false,
+ },
+ {
+ name: "single character token",
+ data: []byte{0x00, 0x01, 0x01, 0x61}, // length 1, "a"
+ wantAdvance: 4,
+ wantToken: []byte("a"),
+ wantErr: false,
+ },
+ }
+ for _, tt := range tests {
+ t.Run(tt.name, func(t *testing.T) {
+ gotAdvance, gotToken, err := newsPathScanner(tt.data, false)
+ if (err != nil) != tt.wantErr {
+ t.Errorf("newsPathScanner() error = %v, wantErr %v", err, tt.wantErr)
+ return
+ }
+ assert.Equal(t, tt.wantAdvance, gotAdvance)
+ assert.Equal(t, tt.wantToken, gotToken)
+ })
+ }
+}