use kani::BoundedArbitrary;
struct StateStruct {
items: Vec<u8>,
}
enum StateEnum {
Empty,
WithItems { items: Vec<u8> },
}
#[kani::proof]
fn vec_literal() {
let v: Vec<u8> = vec![];
assert!(v.is_empty());
}
#[kani::proof]
fn vec_new() {
let v = Vec::<u8>::new();
assert!(v.is_empty());
}
#[kani::proof]
fn vec_from_zero_array() {
let v = Vec::from([0u8; 0]);
assert!(v.is_empty());
}
#[kani::proof]
fn vec_bounded_arbitrary_0() {
let v = Vec::<u8>::bounded_any::<0>();
assert!(v.is_empty());
}
#[kani::proof]
fn vec_any_vec_0() {
let v = kani::vec::any_vec::<u8, 0>();
assert!(v.is_empty());
}
#[kani::proof]
fn struct_with_vec_literal() {
let s = StateStruct { items: vec![] };
assert!(s.items.is_empty());
}
#[kani::proof]
fn struct_with_bounded_arbitrary() {
let s = StateStruct {
items: Vec::<u8>::bounded_any::<0>(),
};
assert!(s.items.is_empty());
}
#[kani::proof]
fn struct_with_any_vec_0() {
let s = StateStruct {
items: kani::vec::any_vec::<u8, 0>(),
};
assert!(s.items.is_empty());
}
enum EnumLiteral {
Empty,
WithItems { items: Vec<u8> },
}
#[cfg(kani)]
impl kani::Arbitrary for EnumLiteral {
fn any() -> Self {
if kani::any::<bool>() {
EnumLiteral::Empty
} else {
EnumLiteral::WithItems { items: vec![] }
}
}
}
enum EnumBounded {
Empty,
WithItems { items: Vec<u8> },
}
#[cfg(kani)]
impl kani::Arbitrary for EnumBounded {
fn any() -> Self {
if kani::any::<bool>() {
EnumBounded::Empty
} else {
EnumBounded::WithItems {
items: Vec::<u8>::bounded_any::<0>(),
}
}
}
}
enum EnumAnyVec {
Empty,
WithItems { items: Vec<u8> },
}
#[cfg(kani)]
impl kani::Arbitrary for EnumAnyVec {
fn any() -> Self {
if kani::any::<bool>() {
EnumAnyVec::Empty
} else {
EnumAnyVec::WithItems {
items: kani::vec::any_vec::<u8, 0>(),
}
}
}
}
enum EnumKaniVec {
Empty,
WithItems { items: Vec<u8> },
}
#[cfg(kani)]
impl kani::Arbitrary for EnumKaniVec {
fn any() -> Self {
if kani::any::<bool>() {
EnumKaniVec::Empty
} else {
EnumKaniVec::WithItems {
items: elicitation::kani_vec::<u8>(),
}
}
}
}
#[kani::proof]
fn enum_drop_vec_literal() {
let s: EnumLiteral = kani::any();
match &s {
EnumLiteral::Empty => {}
EnumLiteral::WithItems { items } => assert!(items.is_empty()),
}
}
#[kani::proof]
fn enum_drop_bounded_arbitrary() {
let s: EnumBounded = kani::any();
match &s {
EnumBounded::Empty => {}
EnumBounded::WithItems { items } => assert!(items.is_empty()),
}
}
#[kani::proof]
fn enum_drop_any_vec_0() {
let s: EnumAnyVec = kani::any();
match &s {
EnumAnyVec::Empty => {}
EnumAnyVec::WithItems { items } => assert!(items.is_empty()),
}
}
#[kani::proof]
fn enum_drop_kani_vec() {
let s: EnumKaniVec = kani::any();
match &s {
EnumKaniVec::Empty => {}
EnumKaniVec::WithItems { items } => assert!(items.is_empty()),
}
}
#[cfg_attr(kani, derive(kani::Arbitrary))]
#[derive(Clone)]
enum FmtLike {
Csv,
Json,
Tsv,
Ndjson,
}
#[kani::proof]
fn vec_unit_enum_literal() {
let v: Vec<FmtLike> = vec![];
drop(v);
}
#[kani::proof]
fn vec_unit_enum_any_vec() {
let v: Vec<FmtLike> = kani::vec::any_vec::<FmtLike, 0>();
drop(v);
}
#[kani::proof]
fn vec_unit_enum_bounded_any() {
let v: Vec<FmtLike> = Vec::<FmtLike>::bounded_any::<0>();
drop(v);
}
#[derive(Clone)]
enum FmtManual {
Csv,
Json,
Tsv,
}
#[cfg(kani)]
impl kani::Arbitrary for FmtManual {
fn any() -> Self {
match kani::any::<u8>() % 3 {
0 => FmtManual::Csv,
1 => FmtManual::Json,
_ => FmtManual::Tsv,
}
}
}
#[kani::proof]
fn vec_unit_enum_manual_arb_literal() {
let v: Vec<FmtManual> = vec![];
drop(v);
}
#[kani::proof]
fn vec_unit_enum_manual_arb_any_vec() {
let v: Vec<FmtManual> = kani::vec::any_vec::<FmtManual, 0>();
drop(v);
}
#[kani::proof]
fn vec_unit_enum_manual_arb_bounded_any() {
let v: Vec<FmtManual> = Vec::<FmtManual>::bounded_any::<0>();
drop(v);
}
#[derive(Clone)]
struct ScalarRow {
id: i64,
count: u64,
}
#[cfg(kani)]
impl kani::Arbitrary for ScalarRow {
fn any() -> Self {
ScalarRow {
id: kani::any(),
count: kani::any(),
}
}
}
#[kani::proof]
fn vec_scalar_struct_literal() {
let v: Vec<ScalarRow> = vec![];
drop(v);
}
#[kani::proof]
fn vec_scalar_struct_any_vec() {
let v: Vec<ScalarRow> = kani::vec::any_vec::<ScalarRow, 0>();
drop(v);
}
#[kani::proof]
fn vec_scalar_struct_bounded_any() {
let v: Vec<ScalarRow> = Vec::<ScalarRow>::bounded_any::<0>();
drop(v);
}
#[derive(Clone)]
struct StringRow {
id: i64,
name: String,
sql: String,
}
#[cfg(kani)]
impl kani::Arbitrary for StringRow {
fn any() -> Self {
StringRow {
id: kani::any(),
name: String::new(),
sql: String::new(),
}
}
}
#[kani::proof]
fn vec_string_struct_literal() {
let v: Vec<StringRow> = vec![];
drop(v);
}
#[kani::proof]
fn string_new_drop() {
let s = String::new();
drop(s);
}
#[kani::proof]
fn string_row_direct_drop() {
let row = StringRow {
id: kani::any(),
name: String::new(),
sql: String::new(),
};
drop(row);
}
#[kani::proof]
fn string_row_arbitrary_drop() {
let row: StringRow = kani::any();
drop(row);
}
#[kani::proof]
fn vec_string_row_new_drop() {
let v: Vec<StringRow> = Vec::new();
drop(v);
}
#[kani::proof]
fn array_string_row_zero_any_drop() {
let a: [StringRow; 0] = kani::any();
drop(a);
}
#[kani::proof]
fn vec_from_array_string_row_zero_any() {
let a: [StringRow; 0] = kani::any();
let v: Vec<StringRow> = Vec::from(a);
drop(v);
}
enum OverlayFixed {
None,
Picker { formats: Vec<FmtLike>, idx: usize },
Browser { entries: Vec<StringRow>, idx: usize },
}
#[cfg(kani)]
impl kani::Arbitrary for OverlayFixed {
fn any() -> Self {
match kani::any::<u8>() % 3 {
0 => OverlayFixed::None,
1 => OverlayFixed::Picker {
formats: Vec::new(), idx: kani::any(),
},
_ => OverlayFixed::Browser {
entries: Vec::new(), idx: kani::any(),
},
}
}
}
fn consume_overlay_fixed(state: OverlayFixed) -> OverlayFixed {
drop(state);
OverlayFixed::None
}
#[kani::proof]
fn close_overlay_browser_variant() {
let state = OverlayFixed::Browser {
entries: Vec::new(),
idx: kani::any(),
};
let result = consume_overlay_fixed(state);
assert!(matches!(result, OverlayFixed::None));
}
#[kani::proof]
fn close_overlay_picker_variant() {
let state = OverlayFixed::Picker {
formats: Vec::new(),
idx: kani::any(),
};
let result = consume_overlay_fixed(state);
assert!(matches!(result, OverlayFixed::None));
}
#[kani::proof]
fn close_overlay_none_variant() {
let state = OverlayFixed::None;
let result = consume_overlay_fixed(state);
assert!(matches!(result, OverlayFixed::None));
}