mry 0.14.0

A simple but powerful mocking library that supports struct, trait, and function.
Documentation
use std::rc::Rc;

#[mry::mry]
struct Cat {}

struct NonCloneable;

#[derive(Clone, PartialEq, Debug)]
struct A;

#[mry::mry(skip_args(NonCloneable, Rc, A))]
impl Cat {
    fn many_args(&self, non_clonable: NonCloneable, rc: Rc<String>, count: usize) -> String {
        let _ = non_clonable;
        rc.to_string().repeat(count)
    }

    fn skip_return(&self) -> A {
        A
    }
}

#[mry::mry(skip_args(Rc))]
fn skip_rc(rc: Rc<String>) -> String {
    rc.to_string()
}

#[mry::mry(skip_args(Rc))]
fn hello(rc: Rc<String>, count: usize) -> String {
    rc.to_string().repeat(count)
}

#[test]
fn test_many_args() {
    let mut cat = mry::new!(Cat {});
    cat.mock_many_args(2).returns("mocked".to_string());

    assert_eq!(
        cat.many_args(NonCloneable, Rc::new("a".to_string()), 2),
        "mocked"
    );
}

#[test]
#[mry::lock(skip_rc)]
fn test_skip_rc() {
    mock_skip_rc().returns("mocked".to_string());
}

#[test]
#[mry::lock(hello)]
fn test_hello() {
    mock_hello(2).returns_with(|num| "mocked".repeat(num));
    assert_eq!(hello(Rc::new("aaa".into()), 2), "mockedmocked");
}

#[test]
fn test_skip_return_no_effect() {
    let mut cat = mry::new!(Cat {});
    cat.mock_skip_return().returns(A);
    assert_eq!(cat.skip_return(), A);
}