mod custom_event;
mod event;
mod event_emitter;
mod event_target;
pub use custom_event::CustomEvent;
pub use event::Event;
pub use event_emitter::{EmitError, Emitter, EmitterExt, EventEmitter, EventKey};
pub use event_target::EventTarget;
use rong::*;
pub fn init(ctx: &JSContext) -> JSResult<()> {
ctx.register_class::<EventEmitter>()?;
EventEmitter::add_node_event_target_prototype(ctx)?;
EventEmitter::add_web_event_target_prototype(ctx)?;
ctx.register_class::<Event>()?;
ctx.register_class::<CustomEvent>()?;
ctx.register_class::<EventTarget>()?;
EventTarget::add_web_event_target_prototype(ctx)?;
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use rong_test::*;
#[test]
fn test_emit_error() {
async_run!(|ctx: JSContext| async move {
#[js_export]
struct TestEmitter {
events: EventEmitter,
}
#[js_class]
impl TestEmitter {
#[js_method(constructor)]
fn new() -> Self {
Self {
events: EventEmitter::new(),
}
}
#[js_method]
fn do_operation(&self, this: This<JSObject>, ctx: JSContext) -> JSResult<bool> {
let result: Result<(), String> = Err("Test error message".to_string());
result.emit_error::<Self>(this, &ctx, "do_operation")
}
#[js_method(gc_mark)]
fn gc_mark_with<F>(&self, mark_fn: F)
where
F: FnMut(&JSValue),
{
self.events.gc_mark_with(mark_fn);
}
}
impl Emitter for TestEmitter {
fn get_event_emitter(&self) -> EventEmitter {
self.events.clone()
}
}
ctx.global().set(
"print",
JSFunc::new(&ctx, |msg: String| println!("{}", msg)),
)?;
ctx.register_class::<TestEmitter>()?;
TestEmitter::add_node_event_target_prototype(&ctx)?;
let result = ctx.eval::<bool>(Source::from_bytes(
r#"
let errorCaught = false;
const testEmitter=new TestEmitter();
testEmitter.on('error', (err) => {
print("Got:"+err);
errorCaught = err === "Test error message";
});
testEmitter.do_operation();
errorCaught;
"#,
))?;
assert!(result, "Error event should have been caught by listener");
Ok(())
});
}
#[test]
fn test_event() {
async_run!(|ctx: JSContext| async move {
init(&ctx)?;
rong_assert::init(&ctx)?;
rong_timer::init(&ctx)?;
rong_console::init(&ctx)?;
let passed = UnitJSRunner::load_script(&ctx, "event.js")
.await?
.run()
.await?;
assert!(passed);
Ok(())
});
}
}