#![allow(clippy::unwrap_used, clippy::expect_used)]
mod common;
use common::run;
use kaish_kernel::{Kernel, KernelConfig};
fn transient_kernel() -> Kernel {
Kernel::new(KernelConfig::transient()).expect("kernel")
}
#[tokio::test]
async fn cut_fields_overlapping_ranges_no_duplicates() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf 'a\\tb\\tc\\td\\te' | cut -f \"1-3,2-4\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "a\tb\tc\td", "overlapping ranges must be unioned, not duplicated");
}
#[tokio::test]
async fn cut_fields_repeated_single_field_no_duplicates() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf 'x\\ty\\tz' | cut -f \"2,2\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "y", "repeated field must appear only once");
}
#[tokio::test]
async fn cut_fields_out_of_order_emits_ascending() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf 'alpha\\tbeta\\tgamma' | cut -f \"3,1\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "alpha\tgamma", "fields must be emitted in ascending position order");
}
#[tokio::test]
async fn cut_fields_out_of_order_range_emits_ascending() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf '1\\t2\\t3\\t4\\t5' | cut -f \"4-5,1-2\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "1\t2\t4\t5", "reversed range order must still output fields ascending");
}
#[tokio::test]
async fn cut_chars_overlapping_ranges_no_duplicates() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf 'abcde' | cut -c \"1-3,2-4\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "abcd", "overlapping char ranges must be unioned");
}
#[tokio::test]
async fn cut_chars_out_of_order_emits_ascending() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf 'abcde' | cut -c \"4,1\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "ad", "char positions must be emitted in ascending order");
}
#[tokio::test]
async fn cut_fields_simple_list_unchanged() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf 'a\\tb\\tc\\td\\te' | cut -f \"1,3,5\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "a\tc\te", "simple non-overlapping list must work");
}
#[tokio::test]
async fn cut_fields_single_range_unchanged() {
let kernel = transient_kernel();
let (out, code) = run(&kernel, "printf 'w\\tx\\ty\\tz' | cut -f \"2-3\"").await;
assert_eq!(code, 0, "exit code: {out}");
assert_eq!(out, "x\ty", "single range must still work");
}