1package json23import (4 "testing"5)67func TestNodeBuilder(t *testing.T) {8 tests := []struct {9 name string10 build func() *Node11 expected string12 }{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 }9091 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}104Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.