text_test.go

  1package ygo_test
  2
  3import (
  4	"encoding/json"
  5	"testing"
  6
  7	"git.kilimanjaro.io/ygo"
  8)
  9
 10func TestTextBasic(t *testing.T) {
 11	doc, err := ygo.NewDoc()
 12	if err != nil {
 13		t.Fatalf("failed to create doc: %v", err)
 14	}
 15	defer doc.Destroy()
 16
 17	txt, err := doc.GetText("test")
 18	if err != nil {
 19		t.Fatalf("failed to get text: %v", err)
 20	}
 21	defer txt.Destroy()
 22
 23	var length uint32
 24	var str string
 25
 26	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
 27		txt.Insert(txn, 0, "hello")
 28		txt.Insert(txn, 5, " world")
 29		txt.RemoveRange(txn, 0, 6)
 30
 31		length = txt.Len(txn)
 32
 33		str, err = txt.String(txn)
 34		return err
 35	})
 36	if err != nil {
 37		t.Fatalf("transaction failed: %v", err)
 38	}
 39
 40	if length != 5 {
 41		t.Errorf("expected length 5, got %d", length)
 42	}
 43
 44	if str != "world" {
 45		t.Errorf("expected 'world', got '%s'", str)
 46	}
 47}
 48
 49func TestTextInsertWithAttributes(t *testing.T) {
 50	doc, err := ygo.NewDocWithOptions(ygo.DocOptions{Encoding: ygo.OffsetUTF16})
 51	if err != nil {
 52		t.Fatalf("failed to create doc: %v", err)
 53	}
 54	defer doc.Destroy()
 55
 56	txt, err := doc.GetText("test")
 57	if err != nil {
 58		t.Fatalf("failed to get text: %v", err)
 59	}
 60	defer txt.Destroy()
 61
 62	var length uint32
 63
 64	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
 65		attrs, jsonErr := ygo.JSONMap([]string{"bold"}, []ygo.Input{ygo.Bool(true)})
 66		if jsonErr != nil {
 67			return jsonErr
 68		}
 69		txt.InsertWithAttributes(txn, 0, "bold text", attrs)
 70
 71		length = txt.Len(txn)
 72		return nil
 73	})
 74	if err != nil {
 75		t.Fatalf("transaction failed: %v", err)
 76	}
 77
 78	if length != 9 {
 79		t.Errorf("expected length 9, got %d", length)
 80	}
 81}
 82
 83func TestTextFormat(t *testing.T) {
 84	doc, err := ygo.NewDocWithOptions(ygo.DocOptions{Encoding: ygo.OffsetUTF16})
 85	if err != nil {
 86		t.Fatalf("failed to create doc: %v", err)
 87	}
 88	defer doc.Destroy()
 89
 90	txt, err := doc.GetText("test")
 91	if err != nil {
 92		t.Fatalf("failed to get text: %v", err)
 93	}
 94	defer txt.Destroy()
 95
 96	var str string
 97
 98	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
 99		txt.Insert(txn, 0, "hello world")
100
101		attrs, jsonErr := ygo.JSONMap([]string{"italic"}, []ygo.Input{ygo.Bool(true)})
102		if jsonErr != nil {
103			return jsonErr
104		}
105		txt.Format(txn, 0, 5, attrs)
106
107		str, jsonErr = txt.String(txn)
108		return jsonErr
109	})
110	if err != nil {
111		t.Fatalf("transaction failed: %v", err)
112	}
113
114	if str != "hello world" {
115		t.Errorf("expected 'hello world', got '%s'", str)
116	}
117}
118
119func TestTextUnicode(t *testing.T) {
120	opts := ygo.DocOptions{Encoding: ygo.OffsetUTF16}
121	doc, err := ygo.NewDocWithOptions(opts)
122	if err != nil {
123		t.Fatalf("failed to create doc: %v", err)
124	}
125	defer doc.Destroy()
126
127	txt, err := doc.GetText("test")
128	if err != nil {
129		t.Fatalf("failed to get text: %v", err)
130	}
131	defer txt.Destroy()
132
133	var result string
134
135	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
136		// Test with emoji (4-byte UTF-8, but 2 UTF-16 code units)
137		txt.Insert(txn, 0, "πŸ‡ΏπŸ‡ΏπŸ‡ΏπŸ‡ΏπŸ‡©πŸ‡©πŸ‡©πŸ‡ΏπŸ‡©πŸ‡©πŸ‡©πŸ‡©πŸ‡©πŸ‡ΏπŸ‡©πŸ‡©πŸ‡ΏπŸ‡©πŸ‡ΏπŸ‡©")
138		txt.RemoveRange(txn, 0, 5)
139
140		var err error
141		result, err = txt.String(txn)
142		return err
143	})
144	if err != nil {
145		t.Fatalf("transaction failed: %v", err)
146	}
147
148	expected := "πŸ‡ΏπŸ‡©πŸ‡©πŸ‡©πŸ‡ΏπŸ‡©πŸ‡©πŸ‡©πŸ‡©πŸ‡©πŸ‡ΏπŸ‡©πŸ‡©πŸ‡ΏπŸ‡©πŸ‡ΏπŸ‡©"
149	if result != expected {
150		t.Errorf("expected '%s', got '%s'", expected, result)
151	}
152}
153
154func TestTextMarshalJSON(t *testing.T) {
155	doc, err := ygo.NewDoc()
156	if err != nil {
157		t.Fatalf("failed to create doc: %v", err)
158	}
159	defer doc.Destroy()
160
161	txt, err := doc.GetText("content")
162	if err != nil {
163		t.Fatalf("failed to get text: %v", err)
164	}
165	defer txt.Destroy()
166
167	err = doc.WithWriteTransaction(func(txn *ygo.Transaction) error {
168		return txt.Push(txn, "Hello, World!")
169	})
170	if err != nil {
171		t.Fatalf("transaction failed: %v", err)
172	}
173
174	var jsonBytes []byte
175	err = doc.WithReadTransaction(func(txn *ygo.Transaction) error {
176		var err error
177		jsonBytes, err = txt.MarshalJSONWithTxn(txn)
178		return err
179	})
180	if err != nil {
181		t.Fatalf("marshal failed: %v", err)
182	}
183
184	// Text should marshal to a JSON string
185	var result string
186	if err := json.Unmarshal(jsonBytes, &result); err != nil {
187		t.Fatalf("failed to unmarshal: %v", err)
188	}
189	if result != "Hello, World!" {
190		t.Errorf("expected 'Hello, World!', got '%s'", result)
191	}
192}