Skip to content

Commit 2d3f0f4

Browse files
committed
small usability improvement: distinguish invariants in errors
1 parent 3da5f53 commit 2d3f0f4

2 files changed

Lines changed: 17 additions & 3 deletions

File tree

src/lib.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -159,17 +159,21 @@ fn instrument_body(func: &ItemFn, args: &ContractArgs) -> Result<proc_macro2::To
159159

160160
// --- Generate Precondition Checks ---
161161
let preconditions = args.conditions.iter().filter_map(|c| match c {
162-
Condition::Requires { predicate } | Condition::Maintains { predicate } => {
162+
Condition::Requires { predicate } => {
163163
let msg = format!("Precondition failed: {}", predicate.to_token_stream());
164164
Some(quote! { assert!(#predicate, #msg); })
165165
}
166+
Condition::Maintains { predicate } => {
167+
let msg = format!("Pre-invariant failed: {}", predicate.to_token_stream());
168+
Some(quote! { assert!(#predicate, #msg); })
169+
}
166170
_ => None,
167171
});
168172

169173
// --- Generate Postcondition Checks ---
170174
let postconditions = args.conditions.iter().filter_map(|c| match c {
171175
Condition::Maintains { predicate } => {
172-
let msg = format!("Postcondition failed: {}", predicate.to_token_stream());
176+
let msg = format!("Post-invariant failed: {}", predicate.to_token_stream());
173177
Some(quote! { assert!(#predicate, #msg); })
174178
}
175179
Condition::Ensures { predicate } => {

tests/method_with_invariant.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,21 @@ fn test_increment_success() {
2525
}
2626

2727
#[test]
28-
#[should_panic(expected = "Postcondition failed: self.count <= self.capacity")]
28+
#[should_panic(expected = "Post-invariant failed: self.count <= self.capacity")]
2929
fn test_increment_violates_invariant() {
3030
let mut c = Counter {
3131
count: 10,
3232
capacity: 10,
3333
};
3434
c.increment(); // This will make count 11, violating the invariant on exit.
3535
}
36+
37+
#[test]
38+
#[should_panic(expected = "Pre-invariant failed: self.count <= self.capacity")]
39+
fn test_increment_violates_pre_invariant() {
40+
let mut c = Counter {
41+
count: 11,
42+
capacity: 10, // count > capacity, violates pre-invariant
43+
};
44+
c.increment();
45+
}

0 commit comments

Comments
 (0)