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}