use crate::workdir::Workdir;

#[test]
fn transform() {
    let wrk = Workdir::new("transform");
    wrk.create(
        "data.csv",
        vec![svec!["a", "b"], svec!["1", "2"], svec!["2", "3"]],
    );
    let mut cmd = wrk.command("transform");
    cmd.arg("b").arg("add(a, b)").arg("data.csv");

    let got: Vec<Vec<String>> = wrk.read_stdout(&mut cmd);
    let expected = vec![svec!["a", "b"], svec!["1", "3"], svec!["2", "5"]];
    assert_eq!(got, expected);
}

#[test]
fn transform_no_headers() {
    let wrk = Workdir::new("transform_no_headers");
    wrk.create("data.csv", vec![svec!["1", "2"], svec!["2", "3"]]);
    let mut cmd = wrk.command("transform");
    cmd.arg("-n")
        .arg("1")
        .arg("add(col(0), col(1))")
        .arg("data.csv");

    let got: Vec<Vec<String>> = wrk.read_stdout(&mut cmd);
    let expected = vec![svec!["1", "3"], svec!["2", "5"]];
    assert_eq!(got, expected);
}

#[test]
fn transform_rename() {
    let wrk = Workdir::new("transform_rename");
    wrk.create(
        "data.csv",
        vec![svec!["a", "b"], svec!["1", "2"], svec!["2", "3"]],
    );
    let mut cmd = wrk.command("transform");
    cmd.arg("b")
        .arg("add(a, b)")
        .args(&["-r", "c"])
        .arg("data.csv");

    let got: Vec<Vec<String>> = wrk.read_stdout(&mut cmd);
    let expected = vec![svec!["a", "c"], svec!["1", "3"], svec!["2", "5"]];
    assert_eq!(got, expected);
}

#[test]
fn transform_multi() {
    let wrk = Workdir::new("transform_multi");
    wrk.create(
        "data.csv",
        vec![
            svec!["a", "b", "c"],
            svec!["1", "2", "5"],
            svec!["2", "3", "8"],
        ],
    );
    let mut cmd = wrk.command("transform");
    cmd.arg("b,c")
        .arg("_ * 10")
        .args(["-r", "B,C"])
        .arg("data.csv");

    let got: Vec<Vec<String>> = wrk.read_stdout(&mut cmd);
    let expected = vec![
        svec!["a", "B", "C"],
        svec!["1", "20", "50"],
        svec!["2", "30", "80"],
    ];
    assert_eq!(got, expected);
}

#[test]
fn transform_implicit() {
    let wrk = Workdir::new("transform_implicit");
    wrk.create(
        "data.csv",
        vec![
            svec!["name", "surname"],
            svec!["john", "davis"],
            svec!["mary", "sue"],
        ],
    );
    let mut cmd = wrk.command("transform");
    cmd.arg("surname")
        .arg("upper")
        .args(&["-r", "upper_surname"])
        .arg("data.csv");

    let got: Vec<Vec<String>> = wrk.read_stdout(&mut cmd);
    let expected = vec![
        svec!["name", "upper_surname"],
        svec!["john", "DAVIS"],
        svec!["mary", "SUE"],
    ];
    assert_eq!(got, expected);
}

#[test]
fn transform_errors_panic() {
    let wrk = Workdir::new("transform_errors_panic");
    wrk.create(
        "data.csv",
        vec![svec!["a", "b"], svec!["1", "test"], svec!["2", "3"]],
    );
    let mut cmd = wrk.command("transform");
    cmd.arg("b").arg("add(a, b)").arg("data.csv");

    wrk.assert_err(&mut cmd);
}