fix(terminal): 缩放/高频输出冻结修复(reflow 节流 + 写入批量化),新增诊断日志(7 天滚动 + 开关),v1.0.26
CI / typecheck + test + build (windows) (push) Canceled after 0s
CI / typecheck + test + build (windows) (push) Canceled after 0s
This commit is contained in:
1 parent
fd4f1a3956
commit
bca7033689
29 files changed
+728
-12
No files matched your search
@@ -0,0 +1,49 @@
|
||||
/**
|
||||
* Refit-throttle self-test (refit-throttle.mjs).
|
||||
*
|
||||
* `src/renderer/src/terminal/fitThrottle.ts` decides whether a resize event
|
||||
* may reflow now or must wait. The contract it pins:
|
||||
*
|
||||
* - `lastFitAt <= 0` (no fit recorded, e.g. a freshly bound session) always
|
||||
* fits immediately — the pty spawns at a placeholder size and the shell
|
||||
* may already be drawing, so the first fit must never wait;
|
||||
* - inside the throttle window the answer is the REMAINING wait (feeds the
|
||||
* trailing timer that lands the final fit at the settled size);
|
||||
* - at and past the window boundary the fit runs now;
|
||||
* - the window length is configurable so the test does not depend on the
|
||||
* production constant's value.
|
||||
*
|
||||
* Direct .ts import (no esbuild bundle needed): the module has no imports and
|
||||
* no runtime-only TS syntax, and Node >= 22.18 strips types itself.
|
||||
* Run: node tests/refit-throttle.mjs (must exit 0)
|
||||
*/
|
||||
import { FIT_REFLOW_THROTTLE_MS, refitDelay } from '../src/renderer/src/terminal/fitThrottle.ts'
|
||||
|
||||
let failed = 0
|
||||
const ok = (cond, msg) => {
|
||||
console.log(` ${cond ? 'ok' : 'FAIL'}: ${msg}`)
|
||||
if (!cond) failed += 1
|
||||
}
|
||||
|
||||
console.log('the first fit never waits')
|
||||
ok(refitDelay(0, 1000) === 0, 'lastFitAt = 0 fits immediately')
|
||||
ok(refitDelay(-1, 1000) === 0, 'a negative marker also fits immediately')
|
||||
|
||||
console.log('inside the window the answer is the remaining wait')
|
||||
ok(refitDelay(1000, 1000) === FIT_REFLOW_THROTTLE_MS, 'a fit at the same tick waits the full window')
|
||||
ok(refitDelay(1000, 1100) === FIT_REFLOW_THROTTLE_MS - 100, 'mid-window returns the remainder')
|
||||
ok(refitDelay(1000, 1000 + FIT_REFLOW_THROTTLE_MS - 1) === 1, 'one ms before the boundary waits 1ms')
|
||||
|
||||
console.log('at and past the boundary the fit runs now')
|
||||
ok(refitDelay(1000, 1000 + FIT_REFLOW_THROTTLE_MS) === 0, 'exactly at the boundary fits')
|
||||
ok(refitDelay(1000, 100000) === 0, 'long after the last fit fits')
|
||||
|
||||
console.log('the window length is a parameter')
|
||||
ok(refitDelay(1000, 1050, 150) === 100, 'explicit throttleMs is honored')
|
||||
ok(refitDelay(1000, 1150, 150) === 0, 'explicit window boundary fits')
|
||||
|
||||
if (failed > 0) {
|
||||
console.error(`\n[refit-throttle] ${failed} check(s) FAILED`)
|
||||
process.exit(1)
|
||||
}
|
||||
console.log('\n[refit-throttle] ALL CHECKS PASSED')
|
||||
Reference in new issue
Block a user