use vim_rs::types::boxed_types::ValueElements;
use vim_rs::types::convert::CastInto;
use vim_rs::types::structs::{VirtualDevice, VirtualE1000, VirtualEthernetCard};
use vim_rs::types::traits::VirtualEthernetCardTrait;
use vim_rs::types::vim_any::VimAny;
#[test]
fn narrow_vim_any_array_of_virtual_device() {
let any = VimAny::Value(ValueElements::ArrayOfVirtualDevice(vec![Box::new(
create_virtual_e1000(),
)]));
let VimAny::Value(ValueElements::ArrayOfVirtualDevice(devices)) = any else {
panic!("expected VimAny::Value(ArrayOfVirtualDevice)");
};
let e1000 = devices[0]
.as_any_ref()
.downcast_ref::<VirtualE1000>()
.expect("first device should be VirtualE1000");
assert_eq!(e1000.key, 1000);
}
#[test]
fn downcast_vim_any_object_to_concrete_type() {
let any = VimAny::Object(Box::new(create_virtual_e1000()));
let VimAny::Object(obj) = any else {
panic!("expected VimAny::Object");
};
let e1000: Box<VirtualE1000> = obj.as_any_box().downcast().expect("downcast should work");
assert_eq!(e1000.key, 1000);
}
#[test]
fn narrow_vim_any_object_to_trait_box() {
let any = VimAny::Object(Box::new(create_virtual_e1000()));
let VimAny::Object(obj) = any else {
panic!("expected VimAny::Object");
};
let eth: Box<dyn VirtualEthernetCardTrait> = obj.into_box().expect("trait cast should work");
assert_eq!(eth.key, 1000);
assert_eq!(
eth.mac_address,
Some("00:50:56:aa:bb:cc".to_string())
);
}
fn create_virtual_e1000() -> VirtualE1000 {
VirtualE1000 {
virtual_ethernet_card_: VirtualEthernetCard {
virtual_device_: VirtualDevice {
numa_node: None,
device_group_info: None,
unit_number: None,
backing: None,
controller_key: None,
slot_info: None,
key: 1000,
device_info: None,
connectable: None,
},
dynamic_property: None,
mac_address: Some("00:50:56:aa:bb:cc".to_string()),
wake_on_lan_enabled: Some(true),
address_type: Some("Generated".to_string()),
subnet_id: None,
resource_allocation: None,
upt_compatibility_enabled: Some(false),
external_id: None,
},
}
}