woab 0.9.0

Widgets on Actors Bridge - a GUI microframework for combining GTK with Actix
use std::cell::RefCell;
use std::rc::Rc;

use gio::prelude::*;

#[macro_use]
mod util;

#[test]
fn test_waking() -> anyhow::Result<()> {
    util::test_main(async {
        let output = Rc::new(RefCell::new(Vec::<&'static str>::new()));
        let output = output.clone();
        let action1 = gio::SimpleAction::new("action1", None);
        output.borrow_mut().push("before action1");
        let action_response = woab::wake_from(|tx| {
            let output = output.clone();
            action1.connect_activate(move |_, _| {
                let _ = tx.try_send(12);
                output.borrow_mut().push("inside action1");
            });
            action1.activate(None);
        })
        .await
        .unwrap();
        assert_eq!(action_response, 12);
        output.borrow_mut().push("after action1");

        let action2 = gio::SimpleAction::new("action2", None);
        let action_response = woab::wake_from_signal(&action2, |tx| {
            let output = output.clone();
            let signal_handler_id = action2.connect_activate(move |_, _| {
                let _ = tx.try_send(13);
                output.borrow_mut().push("inside action2 1");
            });
            action2.activate(None);
            signal_handler_id
        })
        .await
        .unwrap();
        assert_eq!(action_response, 13);
        let action_response = woab::wake_from_signal(&action2, |tx| {
            let output = output.clone();
            let signal_handler_id = action2.connect_activate(move |_, _| {
                let _ = tx.try_send(14);
                output.borrow_mut().push("inside action2 2");
            });
            action2.activate(None);
            signal_handler_id
        })
        .await
        .unwrap();
        assert_eq!(action_response, 14);
        output.borrow_mut().push("after action2");

        wait_for!(
            *output.borrow()
                == [
                    "before action1",
                    "inside action1",
                    "after action1",
                    "inside action2 1",
                    "inside action2 2",
                    "after action2",
                ]
        )?;

        Ok(())
    })
}