use ifc_model::{Model, Value};
use ifc_resource::{AppliedValueDraft, ResourceEditor};
fn model() -> Model {
let mut model = Model::default();
model.header_mut().schema = vec!["IFC4".to_owned()];
model
}
#[test]
fn an_applied_value_stages() {
let mut model = model();
let mut editor = ResourceEditor::for_model(&mut model).expect("editor");
let id = editor
.create_applied_value(
AppliedValueDraft {
name: Some("Unit rate"),
category: Some("Labour"),
..AppliedValueDraft::default()
},
&[],
)
.expect("applied value");
let staged = model.get(id).expect("staged");
assert_eq!(staged.type_name.as_ref(), "IfcAppliedValue");
assert_eq!(staged.attributes.len(), 10);
assert_eq!(
staged.attributes[9],
Value::Null,
"an absent Components stays null, not an empty list",
);
}
#[test]
fn an_operator_without_components_is_refused() {
let mut model = model();
let mut editor = ResourceEditor::for_model(&mut model).expect("editor");
assert!(
editor
.create_applied_value(
AppliedValueDraft {
arithmetic_operator: Some("ADD"),
..AppliedValueDraft::default()
},
&[]
)
.is_err(),
"accepted an operator over no operands",
);
}
#[test]
fn a_nested_component_must_be_an_applied_value() {
let mut model = model();
let mut editor = ResourceEditor::for_model(&mut model).expect("editor");
let inner = editor
.create_applied_value(
AppliedValueDraft {
name: Some("Base"),
..AppliedValueDraft::default()
},
&[],
)
.expect("inner");
let outer = editor
.create_applied_value(
AppliedValueDraft {
arithmetic_operator: Some("ADD"),
..AppliedValueDraft::default()
},
&[inner],
)
.expect("outer");
let staged = model.get(outer).expect("staged");
assert_eq!(
staged.attributes[9],
Value::List(vec![Value::Ref(inner)]),
"Components is a LIST [1:?] OF IfcAppliedValue",
);
}