@@ -20,6 +20,8 @@ import (
2020 "testing"
2121
2222 "github.com/stretchr/testify/assert"
23+
24+ "github.com/cloudwego/eino/internal/generic"
2325)
2426
2527func TestConcatResponseMetaExtensions (t * testing.T ) {
@@ -191,3 +193,76 @@ func TestConcatAssistantGenTextExtensions(t *testing.T) {
191193 assert .Error (t , err )
192194 })
193195}
196+
197+ func TestConcatReasoningExtensions (t * testing.T ) {
198+ t .Run ("empty chunks - error" , func (t * testing.T ) {
199+ _ , err := ConcatReasoningExtensions (nil )
200+ assert .Error (t , err )
201+ })
202+
203+ t .Run ("single extension" , func (t * testing.T ) {
204+ ext := & ReasoningExtension {
205+ Content : []* ReasoningContent {
206+ {Text : "hello" , Index : generic .PtrOf (0 )},
207+ },
208+ }
209+
210+ result , err := ConcatReasoningExtensions ([]* ReasoningExtension {ext })
211+ assert .NoError (t , err )
212+ assert .Len (t , result .Content , 1 )
213+ assert .Equal (t , "hello" , result .Content [0 ].Text )
214+ })
215+
216+ t .Run ("streaming scenario - same index concatenated, ordered by index" , func (t * testing.T ) {
217+ exts := []* ReasoningExtension {
218+ {Content : []* ReasoningContent {{Text : "he" , Index : generic .PtrOf (0 )}}},
219+ {Content : []* ReasoningContent {{Text : "first" , Index : generic .PtrOf (1 )}}},
220+ {Content : []* ReasoningContent {{Text : "llo" , Index : generic .PtrOf (0 )}}},
221+ }
222+
223+ result , err := ConcatReasoningExtensions (exts )
224+ assert .NoError (t , err )
225+ assert .Len (t , result .Content , 2 )
226+ assert .Nil (t , result .Content [0 ].Index )
227+ assert .Equal (t , "hello" , result .Content [0 ].Text )
228+ assert .Nil (t , result .Content [1 ].Index )
229+ assert .Equal (t , "first" , result .Content [1 ].Text )
230+ })
231+
232+ t .Run ("nil extension and nil content skipped" , func (t * testing.T ) {
233+ exts := []* ReasoningExtension {
234+ nil ,
235+ {Content : []* ReasoningContent {nil , {Text : "ok" , Index : generic .PtrOf (0 )}}},
236+ }
237+
238+ result , err := ConcatReasoningExtensions (exts )
239+ assert .NoError (t , err )
240+ assert .Len (t , result .Content , 1 )
241+ assert .Equal (t , "ok" , result .Content [0 ].Text )
242+ })
243+
244+ t .Run ("all unindexed - appended in arrival order" , func (t * testing.T ) {
245+ exts := []* ReasoningExtension {
246+ {Content : []* ReasoningContent {{Text : "he" }}},
247+ {Content : []* ReasoningContent {{Text : "llo" }}},
248+ }
249+
250+ result , err := ConcatReasoningExtensions (exts )
251+ assert .NoError (t , err )
252+ assert .Len (t , result .Content , 2 )
253+ assert .Nil (t , result .Content [0 ].Index )
254+ assert .Equal (t , "he" , result .Content [0 ].Text )
255+ assert .Nil (t , result .Content [1 ].Index )
256+ assert .Equal (t , "llo" , result .Content [1 ].Text )
257+ })
258+
259+ t .Run ("mixed indexed and unindexed - error" , func (t * testing.T ) {
260+ exts := []* ReasoningExtension {
261+ {Content : []* ReasoningContent {{Text : "indexed" , Index : generic .PtrOf (0 )}}},
262+ {Content : []* ReasoningContent {{Text : "no meta" }}},
263+ }
264+
265+ _ , err := ConcatReasoningExtensions (exts )
266+ assert .Error (t , err )
267+ })
268+ }
0 commit comments