use std::borrow::ToOwned;
use crate::workdir::Workdir;
macro_rules! split_eq {
($wrk:expr, $path:expr, $expected:expr) => {
assert_eq!(
$wrk.from_str::<String>(&$wrk.path($path)),
$expected.to_owned()
);
};
}
fn data(headers: bool) -> Vec<Vec<String>> {
let mut rows = vec![
svec!["a", "b"],
svec!["c", "d"],
svec!["e", "f"],
svec!["g", "h"],
svec!["i", "j"],
svec!["k", "l"],
];
if headers {
rows.insert(0, svec!["h1", "h2"]);
}
rows
}
#[test]
fn split_zero() {
let wrk = Workdir::new("split_zero");
wrk.create("in.csv", data(true));
let mut cmd = wrk.command("split");
cmd.args(["--size", "0"])
.arg("-O")
.arg(&wrk.path("."))
.arg("in.csv");
wrk.assert_err(&mut cmd);
}
#[test]
fn split() {
let wrk = Workdir::new("split");
wrk.create("in.csv", data(true));
let mut cmd = wrk.command("split");
cmd.args(["--size", "2"])
.arg("-O")
.arg(&wrk.path("."))
.arg("in.csv");
wrk.run(&mut cmd);
split_eq!(
wrk,
"0.csv",
"\
h1,h2
a,b
c,d
"
);
split_eq!(
wrk,
"2.csv",
"\
h1,h2
e,f
g,h
"
);
split_eq!(
wrk,
"4.csv",
"\
h1,h2
i,j
k,l
"
);
assert!(!wrk.path("6.csv").exists());
}
#[test]
fn split_no_headers() {
let wrk = Workdir::new("split_no_headers");
wrk.create("in.csv", data(false));
let mut cmd = wrk.command("split");
cmd.args(["--no-headers", "--size", "2"])
.arg("-O")
.arg(&wrk.path("."))
.arg("in.csv");
wrk.run(&mut cmd);
split_eq!(
wrk,
"0.csv",
"\
a,b
c,d
"
);
split_eq!(
wrk,
"2.csv",
"\
e,f
g,h
"
);
split_eq!(
wrk,
"4.csv",
"\
i,j
k,l
"
);
}
#[test]
fn split_one() {
let wrk = Workdir::new("split_one");
wrk.create("in.csv", data(true));
let mut cmd = wrk.command("split");
cmd.args(["--size", "1"])
.arg("-O")
.arg(&wrk.path("."))
.arg("in.csv");
wrk.run(&mut cmd);
split_eq!(
wrk,
"0.csv",
"\
h1,h2
a,b
"
);
split_eq!(
wrk,
"1.csv",
"\
h1,h2
c,d
"
);
split_eq!(
wrk,
"2.csv",
"\
h1,h2
e,f
"
);
split_eq!(
wrk,
"3.csv",
"\
h1,h2
g,h
"
);
split_eq!(
wrk,
"4.csv",
"\
h1,h2
i,j
"
);
split_eq!(
wrk,
"5.csv",
"\
h1,h2
k,l
"
);
}
#[test]
fn split_uneven() {
let wrk = Workdir::new("split_uneven");
wrk.create("in.csv", data(true));
let mut cmd = wrk.command("split");
cmd.args(["--size", "4"])
.arg("-O")
.arg(&wrk.path("."))
.arg("in.csv");
wrk.run(&mut cmd);
split_eq!(
wrk,
"0.csv",
"\
h1,h2
a,b
c,d
e,f
g,h
"
);
split_eq!(
wrk,
"4.csv",
"\
h1,h2
i,j
k,l
"
);
}
#[test]
fn split_custom_filename() {
let wrk = Workdir::new("split");
wrk.create("in.csv", data(true));
let mut cmd = wrk.command("split");
cmd.args(["--size", "2"])
.args(["--filename", "prefix-{}.csv"])
.arg("-O")
.arg(&wrk.path("."))
.arg("in.csv");
wrk.run(&mut cmd);
assert!(wrk.path("prefix-0.csv").exists());
assert!(wrk.path("prefix-2.csv").exists());
assert!(wrk.path("prefix-4.csv").exists());
}