#![cfg(kani)]
use oxgraph_graph::{ElementSuccessors, OutgoingGraph};
use crate::{CsrGraph, CsrNodeId};
#[kani::proof]
#[kani::unwind(8)]
fn validate_total_n3_m4() {
let node_count: u32 = kani::any();
kani::assume(node_count <= 3);
let offsets_storage: [u32; 4] = kani::any();
let targets: [u32; 4] = kani::any();
let offsets_take: usize = kani::any();
kani::assume(offsets_take <= offsets_storage.len());
let offsets_slice = &offsets_storage[..offsets_take];
let _ = CsrGraph::<u32, u32, u32, u32>::validate(node_count, offsets_slice, &targets);
}
#[kani::proof]
#[kani::unwind(8)]
fn validated_traversal_in_bounds_n2_m2() {
let offsets: [u32; 3] = kani::any();
let targets: [u32; 2] = kani::any();
let graph = match CsrGraph::<u32, u32, u32, u32>::validate(2, &offsets, &targets) {
Ok(value) => value,
Err(_) => return,
};
for node_index in 0..2u32 {
let node = CsrNodeId::new(node_index);
let mut count = 0u32;
for _target in graph.element_successors(node) {
count = count.wrapping_add(1);
}
assert!(count <= 2);
let edges_iter_count: u32 = graph.outgoing_edges(node).count() as u32;
assert_eq!(count, edges_iter_count);
}
}
#[kani::proof]
#[kani::unwind(8)]
fn validated_final_offset_matches_targets_len_n3() {
let offsets: [u32; 4] = kani::any();
let targets: [u32; 3] = kani::any();
let graph = match CsrGraph::<u32, u32, u32, u32>::validate(3, &offsets, &targets) {
Ok(value) => value,
Err(_) => return,
};
let final_offset = graph.offsets()[graph.offsets().len() - 1];
assert_eq!(final_offset as usize, graph.targets().len());
}