|
1 | 1 | #![allow(dead_code)] |
2 | 2 |
|
| 3 | +use std::rc::Rc; |
3 | 4 | use std::{ffi::CStr, fs::File, io::Write}; |
4 | 5 |
|
| 6 | +use mrubyedge::yamrb::helpers::{mrb_call_inspect, mrb_define_cmethod}; |
| 7 | +use mrubyedge::yamrb::value::RObject; |
| 8 | +use mrubyedge::yamrb::vm::VM; |
| 9 | +use mrubyedge::Error; |
| 10 | + |
| 11 | +/// Define `Object#assert_eq(expected)` in the VM. |
| 12 | +/// Raises RuntimeError if `self != expected`. |
| 13 | +pub fn define_assert_eq(vm: &mut VM) { |
| 14 | + let object_class = vm.get_class_by_name("Object"); |
| 15 | + |
| 16 | + mrb_define_cmethod( |
| 17 | + vm, |
| 18 | + object_class, |
| 19 | + "assert_eq", |
| 20 | + Box::new( |
| 21 | + |vm: &mut VM, args: &[Rc<RObject>]| -> Result<Rc<RObject>, Error> { |
| 22 | + if args.len() < 2 { |
| 23 | + return Err(Error::ArgumentError( |
| 24 | + "assert_eq requires 2 arguments".to_string(), |
| 25 | + )); |
| 26 | + } |
| 27 | + let expected = &args[0]; |
| 28 | + let got = &args[1]; |
| 29 | + |
| 30 | + let expected_inspect = mrb_call_inspect(vm, expected.clone())?; |
| 31 | + let got_inspect = mrb_call_inspect(vm, got.clone())?; |
| 32 | + |
| 33 | + let expected_str: String = expected_inspect.as_ref().try_into()?; |
| 34 | + let got_str: String = got_inspect.as_ref().try_into()?; |
| 35 | + |
| 36 | + if expected_str != got_str { |
| 37 | + return Err(Error::RuntimeError(format!( |
| 38 | + "assertion failed: expected {}, got {}", |
| 39 | + expected_str, got_str |
| 40 | + ))); |
| 41 | + } |
| 42 | + |
| 43 | + Ok(RObject::nil().to_refcount_assigned()) |
| 44 | + }, |
| 45 | + ), |
| 46 | + ); |
| 47 | +} |
| 48 | + |
5 | 49 | pub fn mrbc_compile(fname: &'static str, code: &str) -> Vec<u8> { |
6 | 50 | let mut src = std::env::temp_dir(); |
7 | 51 | src.push(format!("{}.{}.rb", fname, std::process::id())); |
|
0 commit comments