use elicitation::{
ElicitResult,
contracts::{And, Established, InVariant, Is, both},
};
#[tokio::test]
#[cfg_attr(not(feature = "api"), ignore)]
async fn test_string_elicit_proven() -> ElicitResult<()> {
Ok(())
}
#[test]
fn test_proof_composition() {
#[derive(elicitation::Prop)]
struct EmailValidated;
#[derive(elicitation::Prop)]
struct ConsentObtained;
let email_proof: Established<EmailValidated> = Established::assert();
let consent_proof: Established<ConsentObtained> = Established::assert();
let combined: Established<And<EmailValidated, ConsentObtained>> =
both(email_proof, consent_proof);
fn register_user(_email: String, _proof: Established<And<EmailValidated, ConsentObtained>>) {
}
register_user("user@example.com".to_string(), combined);
}
#[test]
fn test_inhabitation_proof() {
fn use_validated_string(_s: String, _proof: Established<Is<String>>) {
}
let s = String::from("hello");
let proof = Established::assert();
use_validated_string(s, proof);
}
#[test]
fn test_proofs_zero_sized() {
let string_proof: Established<Is<String>> = Established::assert();
assert_eq!(std::mem::size_of_val(&string_proof), 0);
let i32_proof: Established<Is<i32>> = Established::assert();
assert_eq!(std::mem::size_of_val(&i32_proof), 0);
#[derive(elicitation::Prop)]
struct EmailValid;
let custom_proof: Established<EmailValid> = Established::assert();
assert_eq!(std::mem::size_of_val(&custom_proof), 0);
}
#[test]
fn test_invariant_state_machine() {
enum WorkflowState {
Draft,
Review,
Approved,
}
struct DraftVariant;
struct ReviewVariant;
struct ApprovedVariant;
fn edit_draft(
_state: WorkflowState,
_proof: Established<InVariant<WorkflowState, DraftVariant>>,
) {
}
fn submit_for_review(
_state: WorkflowState,
_proof: Established<InVariant<WorkflowState, DraftVariant>>,
) -> Established<InVariant<WorkflowState, ReviewVariant>> {
Established::assert()
}
fn approve(
_state: WorkflowState,
_proof: Established<InVariant<WorkflowState, ReviewVariant>>,
) -> Established<InVariant<WorkflowState, ApprovedVariant>> {
Established::assert()
}
let draft_proof: Established<InVariant<WorkflowState, DraftVariant>> = Established::assert();
edit_draft(WorkflowState::Draft, draft_proof);
let review_proof = submit_for_review(WorkflowState::Draft, draft_proof);
let approved_proof = approve(WorkflowState::Review, review_proof);
let _final_state = (WorkflowState::Approved, approved_proof);
}