| """Messaging-specific assertions built on neutral Anthropic stream contracts.""" |
|
|
| from free_claude_code.core.anthropic import AnthropicStreamLedger |
| from free_claude_code.core.anthropic.stream_contracts import ( |
| assert_anthropic_stream_contract, |
| has_tool_use, |
| parse_sse_text, |
| ) |
| from free_claude_code.messaging.event_parser import parse_cli_event |
| from free_claude_code.messaging.transcript import RenderCtx, TranscriptBuffer |
|
|
|
|
| def test_thinking_tool_text_and_transcript_order_contract() -> None: |
| builder = AnthropicStreamLedger("msg_contract", "contract-model") |
| chunks = [builder.message_start()] |
| chunks.extend(builder.ensure_thinking_block()) |
| chunks.append(builder.emit_thinking_delta("inspect first")) |
| chunks.extend(builder.close_content_blocks()) |
| tool_block_index = builder.blocks.allocate_index() |
| chunks.append( |
| builder.content_block_start( |
| tool_block_index, "tool_use", id="toolu_1", name="Read" |
| ) |
| ) |
| chunks.append( |
| builder.content_block_delta( |
| tool_block_index, "input_json_delta", '{"file":"README.md"}' |
| ) |
| ) |
| chunks.append(builder.content_block_stop(tool_block_index)) |
| chunks.extend(builder.ensure_text_block()) |
| chunks.append(builder.emit_text_delta("done")) |
| chunks.extend(builder.close_all_blocks()) |
| chunks.append(builder.message_delta("end_turn", 20)) |
| chunks.append(builder.message_stop()) |
|
|
| events = parse_sse_text("".join(chunks)) |
| assert_anthropic_stream_contract(events) |
| assert has_tool_use(events) |
|
|
| transcript = TranscriptBuffer() |
| for event in events: |
| for parsed in parse_cli_event(event.data): |
| transcript.apply(parsed) |
| rendered = transcript.render(_render_ctx(), limit_chars=3900, status=None) |
| assert ( |
| rendered.find("inspect first") |
| < rendered.find("Tool call:") |
| < rendered.find("done") |
| ) |
|
|
|
|
| def _render_ctx() -> RenderCtx: |
| return RenderCtx( |
| bold=lambda s: f"*{s}*", |
| code_inline=lambda s: f"`{s}`", |
| escape_code=lambda s: s, |
| escape_text=lambda s: s, |
| render_markdown=lambda s: s, |
| ) |
|
|