Skip to content

[Test] Add unit tests for srt/parser#20947

Merged
ispobock merged 5 commits intosgl-project:mainfrom
Zijun9:test/add-unit-tests-for-srt-parser
Mar 23, 2026
Merged

[Test] Add unit tests for srt/parser#20947
ispobock merged 5 commits intosgl-project:mainfrom
Zijun9:test/add-unit-tests-for-srt-parser

Conversation

@Zijun9
Copy link
Copy Markdown
Contributor

@Zijun9 Zijun9 commented Mar 19, 2026

Motivation

Part of #20865 (srt/parser portion).

The srt/parser/ module had limited unit test coverage, with code_completion_parser.py and conversation.py having none. This PR adds 306 tests across 5 files (2 new + 3 extended), covering all 5 source files under srt/parser/. No server launch, no model weight loading. generate_chat_conv() tests use real ChatCompletionRequest Pydantic objects, and get_model_type() tests use real temp files.

Coverage

Name                                                         Stmts   Miss  Cover   Missing
------------------------------------------------------------------------------------------
python/sglang/srt/parser/code_completion_parser.py              47      0   100%
python/sglang/srt/parser/conversation.py                       522      0   100%
python/sglang/srt/parser/harmony_parser.py                     329      4    99%   196, 294, 362, 493
python/sglang/srt/parser/jinja_template_utils.py                94      5    95%   32, 61, 118-120
python/sglang/srt/parser/reasoning_parser.py                   167      3    98%   169, 358, 379

The 12 remaining uncovered lines are internal defensive branches: malformed token handling in harmony_parser, AST type checks in jinja_template_utils, and streaming fallback paths in reasoning_parser.

Test plan

# command
pytest test/registered/unit/parser/test_code_completion_parser.py -v
# output
================================================= test session starts =================================================
platform linux -- Python 3.12.13, pytest-9.0.2, pluggy-1.6.0 -- /scratch/zijunga1/conda_envs/sglang/bin/python3
cachedir: .pytest_cache
rootdir: /scratch/zijunga1/sglang/test
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.0.0
collected 15 items                                                                                                    

test/registered/unit/parser/test_code_completion_parser.py::TestFimPosition::test_middle_and_end_are_distinct PASSED [  6%]
test/registered/unit/parser/test_code_completion_parser.py::TestCompletionTemplate::test_dataclass_fields PASSED [ 13%]
test/registered/unit/parser/test_code_completion_parser.py::TestRegisterCompletionTemplate::test_builtin_templates_registered PASSED [ 20%]
test/registered/unit/parser/test_code_completion_parser.py::TestRegisterCompletionTemplate::test_register_duplicate_raises PASSED [ 26%]
test/registered/unit/parser/test_code_completion_parser.py::TestRegisterCompletionTemplate::test_register_duplicate_with_override PASSED [ 33%]
test/registered/unit/parser/test_code_completion_parser.py::TestRegisterCompletionTemplate::test_register_new_template PASSED [ 40%]
test/registered/unit/parser/test_code_completion_parser.py::TestRegisterCompletionTemplate::test_unregistered_template_not_found PASSED [ 46%]
test/registered/unit/parser/test_code_completion_parser.py::TestGenerateCompletionPrompt::test_deepseek_coder_middle_position PASSED [ 53%]
test/registered/unit/parser/test_code_completion_parser.py::TestGenerateCompletionPrompt::test_empty_prompt_and_suffix PASSED [ 60%]
test/registered/unit/parser/test_code_completion_parser.py::TestGenerateCompletionPrompt::test_qwen_coder_end_position PASSED [ 66%]
test/registered/unit/parser/test_code_completion_parser.py::TestGenerateCompletionPrompt::test_star_coder_end_position PASSED [ 73%]
test/registered/unit/parser/test_code_completion_parser.py::TestGenerateCompletionPromptFromRequest::test_empty_suffix_returns_prompt_directly PASSED [ 80%]
test/registered/unit/parser/test_code_completion_parser.py::TestGenerateCompletionPromptFromRequest::test_nonempty_suffix_uses_fim_template PASSED [ 86%]
test/registered/unit/parser/test_code_completion_parser.py::TestSetCompletionTemplate::test_is_completion_template_defined PASSED [ 93%]
test/registered/unit/parser/test_code_completion_parser.py::TestSetCompletionTemplate::test_set_only_once PASSED [100%]

