use std::fs;
use std::path::Path;
use ctddump::handle_dispatch;
use polars::prelude::*;
fn setup_src(files: &[&str]) -> (tempfile::TempDir, std::path::PathBuf) {
let dir = tempfile::tempdir().unwrap();
for f in files {
fs::copy(f, dir.path().join(Path::new(f).file_name().unwrap())).unwrap();
}
let path = dir.path().to_path_buf();
(dir, path)
}
fn make_parquet_dir(nc_files: &[&str], subcommand: &str) -> tempfile::TempDir {
let out_dir = tempfile::tempdir().unwrap();
let (_src_guard, src_dir) = setup_src(nc_files);
let args: Vec<String> = vec![
"batch".to_string(), "convert".to_string(), subcommand.to_string(),
"--output".to_string(), out_dir.path().to_str().unwrap().to_string(),
src_dir.to_str().unwrap().to_string(),
];
handle_dispatch(&args).unwrap();
out_dir
}
fn concat_to(parquet_dir: &Path, chunk_rows: &str) -> DataFrame {
std::env::set_var("CTDDUMP_CHUNK_ROWS", chunk_rows);
let output = tempfile::NamedTempFile::with_suffix(".parquet").unwrap();
let args = vec![
"concat".to_string(), "convert".to_string(),
parquet_dir.to_str().unwrap().to_string(),
output.path().to_str().unwrap().to_string(),
];
handle_dispatch(&args).expect("concat convert should succeed");
let f = fs::File::open(output.path()).unwrap();
ParquetReader::new(f).finish().unwrap()
}
#[test]
fn test_concat_convert_is_chunk_size_independent() {
let parquet_dir = make_parquet_dir(
&["./tests/test_data/AR_PR_CT_ITP-71.nc", "./tests/test_data/AR_PR_CT_58KN.nc"],
"nrt_ar",
);
let big = concat_to(parquet_dir.path(), "100000000");
let small = concat_to(parquet_dir.path(), "1");
assert_eq!(big.height(), small.height(), "row count must not depend on chunk size");
for name in ["platform_code", "profile_no", "observation_no", "profile_timestamp"] {
let a = big.column(name).unwrap();
let b = small.column(name).unwrap();
assert!(
a.equals(b),
"column `{name}` differs between chunk sizes — renumbering is not chunk-independent",
);
}
}