emitbrown 0.1.9

event emitter based on google swisstable
Documentation
extern crate hashbrown;

use emitbrown::{Emitter, Events};
use hashbrown::HashMap;

#[test]
fn must_register_an_event_and_call_callback_passing_data() {
    let (test, data_inside) = ("TEST".to_owned(), "DATA INSIDE".to_owned());

    let (mut emitter, callback) = (
        Emitter::new(),
        Box::new(
            |event: &mut HashMap<String, String>| match event.get(&test) {
                Some(thing) => {
                    if *thing != data_inside {
                        panic!("the data inside the event is not what is expected, expected {}, get {}", data_inside, *thing);
                    }
                }
                None => panic!("the data expected wasn't found"),
            },
        ),
    );

    emitter.on(&test, callback);

    let mut data: HashMap<String, String> = HashMap::new();
    data.insert(test.clone(), data_inside.clone());
    emitter.emit(&test, &mut data);
}

#[test]
fn must_register_multiple_events_and_call_all_the_callback_passing_a_copy_of_the_same_data() {
    let (test, data_inside) = ("TEST".to_string(), "DATA INSIDE".to_string());
    let (mut emitter, callback, second_callback) = (
        Emitter::new(),
        Box::new(
            |event: &mut HashMap<String, String>| match event.get(&test) {
                Some(thing) => {
                    if *thing != data_inside {
                        panic!(
                        "the data inside the event is not what is expected, expected {}, get {}",
                        data_inside, *thing
                    );
                    }
                }
                None => panic!("the data expected wasn't found"),
            },
        ),
        Box::new(
            |event: &mut HashMap<String, String>| match event.get(&test) {
                Some(thing) => {
                    if *thing != data_inside {
                        panic!(
                        "the data inside the event is not what is expected, expected {}, get {}",
                        data_inside, *thing
                    );
                    }
                }
                None => panic!("the data expected wasn't found"),
            },
        ),
    );

    emitter.on(&test, callback);

    emitter.on(&test, second_callback);

    let mut data: HashMap<String, String> = HashMap::new();
    data.insert(test.clone(), data_inside.clone());
    emitter.emit(&test, &mut data);
}

#[test]
fn must_unregister_an_event() {
    let (test, data_inside) = ("TEST".to_string(), "DATA INSIDE".to_string());
    let (mut emitter, callback) = (
        Emitter::new(),
        Box::new(|event: &mut HashMap<String, String>| {
            panic!(
                "the emitter must never be called instead has been called with {} parameters",
                event.capacity()
            );
        }),
    );

    emitter.on(&test, callback);

    let mut data: HashMap<String, String> = HashMap::new();
    data.insert(test.clone(), data_inside.clone());
    emitter.off(&test);
    emitter.emit(&test, &mut data);
}

#[test]
fn must_work_with_a_custom_event_data_and_allow_the_callback_to_modified_it() {
    struct Foo {
        bar: String,
    };

    let (test, data_inside) = ("TEST".to_string(), "DATA INSIDE".to_string());

    let (mut emitter, callback) = (
        Emitter::new(),
        Box::new(|event: &mut HashMap<String, Foo>| {
            match event.get(&test) {
                Some(thing) => {
                    if (*thing).bar != data_inside {
                        panic!(
                        "the data inside the event is not what is expected, expected {}, get {}",
                        data_inside,
                        (*thing).bar
                    );
                    }
                }
                None => panic!("the data expected wasn't found"),
            }
            event.insert(
                "Result".to_string(),
                Foo {
                    bar: "HAHAHA".to_string(),
                },
            );
        }),
    );

    emitter.on(&test, callback);

    let mut data: HashMap<String, Foo> = HashMap::new();
    data.insert(
        test.clone(),
        Foo {
            bar: data_inside.clone(),
        },
    );
    emitter.emit(&test, &mut data);
    match data.get(&"Result".to_string()) {
        Some(ref data) => {
            if data.bar != "HAHAHA".to_string() {
                panic!("Doesn't pass back values")
            }
        }
        _ => panic!("Doesn't pass back values"),
    }
}