================================================== warnings summary ===================================================
../conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428
  /scratch/zijunga1/conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428: PytestConfigWarning: Unknown config option: asyncio_mode
  
    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

<frozen importlib._bootstrap>:488
  <frozen importlib._bootstrap>:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute

<frozen importlib._bootstrap>:488
  <frozen importlib._bootstrap>:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
===================================== 15 passed, 3 warnings in 218.13s (0:03:38) ======================================
sys:1: DeprecationWarning: builtin type swigvarlink has no __module__ attribute
# command
pytest test/registered/unit/parser/test_conversation.py -v
# output
================================================= test session starts =================================================
platform linux -- Python 3.12.13, pytest-9.0.2, pluggy-1.6.0 -- /scratch/zijunga1/conda_envs/sglang/bin/python3
cachedir: .pytest_cache
rootdir: /scratch/zijunga1/sglang/test
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.0.0
collected 99 items                                                                                                    

test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_add_colon_single PASSED       [  1%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_add_colon_space_single PASSED [  2%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_add_colon_two PASSED          [  3%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_add_new_line_single PASSED    [  4%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_chatglm PASSED                [  5%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_chatglm2_round_offset PASSED  [  6%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_chatglm3 PASSED               [  7%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_chatglm_with_system PASSED    [  8%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_chatintern PASSED             [  9%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_chatml PASSED                 [ 10%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_deepseek_chat PASSED          [ 11%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_deepseek_vl2 PASSED           [ 12%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_deepseek_vl2_empty_system PASSED [ 13%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_dolly PASSED                  [ 14%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_empty_system_message PASSED   [ 15%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_falcon_chat PASSED            [ 16%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_gemma3 PASSED                 [ 17%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_invalid_sep_style_raises PASSED [ 18%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_llama2_multi_turn PASSED      [ 19%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_llama2_with_system PASSED     [ 20%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_llama2_without_system PASSED  [ 21%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_llama3 PASSED                 [ 22%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_llama4 PASSED                 [ 23%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_llama4_empty_system PASSED    [ 24%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_metamath PASSED               [ 25%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_mpt PASSED                    [ 26%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_mpt_with_tuple_message PASSED [ 27%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_no_colon_single PASSED        [ 28%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_no_colon_two PASSED           [ 29%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_none_message_in_prompt PASSED [ 30%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_paddle_ocr PASSED             [ 31%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_paddle_ocr_with_image_token PASSED [ 32%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_phoenix PASSED                [ 33%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_qwen2_audio PASSED            [ 34%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_qwen2_vl_embed PASSED         [ 35%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_robin PASSED                  [ 36%]
test/registered/unit/parser/test_conversation.py::TestConversationGetPrompt::test_rwkv PASSED                   [ 37%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_append_audio PASSED             [ 38%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_append_image PASSED             [ 39%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_append_message PASSED           [ 40%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_append_video PASSED             [ 41%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_copy_is_independent PASSED      [ 42%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_dict_serialization PASSED       [ 43%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_set_system_message PASSED       [ 44%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_to_gradio_chatbot PASSED        [ 45%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_to_gradio_chatbot_pending_response PASSED [ 46%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_to_openai_api_messages_skips_none_assistant PASSED [ 47%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_to_openai_api_messages_with_system PASSED [ 48%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_to_openai_api_messages_without_system PASSED [ 49%]
test/registered/unit/parser/test_conversation.py::TestConversationMethods::test_update_last_message PASSED      [ 50%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_builtin_templates_exist PASSED     [ 51%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_deepseek_ocr PASSED [ 52%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_deepseek_vl2 PASSED [ 53%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_internvl PASSED [ 54%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_janus PASSED [ 55%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_llava_next PASSED [ 56%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_minicpm_o PASSED [ 57%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_minicpm_v PASSED [ 58%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_paddle_ocr PASSED [ 59%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_phi4_mm PASSED [ 60%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_points PASSED [ 61%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_returns_none_for_unknown PASSED [ 62%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_vicuna PASSED [ 63%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_get_conv_template_by_model_path_whisper PASSED [ 64%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_register_and_lookup PASSED         [ 65%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_register_duplicate_raises PASSED   [ 66%]
test/registered/unit/parser/test_conversation.py::TestTemplateRegistry::test_unregistered_template_not_found PASSED [ 67%]
test/registered/unit/parser/test_conversation.py::TestGenerateEmbeddingConvs::test_multiple_items PASSED        [ 68%]
test/registered/unit/parser/test_conversation.py::TestGenerateEmbeddingConvs::test_none_text PASSED             [ 69%]
test/registered/unit/parser/test_conversation.py::TestGenerateEmbeddingConvs::test_text_only PASSED             [ 70%]
test/registered/unit/parser/test_conversation.py::TestGenerateEmbeddingConvs::test_with_image PASSED            [ 71%]
test/registered/unit/parser/test_conversation.py::TestGenerateEmbeddingConvs::test_with_image_and_video PASSED  [ 72%]
test/registered/unit/parser/test_conversation.py::TestGenerateEmbeddingConvs::test_with_video PASSED            [ 73%]
test/registered/unit/parser/test_conversation.py::TestGetFullMultimodalTextPrompt::test_adds_missing_image_tokens PASSED [ 74%]
test/registered/unit/parser/test_conversation.py::TestGetFullMultimodalTextPrompt::test_all_tokens_present_no_addition PASSED [ 75%]
test/registered/unit/parser/test_conversation.py::TestGetFullMultimodalTextPrompt::test_more_tokens_than_data_raises PASSED [ 76%]
test/registered/unit/parser/test_conversation.py::TestGetFullMultimodalTextPrompt::test_preserves_existing_tokens PASSED [ 77%]
test/registered/unit/parser/test_conversation.py::TestGetFullMultimodalTextPrompt::test_tokens_joined_with_newline PASSED [ 78%]
test/registered/unit/parser/test_conversation.py::TestGetFullMultimodalTextPrompt::test_video_tokens PASSED     [ 79%]
test/registered/unit/parser/test_conversation.py::TestGetFullMultimodalTextPrompt::test_zero_count_with_no_tokens PASSED [ 80%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_assistant_invalid_list_raises PASSED [ 81%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_assistant_message_as_list PASSED   [ 82%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_deepseek_vl2_modality_supplement PASSED [ 83%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_multi_turn_conversation PASSED     [ 84%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_simple_user_message PASSED         [ 85%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_string_messages_raises PASSED      [ 86%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_system_message_as_list PASSED      [ 87%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_system_message_invalid_list_raises PASSED [ 88%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_system_then_user PASSED            [ 89%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_unknown_role_raises PASSED         [ 90%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_user_message_image_at_prefix PASSED [ 91%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_user_message_many_images_adds_newline PASSED [ 92%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_user_message_with_audio PASSED     [ 93%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_user_message_with_image PASSED     [ 94%]
test/registered/unit/parser/test_conversation.py::TestGenerateChatConv::test_user_message_with_video PASSED     [ 95%]
test/registered/unit/parser/test_conversation.py::TestGetModelType::test_config_without_model_type_returns_none PASSED [ 96%]
test/registered/unit/parser/test_conversation.py::TestGetModelType::test_invalid_json_returns_none PASSED       [ 97%]
test/registered/unit/parser/test_conversation.py::TestGetModelType::test_nonexistent_path_returns_none PASSED   [ 98%]
test/registered/unit/parser/test_conversation.py::TestGetModelType::test_valid_config_returns_model_type PASSED [100%]

================================================== warnings summary ===================================================
../conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428
  /scratch/zijunga1/conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428: PytestConfigWarning: Unknown config option: asyncio_mode
  
    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

<frozen importlib._bootstrap>:488
  <frozen importlib._bootstrap>:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute

<frozen importlib._bootstrap>:488
  <frozen importlib._bootstrap>:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
===================================== 99 passed, 3 warnings in 135.28s (0:02:15) ======================================
sys:1: DeprecationWarning: builtin type swigvarlink has no __module__ attribute
# command
pytest test/registered/unit/parser/test_harmony_parser.py -v
# output
================================================= test session starts =================================================
platform linux -- Python 3.12.13, pytest-9.0.2, pluggy-1.6.0 -- /scratch/zijunga1/conda_envs/sglang/bin/python3
cachedir: .pytest_cache
rootdir: /scratch/zijunga1/sglang/test
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.0.0
collected 73 items                                                                                                    

test/registered/unit/parser/test_harmony_parser.py::TestEvent::test_init PASSED                                 [  1%]
test/registered/unit/parser/test_harmony_parser.py::TestToken::test_init PASSED                                 [  2%]
test/registered/unit/parser/test_harmony_parser.py::TestPrefixHold::test_empty_text PASSED                      [  4%]
test/registered/unit/parser/test_harmony_parser.py::TestPrefixHold::test_exact_token_match PASSED               [  5%]
test/registered/unit/parser/test_harmony_parser.py::TestPrefixHold::test_multiple_potential_matches PASSED      [  6%]
test/registered/unit/parser/test_harmony_parser.py::TestPrefixHold::test_no_matching_prefixes PASSED            [  8%]
test/registered/unit/parser/test_harmony_parser.py::TestPrefixHold::test_partial_token_suffix PASSED            [  9%]
test/registered/unit/parser/test_harmony_parser.py::TestIterTokens::test_all_structural_tokens PASSED           [ 10%]
test/registered/unit/parser/test_harmony_parser.py::TestIterTokens::test_empty_text PASSED                      [ 12%]
test/registered/unit/parser/test_harmony_parser.py::TestIterTokens::test_mixed_content PASSED                   [ 13%]
test/registered/unit/parser/test_harmony_parser.py::TestIterTokens::test_plain_text PASSED                      [ 15%]
test/registered/unit/parser/test_harmony_parser.py::TestIterTokens::test_single_token PASSED                    [ 16%]
test/registered/unit/parser/test_harmony_parser.py::TestIterTokens::test_unknown_token_middle PASSED            [ 17%]
test/registered/unit/parser/test_harmony_parser.py::TestIterTokens::test_unknown_token_partial_suffix PASSED    [ 19%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_extract_channel_type PASSED     [ 20%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_init PASSED                     [ 21%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_commentary_filler_between_blocks PASSED [ 23%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_complex_sequence PASSED   [ 24%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_empty_content_blocks PASSED [ 26%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_incomplete_block PASSED   [ 27%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_partial_token_suffix PASSED [ 28%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_single_analysis_block PASSED [ 30%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_single_commentary_block PASSED [ 31%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_single_final_block PASSED [ 32%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_tool_call_analysis PASSED [ 34%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_tool_call_commentary PASSED [ 35%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_tool_response_message PASSED [ 36%]
test/registered/unit/parser/test_harmony_parser.py::TestCanonicalStrategy::test_parse_with_interspersed_text PASSED [ 38%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_init PASSED                          [ 39%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_analysis_no_space_after_header PASSED [ 41%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_analysis_only PASSED           [ 42%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_analysis_then_final PASSED     [ 43%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_case_insensitive PASSED        [ 45%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_commentary_then_final PASSED   [ 46%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_final_only PASSED              [ 47%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_incomplete_assistantfinal PASSED [ 49%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_partial_analysis_streaming PASSED [ 50%]
test/registered/unit/parser/test_harmony_parser.py::TestTextStrategy::test_parse_plain_text_fallback PASSED     [ 52%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_init PASSED                         [ 53%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_repetitive_tool_calls_with_commentary_filler PASSED [ 54%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_strategy_selection_canonical PASSED [ 56%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_strategy_selection_delayed PASSED   [ 57%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_strategy_selection_text PASSED      [ 58%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_streaming_canonical_format PASSED   [ 60%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_streaming_commentary_filler PASSED  [ 61%]
test/registered/unit/parser/test_harmony_parser.py::TestHarmonyParser::test_streaming_text_format PASSED        [ 63%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_built_in_tool_call PASSED    [ 64%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_complete_reasoning_flow PASSED [ 65%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_preamble_sequence PASSED     [ 67%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_streaming_property_canonical PASSED [ 68%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_streaming_property_text PASSED [ 69%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_text_fallback_formats PASSED [ 71%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_tool_call_sequence PASSED    [ 72%]
test/registered/unit/parser/test_harmony_parser.py::TestIntegrationScenarios::test_tool_response_handling PASSED [ 73%]
test/registered/unit/parser/test_harmony_parser.py::TestEdgeCases::test_consecutive_blocks_same_type PASSED     [ 75%]
test/registered/unit/parser/test_harmony_parser.py::TestEdgeCases::test_empty_input PASSED                      [ 76%]
test/registered/unit/parser/test_harmony_parser.py::TestEdgeCases::test_malformed_channel_headers PASSED        [ 78%]
test/registered/unit/parser/test_harmony_parser.py::TestEdgeCases::test_mixed_unknown_tokens PASSED             [ 79%]
test/registered/unit/parser/test_harmony_parser.py::TestEdgeCases::test_streaming_whitespace_preservation PASSED [ 80%]
test/registered/unit/parser/test_harmony_parser.py::TestEdgeCases::test_whitespace_preservation PASSED          [ 82%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_canonical_call_with_text_commentary_after PASSED [ 83%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_canonical_commentary_filler_after_call PASSED [ 84%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_canonical_incomplete_block_returns_partial PASSED [ 86%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_canonical_incomplete_parse_block_no_end PASSED [ 87%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_canonical_return_without_final PASSED [ 89%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_canonical_standalone_end_token_filtered PASSED [ 90%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_canonical_standalone_structural_token_filtered PASSED [ 91%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_iter_tokens_unknown_at_end_no_next_marker PASSED [ 93%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_iter_tokens_unknown_token_no_closing PASSED [ 94%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_prefix_hold_with_empty_token_in_list PASSED [ 95%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_text_strategy_commentary_channel PASSED [ 97%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_text_strategy_commentary_only PASSED [ 98%]
test/registered/unit/parser/test_harmony_parser.py::TestAdditionalEdgeCases::test_text_strategy_commentary_with_hold PASSED [100%]

================================================== warnings summary ===================================================
../conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428
  /scratch/zijunga1/conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428: PytestConfigWarning: Unknown config option: asyncio_mode
  
    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
====================================== 73 passed, 1 warning in 96.26s (0:01:36) =======================================
# command
pytest test/registered/unit/parser/test_jinja_template_utils.py -v
# output
================================================= test session starts =================================================
platform linux -- Python 3.12.13, pytest-9.0.2, pluggy-1.6.0 -- /scratch/zijunga1/conda_envs/sglang/bin/python3
cachedir: .pytest_cache
rootdir: /scratch/zijunga1/sglang/test
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.0.0
collected 22 items                                                                                                    

test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_deepseek_string_format PASSED [  4%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_empty_template PASSED [  9%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_invalid_template PASSED [ 13%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_llama4_openai_format PASSED [ 18%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_m_content_pattern PASSED [ 22%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_msg_content_pattern PASSED [ 27%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_msg_content_without_multimodal_keywords PASSED [ 31%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_template_no_content_loop_is_string PASSED [ 36%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_template_with_filter PASSED [ 40%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_template_with_is_test PASSED [ 45%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_detect_template_with_slice PASSED [ 50%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_already_string PASSED [ 54%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_filter_none_values PASSED [ 59%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_invalid_format_raises PASSED [ 63%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_openai_format PASSED [ 68%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_string_format PASSED [ 72%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_v32_encoding PASSED [ 77%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_video_with_max_dynamic_patch PASSED [ 81%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_video_with_modalities PASSED [ 86%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_with_audio PASSED [ 90%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_with_modalities PASSED [ 95%]
test/registered/unit/parser/test_jinja_template_utils.py::TestTemplateContentFormatDetection::test_process_content_with_video PASSED [100%]

================================================== warnings summary ===================================================
../conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428
  /scratch/zijunga1/conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428: PytestConfigWarning: Unknown config option: asyncio_mode
  
    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
====================================== 22 passed, 1 warning in 92.71s (0:01:32) =======================================
# command
pytest test/registered/unit/parser/test_reasoning_parser.py -v
# output
================================================= test session starts =================================================
platform linux -- Python 3.12.13, pytest-9.0.2, pluggy-1.6.0 -- /scratch/zijunga1/conda_envs/sglang/bin/python3
cachedir: .pytest_cache
rootdir: /scratch/zijunga1/sglang/test
configfile: pytest.ini
plugins: anyio-4.12.1, cov-7.0.0
collected 95 items                                                                                                    

test/registered/unit/parser/test_reasoning_parser.py::TestStreamingParseResult::test_init_default PASSED        [  1%]
test/registered/unit/parser/test_reasoning_parser.py::TestStreamingParseResult::test_init_with_values PASSED    [  2%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_detect_and_parse_complete_reasoning PASSED [  3%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_detect_and_parse_force_reasoning PASSED [  4%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_detect_and_parse_normal_text PASSED [  5%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_detect_and_parse_with_start_token PASSED [  6%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_init PASSED         [  7%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_parse_streaming_increment_complete_start PASSED [  8%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_parse_streaming_increment_end_token PASSED [  9%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_parse_streaming_increment_mixed_content PASSED [ 10%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_parse_streaming_increment_no_stream_reasoning PASSED [ 11%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_parse_streaming_increment_normal PASSED [ 12%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_parse_streaming_increment_partial_token PASSED [ 13%]
test/registered/unit/parser/test_reasoning_parser.py::TestBaseReasoningFormatDetector::test_parse_streaming_increment_reasoning_content PASSED [ 14%]
test/registered/unit/parser/test_reasoning_parser.py::TestDeepSeekR1Detector::test_detect_and_parse_r1_format PASSED [ 15%]
test/registered/unit/parser/test_reasoning_parser.py::TestDeepSeekR1Detector::test_detect_and_parse_with_end_token PASSED [ 16%]
test/registered/unit/parser/test_reasoning_parser.py::TestDeepSeekR1Detector::test_detect_and_parse_with_start_token PASSED [ 17%]
test/registered/unit/parser/test_reasoning_parser.py::TestDeepSeekR1Detector::test_init PASSED                  [ 18%]
test/registered/unit/parser/test_reasoning_parser.py::TestDeepSeekR1Detector::test_init_no_stream_reasoning PASSED [ 20%]
test/registered/unit/parser/test_reasoning_parser.py::TestQwen3Detector::test_detect_and_parse_qwen3_format PASSED [ 21%]
test/registered/unit/parser/test_reasoning_parser.py::TestQwen3Detector::test_detect_and_parse_without_thinking PASSED [ 22%]
test/registered/unit/parser/test_reasoning_parser.py::TestQwen3Detector::test_init PASSED                       [ 23%]
test/registered/unit/parser/test_reasoning_parser.py::TestQwen3ForcedReasoningDetector::test_detect_and_parse_qwen3_forced_reasoning_format PASSED [ 24%]
test/registered/unit/parser/test_reasoning_parser.py::TestQwen3ForcedReasoningDetector::test_detect_and_parse_with_start_token PASSED [ 25%]
test/registered/unit/parser/test_reasoning_parser.py::TestQwen3ForcedReasoningDetector::test_init PASSED        [ 26%]
test/registered/unit/parser/test_reasoning_parser.py::TestQwen3ForcedReasoningDetector::test_streaming_qwen3_forced_reasoning_format PASSED [ 27%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiDetector::test_detect_and_parse_kimi_format PASSED [ 28%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiDetector::test_detect_and_parse_kimi_no_thinking PASSED [ 29%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiDetector::test_init PASSED                        [ 30%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiDetector::test_streaming_kimi_format PASSED       [ 31%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiK2Detector::test_detect_and_parse_tool_interrupt PASSED [ 32%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiK2Detector::test_init PASSED                      [ 33%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiK2Detector::test_streaming_after_interrupt_is_normal PASSED [ 34%]
test/registered/unit/parser/test_reasoning_parser.py::TestKimiK2Detector::test_streaming_tool_interrupt PASSED  [ 35%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_detect_and_parse_multiple_tool_calls_find PASSED [ 36%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_detect_and_parse_normal_reasoning PASSED [ 37%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_detect_and_parse_normal_text_only PASSED [ 38%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_detect_and_parse_tool_interrupt PASSED [ 40%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_detect_and_parse_truncated_reasoning PASSED [ 41%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_forced_reasoning_mode PASSED      [ 42%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_init PASSED                       [ 43%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_streaming_empty_reasoning_with_tool PASSED [ 44%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_streaming_no_stream_reasoning PASSED [ 45%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_streaming_normal_flow PASSED      [ 46%]
test/registered/unit/parser/test_reasoning_parser.py::TestGlm45Detector::test_streaming_tool_interrupt_split_tokens PASSED [ 47%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_detect_and_parse_complete_reasoning PASSED [ 48%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_detect_and_parse_no_thinking PASSED [ 49%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_detect_and_parse_reasoning_only PASSED [ 50%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_force_nonempty_content_no_swap_when_normal_text_exists PASSED [ 51%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_force_nonempty_content_no_thinking_tokens PASSED [ 52%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_force_nonempty_content_swaps_when_no_normal_text PASSED [ 53%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_force_nonempty_content_truncated_reasoning PASSED [ 54%]
test/registered/unit/parser/test_reasoning_parser.py::TestNemotron3Detector::test_init PASSED                   [ 55%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_case_insensitive_model_type PASSED [ 56%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_glm45_tool_interruption PASSED  [ 57%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_init_invalid_model PASSED       [ 58%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_init_no_model PASSED            [ 60%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_init_valid_model PASSED         [ 61%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_kimik2_tool_interruption PASSED [ 62%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_parse_non_stream PASSED         [ 63%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_parse_stream_chunk PASSED       [ 64%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParser::test_stream_reasoning_parameter PASSED [ 65%]
test/registered/unit/parser/test_reasoning_parser.py::TestIntegrationScenarios::test_deepseek_r1_complete_response PASSED [ 66%]
test/registered/unit/parser/test_reasoning_parser.py::TestIntegrationScenarios::test_empty_reasoning_blocks PASSED [ 67%]
test/registered/unit/parser/test_reasoning_parser.py::TestIntegrationScenarios::test_kimi_streaming_scenario PASSED [ 68%]
test/registered/unit/parser/test_reasoning_parser.py::TestIntegrationScenarios::test_qwen3_forced_reasoning_complete_response PASSED [ 69%]
test/registered/unit/parser/test_reasoning_parser.py::TestIntegrationScenarios::test_qwen3_forced_reasoning_streaming_scenario PASSED [ 70%]
test/registered/unit/parser/test_reasoning_parser.py::TestIntegrationScenarios::test_qwen3_streaming_scenario PASSED [ 71%]
test/registered/unit/parser/test_reasoning_parser.py::TestBufferLossBugFix::test_edge_case_exact_token_match PASSED [ 72%]
test/registered/unit/parser/test_reasoning_parser.py::TestBufferLossBugFix::test_multiple_partial_fragments PASSED [ 73%]
test/registered/unit/parser/test_reasoning_parser.py::TestBufferLossBugFix::test_partial_end_tag_buffer_loss_bug PASSED [ 74%]
test/registered/unit/parser/test_reasoning_parser.py::TestBufferLossBugFix::test_partial_end_tag_in_reasoning_mode PASSED [ 75%]
test/registered/unit/parser/test_reasoning_parser.py::TestBufferLossBugFix::test_partial_start_tag_buffer_preservation PASSED [ 76%]
test/registered/unit/parser/test_reasoning_parser.py::TestGptOssDetector::test_detect_and_parse_normal_only PASSED [ 77%]
test/registered/unit/parser/test_reasoning_parser.py::TestGptOssDetector::test_detect_and_parse_with_analysis_and_final PASSED [ 78%]
test/registered/unit/parser/test_reasoning_parser.py::TestGptOssDetector::test_streaming_analysis_then_final PASSED [ 80%]
test/registered/unit/parser/test_reasoning_parser.py::TestGptOssDetector::test_streaming_with_tool_call PASSED  [ 81%]
test/registered/unit/parser/test_reasoning_parser.py::TestMiniMaxAppendThinkDetector::test_detect_and_parse_prepends_think PASSED [ 82%]
test/registered/unit/parser/test_reasoning_parser.py::TestMiniMaxAppendThinkDetector::test_streaming_first_chunk_prepends_think PASSED [ 83%]
test/registered/unit/parser/test_reasoning_parser.py::TestMiniMaxAppendThinkDetector::test_streaming_second_chunk_no_prepend PASSED [ 84%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParserAdvanced::test_continue_final_message_with_request PASSED [ 85%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParserAdvanced::test_detector_map_aliases PASSED [ 86%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParserAdvanced::test_force_nonempty_content_via_chat_template_kwargs PASSED [ 87%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParserAdvanced::test_gpt_oss_model_type PASSED [ 88%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParserAdvanced::test_minimax_append_think_model_type PASSED [ 89%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParserAdvanced::test_minimax_forces_reasoning PASSED [ 90%]
test/registered/unit/parser/test_reasoning_parser.py::TestReasoningParserAdvanced::test_qwen3_thinking_forces_reasoning PASSED [ 91%]
test/registered/unit/parser/test_reasoning_parser.py::TestContinueFinalMessage::test_continue_detect_parse_think_start_in_prev_but_end_also_in_prev PASSED [ 92%]
test/registered/unit/parser/test_reasoning_parser.py::TestContinueFinalMessage::test_continue_detect_parse_with_end_in_previous PASSED [ 93%]
test/registered/unit/parser/test_reasoning_parser.py::TestContinueFinalMessage::test_continue_end_in_previous_new_text_has_start_but_no_end PASSED [ 94%]
test/registered/unit/parser/test_reasoning_parser.py::TestContinueFinalMessage::test_continue_with_think_end_in_previous PASSED [ 95%]
test/registered/unit/parser/test_reasoning_parser.py::TestContinueFinalMessage::test_continue_with_think_start_in_previous PASSED [ 96%]
test/registered/unit/parser/test_reasoning_parser.py::TestContinueFinalMessage::test_streaming_returns_empty_when_in_reasoning_and_end_buffered PASSED [ 97%]
test/registered/unit/parser/test_reasoning_parser.py::TestGptOssDetectorToolCall::test_detect_and_parse_tool_call_raw_text PASSED [ 98%]
test/registered/unit/parser/test_reasoning_parser.py::TestGptOssDetectorToolCall::test_streaming_tool_call_raw_text PASSED [100%]

================================================== warnings summary ===================================================
../conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428
  /scratch/zijunga1/conda_envs/sglang/lib/python3.12/site-packages/_pytest/config/__init__.py:1428: PytestConfigWarning: Unknown config option: asyncio_mode
  
    self._warn_or_fail_if_strict(f"Unknown config option: {key}\n")

<frozen importlib._bootstrap>:488
  <frozen importlib._bootstrap>:488: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute

<frozen importlib._bootstrap>:488
  <frozen importlib._bootstrap>:488: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
====================================== 95 passed, 3 warnings in 99.94s (0:01:39) ======================================
sys:1: DeprecationWarning: builtin type swigvarlink has no __module__ attribute

@gemini-code-assist
Copy link
Copy Markdown
Contributor

Summary of Changes

Hello, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

This pull request substantially improves the unit test coverage for the srt/parser module, which is crucial for ensuring the reliability and correctness of prompt parsing and conversation handling logic. By adding a comprehensive suite of new tests and extending existing ones, the changes aim to prevent regressions and validate various parsing behaviors, including multimodal content and different conversation styles, in an isolated and efficient manner.

Highlights

  • Enhanced Test Coverage: Significantly increased unit test coverage for the srt/parser module, adding 304 new tests across five files.
  • New Test Files: Introduced new dedicated test files for code_completion_parser.py and conversation.py, achieving 100% coverage for these modules.
  • Extended Existing Tests: Expanded test suites for harmony_parser.py, jinja_template_utils.py, and reasoning_parser.py to improve robustness.
  • Realistic Testing Environment: Tests are designed to run without requiring server launches or model weight loading, utilizing real Pydantic objects and temporary files for efficiency.

🧠 New Feature in Public Preview: You can now enable Memory to help Gemini Code Assist learn from your team's feedback. This makes future code reviews more consistent and personalized to your project's style. Click here to enable Memory in your admin console.

Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for GitHub and other Google products, sign up here.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

Copy link
Copy Markdown
Contributor

@gemini-code-assist gemini-code-assist Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request significantly improves the test coverage for the srt/parser module by adding a comprehensive suite of unit tests. The new tests are well-structured, cover a wide range of scenarios including many edge cases, and follow good testing practices. The modifications to existing test files also represent clear improvements. I have one suggestion to make the tests even more robust and idiomatic by using unittest.mock.patch for managing global state in one of the new test files. Overall, this is a high-quality contribution that enhances the project's reliability.

Comment thread test/registered/unit/parser/test_code_completion_parser.py Outdated
@Zijun9 Zijun9 force-pushed the test/add-unit-tests-for-srt-parser branch from 88bccb0 to 42627c7 Compare March 20, 2026 03:12
@ispobock
Copy link
Copy Markdown
Collaborator

ispobock commented Mar 20, 2026

/tag-and-rerun-ci

Comment thread test/registered/unit/parser/test_reasoning_parser.py Outdated
Comment thread test/registered/unit/parser/test_code_completion_parser.py Outdated
@Zijun9 Zijun9 requested a review from ispobock March 22, 2026 01:56
@ispobock ispobock merged commit 4dbe425 into sgl-project:main Mar 23, 2026
101 of 107 checks passed
@Zijun9 Zijun9 deleted the test/add-unit-tests-for-srt-parser branch March 23, 2026 16:27
adityavaid pushed a commit to adityavaid/sglang that referenced this pull request Mar 24, 2026
0-693 pushed a commit to 0-693/sglang that referenced this pull request Mar 25, 2026
JustinTong0323 pushed a commit to JustinTong0323/sglang that referenced this pull request Apr 7, 2026
yhyang201 pushed a commit to yhyang201/sglang that referenced this pull request Apr 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants