Files
MetaCrate/tests/compat/tests/rlv_folder_exception_semantics.rs

254 lines
9.6 KiB
Rust

// Exact Rust translations of the recursive folder exception tests.
use libremetaverse_compat_tests::block_on;
use libremetaverse_compat_tests::rlv_support::{RlvHarness, SampleInventoryTree, guid};
use libremetaverse_rlv::{InventoryMap, RlvAttachmentPoint};
const PRIM: &str = "11111111-0003-4aaa-8aaa-ffffffffffff";
const HATS_EXCEPTED: [bool; 7] = [true, true, false, false, false, true, true];
const CLOTHING_EXCEPTED: [bool; 7] = [true; 7];
const NO_EXCEPTIONS: [bool; 7] = [false, false, false, false, false, true, true];
#[derive(Clone, Copy)]
enum Mode {
Attach,
Detach,
}
fn exception_case_matches(
commands: &[&str],
mode: Mode,
expected_items: [bool; 7],
expected_exception_counts: Option<[usize; 3]>,
) -> bool {
let h = RlvHarness::new().expect("RlvService constructor");
let mut tree = SampleInventoryTree::build().expect("sample inventory tree");
tree.business_pants
.set_attached_to(Some(Some(RlvAttachmentPoint::Pelvis)));
tree.business_pants
.set_attached_prim_id(Some(Some(guid(PRIM))));
let folder_ids = [tree.clothing.id(), tree.hats.id(), tree.sub_hats.id()];
h.queries.lock().unwrap().inventory_map = Some(InventoryMap::new(tree.root, vec![]).unwrap());
for command in commands {
if !block_on(h.process_from(command, PRIM, "Business Pants (Pelvis)")).unwrap() {
return false;
}
}
let permissions = h.service.permissions();
let actual = match mode {
Mode::Attach => [
permissions
.can_attach_with_rlv_inventory_item_boolean(tree.party_hat, true)
.unwrap(),
permissions
.can_attach_with_rlv_inventory_item_boolean(tree.fancy_hat, true)
.unwrap(),
permissions
.can_attach_with_rlv_inventory_item_boolean(tree.business_pants, true)
.unwrap(),
permissions
.can_attach_with_rlv_inventory_item_boolean(tree.happy_shirt, true)
.unwrap(),
permissions
.can_attach_with_rlv_inventory_item_boolean(tree.retro_pants, true)
.unwrap(),
permissions
.can_attach_with_rlv_inventory_item_boolean(tree.glasses, true)
.unwrap(),
permissions
.can_attach_with_rlv_inventory_item_boolean(tree.watch, true)
.unwrap(),
],
Mode::Detach => [
permissions
.can_detach_with_rlv_inventory_item(tree.party_hat)
.unwrap(),
permissions
.can_detach_with_rlv_inventory_item(tree.fancy_hat)
.unwrap(),
permissions
.can_detach_with_rlv_inventory_item(tree.business_pants)
.unwrap(),
permissions
.can_detach_with_rlv_inventory_item(tree.happy_shirt)
.unwrap(),
permissions
.can_detach_with_rlv_inventory_item(tree.retro_pants)
.unwrap(),
permissions
.can_detach_with_rlv_inventory_item(tree.glasses)
.unwrap(),
permissions
.can_detach_with_rlv_inventory_item(tree.watch)
.unwrap(),
],
};
if actual != expected_items {
return false;
}
if let Some(expected_counts) = expected_exception_counts {
let locked = h.service.restrictions().get_locked_folders().unwrap();
if locked.len() != 3 {
return false;
}
for (index, id) in folder_ids.iter().enumerate() {
let Some(folder) = locked.get(id) else {
return false;
};
let matches = folder.is_locked()
&& match mode {
Mode::Attach => {
folder.attach_exceptions().len() == expected_counts[index]
&& folder.attach_restrictions().len() == 1
&& folder.detach_exceptions().is_empty()
&& folder.detach_restrictions().is_empty()
}
Mode::Detach => {
folder.attach_exceptions().is_empty()
&& folder.attach_restrictions().is_empty()
&& folder.detach_exceptions().len() == expected_counts[index]
&& folder.detach_restrictions().len() == 1
}
};
if !matches {
return false;
}
}
}
true
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/AttachAllThisExceptExceptionTests.cs::AttachAllThisExceptExceptionTests.AttachAllThis_Recursive_ExceptAll::test 1daa414beb2a767518f335f6ae59e711395375ed9d7912fbbc139fa0998dfdb1 translated
#[test]
fn attach_all_this_except_subtree() {
assert!(exception_case_matches(
&[
"@attachallthis=n",
"@attachallthis_except:Clothing/Hats=add",
],
Mode::Attach,
HATS_EXCEPTED,
Some([0, 1, 1]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/AttachAllThisExceptExceptionTests.cs::AttachAllThisExceptExceptionTests.AttachAllThis_Recursive_ExceptAll_Recursive::test 6e0c78d6ed78bedca9a8c6a9a83fd9f90f7123da433eb4c560e6f5c0b6fe6d94 translated
#[test]
fn attach_all_this_except_recursive_subtree() {
assert!(exception_case_matches(
&["@attachallthis=n", "@attachallthis_except:Clothing=add"],
Mode::Attach,
CLOTHING_EXCEPTED,
Some([1, 1, 1]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/AttachAllThisExceptExceptionTests.cs::AttachAllThisExceptExceptionTests.AttachAllThis_Recursive_ExceptAll_Recursive_AddRem::test 9423ed205501604501d31909414ecf6ef99a0d56d4efae100f5576b31b71a858 translated
#[test]
fn attach_all_this_recursive_exception_removed() {
assert!(exception_case_matches(
&[
"@attachallthis=n",
"@attachallthis_except:Clothing=add",
"@attachallthis_except:Clothing=rem",
],
Mode::Attach,
NO_EXCEPTIONS,
Some([0, 0, 0]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/AttachThisExceptExceptionTests.cs::AttachThisExceptExceptionTests.AttachThisExcept_Default::test b8e6e55d8f2654429c9826e38ffc8522eec44ab2521891b68616db61ac662db0 translated
#[test]
fn attach_this_except_folder() {
assert!(exception_case_matches(
&["@attachallthis=n", "@attachthis_except:Clothing/Hats=add"],
Mode::Attach,
HATS_EXCEPTED,
Some([0, 1, 0]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/AttachThisExceptExceptionTests.cs::AttachThisExceptExceptionTests.AttachThisExcept_AddRem::test 05bc7eab5dd02a0a3e60f85eb51b374623aaa29c9ce2b522748a3478b8ee44ea translated
#[test]
fn attach_this_exception_removed() {
assert!(exception_case_matches(
&[
"@attachallthis=n",
"@attachthis_except:Clothing/Hats=add",
"@attachthis_except:Clothing/Hats=rem",
],
Mode::Attach,
NO_EXCEPTIONS,
Some([0, 0, 0]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/DetachAllThisExceptExceptionTests.cs::DetachAllThisExceptExceptionTests.DetachAllThis_Recursive_ExceptAll::test 75e7ab22f6d9d058580fd83741d65f7e5babb7ad54805eaeb16bec8cd65370ed translated
#[test]
fn detach_all_this_except_subtree() {
assert!(exception_case_matches(
&[
"@detachallthis=n",
"@detachallthis_except:Clothing/Hats=add",
],
Mode::Detach,
HATS_EXCEPTED,
None,
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/DetachAllThisExceptExceptionTests.cs::DetachAllThisExceptExceptionTests.DetachAllThis_Recursive_ExceptAll_Recursive::test 3fb8bb13d6a917d9be18265d90767488cde66746badc6584025bbbaf84f020ad translated
#[test]
fn detach_all_this_except_recursive_subtree() {
assert!(exception_case_matches(
&["@detachallthis=n", "@detachallthis_except:Clothing=add"],
Mode::Detach,
CLOTHING_EXCEPTED,
Some([1, 1, 1]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/DetachAllThisExceptExceptionTests.cs::DetachAllThisExceptExceptionTests.DetachAllThis_Recursive_ExceptAll_Recursive_AddRem::test fb5fd8a4eda181d22d1756ec0cae700c4b90895a74dc79c24c67c1705cfd37c8 translated
#[test]
fn detach_all_this_recursive_exception_removed() {
assert!(exception_case_matches(
&[
"@detachallthis=n",
"@detachallthis_except:Clothing=add",
"@detachallthis_except:Clothing=rem",
],
Mode::Detach,
NO_EXCEPTIONS,
Some([0, 0, 0]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/DetachThisExceptExceptionTests.cs::DetachThisExceptExceptionTests.DetachAllThis_Recursive_Except::test 3222d97d73d8b54bd11212f8cd3de26279040321f0bc330e061ff93880053f3e translated
#[test]
fn detach_this_except_folder() {
assert!(exception_case_matches(
&["@detachallthis=n", "@detachthis_except:Clothing/Hats=add"],
Mode::Detach,
HATS_EXCEPTED,
Some([0, 1, 0]),
));
}
// parity-case: LibreMetaverse.Tests/RLV/Exceptions/DetachThisExceptExceptionTests.cs::DetachThisExceptExceptionTests.DetachAllThis_Recursive_Except_AddRem::test d25b2c533b9b51428c0c2414d687c466a3c80c4a573dd36763504de19e8dc6f8 translated
#[test]
fn detach_this_exception_removed() {
assert!(exception_case_matches(
&[
"@detachallthis=n",
"@detachthis_except:Clothing/Hats=add",
"@detachthis_except:Clothing/Hats=rem",
],
Mode::Detach,
NO_EXCEPTIONS,
Some([0, 0, 0]),
));
}