arbiter-engine 0.4.0

Allowing smart contract developers to do simulation driven development via an EVM emulator
Documentation
use std::fs::{read_to_string, remove_file, File};

use arbiter_engine::{agent::Agent, universe::Universe, world::World};
use tracing_subscriber::{fmt, EnvFilter};
include!("common.rs");

#[tokio::test]
async fn run_parallel() {
    std::env::set_var("RUST_LOG", "trace");
    let file = File::create("test_logs_engine.log").expect("Unable to create log file");

    let subscriber = fmt()
        .with_env_filter(EnvFilter::from_default_env())
        .with_writer(file)
        .finish();

    tracing::subscriber::set_global_default(subscriber).expect("setting default subscriber failed");

    let mut world1 = World::new("test1");
    let agent1 = Agent::builder("agent1");
    let behavior1 = TimedMessage::new(
        1,
        "echo".to_owned(),
        "echo".to_owned(),
        Some(5),
        Some("echo".to_owned()),
    );
    world1.add_agent(agent1.with_behavior(behavior1));

    let mut world2 = World::new("test2");
    let agent2 = Agent::builder("agent2");
    let behavior2 = TimedMessage::new(
        1,
        "echo".to_owned(),
        "echo".to_owned(),
        Some(5),
        Some("echo".to_owned()),
    );
    world2.add_agent(agent2.with_behavior(behavior2));

    let mut universe = Universe::new();
    universe.add_world(world1);
    universe.add_world(world2);

    universe.run_worlds().await.unwrap();

    let parsed_file = read_to_string("test_logs_engine.log").expect("Unable to read log file");

    // Define the line to check (excluding the timestamp)
    let line_to_check = "Behavior is starting up.";

    // Assert that the lines appear consecutively
    assert!(
        lines_appear_consecutively(&parsed_file, line_to_check),
        "The lines do not appear consecutively"
    );
    remove_file("test_logs_engine.log").expect(
        "Unable to remove log
        file",
    );
}

fn lines_appear_consecutively(file_contents: &str, line_to_check: &str) -> bool {
    let mut lines = file_contents.lines();

    while let Some(line) = lines.next() {
        if line.contains(line_to_check) {
            println!("Found line: {}", line);
            // Check if the next line also contains the line_to_check
            if let Some(next_line) = lines.next() {
                if next_line.contains(line_to_check) {
                    println!("Found next line: {}", next_line);
                    return true;
                }
            }
        }
    }

    false
}