1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
use crate::load::MrbLoadSources;
use crate::Mrb;
use crate::MrbError;
pub fn init(interp: &Mrb) -> Result<(), MrbError> {
interp
.borrow_mut()
.def_class::<Monitor>("Monitor", None, None);
interp.def_rb_source_file("monitor.rb", include_str!("monitor.rb"))?;
Ok(())
}
pub struct Monitor;
#[cfg(test)]
mod tests {
use crate::convert::TryFromMrb;
use crate::eval::MrbEval;
#[test]
fn mon_initialize() {
let spec = r#"
cls = Class.new do
include MonitorMixin
def initialize(*array)
mon_initialize
@array = array
end
def to_a
synchronize { @array.dup }
end
def initialize_copy(other)
mon_initialize
synchronize do
@array = other.to_a
end
end
end
instance = cls.new(1, 2, 3)
copy = instance.dup
copy != instance
# The below requires mspec
# copy.should_not equal(instance)
"#;
let interp = crate::interpreter().expect("mrb init");
interp.eval("require 'monitor'").expect("require");
let result = interp.eval(spec).expect("spec");
assert!(unsafe { bool::try_from_mrb(&interp, result) }.expect("convert"));
}
}