open-standards/eoc/eoc-rs/crates/eoc-rag/tests/citation_required.rs
Transaction Science e11c20b1eb ingest wave A3: 3 crates · op-ewallets-asia + smart-byte-zk + eoc-rag
OpenPay (1 crate, 3277 LOC, 18 tests)
  op-ewallets-asia    APAC e-wallet rail adapters. Alipay Cross-Border v3,
                      WeChat Pay (JSAPI/Native/H5/MicroPay) with constant-time
                      HMAC notify, UPI 2.0 (collect/intent/mandate/VPA),
                      Paytm, GrabPay, GoPay (Midtrans), Touch'n Go.
                      EMVCo MPM TLV + CRC-16/CCITT-FALSE encoder for
                      PromptPay (TH), PayNow (SG), DuitNow (MY), QRIS (ID).
                      Transport-free traits — operators inject HTTP + RSA-SHA256
                      signers (keeps POS firmware / WASM consumers reqwest-free).

Smart Byte (1 crate, 1310 LOC, 15 tests)
  smart-byte-zk       Selective-disclosure ZK primitives.
                      Real: Bulletproofs over Ristretto255 (range proofs at
                      8/16/32/64-bit), RangePredicate / InequalityPredicate /
                      SetMembershipPredicate all delegating to Bulletproofs.
                      Stubs (documented): Groth16, PLONK — deterministic
                      placeholder proofs satisfying ZkScheme trait for future
                      arkworks integration. AnonCred sketch + VerifiablePresentation
                      builder.

EOC (1 crate, ~3000 LOC, 36 tests)
  eoc-rag             RAG orchestrator. Naive (Lewis 2020), HyDE (Gao 2022),
                      RAG-Fusion + RRF (Cormack 2009), Self-RAG (Asai 2023)
                      with Retrieve/ISREL/ISSUP/ISUSE critique tokens,
                      Corrective RAG (Yan 2024) with retrieval evaluator
                      + external fallback, Adaptive RAG (Jeong 2024)
                      complexity router. Chunking: sentence-window, semantic,
                      recursive, late-chunking. Span-backed citations with
                      3-mode enforcement. SelfCheckGPT consistency guard.

Co-Authored-By: Claude Opus 4.7 <[email protected]>
2026-05-24 12:08:49 -04:00

43 lines
1.3 KiB
Rust

//! Integration test: under `CitationPolicy::Required`, the
//! enforcement gate rejects answers with no citations.
use eoc_rag::{
CitationEnforcement, CitationPolicy, Chunk, Cite, RagError, RetrievedChunk,
};
#[test]
fn required_policy_rejects_empty_citations() {
let gate = CitationEnforcement::new(CitationPolicy::Required);
let chunks = vec![RetrievedChunk {
chunk: Chunk::new("d1", 0, "evidence text"),
score: 1.0,
rank: 1,
}];
let err = gate
.enforce("an answer with no cites", &chunks, &[])
.expect_err("must reject");
matches!(err, RagError::CitationRequired);
}
#[test]
fn required_policy_accepts_with_cite() {
let gate = CitationEnforcement::new(CitationPolicy::Required);
let chunk = Chunk::new("d1", 0, "evidence text");
let cites = vec![Cite::whole(&chunk)];
let chunks = vec![RetrievedChunk {
chunk,
score: 1.0,
rank: 1,
}];
assert!(
gate.enforce("an answer that cites evidence", &chunks, &cites)
.is_ok()
);
}
#[test]
fn optional_policy_accepts_empty_citations() {
let gate = CitationEnforcement::new(CitationPolicy::Optional);
let chunks: Vec<RetrievedChunk> = Vec::new();
assert!(gate.enforce("no cites no problem", &chunks, &[]).is_ok());
}