convenience_test.go

  1package ygo_test
  2
  3import (
  4	"testing"
  5
  6	"git.kilimanjaro.io/ygo"
  7)
  8
  9func TestMapGetString(t *testing.T) {
 10	doc, err := ygo.NewDoc()
 11	if err != nil {
 12		t.Fatalf("failed to create doc: %v", err)
 13	}
 14	defer doc.Destroy()
 15
 16	m, err := doc.GetMap("test")
 17	if err != nil {
 18		t.Fatalf("failed to get map: %v", err)
 19	}
 20	defer m.Destroy()
 21
 22	// Insert test data
 23	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
 24		m.Insert(txn, "name", ygo.String("Alice"))
 25		return nil
 26	})
 27	if err != nil {
 28		t.Fatalf("transaction failed: %v", err)
 29	}
 30
 31	// Test GetString
 32	var name string
 33	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
 34		var err error
 35		name, err = m.GetString(txn, "name")
 36		return err
 37	})
 38	if err != nil {
 39		t.Fatalf("GetString failed: %v", err)
 40	}
 41	if name != "Alice" {
 42		t.Errorf("expected Alice, got %s", name)
 43	}
 44}
 45
 46func TestMapGetInt(t *testing.T) {
 47	doc, err := ygo.NewDoc()
 48	if err != nil {
 49		t.Fatalf("failed to create doc: %v", err)
 50	}
 51	defer doc.Destroy()
 52
 53	m, err := doc.GetMap("test")
 54	if err != nil {
 55		t.Fatalf("failed to get map: %v", err)
 56	}
 57	defer m.Destroy()
 58
 59	// Insert test data
 60	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
 61		m.Insert(txn, "age", ygo.Int(30))
 62		return nil
 63	})
 64	if err != nil {
 65		t.Fatalf("transaction failed: %v", err)
 66	}
 67
 68	// Test GetInt
 69	var age int64
 70	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
 71		var err error
 72		age, err = m.GetInt(txn, "age")
 73		return err
 74	})
 75	if err != nil {
 76		t.Fatalf("GetInt failed: %v", err)
 77	}
 78	if age != 30 {
 79		t.Errorf("expected 30, got %d", age)
 80	}
 81}
 82
 83func TestMapGetFloat(t *testing.T) {
 84	doc, err := ygo.NewDoc()
 85	if err != nil {
 86		t.Fatalf("failed to create doc: %v", err)
 87	}
 88	defer doc.Destroy()
 89
 90	m, err := doc.GetMap("test")
 91	if err != nil {
 92		t.Fatalf("failed to get map: %v", err)
 93	}
 94	defer m.Destroy()
 95
 96	// Insert test data
 97	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
 98		m.Insert(txn, "pi", ygo.Float(3.14))
 99		return nil
100	})
101	if err != nil {
102		t.Fatalf("transaction failed: %v", err)
103	}
104
105	// Test GetFloat
106	var pi float64
107	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
108		var err error
109		pi, err = m.GetFloat(txn, "pi")
110		return err
111	})
112	if err != nil {
113		t.Fatalf("GetFloat failed: %v", err)
114	}
115	if pi != 3.14 {
116		t.Errorf("expected 3.14, got %f", pi)
117	}
118}
119
120func TestMapGetBool(t *testing.T) {
121	doc, err := ygo.NewDoc()
122	if err != nil {
123		t.Fatalf("failed to create doc: %v", err)
124	}
125	defer doc.Destroy()
126
127	m, err := doc.GetMap("test")
128	if err != nil {
129		t.Fatalf("failed to get map: %v", err)
130	}
131	defer m.Destroy()
132
133	// Insert test data
134	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
135		m.Insert(txn, "active", ygo.Bool(true))
136		return nil
137	})
138	if err != nil {
139		t.Fatalf("transaction failed: %v", err)
140	}
141
142	// Test GetBool
143	var active bool
144	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
145		var err error
146		active, err = m.GetBool(txn, "active")
147		return err
148	})
149	if err != nil {
150		t.Fatalf("GetBool failed: %v", err)
151	}
152	if !active {
153		t.Errorf("expected true, got %v", active)
154	}
155}
156
157func TestMapForEach(t *testing.T) {
158	doc, err := ygo.NewDoc()
159	if err != nil {
160		t.Fatalf("failed to create doc: %v", err)
161	}
162	defer doc.Destroy()
163
164	m, err := doc.GetMap("test")
165	if err != nil {
166		t.Fatalf("failed to get map: %v", err)
167	}
168	defer m.Destroy()
169
170	// Insert test data
171	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
172		m.Insert(txn, "a", ygo.String("1"))
173		m.Insert(txn, "b", ygo.String("2"))
174		m.Insert(txn, "c", ygo.String("3"))
175		return nil
176	})
177	if err != nil {
178		t.Fatalf("transaction failed: %v", err)
179	}
180
181	// Test ForEach
182	var count int
183	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
184		return m.ForEach(txn, func(key string, value *ygo.Output) error {
185			count++
186			return nil
187		})
188	})
189	if err != nil {
190		t.Fatalf("ForEach failed: %v", err)
191	}
192	if count != 3 {
193		t.Errorf("expected 3 entries, got %d", count)
194	}
195}
196
197func TestMapForEachEarlyExit(t *testing.T) {
198	doc, err := ygo.NewDoc()
199	if err != nil {
200		t.Fatalf("failed to create doc: %v", err)
201	}
202	defer doc.Destroy()
203
204	m, err := doc.GetMap("test")
205	if err != nil {
206		t.Fatalf("failed to get map: %v", err)
207	}
208	defer m.Destroy()
209
210	// Insert test data
211	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
212		m.Insert(txn, "a", ygo.String("1"))
213		m.Insert(txn, "b", ygo.String("2"))
214		m.Insert(txn, "c", ygo.String("3"))
215		return nil
216	})
217	if err != nil {
218		t.Fatalf("transaction failed: %v", err)
219	}
220
221	// Test ForEach with early exit
222	var count int
223	testErr := ygo.ErrKeyNotFound // Just use any error for testing
224	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
225		return m.ForEach(txn, func(key string, value *ygo.Output) error {
226			count++
227			if count >= 2 {
228				return testErr
229			}
230			return nil
231		})
232	})
233	if err != testErr {
234		t.Fatalf("expected ForEach to return test error, got: %v", err)
235	}
236	if count != 2 {
237		t.Errorf("expected iteration to stop at 2, got %d", count)
238	}
239}
240
241func TestArrayForEach(t *testing.T) {
242	doc, err := ygo.NewDoc()
243	if err != nil {
244		t.Fatalf("failed to create doc: %v", err)
245	}
246	defer doc.Destroy()
247
248	arr, err := doc.GetArray("test")
249	if err != nil {
250		t.Fatalf("failed to get array: %v", err)
251	}
252	defer arr.Destroy()
253
254	// Insert test data
255	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
256		arr.Push(txn, ygo.Int(10))
257		arr.Push(txn, ygo.Int(20))
258		arr.Push(txn, ygo.Int(30))
259		return nil
260	})
261	if err != nil {
262		t.Fatalf("transaction failed: %v", err)
263	}
264
265	// Test ForEach
266	var sum int64
267	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
268		return arr.ForEach(txn, func(index uint32, value *ygo.Output) error {
269			if v, ok := value.Int(); ok {
270				sum += v
271			}
272			return nil
273		})
274	})
275	if err != nil {
276		t.Fatalf("ForEach failed: %v", err)
277	}
278	if sum != 60 {
279		t.Errorf("expected sum 60, got %d", sum)
280	}
281}
282
283func TestMapInput(t *testing.T) {
284	// Test MapInput with data
285	data := map[string]ygo.Input{
286		"name": ygo.String("Alice"),
287		"age":  ygo.Int(30),
288	}
289	input, err := ygo.MapInput(data)
290	if err != nil {
291		t.Fatalf("MapInput failed: %v", err)
292	}
293
294	doc, err := ygo.NewDoc()
295	if err != nil {
296		t.Fatalf("failed to create doc: %v", err)
297	}
298	defer doc.Destroy()
299
300	m, err := doc.GetMap("test")
301	if err != nil {
302		t.Fatalf("failed to get map: %v", err)
303	}
304	defer m.Destroy()
305
306	// Insert the map input
307	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
308		return m.Insert(txn, "data", input)
309	})
310	if err != nil {
311		t.Fatalf("transaction failed: %v", err)
312	}
313
314	// Verify we can read it back
315	var name string
316	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
317		dataMap, err := m.GetNestedMap(txn, "data")
318		if err != nil {
319			return err
320		}
321		defer dataMap.Destroy()
322		name, err = dataMap.GetString(txn, "name")
323		return err
324	})
325	if err != nil {
326		t.Fatalf("GetNestedMap failed: %v", err)
327	}
328	if name != "Alice" {
329		t.Errorf("expected Alice, got %s", name)
330	}
331}
332
333func TestJSONObject(t *testing.T) {
334	// Test JSONObject with data
335	data := map[string]ygo.Input{
336		"name": ygo.String("Bob"),
337		"age":  ygo.Int(25),
338	}
339	input, err := ygo.JSONObject(data)
340	if err != nil {
341		t.Fatalf("JSONObject failed: %v", err)
342	}
343
344	doc, err := ygo.NewDoc()
345	if err != nil {
346		t.Fatalf("failed to create doc: %v", err)
347	}
348	defer doc.Destroy()
349
350	m, err := doc.GetMap("test")
351	if err != nil {
352		t.Fatalf("failed to get map: %v", err)
353	}
354	defer m.Destroy()
355
356	// Insert the JSON object input
357	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
358		return m.Insert(txn, "data", input)
359	})
360	if err != nil {
361		t.Fatalf("transaction failed: %v", err)
362	}
363
364	// Verify we can read it back as a JSON map
365	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
366		out, err := m.Get(txn, "data")
367		if err != nil {
368			return err
369		}
370		defer out.Destroy()
371
372		if out.Tag() != ygo.TagJSONMap {
373			t.Errorf("expected TagJSONMap, got %v", out.Tag())
374		}
375		return nil
376	})
377	if err != nil {
378		t.Fatalf("Get failed: %v", err)
379	}
380}