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]>
43 lines
1.3 KiB
Rust
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());
|
|
}
|