Skip to content

Commit 23b7abd

Browse files
authored
Add range demo example (rust-lang#2772)
1 parent c3ff9ea commit 23b7abd

File tree

3 files changed

+64
-0
lines changed

3 files changed

+64
-0
lines changed
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# Copyright Kani Contributors
2+
# SPDX-License-Identifier: Apache-2.0 OR MIT
3+
[package]
4+
name = "non-empty-range"
5+
version = "0.1.0"
6+
edition = "2021"
7+
description = "A demo example for Kani that shows how to go from partial assurance with unit tests to full assurance with Kani"
8+
9+
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
10+
11+
[dependencies]
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Status: SUCCESS\
2+
Description: "assertion failed: range.is_none() || !range.as_ref().unwrap().is_empty()"
3+
4+
VERIFICATION:- SUCCESSFUL
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright Kani Contributors
2+
// SPDX-License-Identifier: Apache-2.0 OR MIT
3+
4+
/// a helper function that given a pair of integers, returns a valid non-empty
5+
/// range (if possible) or `None`
6+
pub fn create_non_empty_range(a: i32, b: i32) -> Option<std::ops::Range<i32>> {
7+
let range = if a < b {
8+
Some(a..b)
9+
} else if b < a {
10+
Some(b..a)
11+
} else {
12+
None
13+
};
14+
assert!(range.is_none() || !range.as_ref().unwrap().is_empty());
15+
range
16+
}
17+
18+
#[cfg(test)]
19+
mod tests {
20+
use super::*;
21+
22+
#[test]
23+
fn test_create_range1() {
24+
let r = create_non_empty_range(5, 9);
25+
assert_eq!(r.unwrap(), 5..9);
26+
}
27+
28+
#[test]
29+
fn test_create_range2() {
30+
let r = create_non_empty_range(35, 2);
31+
assert_eq!(r.unwrap(), 2..35);
32+
}
33+
34+
#[test]
35+
fn test_create_range3() {
36+
let r = create_non_empty_range(-5, -5);
37+
assert!(r.is_none());
38+
}
39+
}
40+
41+
#[cfg(kani)]
42+
mod kani_checks {
43+
use super::*;
44+
45+
#[kani::proof]
46+
fn check_range() {
47+
create_non_empty_range(kani::any(), kani::any());
48+
}
49+
}

0 commit comments

Comments
 (0)