sqlitegraph 2.2.2

Embedded graph database with full ACID transactions, HNSW vector search, dual backend support, and comprehensive graph algorithms library
Documentation
use sqlitegraph::bench_meta::BenchRun;
use sqlitegraph::bench_regression::{BenchGate, BenchGateConfig, GateEnforcer};

fn config() -> BenchGateConfig {
    BenchGateConfig {
        thresholds: vec![("insert_small".into(), 2_000_000)],
        baseline: vec![BenchRun {
            name: "insert_small".into(),
            mean_ns: 1_500_000,
            samples: 20,
        }],
        tolerance: 0.10,
    }
}

#[test]
fn test_gate_report_collects_failures() {
    let enforcer = GateEnforcer::new(BenchGate::new(config()));
    let runs = vec![BenchRun {
        name: "insert_small".into(),
        mean_ns: 2_500_000,
        samples: 20,
    }];
    let report = enforcer.evaluate(&runs);
    assert!(!report.passed);
    assert_eq!(report.reasons.len(), 2);
    assert!(report.reasons.iter().any(|r| r.contains("threshold")));
    assert!(report.reasons.iter().any(|r| r.contains("baseline")));
}

#[test]
fn test_gate_report_passes_when_conditions_met() {
    let enforcer = GateEnforcer::new(BenchGate::new(config()));
    let runs = vec![BenchRun {
        name: "insert_small".into(),
        mean_ns: 1_600_000,
        samples: 20,
    }];
    let report = enforcer.evaluate(&runs);
    assert!(report.passed);
    assert!(report.reasons.is_empty());
}