run-kit 0.7.1

Universal multi-language runner and smart REPL
Documentation
use run::engine::{CSharpEngine, LanguageEngine};

fn csharp_available() -> bool {
    CSharpEngine::new().validate().is_ok()
}

#[test]
fn csharp_session_prints_method_call_expressions_with_or_without_semicolon() {
    if !csharp_available() {
        eprintln!("skipping csharp session test: dotnet not available");
        return;
    }

    let engine = CSharpEngine::new();
    let mut session = engine.start_session().expect("start csharp session");

    let out = session
        .eval(r#"string[] names = {"dood", "dude"};"#)
        .unwrap();
    assert!(
        out.success(),
        "declaration should succeed; stderr was:\n{}",
        out.stderr
    );

    let out = session.eval(r#"names.Contains("dood")"#).unwrap();
    assert!(
        out.success(),
        "method call should succeed; stderr was:\n{}",
        out.stderr
    );
    assert!(
        out.stdout.contains("True"),
        "expected output to contain True; got stdout:\n{}",
        out.stdout
    );

    let out = session.eval(r#"names.Contains("dood");"#).unwrap();
    assert!(
        out.success(),
        "method call with semicolon should succeed; stderr was:\n{}",
        out.stderr
    );
    assert!(
        out.stdout.contains("True"),
        "expected output to contain True; got stdout:\n{}",
        out.stdout
    );
}

#[test]
fn csharp_session_prints_arithmetic_expression_with_trailing_semicolon() {
    if !csharp_available() {
        eprintln!("skipping csharp session test: dotnet not available");
        return;
    }

    let engine = CSharpEngine::new();
    let mut session = engine.start_session().expect("start csharp session");

    let out = session.eval("int d = 10;").unwrap();
    assert!(
        out.success(),
        "setup should succeed; stderr:\n{}",
        out.stderr
    );

    let out = session.eval("d + 10;").unwrap();
    assert!(
        out.success(),
        "expression with semicolon should succeed; stderr was:\n{}",
        out.stderr
    );
    assert!(
        out.stdout.contains("20"),
        "expected output to contain 20; got stdout:\n{}",
        out.stdout
    );
}

#[test]
fn csharp_session_prints_member_access_expression_with_or_without_semicolon() {
    if !csharp_available() {
        eprintln!("skipping csharp session test: dotnet not available");
        return;
    }

    let engine = CSharpEngine::new();
    let mut session = engine.start_session().expect("start csharp session");

    let out = session.eval(r#""Hello".Length"#).unwrap();
    assert!(
        out.success(),
        "member access expression should succeed; stderr was:\n{}",
        out.stderr
    );
    assert!(
        out.stdout.contains('5'),
        "expected output to contain 5; got stdout:\n{}",
        out.stdout
    );

    let out = session.eval(r#""Hello".Length;"#).unwrap();
    assert!(
        out.success(),
        "member access expression with semicolon should succeed; stderr was:\n{}",
        out.stderr
    );
    assert!(
        out.stdout.contains('5'),
        "expected output to contain 5; got stdout:\n{}",
        out.stdout
    );
}

#[test]
fn csharp_session_prints_ternary_expression() {
    if !csharp_available() {
        eprintln!("skipping csharp session test: dotnet not available");
        return;
    }

    let engine = CSharpEngine::new();
    let mut session = engine.start_session().expect("start csharp session");

    let out = session.eval("int n = 7;").unwrap();
    assert!(
        out.success(),
        "setup should succeed; stderr:\n{}",
        out.stderr
    );

    let out = session.eval(r#"n % 2 == 0 ? "even" : "odd""#).unwrap();
    assert!(
        out.success(),
        "ternary expression should succeed; stderr:\n{}",
        out.stderr
    );
    assert!(
        out.stdout.contains("odd"),
        "expected output to contain odd; got stdout:\n{}",
        out.stdout
    );

    let out = session.eval(r#"n % 2 == 0 ? "even" : "odd";"#).unwrap();
    assert!(
        out.success(),
        "ternary expression with semicolon should succeed; stderr:\n{}",
        out.stderr
    );
    assert!(
        out.stdout.contains("odd"),
        "expected output to contain odd; got stdout:\n{}",
        out.stdout
    );
}