use nu_test_support::nu;

#[test]
fn append_assign_int() {
    let actual = nu!(r#"
            mut a = [1 2];
            $a ++= [3 4];
            $a == [1 2 3 4]
        "#);

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

#[test]
fn append_assign_string() {
    let actual = nu!(r#"
            mut a = [a b];
            $a ++= [c d];
            $a == [a b c d]
        "#);

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

#[test]
fn append_assign_any() {
    let actual = nu!(r#"
            mut a = [1 2 a];
            $a ++= [b 3];
            $a == [1 2 a b 3]
        "#);

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

#[test]
fn append_assign_both_empty() {
    let actual = nu!(r#"
            mut a = [];
            $a ++= [];
            $a == []
        "#);

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

#[test]
fn append_assign_type_mismatch() {
    let actual = nu!(r#"
            mut a = [1 2];
            $a ++= [a];
            $a == [1 2 "a"]
        "#);

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

#[test]
fn append_assign_single_element() {
    let actual = nu!(r#"
            mut a = ["list" "and"];
            $a ++= "a single element";
	    $a == ["list" "and" "a single element"]
        "#);

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

#[test]
fn append_assign_to_single_element() {
    let actual = nu!(r#"
            mut a = "string";
            $a ++= ["and" "the" "list"];
	    $a == ["string" "and" "the" "list"]
        "#);

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

#[test]
fn append_assign_single_to_single() {
    let actual = nu!(r#"
            mut a = 1;
            $a ++= "and a single element";
        "#);

    assert!(actual.err.contains("nu::parser::unsupported_operation"));
}