#[test]
#[cfg(all(feature = "sys", feature = "wamr", feature = "v8"))]
fn can_create_multiple_engines() {
    use wasmer::{sys::Cranelift, v8::V8, wamr::Wamr, *};
    let _: Engine = Cranelift::new().into();

    #[cfg(feature = "v8")]
    {
        let _: Engine = V8::new().into();
    }

    #[cfg(feature = "wamr")]
    {
        let _: Engine = Wamr::new().into();
    }
}

#[test]
#[cfg(all(feature = "v8", feature = "sys"))]
fn multiple_engines_can_run_together() {
    use wasmer::{sys::Cranelift, v8::V8, *};

    let clift: Engine = Cranelift::new().into();
    let mut clift_store = Store::new(clift);
    let c_hello = Function::new_typed(&mut clift_store, move || {
        println!("hello from cranelift!");
    });

    #[cfg(feature = "v8")]
    {
        let v8: Engine = V8::new().into();
        let mut v8_store = Store::new(v8);
        let v8_hello = Function::new_typed(&mut v8_store, move || {
            println!("hello from v8!");
        });
        c_hello.call(&mut clift_store, &[]).unwrap();
        v8_hello.call(&mut v8_store, &[]).unwrap();
    }
}

#[test]
#[cfg(all(feature = "sys", feature = "wamr", feature = "v8"))]
fn engine_unique_id() {
    use std::collections::HashSet;

    use wasmer::{sys::Cranelift, v8::V8, wamr::Wamr, *};

    let mut table = HashSet::new();

    for _ in 0..100_000 {
        let e: Engine = Cranelift::new().into();

        let id = e.id();

        assert!(!table.contains(&id));
        table.insert(e.id());
        assert!(table.contains(&id));

        let e: Engine = V8::new().into();
        let id = e.id();

        assert!(!table.contains(&id));
        table.insert(e.id());
        assert!(table.contains(&id));

        let e: Engine = Wamr::new().into();
        let id = e.id();

        assert!(!table.contains(&id));
        table.insert(e.id());
        assert!(table.contains(&id));
    }
}
