@@ -162,4 +162,109 @@ class EditorServiceV5ImplTest : FunSpec({
162162 verify { pendingMessages.take(testId) }
163163 verify { editorProcess.writeBuffer(expectedOutgoingMessage.build()) }
164164 }
165+
166+ test("fmt converts string indices to byte indices correctly for ASCII text") {
167+ val testFile = " /test/File.kt"
168+ val testContent = " hello world"
169+ val onFinished = mockk<(FormatResult ) -> Unit >()
170+
171+ every { editorProcess.writeBuffer(any()) } returns Unit
172+ every { pendingMessages.store(any(), any()) } returns Unit
173+ every { onFinished(any()) } returns Unit
174+
175+ editorServiceV5.fmt(1, testFile, testContent, 6, 11, onFinished)
176+
177+ val expectedOutgoingMessage = OutgoingMessage (1, MessageType .FormatFile )
178+ expectedOutgoingMessage.addString(testFile)
179+ expectedOutgoingMessage.addInt(6) // "hello " = 6 bytes
180+ expectedOutgoingMessage.addInt(11) // "hello world" = 11 bytes
181+ expectedOutgoingMessage.addInt(0)
182+ expectedOutgoingMessage.addString(testContent)
183+
184+ verify(exactly = 1) { editorProcess.writeBuffer(expectedOutgoingMessage.build()) }
185+ }
186+
187+ test("fmt converts string indices to byte indices correctly for Unicode text") {
188+ val testFile = " /test/File.kt"
189+ val testContent = " 🚀 rocket"
190+ val onFinished = mockk<(FormatResult ) -> Unit >()
191+
192+ every { editorProcess.writeBuffer(any()) } returns Unit
193+ every { pendingMessages.store(any(), any()) } returns Unit
194+ every { onFinished(any()) } returns Unit
195+
196+ editorServiceV5.fmt(1, testFile, testContent, 2, 8, onFinished)
197+
198+ val expectedOutgoingMessage = OutgoingMessage (1, MessageType .FormatFile )
199+ expectedOutgoingMessage.addString(testFile)
200+ expectedOutgoingMessage.addInt(4) // 🚀 is 2 bytes then another 2 for ' r'
201+ expectedOutgoingMessage.addInt(10)
202+ expectedOutgoingMessage.addInt(0)
203+ expectedOutgoingMessage.addString(testContent)
204+
205+ verify(exactly = 1) { editorProcess.writeBuffer(expectedOutgoingMessage.build()) }
206+ }
207+
208+ test("fmt handles edge case with start index 0") {
209+ val testFile = " /test/File.kt"
210+ val testContent = " test"
211+ val onFinished = mockk<(FormatResult ) -> Unit >()
212+
213+ every { editorProcess.writeBuffer(any()) } returns Unit
214+ every { pendingMessages.store(any(), any()) } returns Unit
215+ every { onFinished(any()) } returns Unit
216+
217+ editorServiceV5.fmt(1, testFile, testContent, 0, 2, onFinished)
218+
219+ val expectedOutgoingMessage = OutgoingMessage (1, MessageType .FormatFile )
220+ expectedOutgoingMessage.addString(testFile)
221+ expectedOutgoingMessage.addInt(0) // start at 0
222+ expectedOutgoingMessage.addInt(2) // "te" = 2 bytes
223+ expectedOutgoingMessage.addInt(0)
224+ expectedOutgoingMessage.addString(testContent)
225+
226+ verify(exactly = 1) { editorProcess.writeBuffer(expectedOutgoingMessage.build()) }
227+ }
228+
229+ test("fmt handles edge case with index beyond content length") {
230+ val testFile = " /test/File.kt"
231+ val testContent = " test"
232+ val onFinished = mockk<(FormatResult ) -> Unit >()
233+
234+ every { editorProcess.writeBuffer(any()) } returns Unit
235+ every { pendingMessages.store(any(), any()) } returns Unit
236+ every { onFinished(any()) } returns Unit
237+
238+ editorServiceV5.fmt(1, testFile, testContent, 10, 20, onFinished)
239+
240+ val expectedOutgoingMessage = OutgoingMessage (1, MessageType .FormatFile )
241+ expectedOutgoingMessage.addString(testFile)
242+ expectedOutgoingMessage.addInt(4) // beyond length returns full content byte size
243+ expectedOutgoingMessage.addInt(4) // beyond length returns full content byte size
244+ expectedOutgoingMessage.addInt(0)
245+ expectedOutgoingMessage.addString(testContent)
246+
247+ verify(exactly = 1) { editorProcess.writeBuffer(expectedOutgoingMessage.build()) }
248+ }
249+
250+ test("fmt handles mixed Unicode characters correctly") {
251+ val testFile = " /test/File.kt"
252+ val testContent = " café 🎉 test"
253+ val onFinished = mockk<(FormatResult ) -> Unit >()
254+
255+ every { editorProcess.writeBuffer(any()) } returns Unit
256+ every { pendingMessages.store(any(), any()) } returns Unit
257+ every { onFinished(any()) } returns Unit
258+
259+ editorServiceV5.fmt(1, testFile, testContent, 5, 7, onFinished)
260+
261+ val expectedOutgoingMessage = OutgoingMessage (1, MessageType .FormatFile )
262+ expectedOutgoingMessage.addString(testFile)
263+ expectedOutgoingMessage.addInt(testContent.substring(0, 5).encodeToByteArray().size) // Dynamic calculation
264+ expectedOutgoingMessage.addInt(testContent.substring(0, 7).encodeToByteArray().size) // Dynamic calculation
265+ expectedOutgoingMessage.addInt(0)
266+ expectedOutgoingMessage.addString(testContent)
267+
268+ verify(exactly = 1) { editorProcess.writeBuffer(expectedOutgoingMessage.build()) }
269+ }
165270})
0 commit comments