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}