aboutsummaryrefslogtreecommitdiff
path: root/src/ghostty
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-04-25 04:16:00 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-04-25 04:16:44 +0300
commitddb3e04f92ebc924dd8355df6510781caf498a02 (patch)
treeda79533c2375bd76417b8237f5daf0dc78cd0511 /src/ghostty
parentfba05502cdf235eedc057c3857fdc95e8fbd781d (diff)
test: add libghostty upgrade contract coverage
Diffstat (limited to 'src/ghostty')
-rw-r--r--src/ghostty/mod.rs78
1 files changed, 78 insertions, 0 deletions
diff --git a/src/ghostty/mod.rs b/src/ghostty/mod.rs
index 75e600b8..99923789 100644
--- a/src/ghostty/mod.rs
+++ b/src/ghostty/mod.rs
@@ -1163,6 +1163,51 @@ mod tests {
}
}
+ fn build_info_bool(data: ffi::GhosttyBuildInfo) -> bool {
+ let mut out = false;
+ unsafe {
+ ffi::ghostty_build_info(data, (&mut out as *mut bool).cast())
+ .into_result()
+ .unwrap();
+ }
+ out
+ }
+
+ fn build_info_optimize() -> ffi::GhosttyOptimizeMode {
+ let mut out = ffi::GhosttyOptimizeMode_GHOSTTY_OPTIMIZE_DEBUG;
+ unsafe {
+ ffi::ghostty_build_info(
+ ffi::GhosttyBuildInfo_GHOSTTY_BUILD_INFO_OPTIMIZE,
+ (&mut out as *mut ffi::GhosttyOptimizeMode).cast(),
+ )
+ .into_result()
+ .unwrap();
+ }
+ out
+ }
+
+ #[test]
+ fn build_info_contract_matches_expected_vendored_features() {
+ let _simd = build_info_bool(ffi::GhosttyBuildInfo_GHOSTTY_BUILD_INFO_SIMD);
+ let _tmux_control_mode =
+ build_info_bool(ffi::GhosttyBuildInfo_GHOSTTY_BUILD_INFO_TMUX_CONTROL_MODE);
+ let kitty_graphics =
+ build_info_bool(ffi::GhosttyBuildInfo_GHOSTTY_BUILD_INFO_KITTY_GRAPHICS);
+ assert!(
+ !kitty_graphics,
+ "current herdr vendor must keep Kitty graphics disabled until image handling is explicit"
+ );
+
+ let optimize = build_info_optimize();
+ assert!(matches!(
+ optimize,
+ ffi::GhosttyOptimizeMode_GHOSTTY_OPTIMIZE_DEBUG
+ | ffi::GhosttyOptimizeMode_GHOSTTY_OPTIMIZE_RELEASE_SAFE
+ | ffi::GhosttyOptimizeMode_GHOSTTY_OPTIMIZE_RELEASE_SMALL
+ | ffi::GhosttyOptimizeMode_GHOSTTY_OPTIMIZE_RELEASE_FAST
+ ));
+ }
+
#[test]
fn focus_encoding_matches_expected_sequences() {
assert_eq!(encode_focus(FocusEvent::Gained).unwrap(), b"\x1b[I");
@@ -1282,6 +1327,39 @@ mod tests {
}
#[test]
+ fn active_screen_and_cursor_visibility_contract() {
+ let mut terminal = Terminal::new(12, 3, 0).unwrap();
+ let mut render_state = RenderState::new().unwrap();
+
+ terminal.write(b"primary");
+ assert_eq!(terminal.active_screen().unwrap(), ActiveScreen::Primary);
+ assert_eq!(
+ terminal.read_text_viewport((0, 0), (6, 0), false).unwrap(),
+ "primary"
+ );
+
+ render_state.update(&terminal).unwrap();
+ assert_eq!(render_state.cursor_visible().unwrap(), true);
+ terminal.write(b"\x1b[?25l");
+ render_state.update(&terminal).unwrap();
+ assert_eq!(render_state.cursor_visible().unwrap(), false);
+
+ terminal.write(b"\x1b[?1049h\x1b[HALT");
+ assert_eq!(terminal.active_screen().unwrap(), ActiveScreen::Alternate);
+ assert_eq!(
+ terminal.read_text_viewport((0, 0), (2, 0), false).unwrap(),
+ "ALT"
+ );
+
+ terminal.write(b"\x1b[?1049l");
+ assert_eq!(terminal.active_screen().unwrap(), ActiveScreen::Primary);
+ assert_eq!(
+ terminal.read_text_viewport((0, 0), (6, 0), false).unwrap(),
+ "primary"
+ );
+ }
+
+ #[test]
fn terminal_and_render_state_smoke_test() {
let mut terminal = Terminal::new(8, 3, 100).unwrap();
assert_eq!(terminal.cols().unwrap(), 8);