Skip to content

Commit 76512f3

Browse files
AdrianJendopriyasiddharth
authored andcommitted
Implement WithVal functionality
1 parent c40c7a0 commit 76512f3

File tree

2 files changed

+47
-10
lines changed

2 files changed

+47
-10
lines changed

src/rust-jobs/mock-test1/lib.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub trait Test {
1212
}
1313

1414
fn test<T: Test>(mock_test: &T, x: i32, y: bool) -> i32 {
15-
let ans = mock_test.a(x, y);
15+
let ans = mock_test.a(x + 5, y);
1616
mock_test.b();
1717
mock_test.c();
1818
return ans;
@@ -25,17 +25,19 @@ pub extern "C" fn entrypt() {
2525
let y: bool = verifier::any!();
2626

2727
verifier::assume!(x < 10);
28+
verifier::assume!(y == true);
2829

2930
mock
3031
.times_a(2)
3132
.times_b(2)
3233
.times_c(1)
34+
.with_a((WithVal::Lt(15), WithVal::Eq(true)))
3335
.returning_a(|x, _y| x + 5)
3436
.returning_b(|| 4);
3537

3638
verifier::vassert!(mock.a(x, y) < 15);
3739
verifier::vassert!(mock.b() == 4);
38-
verifier::vassert!(test(&mock, x, y) < 15);
40+
verifier::vassert!(test(&mock, x, y) < 20);
3941
verifier::vassert!(mock.expect_times_a(2));
4042
verifier::vassert!(mock.expect_times_b(2));
4143
verifier::vassert!(mock.expect_times_c(1));

src/seamock-lib/src/lib.rs

Lines changed: 43 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,9 @@ pub fn seamock(_args: TokenStream, input: TokenStream) -> TokenStream {
3535
generate_attr_names(method, &["times"])
3636
});
3737

38-
let mut returning_attrs = vec!{};
39-
let mut with_attrs = vec!{};
40-
let mut with_methods = vec!{};
38+
let mut returning_attrs = vec![];
39+
let mut with_attrs = vec![];
40+
let mut with_methods = vec![];
4141

4242
let ret = trait_methods.clone().flat_map(|method| {
4343
let method_output = &method.sig.output;
@@ -134,8 +134,7 @@ pub fn seamock(_args: TokenStream, input: TokenStream) -> TokenStream {
134134
let method_name = &method.sig.ident;
135135
let method_output = &method.sig.output;
136136
let method_inputs = &method.sig.inputs;
137-
let mut params = vec!{};
138-
// For each argument, create WithVal<T> where T is the argument type
137+
let mut params = vec![];
139138
for arg in method_inputs.iter() {
140139
if let syn::FnArg::Typed(pat_type) = arg {
141140
let arg_name = match &*pat_type.pat {
@@ -149,15 +148,49 @@ pub fn seamock(_args: TokenStream, input: TokenStream) -> TokenStream {
149148
let times_attr = Ident::new(&format!("times_{}", &method.sig.ident), method.sig.ident.span());
150149
let max_times_attr = Ident::new(&format!("max_times_{}", &method.sig.ident), method.sig.ident.span());
151150
let ret_func = Ident::new(&format!("val_returning_{}", &method.sig.ident), method.sig.ident.span());
152-
let error = format!("Hit times limit for {}", &method.sig.ident);
151+
let max_attr_error = format!("Hit times limit for {}", &method.sig.ident);
152+
let val_attr = Ident::new(&format!("val_with_{}", &method.sig.ident), method.sig.ident.span());
153+
let val_error = format!("Called {} with incorrect parameters", &method.sig.ident);
154+
155+
let expected_val_logic = params.iter().enumerate().map(|(i, _)| {
156+
let idx = syn::Index::from(i);
157+
Some (quote! {
158+
let with_val = &tuple.#idx;
159+
let input = &params.#idx;
160+
val_match = val_match && match with_val {
161+
WithVal::Gt(val) => input > val,
162+
WithVal::Gte(val) => input >= val,
163+
WithVal::Lt(val) => input < val,
164+
WithVal::Lte(val) => input <= val,
165+
WithVal::Eq(val) => input == val,
166+
};
167+
})
168+
});
169+
170+
let with_matching = if params.len() > 0 {
171+
quote! {
172+
if let Some(tuple) = &self.#val_attr {
173+
let params = (#(#params)*);
174+
let mut val_match = true;
175+
#(
176+
#expected_val_logic
177+
)*
178+
if !val_match {
179+
sea::sea_printf!(#val_error, &self.#val_attr);
180+
verifier::vassert!(false);
181+
}
182+
}
183+
}
184+
} else { quote! {} };
153185

154186
Some (quote! {
155187
fn #method_name(#method_inputs) #method_output {
156188
self.#times_attr.replace_with(|&mut old| old + 1);
157-
if (*self.#times_attr.borrow() > self.#max_times_attr) {
158-
sea::sea_printf!(#error, self.#max_times_attr);
189+
if *self.#times_attr.borrow() > self.#max_times_attr {
190+
sea::sea_printf!(#max_attr_error, self.#max_times_attr);
159191
verifier::vassert!(false);
160192
}
193+
#with_matching
161194
(self.#ret_func)(#(#params)*)
162195
}
163196
})
@@ -220,6 +253,8 @@ pub fn seamock(_args: TokenStream, input: TokenStream) -> TokenStream {
220253
// Combine the generated tokens
221254
let expanded = quote! {
222255
use core::cell::RefCell;
256+
#[macro_use]
257+
extern crate alloc;
223258
enum WithVal<T> {
224259
Gt(T),
225260
Gte(T),

0 commit comments

Comments
 (0)