use ifc_constraint::{create_reference, ReferenceDraft};
use ifc_model::{Model, Transaction, Value};
#[test]
fn a_reference_stages_its_slots() {
let mut model = Model::default();
let mut tx = Transaction::new(&model);
let id = create_reference(
&mut tx,
&model,
ReferenceDraft {
type_identifier: Some("IfcWall"),
attribute_identifier: Some("Name"),
instance_name: Some("Wall 1"),
list_positions: &[],
inner_reference: None,
},
)
.expect("reference");
tx.commit(&mut model).expect("commit");
let staged = model.get(id).expect("staged");
assert_eq!(staged.type_name.as_ref(), "IFCREFERENCE");
assert_eq!(staged.attributes.len(), 5);
assert_eq!(
staged.attributes[4],
Value::Null,
"an absent InnerReference stays null",
);
}
#[test]
fn an_inner_reference_must_be_a_reference() {
let mut model = Model::default();
let mut tx = Transaction::new(&model);
let inner = create_reference(
&mut tx,
&model,
ReferenceDraft {
type_identifier: Some("IfcWall"),
attribute_identifier: None,
instance_name: None,
list_positions: &[],
inner_reference: None,
},
)
.expect("inner");
let outer = create_reference(
&mut tx,
&model,
ReferenceDraft {
type_identifier: None,
attribute_identifier: Some("HasProperties"),
instance_name: None,
list_positions: &[2],
inner_reference: Some(inner),
},
)
.expect("outer");
tx.commit(&mut model).expect("commit");
let staged = model.get(outer).expect("staged");
assert_eq!(staged.attributes[4], Value::Ref(inner));
assert_eq!(
staged.attributes[3],
Value::List(vec![Value::Integer(2)]),
"ListPositions is a LIST [1:?] OF IfcInteger",
);
}
#[test]
fn a_non_reference_inner_target_is_refused() {
use ifc_model::Entity;
let mut model = Model::default();
let mut tx = Transaction::new(&model);
let wall = tx.create(Entity::new("IFCWALL", vec![Value::Null; 8]));
tx.commit(&mut model).expect("commit");
let mut tx = Transaction::new(&model);
assert!(
create_reference(
&mut tx,
&model,
ReferenceDraft {
type_identifier: None,
attribute_identifier: None,
instance_name: None,
list_positions: &[],
inner_reference: Some(wall),
},
)
.is_err(),
"accepted a wall as an InnerReference",
);
}