vb6parse 1.2.4

vb6parse is a library for parsing and analyzing VB6 code, from projects, to controls, to modules, and forms.
Documentation
//! Test for proper `ArgumentList` parsing in procedure calls.
//!
//! This test verifies that procedure calls create proper `ArgumentList` nodes
//! with structured `Argument` children, rather than flat token streams.

use vb6parse::*;
const SNAPSHOT_PATH: &str = "../snapshots/parsers/cst/call_argument_list";

#[test]
fn call_with_parenthesized_arguments() {
    let source = r"prefs.Add settings(i, 1), settings(i, 0)";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_with_unparenthesized_arguments() {
    let source = r"Debug.Print x, y, z";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_no_arguments() {
    let source = r"DoEvents";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_with_member_access() {
    let source = r"obj.Method arg1, arg2";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_with_dot_prefix() {
    let source = r#"
Sub Test()
    With myObject
        .Method "argument"
    End With
End Sub
"#;
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_statement_with_keyword() {
    let source = r"
Sub Test()
    Call MySub(x, y)
End Sub
";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_nested_in_expression() {
    let source = r"result = Calculate(x, y)";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_with_empty_arguments() {
    let source = r#"Err.Raise 1, , "PROGRAM ERROR 454, invalid note, " & Trim$(str$(mNote))"#;
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_with_bracketed_enum_arguments() {
    let source = r"CallInterface c_lngObjDevEnumerator, [GetDefaultAudioEndpoint], 3, [eRender], [eConsole], VarPtr(c_lngObjIMMDevice)";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_with_bracketed_identifier_containing_whitespace() {
    let source = r"CallInterface [Get Default Audio Endpoint], [e Render], [e Console]";
    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    // Check for failures
    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}

#[test]
fn call_with_named_arguments_in_if_expression() {
    let source = r"
Sub Test()
    If Not m_oSocket.create(SocketType:=ucsSckStream) Then
        GoTo QH
    End If
    If Not m_oSocket.Connect(m_uRemote.Host, m_uRemote.Port, UseTls:=pvIsProtocolSecure(m_uRemote.Protocol)) Then
        GoTo QH
    End If
QH:
End Sub
";

    let (cst_opt, failures) = ConcreteSyntaxTree::from_text("test.bas", source).unpack();

    for failure in &failures {
        failure.eprint();
    }

    let cst = cst_opt.expect("CST should be parsed");
    let tree = cst.to_serializable();

    // Create snapshot
    let mut settings = insta::Settings::clone_current();
    settings.set_snapshot_path(SNAPSHOT_PATH);
    settings.set_prepend_module_to_snapshot(false);
    let _guard = settings.bind_to_scope();
    insta::assert_yaml_snapshot!(tree);
}