use nu_test_support::{nu, pipeline};

#[test]
fn record_map_to_toml() {
    let actual = nu!(pipeline(
        r#"
            {a: 1 b: 2 c: 'qwe'} 
            | to toml
            | from toml
            | $in == {a: 1 b: 2 c: 'qwe'}
        "#
    ));

    assert_eq!(actual.out, "true");
}

#[test]
fn nested_records_to_toml() {
    let actual = nu!(pipeline(
        r#"
            {a: {a: a b: b} c: 1} 
            | to toml
            | from toml
            | $in == {a: {a: a b: b} c: 1}
        "#
    ));

    assert_eq!(actual.out, "true");
}

#[test]
fn records_with_tables_to_toml() {
    let actual = nu!(pipeline(
        r#"
            {a: [[a b]; [1 2] [3 4]] b: [[c d e]; [1 2 3]]}
            | to toml
            | from toml
            | $in == {a: [[a b]; [1 2] [3 4]] b: [[c d e]; [1 2 3]]}
        "#
    ));

    assert_eq!(actual.out, "true");
}

#[test]
fn nested_tables_to_toml() {
    let actual = nu!(pipeline(
        r#"
            {c: [[f g]; [[[h k]; [1 2] [3 4]] 1]]}
            | to toml
            | from toml
            | $in == {c: [[f g]; [[[h k]; [1 2] [3 4]] 1]]}
        "#
    ));

    assert_eq!(actual.out, "true");
}

#[test]
fn table_to_toml_fails() {
    // Tables can't be represented in toml
    let actual = nu!(pipeline(
        r#"
        try { [[a b]; [1 2] [5 6]] | to toml | false } catch { true }
        "#
    ));

    assert!(actual.err.contains("command doesn't support"));
}

#[test]
fn string_to_toml_fails() {
    // Strings are not a top-level toml structure
    let actual = nu!(pipeline(
        r#"
        try { 'not a valid toml' | to toml | false } catch { true }
        "#
    ));

    assert!(actual.err.contains("command doesn't support"));
}

#[test]
fn big_record_to_toml_text_and_from_toml_text_back_into_record() {
    let actual = nu!(
        cwd: "tests/fixtures/formats", pipeline(
        r#"
            open cargo_sample.toml
            | to toml
            | from toml
            | get package.name
        "#
    ));

    assert_eq!(actual.out, "nu");
}
