marshal_test.go
1// marshal_test.go - Integration tests for MarshalJSON functionality
2package ygo_test
3
4import (
5 "encoding/json"
6 "testing"
7
8 "git.kilimanjaro.io/ygo"
9)
10
11func TestMarshalComplexStructure(t *testing.T) {
12 doc, err := ygo.NewDoc()
13 if err != nil {
14 t.Fatalf("failed to create doc: %v", err)
15 }
16 defer doc.Destroy()
17
18 root, err := doc.GetMap("root")
19 if err != nil {
20 t.Fatalf("failed to get root map: %v", err)
21 }
22 defer root.Destroy()
23
24 err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
25 // Add simple fields
26 root.Insert(txn, "title", ygo.String("Complex Document"))
27 root.Insert(txn, "count", ygo.Int(42))
28 root.Insert(txn, "active", ygo.Bool(true))
29
30 // Add nested map
31 nestedData, err := ygo.YMap(
32 []string{"nested_key"},
33 []ygo.Input{ygo.String("nested_value")},
34 )
35 if err != nil {
36 return err
37 }
38 root.Insert(txn, "metadata", nestedData)
39
40 // Add array
41 arrItems := []ygo.Input{ygo.Int(1), ygo.Int(2), ygo.Int(3)}
42 root.Insert(txn, "numbers", ygo.YArray(arrItems))
43
44 return nil
45 })
46 if err != nil {
47 t.Fatalf("transaction failed: %v", err)
48 }
49
50 // Marshal and verify
51 var jsonBytes []byte
52 err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
53 var err error
54 jsonBytes, err = root.MarshalJSONWithTxn(txn)
55 return err
56 })
57 if err != nil {
58 t.Fatalf("marshal failed: %v", err)
59 }
60
61 var result map[string]interface{}
62 if err := json.Unmarshal(jsonBytes, &result); err != nil {
63 t.Fatalf("unmarshal failed: %v", err)
64 }
65
66 // Verify structure
67 if result["title"] != "Complex Document" {
68 t.Errorf("wrong title: %v", result["title"])
69 }
70
71 metadata, ok := result["metadata"].(map[string]interface{})
72 if !ok {
73 t.Fatal("metadata should be a map")
74 }
75 if metadata["nested_key"] != "nested_value" {
76 t.Errorf("wrong nested value: %v", metadata["nested_key"])
77 }
78
79 numbers, ok := result["numbers"].([]interface{})
80 if !ok {
81 t.Fatal("numbers should be an array")
82 }
83 if len(numbers) != 3 {
84 t.Errorf("expected 3 numbers, got %d", len(numbers))
85 }
86}
87
88func TestMarshalXMLWithNestedElements(t *testing.T) {
89 doc, err := ygo.NewDoc()
90 if err != nil {
91 t.Fatalf("failed to create doc: %v", err)
92 }
93 defer doc.Destroy()
94
95 frag, err := doc.GetXmlFragment("content")
96 if err != nil {
97 t.Fatalf("failed to get fragment: %v", err)
98 }
99 defer frag.Destroy()
100
101 err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
102 // Create structure: <article><title>Hello</title><p>World</p></article>
103 article, err := frag.InsertElement(txn, 0, "article")
104 if err != nil {
105 return err
106 }
107 article.SetAttribute(txn, "id", ygo.String("doc-1"))
108
109 title, err := article.InsertElement(txn, 0, "title")
110 if err != nil {
111 return err
112 }
113 titleText, err := title.InsertText(txn, 0)
114 if err != nil {
115 return err
116 }
117 titleText.Insert(txn, 0, "Hello")
118
119 p, err := article.InsertElement(txn, 1, "p")
120 if err != nil {
121 return err
122 }
123 pText, err := p.InsertText(txn, 0)
124 if err != nil {
125 return err
126 }
127 pText.Insert(txn, 0, "World")
128
129 return nil
130 })
131 if err != nil {
132 t.Fatalf("transaction failed: %v", err)
133 }
134
135 // Marshal fragment
136 var jsonBytes []byte
137 err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
138 var err error
139 jsonBytes, err = frag.MarshalJSONWithTxn(txn)
140 return err
141 })
142 if err != nil {
143 t.Fatalf("marshal failed: %v", err)
144 }
145
146 var result []interface{}
147 if err := json.Unmarshal(jsonBytes, &result); err != nil {
148 t.Fatalf("unmarshal failed: %v", err)
149 }
150
151 if len(result) != 1 {
152 t.Fatalf("expected 1 root element, got %d", len(result))
153 }
154
155 article, ok := result[0].(map[string]interface{})
156 if !ok {
157 t.Fatal("article should be an object")
158 }
159
160 if article["type"] != "article" {
161 t.Errorf("wrong type: %v", article["type"])
162 }
163
164 attrs, ok := article["attrs"].(map[string]interface{})
165 if !ok {
166 t.Fatal("attrs should be a map")
167 }
168 if attrs["id"] != "doc-1" {
169 t.Errorf("wrong id: %v", attrs["id"])
170 }
171
172 children, ok := article["children"].([]interface{})
173 if !ok {
174 t.Fatal("children should be an array")
175 }
176 if len(children) != 2 {
177 t.Errorf("expected 2 children, got %d", len(children))
178 }
179}