tree - read_test.go
1 package tree
2
3 import (
4 "bytes"
5 "os"
6 "path/filepath"
7 "reflect"
8 "strconv"
9 "testing"
10 )
11
12 var (
13 openTests = [...]node{
14 {}, // 1
15 { // 2
16 data: []byte("ABC"),
17 },
18 { // 3
19 children: []node{
20 {
21 name: "",
22 },
23 },
24 },
25 { // 4
26 children: []node{
27 {
28 name: "Child1",
29 },
30 },
31 },
32 { // 5
33 children: []node{
34 {
35 name: "Child1",
36 data: []byte("123"),
37 },
38 },
39 },
40 { // 6
41 children: []node{
42 {
43 name: "Child2",
44 data: []byte("456"),
45 },
46 },
47 },
48 { // 7
49 children: []node{
50 {
51 name: "Child1",
52 data: []byte("123"),
53 },
54 {
55 name: "Child2",
56 data: []byte("456"),
57 },
58 },
59 },
60 { // 8
61 children: []node{
62 {
63 name: "Child2",
64 data: []byte("456"),
65 },
66 },
67 data: []byte("ABC"),
68 },
69 }
70 testChild = &node{
71 children: []node{
72 {
73 name: "A1",
74 data: []byte("123"),
75 children: []node{
76 {
77 name: "B1",
78 data: []byte("456"),
79 },
80 {
81 name: "B2",
82 data: []byte("789"),
83 },
84 {
85 name: "B3",
86 data: []byte("ABC"),
87 },
88 {
89 name: "B4",
90 },
91 },
92 },
93 {
94 name: "A2",
95 data: []byte("DEF"),
96 children: []node{
97 {
98 name: "B1",
99 data: []byte("GHI"),
100 },
101 {
102 name: "B2",
103 data: []byte("JKL"),
104 },
105 },
106 },
107 },
108 data: []byte("MNOP"),
109 }
110 childTests = [...]struct {
111 key []string
112 data []byte
113 errors []error
114 numChildren int
115 dataLen int64
116 }{
117 { // 1
118 data: []byte("MNOP"),
119 numChildren: 2,
120 dataLen: 4,
121 },
122 { // 2
123 key: []string{"A1"},
124 data: []byte("123"),
125 errors: []error{nil},
126 numChildren: 4,
127 dataLen: 3,
128 },
129 { // 3
130 key: []string{"A1", "B1"},
131 data: []byte("456"),
132 errors: []error{nil, nil},
133 dataLen: 3,
134 },
135 { // 4
136 key: []string{"A1", "B2"},
137 data: []byte("789"),
138 errors: []error{nil, nil},
139 dataLen: 3,
140 },
141 { // 5
142 key: []string{"A2", "B2"},
143 data: []byte("JKL"),
144 errors: []error{nil, nil},
145 dataLen: 3,
146 },
147 { // 6
148 key: []string{"A2", "B3"},
149 errors: []error{nil, ChildNotFoundError("B3")},
150 },
151 { // 7
152 key: []string{"A2", "B2", "C1"},
153 errors: []error{nil, nil, ChildNotFoundError("C1")},
154 },
155 { // 8
156 key: []string{"A1", "B4", "C1"},
157 errors: []error{nil, nil, ChildNotFoundError("C1")},
158 },
159 }
160 )
161
162 func TestOpenAt(t *testing.T) {
163 for n, test := range openTests {
164 var buf bytes.Buffer
165
166 Serialise(&buf, &test)
167
168 tree := readTree(OpenAt(bytes.NewReader(buf.Bytes()), int64(buf.Len())))
169
170 if !reflect.DeepEqual(test, tree) {
171 t.Errorf("test %d: no match", n+1)
172 }
173 }
174 }
175
176 func TestOpenFile(t *testing.T) {
177 tmp := t.TempDir()
178
179 for n, test := range openTests {
180 path := filepath.Join(tmp, strconv.Itoa(n))
181
182 f, err := os.Create(path)
183 if err != nil {
184 t.Fatalf("test %d: unexpected error creating file (%s): %s", n+1, path, err)
185 }
186
187 if err = Serialise(f, &test); err != nil {
188 t.Fatalf("test %d: unexpected error serialising tree (%s): %s", n+1, path, err)
189 }
190
191 if err = f.Close(); err != nil {
192 t.Fatalf("test %d: unexpected error closing file (%s): %s", n+1, path, err)
193 }
194
195 node, err := OpenFile(path)
196 if err != nil {
197 t.Fatalf("test %d: unexpected error opening tree (%s): %s", n+1, path, err)
198 }
199
200 tree := readTree(node)
201
202 if !reflect.DeepEqual(test, tree) {
203 t.Errorf("test %d: no match", n+1)
204 }
205
206 node.Close()
207 }
208 }
209
210 func readTree(t Node) node {
211 var n node
212
213 for name, child := range t.Children() {
214 childNode := readTree(child)
215 childNode.name = name
216
217 n.children = append(n.children, childNode)
218 }
219
220 var buf bytes.Buffer
221
222 t.WriteTo(&buf)
223
224 if buf.Len() > 0 {
225 n.data = buf.Bytes()
226 }
227
228 return n
229 }
230
231 func TestChild(t *testing.T) {
232 var buf bytes.Buffer
233
234 Serialise(&buf, testChild)
235
236 Loop:
237 for n, test := range childTests {
238 node := OpenAt(bytes.NewReader(buf.Bytes()), int64(buf.Len()))
239
240 for m := range test.key {
241 child, err := node.Child(test.key[m])
242 if !reflect.DeepEqual(err, test.errors[m]) {
243 t.Errorf("test %d.%d: expecting error %v, got %v", n+1, m+1, test.errors[m], err)
244 }
245
246 if err != nil {
247 continue Loop
248 }
249
250 node = child
251 }
252
253 var data bytes.Buffer
254
255 node.WriteTo(&data)
256
257 if !bytes.Equal(data.Bytes(), test.data) {
258 t.Errorf("test %d: expecting data %q, got %q", n+1, test.data, data.Bytes())
259 } else if numChildren, err := node.NumChildren(); err != nil {
260 t.Errorf("test %d: unexpected error reading number of children: %s", n+1, err)
261 } else if numChildren != test.numChildren {
262 t.Errorf("test %d: expecting %d children, got %d", n+1, test.numChildren, numChildren)
263 } else if dataLen, err := node.DataLen(); err != nil {
264 t.Errorf("test %d: unexpected error reading length of data: %s", n+1, err)
265 } else if dataLen != test.dataLen {
266 t.Errorf("test %d: expecting %d bytes of data, got %d", n+1, test.dataLen, dataLen)
267 }
268 }
269 }
270