@@ -313,6 +313,45 @@ def test_parse_valid_result_message(self):
313313 message = parse_message (data )
314314 assert isinstance (message , ResultMessage )
315315 assert message .subtype == "success"
316+ assert message .stop_reason is None
317+
318+ def test_parse_result_message_with_stop_reason (self ):
319+ """Test parsing a result message with stop_reason field.
320+
321+ The stop_reason field mirrors the Anthropic API's stop_reason on the
322+ final assistant turn (e.g., "end_turn", "max_tokens", "tool_use").
323+ """
324+ data = {
325+ "type" : "result" ,
326+ "subtype" : "success" ,
327+ "duration_ms" : 1000 ,
328+ "duration_api_ms" : 500 ,
329+ "is_error" : False ,
330+ "num_turns" : 2 ,
331+ "session_id" : "session_123" ,
332+ "stop_reason" : "end_turn" ,
333+ "result" : "Done" ,
334+ }
335+ message = parse_message (data )
336+ assert isinstance (message , ResultMessage )
337+ assert message .stop_reason == "end_turn"
338+ assert message .result == "Done"
339+
340+ def test_parse_result_message_with_null_stop_reason (self ):
341+ """Test parsing a result message with explicit null stop_reason."""
342+ data = {
343+ "type" : "result" ,
344+ "subtype" : "error_max_turns" ,
345+ "duration_ms" : 1000 ,
346+ "duration_api_ms" : 500 ,
347+ "is_error" : True ,
348+ "num_turns" : 10 ,
349+ "session_id" : "session_123" ,
350+ "stop_reason" : None ,
351+ }
352+ message = parse_message (data )
353+ assert isinstance (message , ResultMessage )
354+ assert message .stop_reason is None
316355
317356 def test_parse_invalid_data_type (self ):
318357 """Test that non-dict data raises MessageParseError."""
0 commit comments