minecraft - nbt/encoder_test.go
1 package nbt
2
3 import (
4 "bytes"
5 "encoding/base64"
6 "testing"
7 )
8
9 const (
10 smallTestData = `CgALaGVsbG8gd29ybGQIAARuYW1lAAlCYW5hbnJhbWEA`
11 largeTestData = `CgAFTGV2ZWwEAAhsb25nVGVzdH//////////AgAJc2hvcnRUZXN0f/8IAApzdHJpbmdUZXN0AClI` +
12 `RUxMTyBXT1JMRCBUSElTIElTIEEgVEVTVCBTVFJJTkcgw4XDhMOWIQUACWZsb2F0VGVzdD7/GDID` +
13 `AAdpbnRUZXN0f////woAFG5lc3RlZCBjb21wb3VuZCB0ZXN0CgADaGFtCAAEbmFtZQAGSGFtcHVz` +
14 `BQAFdmFsdWU/QAAAAAoAA2VnZwgABG5hbWUAB0VnZ2JlcnQFAAV2YWx1ZT8AAAAAAAkAD2xpc3RU` +
15 `ZXN0IChsb25nKQQAAAAFAAAAAAAAAAsAAAAAAAAADAAAAAAAAAANAAAAAAAAAA4AAAAAAAAADwkA` +
16 `E2xpc3RUZXN0IChjb21wb3VuZCkKAAAAAggABG5hbWUAD0NvbXBvdW5kIHRhZyAjMAQACmNyZWF0` +
17 `ZWQtb24AAAEmUjfVjQAIAARuYW1lAA9Db21wb3VuZCB0YWcgIzEEAApjcmVhdGVkLW9uAAABJlI3` +
18 `1Y0AAQAIYnl0ZVRlc3R/BwBlYnl0ZUFycmF5VGVzdCAodGhlIGZpcnN0IDEwMDAgdmFsdWVzIG9m` +
19 `IChuKm4qMjU1K24qNyklMTAwLCBzdGFydGluZyB3aXRoIG49MCAoMCwgNjIsIDM0LCAxNiwgOCwg` +
20 `Li4uKSkAAAPoAD4iEAgKFixMEkYgBFZOUFwOLlgoAko4MDI+VBA6CkgsGhIUIDZWHFAqDmBYWgIY` +
21 `OGIyDFRCOjxIXhpEFFI2JBweKkBgJlo0GAZiAAwiQgg8Fl5MREZSBCROHlxALiYoNEoGMAA+IhAI` +
22 `ChYsTBJGIARWTlBcDi5YKAJKODAyPlQQOgpILBoSFCA2VhxQKg5gWFoCGDhiMgxUQjo8SF4aRBRS` +
23 `NiQcHipAYCZaNBgGYgAMIkIIPBZeTERGUgQkTh5cQC4mKDRKBjAAPiIQCAoWLEwSRiAEVk5QXA4u` +
24 `WCgCSjgwMj5UEDoKSCwaEhQgNlYcUCoOYFhaAhg4YjIMVEI6PEheGkQUUjYkHB4qQGAmWjQYBmIA` +
25 `DCJCCDwWXkxERlIEJE4eXEAuJig0SgYwAD4iEAgKFixMEkYgBFZOUFwOLlgoAko4MDI+VBA6Ckgs` +
26 `GhIUIDZWHFAqDmBYWgIYOGIyDFRCOjxIXhpEFFI2JBweKkBgJlo0GAZiAAwiQgg8Fl5MREZSBCRO` +
27 `HlxALiYoNEoGMAA+IhAIChYsTBJGIARWTlBcDi5YKAJKODAyPlQQOgpILBoSFCA2VhxQKg5gWFoC` +
28 `GDhiMgxUQjo8SF4aRBRSNiQcHipAYCZaNBgGYgAMIkIIPBZeTERGUgQkTh5cQC4mKDRKBjAAPiIQ` +
29 `CAoWLEwSRiAEVk5QXA4uWCgCSjgwMj5UEDoKSCwaEhQgNlYcUCoOYFhaAhg4YjIMVEI6PEheGkQU` +
30 `UjYkHB4qQGAmWjQYBmIADCJCCDwWXkxERlIEJE4eXEAuJig0SgYwAD4iEAgKFixMEkYgBFZOUFwO` +
31 `LlgoAko4MDI+VBA6CkgsGhIUIDZWHFAqDmBYWgIYOGIyDFRCOjxIXhpEFFI2JBweKkBgJlo0GAZi` +
32 `AAwiQgg8Fl5MREZSBCROHlxALiYoNEoGMAA+IhAIChYsTBJGIARWTlBcDi5YKAJKODAyPlQQOgpI` +
33 `LBoSFCA2VhxQKg5gWFoCGDhiMgxUQjo8SF4aRBRSNiQcHipAYCZaNBgGYgAMIkIIPBZeTERGUgQk` +
34 `Th5cQC4mKDRKBjAAPiIQCAoWLEwSRiAEVk5QXA4uWCgCSjgwMj5UEDoKSCwaEhQgNlYcUCoOYFha` +
35 `Ahg4YjIMVEI6PEheGkQUUjYkHB4qQGAmWjQYBmIADCJCCDwWXkxERlIEJE4eXEAuJig0SgYwAD4i` +
36 `EAgKFixMEkYgBFZOUFwOLlgoAko4MDI+VBA6CkgsGhIUIDZWHFAqDmBYWgIYOGIyDFRCOjxIXhpE` +
37 `FFI2JBweKkBgJlo0GAZiAAwiQgg8Fl5MREZSBCROHlxALiYoNEoGMAYACmRvdWJsZVRlc3Q/349r` +
38 `u/9qXgA=`
39 )
40
41 func TestSmall(t *testing.T) { //test.nbt
42 testNBT(smallTestData,
43 NewTag("hello world", Compound{
44 NewTag("name", String("Bananrama")),
45 }), t)
46 }
47
48 func byteArrayTestData() []int8 {
49 data := make([]int8, 1000)
50 for i := 0; i < 1000; i++ {
51 data[i] = int8((i*i*255 + i*7) % 100)
52 }
53 return data
54 }
55
56 func TestLarge(t *testing.T) { //bigtest.nbt
57 testNBT(largeTestData,
58 NewTag("Level", Compound{
59 NewTag("longTest", Long(9223372036854775807)),
60 NewTag("shortTest", Short(32767)),
61 NewTag("stringTest", String("HELLO WORLD THIS IS A TEST STRING ÅÄÖ!")),
62 NewTag("floatTest", Float(0.49823147)),
63 NewTag("intTest", Int(2147483647)),
64 NewTag("nested compound test", Compound{
65 NewTag("ham", Compound{
66 NewTag("name", String("Hampus")),
67 NewTag("value", Float(0.75)),
68 }),
69 NewTag("egg", Compound{
70 NewTag("name", String("Eggbert")),
71 NewTag("value", Float(0.5)),
72 }),
73 }),
74 NewTag("listTest (long)", NewList([]Data{
75 Long(11),
76 Long(12),
77 Long(13),
78 Long(14),
79 Long(15),
80 })),
81 NewTag("listTest (compound)", NewList([]Data{
82 Compound{
83 NewTag("name", String("Compound tag #0")),
84 NewTag("created-on", Long(1264099775885)),
85 },
86 Compound{
87 NewTag("name", String("Compound tag #1")),
88 NewTag("created-on", Long(1264099775885)),
89 },
90 })),
91 NewTag("byteTest", Byte(127)),
92 NewTag("byteArrayTest (the first 1000 values of (n*n*255+n*7)%100, starting with n=0 (0, 62, 34, 16, 8, ...))", ByteArray(byteArrayTestData())),
93 NewTag("doubleTest", Double(0.4931287132182315)),
94 }), t)
95 }
96
97 func testNBT(input string, middle Tag, t *testing.T) {
98 tag, err := Decode(base64.NewDecoder(base64.StdEncoding, bytes.NewBufferString(input)))
99 if err != nil {
100 t.Errorf("error encountered while reading nbt data: %q", err)
101 return
102 }
103 if !tag.Equal(middle) {
104 t.Error("parsed nbt data did not match given nbt structure")
105 return
106 }
107 o := new(bytes.Buffer)
108 b := base64.NewEncoder(base64.StdEncoding, o)
109 err = Encode(b, tag)
110 b.Close()
111 if err != nil {
112 t.Errorf("error encountered while writing nbt data: %q", err)
113 return
114 }
115 if o.String() != input {
116 t.Error("input and output do not match")
117 }
118 }
119