lotabout.skim/tests/tmux.rs
LoricAndre 9d12e9d420
feat: windows support (#1010)
* wip: windows support

* feat: windows support

* feat: add windows target to CI

* chore: generate completions & manpage

* Update src/util.rs

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* chore: cleanup & doc

* chore: generate completions & manpage

* chore: generate dist

* fix: reduplicate default test

* chore: regate tmux

* chore: remove useless test-utils feature

* fix(windows): ignore dirs in default_command

* docs: update shell docs for windows

* chore: generate completions & manpage

* chore(justfile): do not ignore failed tests

* fix: upload correct junit after profile change

* fix: always execute exit commands

* fix: windows-specific ctrl-c handling

* chore: misc docs & other updates

Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>

* chore: generate completions & manpage

* chore: include license in MSI installer

---------

Co-authored-by: Skim bot <skim-bot@skim-rs.github.io>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: Your Name <you@example.com>
2026-03-29 21:46:42 +00:00

173 lines
5.4 KiB
Rust

#![cfg(unix)]
#[allow(dead_code)]
mod common;
use common::tmux::Keys::*;
use common::tmux::TmuxController;
use std::fs::File;
use std::fs::Permissions;
use std::io::Read;
use std::io::Result;
use std::io::Write;
use std::os::unix::fs::PermissionsExt;
use std::path::Path;
fn setup_tmux_mock(tmux: &TmuxController) -> Result<String> {
let dir = &tmux.tempdir;
let path = dir.path().join("tmux");
let mock_bin = Path::new(&path);
let mut writer = File::create(mock_bin)?;
let outfile = dir.path().join("tmux-mock-cmd");
writer.write_fmt(format_args!(
"#!/bin/sh
echo \"$@\" > {}
",
outfile.to_str().unwrap()
))?;
std::fs::set_permissions(mock_bin, Permissions::from_mode(0o777))?;
tmux.send_keys(&[
Str(&format!("export PATH={}:$PATH", dir.path().to_str().unwrap())),
Enter,
])?;
tmux.until(|_| Path::new(&tmux.tempdir.path().join("tmux")).exists())?;
Ok(outfile.to_str().unwrap().to_string())
}
fn get_tmux_cmd(outfile: &str) -> Result<String> {
let mut cmd = String::new();
File::open(outfile)?.read_to_string(&mut cmd)?;
Ok(cmd)
}
#[test]
fn tmux_vanilla() -> Result<()> {
let mut tmux = TmuxController::new()?;
let outfile = setup_tmux_mock(&tmux)?;
tmux.start_sk(None, &["--tmux"])?;
tmux.until(|_| Path::new(&outfile).exists())?;
let cmd = get_tmux_cmd(&outfile)?;
assert!(cmd.starts_with("display-popup"));
assert!(cmd.contains("-E"));
assert!(cmd.contains("--print-query"));
assert!(cmd.contains("--print-cmd"));
assert!(cmd.contains("--print-header"));
assert!(cmd.contains("--print-current"));
assert!(cmd.contains("--print-score"));
assert!(!cmd.contains("<"));
Ok(())
}
#[test]
fn tmux_output_format() -> Result<()> {
let mut tmux = TmuxController::new()?;
let outfile = setup_tmux_mock(&tmux)?;
tmux.start_sk(
None,
&[
"--tmux",
"--output-format",
"output-format",
"--output-format=output-format",
],
)?;
tmux.until(|_| Path::new(&outfile).exists())?;
let cmd = get_tmux_cmd(&outfile)?;
assert!(cmd.starts_with("display-popup"));
assert!(cmd.contains("-E"));
assert!(cmd.contains("--print-query"));
assert!(cmd.contains("--print-cmd"));
assert!(cmd.contains("--print-header"));
assert!(cmd.contains("--print-current"));
assert!(cmd.contains("--print-score"));
assert!(cmd.contains("--print-score"));
assert!(!cmd.contains("output-format"));
assert!(!cmd.contains("<"));
Ok(())
}
#[test]
fn tmux_stdin() -> Result<()> {
let mut tmux = TmuxController::new()?;
let outfile = setup_tmux_mock(&tmux)?;
tmux.start_sk(Some("ls"), &["--tmux"])?;
tmux.until(|_| Path::new(&outfile).exists())?;
let cmd = get_tmux_cmd(&outfile)?;
println!("{}", cmd);
assert!(cmd.contains("<"));
Ok(())
}
#[test]
fn tmux_quote_bash() -> Result<()> {
let mut tmux = TmuxController::new()?;
let outfile = setup_tmux_mock(&tmux)?;
tmux.send_keys(&[Str("export SHELL=/bin/bash"), Enter])?;
tmux.send_keys(&[Str("export SKIM_ESCAPED_VAR=';;'"), Enter])?;
tmux.start_sk(None, &["--tmux", "--bind 'ctrl-a:reload(ls /foo*)'"])?;
tmux.until(|_| Path::new(&outfile).exists())?;
let cmd = get_tmux_cmd(&outfile)?;
assert!(cmd.starts_with("display-popup"));
assert!(cmd.contains("-E"));
assert!(cmd.contains("--bind $'ctrl-a:reload(ls /foo*)'"));
assert!(cmd.contains("SKIM_ESCAPED_VAR=;\\;"));
Ok(())
}
#[test]
fn tmux_quote_zsh() -> Result<()> {
let mut tmux = TmuxController::new()?;
let outfile = setup_tmux_mock(&tmux)?;
tmux.send_keys(&[Str("export SHELL=/bin/zsh"), Enter])?;
tmux.send_keys(&[Str("export SKIM_ESCAPED_VAR=';;'"), Enter])?;
tmux.start_sk(None, &["--tmux", "--bind 'ctrl-a:reload(ls /foo*)'"])?;
tmux.until(|_| Path::new(&outfile).exists())?;
let cmd = get_tmux_cmd(&outfile)?;
println!("{cmd}");
assert!(cmd.starts_with("display-popup"));
assert!(cmd.contains("-E"));
assert!(cmd.contains(
"sk --bind $'ctrl-a:reload(ls /foo*)' --print-query --print-cmd --print-header --print-current --print-score >"
));
assert!(cmd.contains("SKIM_ESCAPED_VAR=;\\;"));
Ok(())
}
#[test]
fn tmux_quote_sh() -> Result<()> {
let mut tmux = TmuxController::new()?;
let outfile = setup_tmux_mock(&tmux)?;
tmux.send_keys(&[Str("export SHELL=/bin/sh"), Enter])?;
tmux.send_keys(&[Str("export SKIM_ESCAPED_VAR=';;'"), Enter])?;
tmux.start_sk(None, &["--tmux", "--bind 'ctrl-a:reload(ls /foo*)'"])?;
tmux.until(|_| Path::new(&outfile).exists())?;
let cmd = get_tmux_cmd(&outfile)?;
assert!(cmd.starts_with("display-popup"));
assert!(cmd.contains("-E"));
assert!(cmd.contains("--bind ctrl-a':reload(ls /foo*)'"));
assert!(cmd.contains("SKIM_ESCAPED_VAR=;\\;"));
Ok(())
}
#[test]
fn tmux_quote_fish() -> Result<()> {
let mut tmux = TmuxController::new()?;
let outfile = setup_tmux_mock(&tmux)?;
tmux.send_keys(&[Str("export SHELL=/bin/fish"), Enter])?;
tmux.send_keys(&[Str("export SKIM_ESCAPED_VAR=';;'"), Enter])?;
tmux.start_sk(None, &["--tmux", "--bind 'ctrl-a:reload(ls /foo*)'"])?;
tmux.until(|_| Path::new(&outfile).exists())?;
let cmd = get_tmux_cmd(&outfile)?;
assert!(cmd.starts_with("display-popup"));
assert!(cmd.contains("-E"));
assert!(cmd.contains("--bind ctrl-a':reload(ls /foo*)'"));
assert!(cmd.contains("SKIM_ESCAPED_VAR=;\\;"));
Ok(())
}