trellis_testing/
oracle.rs1use std::fmt::Debug;
2
3pub trait FullRecomputeOracle<G> {
5 type CanonicalInputs;
7 type ExpectedState: Clone + Debug + PartialEq;
9
10 fn recompute(inputs: &Self::CanonicalInputs) -> Self::ExpectedState;
12
13 fn observe_incremental(graph: &G, inputs: &Self::CanonicalInputs) -> Self::ExpectedState;
15}
16
17#[derive(Clone, Debug, Eq, PartialEq)]
19pub struct OracleCheck<S> {
20 pub expected: S,
22 pub actual: S,
24}
25
26#[derive(Clone, Debug, Eq, PartialEq)]
28pub struct OracleMismatch<S> {
29 pub expected: S,
31 pub actual: S,
33}
34
35pub fn assert_incremental_equals_full<G, O>(
37 graph: &G,
38 inputs: &O::CanonicalInputs,
39) -> Result<OracleCheck<O::ExpectedState>, OracleMismatch<O::ExpectedState>>
40where
41 O: FullRecomputeOracle<G>,
42{
43 let expected = O::recompute(inputs);
44 let actual = O::observe_incremental(graph, inputs);
45 if expected == actual {
46 Ok(OracleCheck { expected, actual })
47 } else {
48 Err(OracleMismatch { expected, actual })
49 }
50}