1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
package hotline
import (
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/mock"
"io"
"testing"
)
type mockThreadNewsMgr struct {
mock.Mock
}
func (m *mockThreadNewsMgr) ListArticles(newsPath []string) NewsArtListData {
args := m.Called(newsPath)
return args.Get(0).(NewsArtListData)
}
func (m *mockThreadNewsMgr) GetArticle(newsPath []string, articleID uint32) *NewsArtData {
args := m.Called(newsPath, articleID)
return args.Get(0).(*NewsArtData)
}
func (m *mockThreadNewsMgr) DeleteArticle(newsPath []string, articleID uint32, recursive bool) error {
args := m.Called(newsPath, articleID, recursive)
return args.Error(0)
}
func (m *mockThreadNewsMgr) PostArticle(newsPath []string, parentArticleID uint32, article NewsArtData) error {
args := m.Called(newsPath, parentArticleID, article)
return args.Error(0)
}
func (m *mockThreadNewsMgr) CreateGrouping(newsPath []string, name string, itemType [2]byte) error {
args := m.Called(newsPath, name, itemType)
return args.Error(0)
}
func (m *mockThreadNewsMgr) GetCategories(paths []string) []NewsCategoryListData15 {
args := m.Called(paths)
return args.Get(0).([]NewsCategoryListData15)
}
func (m *mockThreadNewsMgr) NewsItem(newsPath []string) NewsCategoryListData15 {
args := m.Called(newsPath)
return args.Get(0).(NewsCategoryListData15)
}
func (m *mockThreadNewsMgr) DeleteNewsItem(newsPath []string) error {
args := m.Called(newsPath)
return args.Error(0)
}
func TestNewsCategoryListData15_MarshalBinary(t *testing.T) {
type fields struct {
Type [2]byte
Name string
Articles map[uint32]*NewsArtData
SubCats map[string]NewsCategoryListData15
Count []byte
AddSN [4]byte
DeleteSN [4]byte
GUID [16]byte
}
tests := []struct {
name string
fields fields
wantData []byte
wantErr bool
}{
{
name: "returns expected bytes when type is a bundle",
fields: fields{
Type: [2]byte{0x00, 0x02},
Articles: map[uint32]*NewsArtData{
uint32(1): {
Title: "",
Poster: "",
Data: "",
},
},
Name: "foo",
},
wantData: []byte{
0x00, 0x02,
0x00, 0x01,
0x03,
0x66, 0x6f, 0x6f,
},
wantErr: false,
},
{
name: "returns expected bytes when type is a category",
fields: fields{
Type: [2]byte{0x00, 0x03},
Articles: map[uint32]*NewsArtData{
uint32(1): {
Title: "",
Poster: "",
Data: "",
},
},
Name: "foo",
},
wantData: []byte{
0x00, 0x03,
0x00, 0x01,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x03,
0x66, 0x6f, 0x6f,
},
wantErr: false,
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
newscat := &NewsCategoryListData15{
Type: tt.fields.Type,
Name: tt.fields.Name,
Articles: tt.fields.Articles,
SubCats: tt.fields.SubCats,
AddSN: tt.fields.AddSN,
DeleteSN: tt.fields.DeleteSN,
GUID: tt.fields.GUID,
}
gotData, err := io.ReadAll(newscat)
if newscat.Type == [2]byte{0, 3} {
// zero out the random GUID before comparison
for i := 4; i < 20; i++ {
gotData[i] = 0
}
}
if (err != nil) != tt.wantErr {
t.Errorf("MarshalBinary() error = %v, wantErr %v", err, tt.wantErr)
return
}
if !assert.Equal(t, tt.wantData, gotData) {
t.Errorf("MarshalBinary() gotData = %v, want %v", gotData, tt.wantData)
}
})
}
}
|