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}