forked from 1b-agent/opencadstudio-upstream
feat: evaluate Lookup choices in Test Block
Verify disposable reference geometry follows selected table rows while the editor definition remains unchanged.
This commit is contained in:
1 parent
09cb28e5b0
commit
68f98ef720
1 file changed
+103
@@ -302,6 +302,109 @@ fn block_test_unsaved_visibility_states_work_without_changing_the_editor() {
|
|||||||
assert_eq!(app.tabs[source].scene.document, original);
|
assert_eq!(app.tabs[source].scene.document, original);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn block_test_lookup_choice_evaluates_temporary_reference_only() {
|
||||||
|
use crate::scene::model::object::PropValue;
|
||||||
|
use crate::scene::{block_actions, block_distance_parameter as distance, block_lookup};
|
||||||
|
use codec::objects::BlockLookupAction;
|
||||||
|
|
||||||
|
let (mut app, source, _) = fixture();
|
||||||
|
let definition = app.tabs[source]
|
||||||
|
.active_block_edit_session()
|
||||||
|
.unwrap()
|
||||||
|
.br_handle;
|
||||||
|
let line = app.tabs[source]
|
||||||
|
.scene
|
||||||
|
.document
|
||||||
|
.block_records
|
||||||
|
.get("SAMPLE")
|
||||||
|
.unwrap()
|
||||||
|
.entity_handles[0];
|
||||||
|
let doc = &mut app.tabs[source].scene.document;
|
||||||
|
let parameter = distance::create(
|
||||||
|
doc,
|
||||||
|
definition,
|
||||||
|
distance::Kind::Linear,
|
||||||
|
Vector3::new(10.0, 20.0, 0.0),
|
||||||
|
Vector3::new(12.0, 20.0, 0.0),
|
||||||
|
Vector3::new(10.0, 21.0, 0.0),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
block_actions::create(
|
||||||
|
doc,
|
||||||
|
definition,
|
||||||
|
block_actions::Kind::Move,
|
||||||
|
parameter,
|
||||||
|
&[line],
|
||||||
|
glam::DVec3::new(10.0, 20.0, 0.0),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
let lookup_parameter =
|
||||||
|
block_lookup::create(doc, definition, Vector3::new(11.0, 21.0, 0.0)).unwrap();
|
||||||
|
let mut table = block_lookup::empty_table(
|
||||||
|
block_lookup::parameters(doc, definition)
|
||||||
|
.into_iter()
|
||||||
|
.find(|(handle, _)| *handle == lookup_parameter)
|
||||||
|
.unwrap()
|
||||||
|
.1,
|
||||||
|
);
|
||||||
|
table.columns.insert(
|
||||||
|
0,
|
||||||
|
block_lookup::properties(doc, definition)[0].column.clone(),
|
||||||
|
);
|
||||||
|
table.column_count = 2;
|
||||||
|
table.row_count = 2;
|
||||||
|
table.expressions = vec!["2".into(), "Small".into(), "4".into(), "Large".into()];
|
||||||
|
block_lookup::apply_table(doc, definition, lookup_parameter, table).unwrap();
|
||||||
|
|
||||||
|
let source_before = app.tabs[source].scene.document.clone();
|
||||||
|
let _ = app.open_block_test(source);
|
||||||
|
let test = app.active_tab;
|
||||||
|
let insert = app.tabs[test].block_test.as_ref().unwrap().insert;
|
||||||
|
app.tabs[test].scene.selected.insert(insert);
|
||||||
|
app.tabs[test].selected_handle = Some(insert);
|
||||||
|
app.refresh_properties();
|
||||||
|
let lookup_property = app.tabs[test]
|
||||||
|
.properties
|
||||||
|
.sections
|
||||||
|
.iter()
|
||||||
|
.flat_map(|section| §ion.props)
|
||||||
|
.find(|property| property.field == "dyn_lookup")
|
||||||
|
.expect("Test Block should expose the Lookup table choice");
|
||||||
|
let PropValue::Choice { selected, options } = &lookup_property.value else {
|
||||||
|
panic!("Lookup table property should be a choice")
|
||||||
|
};
|
||||||
|
assert_eq!(selected, "Small");
|
||||||
|
assert_eq!(options, &["Small", "Large"]);
|
||||||
|
|
||||||
|
let _ = app.update(super::Message::PropGeomChoiceChanged {
|
||||||
|
field: "dyn_lookup",
|
||||||
|
value: "Large".into(),
|
||||||
|
});
|
||||||
|
let EntityType::Insert(evaluated) = app.tabs[test].scene.document.get_entity(insert).unwrap()
|
||||||
|
else {
|
||||||
|
panic!("expected the temporary Test Block reference")
|
||||||
|
};
|
||||||
|
assert_ne!(evaluated.block_name, "SAMPLE");
|
||||||
|
let member = app.tabs[test]
|
||||||
|
.scene
|
||||||
|
.document
|
||||||
|
.block_records
|
||||||
|
.get(&evaluated.block_name)
|
||||||
|
.unwrap()
|
||||||
|
.entity_handles[0];
|
||||||
|
let EntityType::Line(line) = app.tabs[test].scene.document.get_entity(member).unwrap() else {
|
||||||
|
panic!("expected the materialized line")
|
||||||
|
};
|
||||||
|
assert_eq!(line.start, Vector3::new(12.0, 20.0, 0.0));
|
||||||
|
assert_eq!(line.end, Vector3::new(17.0, 20.0, 0.0));
|
||||||
|
assert_eq!(app.tabs[source].scene.document, source_before);
|
||||||
|
assert!(matches!(
|
||||||
|
block_lookup::table(&app.tabs[test].scene.document, definition, lookup_parameter).unwrap(),
|
||||||
|
Some((_, BlockLookupAction { row_count: 2, .. }))
|
||||||
|
));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn block_test_attributes_use_defaults_and_the_stored_base_point() {
|
fn block_test_attributes_use_defaults_and_the_stored_base_point() {
|
||||||
use codec::entities::AttributeDefinition;
|
use codec::entities::AttributeDefinition;
|
||||||
|
|||||||
Reference in new issue
Block a user