builder_test.gno
2.26 Kb ยท 103 lines
1package json
2
3import (
4 "testing"
5)
6
7func TestNodeBuilder(t *testing.T) {
8 tests := []struct {
9 name string
10 build func() *Node
11 expected string
12 }{
13 {
14 name: "plain object",
15 build: func() *Node {
16 return Builder().
17 WriteString("name", "Alice").
18 WriteNumber("age", 30).
19 WriteBool("is_student", false).
20 Node()
21 },
22 expected: `{"name":"Alice","age":30,"is_student":false}`,
23 },
24 {
25 name: "nested object",
26 build: func() *Node {
27 return Builder().
28 WriteString("name", "Alice").
29 WriteObject("address", func(b *NodeBuilder) {
30 b.WriteString("city", "New York").
31 WriteNumber("zipcode", 10001)
32 }).
33 Node()
34 },
35 expected: `{"name":"Alice","address":{"city":"New York","zipcode":10001}}`,
36 },
37 {
38 name: "null node",
39 build: func() *Node {
40 return Builder().WriteNull("foo").Node()
41 },
42 expected: `{"foo":null}`,
43 },
44 {
45 name: "array node",
46 build: func() *Node {
47 return Builder().
48 WriteArray("items", func(ab *ArrayBuilder) {
49 ab.WriteString("item1").
50 WriteString("item2").
51 WriteString("item3")
52 }).
53 Node()
54 },
55 expected: `{"items":["item1","item2","item3"]}`,
56 },
57 {
58 name: "array with objects",
59 build: func() *Node {
60 return Builder().
61 WriteArray("users", func(ab *ArrayBuilder) {
62 ab.WriteObject(func(b *NodeBuilder) {
63 b.WriteString("name", "Bob").
64 WriteNumber("age", 25)
65 }).
66 WriteObject(func(b *NodeBuilder) {
67 b.WriteString("name", "Carol").
68 WriteNumber("age", 27)
69 })
70 }).
71 Node()
72 },
73 expected: `{"users":[{"name":"Bob","age":25},{"name":"Carol","age":27}]}`,
74 },
75 {
76 name: "array with various types",
77 build: func() *Node {
78 return Builder().
79 WriteArray("values", func(ab *ArrayBuilder) {
80 ab.WriteString("item1").
81 WriteNumber(123).
82 WriteBool(true).
83 WriteNull()
84 }).
85 Node()
86 },
87 expected: `{"values":["item1",123,true,null]}`,
88 },
89 }
90
91 for _, tt := range tests {
92 t.Run(tt.name, func(t *testing.T) {
93 node := tt.build()
94 value, err := Marshal(node)
95 if err != nil {
96 t.Errorf("unexpected error: %s", err)
97 }
98 if string(value) != tt.expected {
99 t.Errorf("expected %s, got %s", tt.expected, string(value))
100 }
101 })
102 }
103}