use kaish_kernel::{Kernel, KernelConfig, OutputLimitConfig};
fn mem_kernel() -> Kernel {
let config = KernelConfig::repl().with_output_limit(OutputLimitConfig::none().in_memory());
Kernel::new(config).expect("failed to create kernel")
}
async fn run(kernel: &Kernel, script: &str) -> (String, i64) {
let result = kernel.execute(script).await.expect("kernel execute");
(result.text_out().to_string(), result.code)
}
#[tokio::test]
async fn echo_set_prints_the_word_set() {
let kernel = mem_kernel();
let (out, code) = run(&kernel, "echo set").await;
assert_eq!(code, 0);
assert_eq!(out.trim(), "set");
}
#[tokio::test]
async fn echo_word_set_word_keeps_set_inline() {
let kernel = mem_kernel();
let (out, code) = run(&kernel, "echo before set after").await;
assert_eq!(code, 0);
assert_eq!(out.trim(), "before set after");
}
#[tokio::test]
async fn kaish_output_limit_set_subcommand_parses_and_applies() {
let kernel = mem_kernel();
let (out, code) = run(&kernel, "kaish-output-limit set 1K").await;
assert_eq!(code, 0, "should parse and run; got: {out}");
assert!(out.contains("1K"), "limit should read back as 1K: {out}");
}
#[tokio::test]
async fn set_o_output_limit_with_size_parses() {
let kernel = mem_kernel();
let (out, code) = run(&kernel, "set -o output-limit=4K").await;
assert_eq!(code, 0, "documented form must parse; got: {out}");
}
#[tokio::test]
async fn set_o_output_limit_with_raw_bytes_parses() {
let kernel = mem_kernel();
let (out, code) = run(&kernel, "set -o output-limit=65536").await;
assert_eq!(code, 0, "raw-byte form must parse; got: {out}");
}
#[tokio::test]
async fn set_o_output_limit_quoted_parses() {
let kernel = mem_kernel();
let (out, code) = run(&kernel, "set -o \"output-limit=4K\"").await;
assert_eq!(code, 0, "quoted form must parse; got: {out}");
}
#[tokio::test]
async fn kaish_output_limit_set_persists_across_execute_calls() {
let kernel = mem_kernel();
let (_, code) = run(&kernel, "kaish-output-limit set 1K").await;
assert_eq!(code, 0);
let (out, code) = run(&kernel, "kaish-output-limit").await;
assert_eq!(code, 0);
assert!(out.contains("1K"), "limit must persist across calls: {out}");
let (out, code) = run(&kernel, "seq 1 5000").await;
assert_eq!(code, 3, "persisted limit must truncate later output; got: {out}");
assert!(out.contains("truncated"), "expected truncation marker: {out}");
}
#[tokio::test]
async fn set_o_output_limit_persists_and_truncates() {
let kernel = mem_kernel();
let (_, code) = run(&kernel, "set -o output-limit=64").await;
assert_eq!(code, 0);
let (out, code) = run(&kernel, "seq 1 5000").await;
assert_eq!(code, 3, "set -o output-limit must persist and truncate; got: {out}");
assert!(out.contains("truncated"), "expected truncation marker: {out}");
}
#[tokio::test]
async fn set_plus_o_output_limit_disables_and_persists() {
let kernel = mem_kernel();
run(&kernel, "set -o output-limit=64").await;
let (_, code) = run(&kernel, "set +o output-limit").await;
assert_eq!(code, 0);
let (out, code) = run(&kernel, "seq 1 5000").await;
assert_eq!(code, 0, "limit was disabled, should not truncate; got code {code}");
assert!(!out.contains("truncated"), "should not be truncated: {out}");
assert!(out.contains("5000"), "full output expected: tail missing");
}