test(tui): cover streaming markdown tables

This commit is contained in:
Felipe Coury
2026-04-29 12:08:07 -03:00
parent b81fff1b3c
commit bfc9223149
4 changed files with 103 additions and 3 deletions
@@ -0,0 +1,8 @@
---
source: tui/src/chatwidget/tests/status_and_layout.rs
expression: active_blob(&chat)
---
• ┌──────┬───────┐
│ Name │ Value │
├──────┼───────┤
└──────┴───────┘
@@ -928,6 +928,40 @@ async fn streaming_final_answer_keeps_task_running_state() {
assert!(!chat.bottom_pane.quit_shortcut_hint_visible());
}
#[tokio::test]
async fn streaming_markdown_tail_updates_in_place_until_next_block_stabilizes_it() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
chat.on_task_started();
chat.on_agent_message_delta("First paragraph\n".to_string());
assert_eq!(drain_insert_history(&mut rx).len(), 0);
assert_eq!(active_blob(&chat), "• First paragraph\n");
chat.on_agent_message_delta("\nSecond paragraph\n".to_string());
chat.on_commit_tick();
let inserted = drain_insert_history(&mut rx);
assert_eq!(inserted.len(), 1);
assert_eq!(lines_to_single_string(&inserted[0]), "• First paragraph\n");
assert_eq!(active_blob(&chat), " \n Second paragraph\n");
}
#[tokio::test]
async fn streaming_table_tail_renders_from_complete_lines_only() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
chat.on_task_started();
chat.on_agent_message_delta("| Name | Value |\n".to_string());
assert_eq!(drain_insert_history(&mut rx).len(), 0);
assert_eq!(active_blob(&chat), "• | Name | Value |\n");
chat.on_agent_message_delta("| --- | --- |\n".to_string());
assert_eq!(drain_insert_history(&mut rx).len(), 0);
assert_chatwidget_snapshot!("streaming_table_tail_active", active_blob(&chat));
chat.on_agent_message_delta("| A | 1 |".to_string());
assert_chatwidget_snapshot!("streaming_table_tail_active", active_blob(&chat));
}
#[tokio::test]
async fn idle_commit_ticks_do_not_restore_status_without_commentary_completion() {
let (mut chat, mut rx, _op_rx) = make_chatwidget_manual(/*model_override*/ None).await;
+54
View File
@@ -56,6 +56,59 @@ fn paragraph_multiple() {
);
}
#[test]
fn table_renders_as_box() {
let text = render_markdown_text("| Name | Value |\n| --- | --- |\n| A | 1 |\n");
assert_eq!(
plain_lines(&text),
vec![
"┌──────┬───────┐",
"│ Name │ Value │",
"├──────┼───────┤",
"│ A │ 1 │",
"└──────┴───────┘",
],
);
}
#[test]
fn table_respects_column_alignment() {
let text = render_markdown_text("| Left | Center | Right |\n| :--- | :---: | ---: |\n| a | b | c |\n");
assert_eq!(
plain_lines(&text),
vec![
"┌──────┬────────┬───────┐",
"│ Left │ Center │ Right │",
"├──────┼────────┼───────┤",
"│ a │ b │ c │",
"└──────┴────────┴───────┘",
],
);
}
#[test]
fn narrow_table_stays_boxed_even_when_it_overflows() {
let text = render_markdown_text_with_width_and_cwd(
"| Name | Description |\n| --- | --- |\n| Alpha | a value that wraps |\n",
Some(20),
/*cwd*/ None,
);
assert_eq!(
plain_lines(&text),
vec![
"┌───────┬─────────────┐",
"│ Name │ Description │",
"├───────┼─────────────┤",
"│ Alpha │ a value │",
"│ │ that wraps │",
"└───────┴─────────────┘",
],
);
}
#[test]
fn headings() {
let md = "# Heading 1\n## Heading 2\n### Heading 3\n#### Heading 4\n##### Heading 5\n###### Heading 6\n";
@@ -1203,6 +1256,7 @@ Table below (alignment test):
| Left | Center | Right |
|:-----|:------:|------:|
| a | b | c |
Inline HTML: <sup>sup</sup> and <sub>sub</sub>.
HTML block:
<div style="border:1px solid #ccc;padding:2px">inline block</div>
@@ -28,9 +28,13 @@ Image: alt text
———
Table below (alignment test):
| Left | Center | Right |
|:-----|:------:|------:|
| a | b | c |
┌──────┬────────┬───────┐
│ Left │ Center │ Right │
├──────┼────────┼───────┤
│ a │ b │ c │
└──────┴────────┴───────┘
Inline HTML: <sup>sup</sup> and <sub>sub</sub>.
HTML block:
<div style="border:1px solid #ccc;padding:2px">inline block</div>