use wasm4pm_compat::declare::{
Activity, DeclareConstraint, DeclareScope, DeclareTemplate, OcDeclareConstraint,
OcDeclareRefusal,
};
fn base(scope: DeclareScope) -> DeclareConstraint {
DeclareConstraint::unary(DeclareTemplate::Existence, Activity::new("create"), scope)
}
#[test]
fn oc_declare_refuses_empty_object_type_list() {
let c = OcDeclareConstraint::new(
base(DeclareScope::SingleObjectScope("order".into())),
Vec::<String>::new(),
);
assert_eq!(c.validate(), Err(OcDeclareRefusal::EmptyObjectTypeList));
}
#[test]
fn oc_declare_refuses_synchronization_with_single_type() {
let c = OcDeclareConstraint::synchronized(
base(DeclareScope::SynchronizedObjectScope(vec![
"order".into(),
"item".into(),
])),
vec!["order".into()], );
assert_eq!(
c.validate(),
Err(OcDeclareRefusal::SynchronizationRequiresMultipleTypes)
);
}
#[test]
fn oc_declare_refuses_scope_mismatch() {
let c = OcDeclareConstraint::new(
base(DeclareScope::SynchronizedObjectScope(vec![
"order".into(),
"item".into(),
])),
vec!["order".into(), "item".into()],
);
assert_eq!(c.validate(), Err(OcDeclareRefusal::ScopeMismatch));
}
#[test]
fn oc_declare_admits_well_formed_constraint() {
let c = OcDeclareConstraint::new(
base(DeclareScope::SingleObjectScope("order".into())),
vec!["order".into()],
);
assert_eq!(
c.validate(),
Ok(()),
"non-empty types, non-sync, single scope → admits"
);
assert!(!c.is_synchronized());
}