|
255 | 255 | (should scheduled))))) |
256 | 256 |
|
257 | 257 | (ert-deftest test-ai-code-backends-infra-sync-reflow-filter-advice-vterm () |
258 | | - "Enable and disable reflow advice for vterm according to toggle." |
259 | | - (let ((handler 'ai-code-backends-infra--test-resize-vterm)) |
| 258 | + "Do not install height-only reflow advice for vterm." |
| 259 | + (let ((handler 'ai-code-backends-infra--test-resize-vterm) |
| 260 | + (ai-code-backends-infra--reflow-advised-handlers nil)) |
260 | 261 | (fset handler (lambda (&rest args) args)) |
261 | 262 | (unwind-protect |
262 | 263 | (cl-letf (((symbol-function 'ai-code-backends-infra--terminal-resize-handler) |
263 | 264 | (lambda () handler))) |
264 | 265 | (let ((ai-code-backends-infra-terminal-backend 'vterm) |
265 | 266 | (ai-code-backends-infra-prevent-reflow-glitch t)) |
266 | 267 | (ai-code-backends-infra--sync-reflow-filter-advice) |
267 | | - (should (advice-member-p #'ai-code-backends-infra--terminal-reflow-filter |
268 | | - handler))) |
| 268 | + (should-not (advice-member-p #'ai-code-backends-infra--terminal-reflow-filter |
| 269 | + handler))) |
| 270 | + (advice-add handler :around #'ai-code-backends-infra--terminal-reflow-filter) |
| 271 | + (setq ai-code-backends-infra--reflow-advised-handlers nil) |
269 | 272 | (let ((ai-code-backends-infra-terminal-backend 'vterm) |
270 | | - (ai-code-backends-infra-prevent-reflow-glitch nil)) |
| 273 | + (ai-code-backends-infra-prevent-reflow-glitch t)) |
271 | 274 | (ai-code-backends-infra--sync-reflow-filter-advice) |
272 | 275 | (should-not (advice-member-p #'ai-code-backends-infra--terminal-reflow-filter |
273 | 276 | handler)))) |
|
317 | 320 | ('vterm vterm-handler) |
318 | 321 | ('eat eat-handler) |
319 | 322 | (_ (error "Unexpected backend")))))) |
320 | | - (let ((ai-code-backends-infra-terminal-backend 'vterm) |
321 | | - (ai-code-backends-infra-prevent-reflow-glitch t)) |
322 | | - (ai-code-backends-infra--sync-reflow-filter-advice) |
323 | | - (should (advice-member-p #'ai-code-backends-infra--terminal-reflow-filter |
324 | | - vterm-handler))) |
| 323 | + (advice-add vterm-handler :around #'ai-code-backends-infra--terminal-reflow-filter) |
| 324 | + (setq ai-code-backends-infra--reflow-advised-handlers (list vterm-handler)) |
325 | 325 | (let ((ai-code-backends-infra-terminal-backend 'eat) |
326 | 326 | (ai-code-backends-infra-prevent-reflow-glitch t) |
327 | 327 | (ai-code-backends-infra-eat-preserve-position nil)) |
328 | 328 | (ai-code-backends-infra--sync-reflow-filter-advice)) |
329 | 329 | (should-not (advice-member-p #'ai-code-backends-infra--terminal-reflow-filter |
330 | | - vterm-handler))) |
| 330 | + vterm-handler)) |
| 331 | + (should (advice-member-p #'ai-code-backends-infra--terminal-reflow-filter |
| 332 | + eat-handler))) |
331 | 333 | (dolist (handler (list vterm-handler eat-handler)) |
332 | 334 | (when (advice-member-p #'ai-code-backends-infra--terminal-reflow-filter handler) |
333 | 335 | (advice-remove handler #'ai-code-backends-infra--terminal-reflow-filter)) |
|
357 | 359 | (funcall (cdr (assq 'window-width captured-entry)) 'fake-window) |
358 | 360 | (should (equal resize-call '(fake-window 4 t))))))) |
359 | 361 |
|
| 362 | +(ert-deftest test-ai-code-backends-infra-terminal-reflow-filter-ignores-non-ai-vterm-buffer () |
| 363 | + "The reflow filter should pass through non-session vterm buffers." |
| 364 | + (with-temp-buffer |
| 365 | + (rename-buffer "*vterm*" t) |
| 366 | + (let ((ai-code-backends-infra-terminal-backend 'vterm) |
| 367 | + (ai-code-backends-infra-prevent-reflow-glitch t) |
| 368 | + (original-called nil)) |
| 369 | + (cl-letf (((symbol-function 'window-list) |
| 370 | + (lambda (&rest _args) (list 'fake-window))) |
| 371 | + ((symbol-function 'window-buffer) |
| 372 | + (lambda (_window) (current-buffer)))) |
| 373 | + (should (eq (ai-code-backends-infra--terminal-reflow-filter |
| 374 | + (lambda (&rest _args) |
| 375 | + (setq original-called t) |
| 376 | + 'native-result) |
| 377 | + 'fake-arg) |
| 378 | + 'native-result)) |
| 379 | + (should original-called))))) |
| 380 | + |
| 381 | +(ert-deftest test-ai-code-backends-infra-sync-terminal-dimensions-vterm-height-change () |
| 382 | + "Vterm height changes should go through the native resize handler." |
| 383 | + (let* ((buffer (get-buffer-create "*codex[vterm-height-resize]*")) |
| 384 | + (process (start-process "ai-code-vterm-resize-test" |
| 385 | + buffer |
| 386 | + "sleep" |
| 387 | + "5")) |
| 388 | + (window 'fake-window) |
| 389 | + (height 24) |
| 390 | + (width 80) |
| 391 | + resize-calls |
| 392 | + rendered |
| 393 | + cancelled-timer) |
| 394 | + (unwind-protect |
| 395 | + (cl-letf (((symbol-function 'window-live-p) |
| 396 | + (lambda (candidate) (eq candidate window))) |
| 397 | + ((symbol-function 'get-buffer-window-list) |
| 398 | + (lambda (_buffer &rest _args) (list window))) |
| 399 | + ((symbol-function 'window-body-height) |
| 400 | + (lambda (_window) height)) |
| 401 | + ((symbol-function 'window-body-width) |
| 402 | + (lambda (_window) width)) |
| 403 | + ((symbol-function 'set-process-window-size) |
| 404 | + (lambda (&rest _args) |
| 405 | + (ert-fail "vterm sync should use the native resize handler"))) |
| 406 | + ((symbol-function 'ai-code-backends-infra--terminal-resize-handler) |
| 407 | + (lambda (&optional backend) |
| 408 | + (should (eq backend 'vterm)) |
| 409 | + (lambda (proc windows) |
| 410 | + (push (list proc windows height width) resize-calls) |
| 411 | + (cons width height)))) |
| 412 | + ((symbol-function 'cancel-timer) |
| 413 | + (lambda (timer) (setq cancelled-timer timer))) |
| 414 | + ((symbol-function 'vterm--filter) |
| 415 | + (lambda (proc data) |
| 416 | + (push (list proc data ai-code-backends-infra-vterm-anti-flicker) |
| 417 | + rendered)))) |
| 418 | + (with-current-buffer buffer |
| 419 | + (setq-local ai-code-backends-infra--session-terminal-backend 'vterm) |
| 420 | + (setq-local ai-code-backends-infra--vterm-render-timer 'mock-timer) |
| 421 | + (setq-local ai-code-backends-infra--vterm-render-queue "old-redraw-1") |
| 422 | + (ai-code-backends-infra--sync-terminal-dimensions buffer window) |
| 423 | + (setq height 18) |
| 424 | + (setq-local ai-code-backends-infra--vterm-render-queue "old-redraw-2") |
| 425 | + (ai-code-backends-infra--sync-terminal-dimensions buffer window) |
| 426 | + (should (null ai-code-backends-infra--vterm-render-timer)) |
| 427 | + (should-not ai-code-backends-infra--vterm-render-queue)) |
| 428 | + (should (eq cancelled-timer 'mock-timer)) |
| 429 | + (should (equal (nreverse resize-calls) |
| 430 | + `((,process (,window) 24 80) |
| 431 | + (,process (,window) 18 80))))) |
| 432 | + (should (equal (nreverse rendered) |
| 433 | + `((,process "old-redraw-1" nil) |
| 434 | + (,process "old-redraw-2" nil)))) |
| 435 | + (when (process-live-p process) |
| 436 | + (delete-process process)) |
| 437 | + (when (buffer-live-p buffer) |
| 438 | + (kill-buffer buffer))))) |
| 439 | + |
| 440 | +(ert-deftest test-ai-code-backends-infra-sync-terminal-dimensions-vterm-width-change () |
| 441 | + "Vterm width changes should go through the native resize handler." |
| 442 | + (let* ((buffer (get-buffer-create "*codex[vterm-width-resize]*")) |
| 443 | + (process (start-process "ai-code-vterm-width-resize-test" |
| 444 | + buffer |
| 445 | + "sleep" |
| 446 | + "5")) |
| 447 | + (window 'fake-window) |
| 448 | + (height 24) |
| 449 | + (width 80) |
| 450 | + calls) |
| 451 | + (unwind-protect |
| 452 | + (cl-letf (((symbol-function 'window-live-p) |
| 453 | + (lambda (candidate) (eq candidate window))) |
| 454 | + ((symbol-function 'get-buffer-window-list) |
| 455 | + (lambda (_buffer &rest _args) (list window))) |
| 456 | + ((symbol-function 'window-body-height) |
| 457 | + (lambda (_window) height)) |
| 458 | + ((symbol-function 'window-body-width) |
| 459 | + (lambda (_window) width)) |
| 460 | + ((symbol-function 'set-process-window-size) |
| 461 | + (lambda (&rest _args) |
| 462 | + (ert-fail "vterm sync should not call generic process sizing"))) |
| 463 | + ((symbol-function 'ai-code-backends-infra--terminal-resize-handler) |
| 464 | + (lambda (&optional backend) |
| 465 | + (should (eq backend 'vterm)) |
| 466 | + (lambda (proc windows) |
| 467 | + (push (list proc windows height width) calls) |
| 468 | + (cons width height))))) |
| 469 | + (with-current-buffer buffer |
| 470 | + (setq-local ai-code-backends-infra--session-terminal-backend 'vterm) |
| 471 | + (ai-code-backends-infra--sync-terminal-dimensions buffer window) |
| 472 | + (setq width 100) |
| 473 | + (ai-code-backends-infra--sync-terminal-dimensions buffer window)) |
| 474 | + (should (equal (nreverse calls) |
| 475 | + `((,process (,window) 24 80) |
| 476 | + (,process (,window) 24 100))))) |
| 477 | + (when (process-live-p process) |
| 478 | + (delete-process process)) |
| 479 | + (when (buffer-live-p buffer) |
| 480 | + (kill-buffer buffer))))) |
| 481 | + |
360 | 482 | (ert-deftest test-ai-code-backends-infra-sync-terminal-cursor-vterm-copy-mode () |
361 | 483 | "Show an Emacs cursor in vterm copy mode and restore terminal cursor on exit." |
362 | 484 | (with-temp-buffer |
|
0 commit comments