Files
MetaCrate/tests/compat/tests/rlv_rem_attach_commands_semantics.rs

425 lines
18 KiB
Rust

//! Exact Rust translations of every `detach`/`remattach` alias case.
use libremetaverse_compat_tests::block_on;
use libremetaverse_compat_tests::rlv_support::{RlvHarness, SampleInventoryTree, guid};
use libremetaverse_rlv::{InventoryMap, RlvAttachmentPoint, RlvInventoryItem, RlvWearableType};
use libremetaverse_types::compat::Guid;
const HAPPY: &str = "b1111111-bbbb-4bbb-8bbb-bbbbbbbbbbbb";
const RETRO: &str = "b2222222-bbbb-4bbb-8bbb-bbbbbbbbbbbb";
const FANCY: &str = "d1111111-dddd-4ddd-8ddd-dddddddddddd";
const EXTERNAL: &str = "12312312-0002-4aaa-8aaa-aaaaaaaaaaaa";
const PRIM1: &str = "11111111-0001-4aaa-8aaa-ffffffffffff";
const EXTERNAL_PRIM: &str = "12312312-0002-4aaa-8aaa-ffffffffffff";
#[derive(Clone, Copy)]
enum Setup {
Normal,
NoStrip,
NoStripLink,
External,
Folder,
FolderNoStrip,
FolderLink,
Point,
PointNoStrip,
PointLink,
PointNone,
Uuid,
UuidItemNoStrip,
UuidFolderNoStrip,
UuidFolderLink,
UuidRestricted,
UuidExternal,
}
fn attach(item: &mut RlvInventoryItem, point: RlvAttachmentPoint, prim: &str) {
item.set_attached_to(Some(Some(point)));
item.set_attached_prim_id(Some(Some(guid(prim))));
}
fn external(
id: &str,
name: &str,
point: Option<RlvAttachmentPoint>,
prim: Option<&str>,
worn: Option<RlvWearableType>,
) -> RlvInventoryItem {
RlvInventoryItem::new(
guid(id),
name.into(),
false,
Some(Some(guid("12312312-aaaa-4aaa-8aaa-aaaaaaaaaaaa"))),
point.map(Some),
prim.map(|v| Some(guid(v))),
worn.map(Some),
None,
)
.unwrap()
}
fn base(tree: &mut SampleInventoryTree) {
attach(&mut tree.happy_shirt, RlvAttachmentPoint::Chest, PRIM1);
attach(
&mut tree.fancy_hat,
RlvAttachmentPoint::Chin,
"11111111-0003-4aaa-8aaa-ffffffffffff",
);
tree.retro_pants
.set_worn_on(Some(Some(RlvWearableType::Pants)));
}
#[allow(clippy::too_many_lines)]
fn run(command: &str, setup: Setup) -> Vec<Guid> {
let h = RlvHarness::new().expect("RlvService constructor");
let mut tree = SampleInventoryTree::build().unwrap();
let mut external_items = vec![];
base(&mut tree);
match setup {
Setup::NoStrip | Setup::NoStripLink => {
tree.hats.set_name("nostrip Hats".into());
tree.happy_shirt.set_name("nostrip Happy Shirt".into());
attach(
&mut tree.retro_pants,
RlvAttachmentPoint::Groin,
"11111111-0005-4aaa-8aaa-ffffffffffff",
);
if matches!(setup, Setup::NoStripLink) {
tree.fancy_hat.set_is_link(true);
}
}
Setup::External => {
external_items.push(external(
"12312312-0001-4aaa-8aaa-aaaaaaaaaaaa",
"External Tattoo",
None,
None,
Some(RlvWearableType::Tattoo),
));
external_items.push(external(
EXTERNAL,
"External Jaw Thing",
Some(RlvAttachmentPoint::Jaw),
Some(EXTERNAL_PRIM),
None,
));
}
Setup::FolderNoStrip | Setup::FolderLink => {
tree.hats.set_name("nostrip Hats".into());
if matches!(setup, Setup::FolderLink) {
tree.fancy_hat.set_is_link(true);
}
}
Setup::Point => external_items.push(external(
EXTERNAL,
"External Chest Thing",
Some(RlvAttachmentPoint::Chest),
Some(EXTERNAL_PRIM),
None,
)),
Setup::PointNoStrip | Setup::PointLink => {
tree.hats.set_name("nostrip Hats".into());
tree.happy_shirt.set_name("nostrip Happy Shirt".into());
attach(
&mut tree.fancy_hat,
RlvAttachmentPoint::Chest,
"11111111-0003-4aaa-8aaa-ffffffffffff",
);
attach(
&mut tree.retro_pants,
RlvAttachmentPoint::Chest,
"11111111-0005-4aaa-8aaa-ffffffffffff",
);
if matches!(setup, Setup::PointLink) {
tree.fancy_hat.set_is_link(true);
}
external_items.push(external(
EXTERNAL,
"External Chest Thing",
Some(RlvAttachmentPoint::Chest),
Some(EXTERNAL_PRIM),
None,
));
external_items.push(external(
"12312312-0003-4aaa-8aaa-aaaaaaaaaaaa",
"nostrip External Chest Thing",
Some(RlvAttachmentPoint::Chest),
Some("12312312-0003-4aaa-8aaa-ffffffffffff"),
None,
));
}
Setup::UuidItemNoStrip => tree.happy_shirt.set_name("nostrip Happy Shirt".into()),
Setup::UuidFolderNoStrip | Setup::UuidFolderLink => {
tree.clothing.set_name("nostrip Clothing".into());
if matches!(setup, Setup::UuidFolderLink) {
tree.happy_shirt.set_is_link(true);
}
}
Setup::UuidExternal => external_items.push(external(
EXTERNAL,
"External Jaw Thing",
Some(RlvAttachmentPoint::Jaw),
Some(EXTERNAL_PRIM),
None,
)),
_ => {}
}
h.queries.lock().unwrap().inventory_map =
Some(InventoryMap::new(tree.root, external_items).unwrap());
if matches!(setup, Setup::UuidRestricted) {
block_on(h.process("@detachallthis:Clothing=n")).unwrap();
}
block_on(h.process(command)).unwrap();
let mut v = h.actions.lock().unwrap().detachments[0].clone();
v.sort_by_key(|id| id.0);
v
}
fn ids(values: &[&str]) -> Vec<Guid> {
let mut v: Vec<_> = values.iter().map(|s| guid(s)).collect();
v.sort_by_key(|id| id.0);
v
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach::case:bb1d34dc76ade75f 16420d56c60229e8d8b6a2a0d63b1f500112c23cef451d69bb0ed97fe9b63bae translated
#[test]
fn detach_all_attachments() {
assert_eq!(run("@detach=force", Setup::Normal), ids(&[HAPPY, FANCY]));
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach::case:c9faa5be8fef55e8 16420d56c60229e8d8b6a2a0d63b1f500112c23cef451d69bb0ed97fe9b63bae translated
#[test]
fn remattach_all_attachments() {
assert_eq!(run("@remattach=force", Setup::Normal), ids(&[HAPPY, FANCY]));
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_NoStrip::case:bb1d34dc76ade75f 5b3f1cbe99833e16c6f10ef568618627445babbcdfc9be555b48257bfdffeea7 translated
#[test]
fn detach_honors_nostrip() {
assert_eq!(run("@detach=force", Setup::NoStrip), ids(&[RETRO]));
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_NoStrip::case:c9faa5be8fef55e8 5b3f1cbe99833e16c6f10ef568618627445babbcdfc9be555b48257bfdffeea7 translated
#[test]
fn remattach_honors_nostrip() {
assert_eq!(run("@remattach=force", Setup::NoStrip), ids(&[RETRO]));
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_NoStrip_LinkException::case:bb1d34dc76ade75f 96a4b53d9e55dcd656c25af6619a3d0d67f5bc2517a759d722559a4ffb225472 translated
#[test]
fn detach_honors_nostrip_link_exception() {
assert_eq!(
run("@detach=force", Setup::NoStripLink),
ids(&[RETRO, FANCY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_NoStrip_LinkException::case:c9faa5be8fef55e8 96a4b53d9e55dcd656c25af6619a3d0d67f5bc2517a759d722559a4ffb225472 translated
#[test]
fn remattach_honors_nostrip_link_exception() {
assert_eq!(
run("@remattach=force", Setup::NoStripLink),
ids(&[RETRO, FANCY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ExternalItems::case:bb1d34dc76ade75f 7545f36532fcb7974a9e009e567b2342754a11da95eb3f17ee04089dcec42664 translated
#[test]
fn detach_external_items() {
assert_eq!(
run("@detach=force", Setup::External),
ids(&[HAPPY, FANCY, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ExternalItems::case:c9faa5be8fef55e8 7545f36532fcb7974a9e009e567b2342754a11da95eb3f17ee04089dcec42664 translated
#[test]
fn remattach_external_items() {
assert_eq!(
run("@remattach=force", Setup::External),
ids(&[HAPPY, FANCY, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByFolder::case:97eb7af1f9c3c62c 583d3f596c80411d950038e3ec64032bee75150b8c819741fe89a4ca40eb2553 translated
#[test]
fn detach_by_folder() {
assert_eq!(
run("@detach:Clothing/Hats=force", Setup::Folder),
ids(&[FANCY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByFolder::case:1a04fd408fddaac0 583d3f596c80411d950038e3ec64032bee75150b8c819741fe89a4ca40eb2553 translated
#[test]
fn remattach_by_folder() {
assert_eq!(
run("@remattach:Clothing/Hats=force", Setup::Folder),
ids(&[FANCY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByFolder_NoStrip::case:2117c838922f5ba4 3a21b8ae807126d6f93ac95e16c47330b4146ace9781e9c9665ad493ee8c48b1 translated
#[test]
fn detach_by_folder_honors_nostrip() {
assert!(run("@detach:Clothing/nostrip Hats=force", Setup::FolderNoStrip).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByFolder_NoStrip::case:11d4ca4fd3e35db1 3a21b8ae807126d6f93ac95e16c47330b4146ace9781e9c9665ad493ee8c48b1 translated
#[test]
fn remattach_by_folder_honors_nostrip() {
assert!(
run(
"@remattach:Clothing/nostrip Hats=force",
Setup::FolderNoStrip
)
.is_empty()
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByFolder_NoStrip_LinkException::case:2117c838922f5ba4 7c00e7dc70b3078d75009cf78a9fece889eee85f237c1a3c79c6249ae5e5327f translated
#[test]
fn detach_by_folder_honors_link_exception() {
assert_eq!(
run("@detach:Clothing/nostrip Hats=force", Setup::FolderLink),
ids(&[FANCY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByFolder_NoStrip_LinkException::case:11d4ca4fd3e35db1 7c00e7dc70b3078d75009cf78a9fece889eee85f237c1a3c79c6249ae5e5327f translated
#[test]
fn remattach_by_folder_honors_link_exception() {
assert_eq!(
run("@remattach:Clothing/nostrip Hats=force", Setup::FolderLink),
ids(&[FANCY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint::case:644d3f75f3570ac3 e09627228c1cf8311e56ac6660389bc1b268db8fd4f883dc40aaf3d2ec00916b translated
#[test]
fn detach_by_attachment_point() {
assert_eq!(
run("@detach:chest=force", Setup::Point),
ids(&[HAPPY, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint::case:53be219b37533fa6 e09627228c1cf8311e56ac6660389bc1b268db8fd4f883dc40aaf3d2ec00916b translated
#[test]
fn remattach_by_attachment_point() {
assert_eq!(
run("@remattach:chest=force", Setup::Point),
ids(&[HAPPY, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint_NoStrip::case:644d3f75f3570ac3 ffaaad92700d5d606154abdddd05c24c7584c5c3e55290df61e2b2a71d8148d7 translated
#[test]
fn detach_by_attachment_point_honors_nostrip() {
assert_eq!(
run("@detach:chest=force", Setup::PointNoStrip),
ids(&[RETRO, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint_NoStrip::case:53be219b37533fa6 ffaaad92700d5d606154abdddd05c24c7584c5c3e55290df61e2b2a71d8148d7 translated
#[test]
fn remattach_by_attachment_point_honors_nostrip() {
assert_eq!(
run("@remattach:chest=force", Setup::PointNoStrip),
ids(&[RETRO, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint_NoStrip_LinkException::case:644d3f75f3570ac3 af1b1caf070a186bc2b02b598919b52d47c289d708fde3713e48ce1a40d7c025 translated
#[test]
fn detach_by_attachment_point_honors_link_exception() {
assert_eq!(
run("@detach:chest=force", Setup::PointLink),
ids(&[RETRO, FANCY, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint_NoStrip_LinkException::case:53be219b37533fa6 af1b1caf070a186bc2b02b598919b52d47c289d708fde3713e48ce1a40d7c025 translated
#[test]
fn remattach_by_attachment_point_honors_link_exception() {
assert_eq!(
run("@remattach:chest=force", Setup::PointLink),
ids(&[RETRO, FANCY, EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint_None::case:9a124e69f33b279f afed603254ad6048a46e157254f16253063e6c76c9ea16f46a69d8455bc0e6fb translated
#[test]
fn detach_by_missing_attachment_point() {
assert!(run("@detach:skull=force", Setup::PointNone).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByAttachmentPoint_None::case:800d7d8ba57071b1 afed603254ad6048a46e157254f16253063e6c76c9ea16f46a69d8455bc0e6fb translated
#[test]
fn remattach_by_missing_attachment_point() {
assert!(run("@remattach:skull=force", Setup::PointNone).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID::case:e5bdbdba9613b46a 4b1a8acea7f1bb100bf11e9329672c64b53aba4974558f1c693460eef7f56c2d translated
#[test]
fn detach_by_uuid() {
assert_eq!(
run(&format!("@detach:{PRIM1}=force"), Setup::Uuid),
ids(&[HAPPY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID::case:7cb3f81460bd8e9f 4b1a8acea7f1bb100bf11e9329672c64b53aba4974558f1c693460eef7f56c2d translated
#[test]
fn remattach_by_uuid() {
assert_eq!(
run(&format!("@remattach:{PRIM1}=force"), Setup::Uuid),
ids(&[HAPPY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_NostripInItemName::case:e5bdbdba9613b46a 6857733912b45ef9153b0f58cd74ae6c9dc0034fa10933d153cae88a2c7d9423 translated
#[test]
fn detach_by_uuid_honors_item_nostrip() {
assert!(run(&format!("@detach:{PRIM1}=force"), Setup::UuidItemNoStrip).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_NostripInItemName::case:7cb3f81460bd8e9f 6857733912b45ef9153b0f58cd74ae6c9dc0034fa10933d153cae88a2c7d9423 translated
#[test]
fn remattach_by_uuid_honors_item_nostrip() {
assert!(run(&format!("@remattach:{PRIM1}=force"), Setup::UuidItemNoStrip).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_NostripInFolderName::case:e5bdbdba9613b46a 1a3189f931e086ab3d2d3e99c53dba2e9d39dce75a52fd02400c6892aef5d0c4 translated
#[test]
fn detach_by_uuid_honors_folder_nostrip() {
assert!(run(&format!("@detach:{PRIM1}=force"), Setup::UuidFolderNoStrip).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_NostripInFolderName::case:7cb3f81460bd8e9f 1a3189f931e086ab3d2d3e99c53dba2e9d39dce75a52fd02400c6892aef5d0c4 translated
#[test]
fn remattach_by_uuid_honors_folder_nostrip() {
assert!(
run(
&format!("@remattach:{PRIM1}=force"),
Setup::UuidFolderNoStrip
)
.is_empty()
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_NostripInFolderName_LinkException::case:e5bdbdba9613b46a bd7bc72a107b4a21b00977e13b086da192bef2c2e6f0fdb73b8e332016c6ef23 translated
#[test]
fn detach_by_uuid_honors_folder_link_exception() {
assert_eq!(
run(&format!("@detach:{PRIM1}=force"), Setup::UuidFolderLink),
ids(&[HAPPY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_NostripInFolderName_LinkException::case:7cb3f81460bd8e9f bd7bc72a107b4a21b00977e13b086da192bef2c2e6f0fdb73b8e332016c6ef23 translated
#[test]
fn remattach_by_uuid_honors_folder_link_exception() {
assert_eq!(
run(&format!("@remattach:{PRIM1}=force"), Setup::UuidFolderLink),
ids(&[HAPPY])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_WithRestrictions::case:e5bdbdba9613b46a 2ecf40d1d338117ddac4cfd6c7a030e96b7adf72cd90e0d8327787317e1f38d7 translated
#[test]
fn detach_by_uuid_honors_restrictions() {
assert!(run(&format!("@detach:{PRIM1}=force"), Setup::UuidRestricted).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_WithRestrictions::case:7cb3f81460bd8e9f 2ecf40d1d338117ddac4cfd6c7a030e96b7adf72cd90e0d8327787317e1f38d7 translated
#[test]
fn remattach_by_uuid_honors_restrictions() {
assert!(run(&format!("@remattach:{PRIM1}=force"), Setup::UuidRestricted).is_empty());
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_External::case:e5bdbdba9613b46a e0bdc682df3416bdc01855e6e63974e64c21951aac629807352220baf572dded translated
#[test]
fn detach_external_by_uuid() {
assert_eq!(
run(
&format!("@detach:{EXTERNAL_PRIM}=force"),
Setup::UuidExternal
),
ids(&[EXTERNAL])
);
}
// parity-case: LibreMetaverse.Tests/RLV/Commands/RemAttachCommandTests.cs::RemAttachCommandTests.RemAttach_ByUUID_External::case:7cb3f81460bd8e9f e0bdc682df3416bdc01855e6e63974e64c21951aac629807352220baf572dded translated
#[test]
fn remattach_external_by_uuid() {
assert_eq!(
run(
&format!("@remattach:{EXTERNAL_PRIM}=force"),
Setup::UuidExternal
),
ids(&[EXTERNAL])
);
}