#![cfg(feature = "localfs")]
#![allow(clippy::unwrap_used, clippy::expect_used)]
use kaish_kernel::{Kernel, KernelConfig};
#[tokio::test]
async fn unquoted_for_loop_inside_cmdsubst_runs() {
let kernel = Kernel::new(KernelConfig::repl()).expect("kernel");
let r = kernel
.execute(r#"echo $(for f in a b; do echo $f; done)"#)
.await
.expect("execute");
assert_eq!(r.code, 0, "{r:?}");
assert_eq!(r.text_out().trim(), "a\nb");
}
#[tokio::test]
async fn unquoted_while_loop_inside_cmdsubst_runs() {
let kernel = Kernel::new(KernelConfig::repl()).expect("kernel");
let r = kernel
.execute(r#"x=$(i=0; while [[ $i -lt 3 ]]; do echo $i; i=$((i+1)); done); echo "[$x]""#)
.await
.expect("execute");
assert_eq!(r.code, 0, "{r:?}");
assert_eq!(r.text_out().trim(), "[0\n1\n2]");
}
#[tokio::test]
async fn unquoted_if_else_inside_cmdsubst_runs() {
let kernel = Kernel::new(KernelConfig::repl()).expect("kernel");
let r = kernel
.execute(r#"x=$(if true; then echo yep; else echo nope; fi); echo "[$x]""#)
.await
.expect("execute");
assert_eq!(r.code, 0, "{r:?}");
assert_eq!(r.text_out().trim(), "[yep]");
}
#[tokio::test]
async fn unquoted_case_inside_cmdsubst_runs() {
let kernel = Kernel::new(KernelConfig::repl()).expect("kernel");
let r = kernel
.execute(r#"x=$(case dog in cat) echo meow;; dog) echo woof;; esac); echo "[$x]""#)
.await
.expect("execute");
assert_eq!(r.code, 0, "{r:?}");
assert_eq!(r.text_out().trim(), "[woof]");
}
#[tokio::test]
async fn unquoted_nested_cmdsubst_with_inner_control_structure_runs() {
let kernel = Kernel::new(KernelConfig::repl()).expect("kernel");
let r = kernel
.execute(r#"echo $(echo $(for f in a b; do echo $f; done))"#)
.await
.expect("execute");
assert_eq!(r.code, 0, "{r:?}");
assert_eq!(r.text_out().trim(), "a\nb");
}
#[tokio::test]
async fn quoted_for_loop_inside_cmdsubst_still_runs() {
let kernel = Kernel::new(KernelConfig::repl()).expect("kernel");
let r = kernel
.execute(r#"out="$(for f in a b; do echo $f; done)"; echo "$out""#)
.await
.expect("execute");
assert_eq!(r.code, 0, "{r:?}");
assert_eq!(r.text_out().trim(), "a\nb");
}