257 lines
10 KiB
Rust
257 lines
10 KiB
Rust
// Exact Rust translations of RlvRestrictionManagerTests.
|
|
|
|
use libremetaverse_compat_tests::block_on;
|
|
use libremetaverse_compat_tests::rlv_support::{RlvHarness, guid};
|
|
use libremetaverse_rlv::RlvRestrictionType;
|
|
use libremetaverse_types::compat::Guid;
|
|
use std::sync::{Arc, Mutex};
|
|
|
|
const PRIM_1: &str = "11111111-1111-1111-1111-111111111111";
|
|
const PRIM_2: &str = "22222222-2222-2222-2222-222222222222";
|
|
const PRIM_3: &str = "33333333-3333-3333-3333-333333333333";
|
|
const MISSING: &str = "99999999-9999-9999-9999-999999999999";
|
|
|
|
fn harness() -> RlvHarness {
|
|
RlvHarness::new().expect("RlvService constructor")
|
|
}
|
|
|
|
fn process_from(h: &RlvHarness, sender: &str, commands: &[&str]) {
|
|
for command in commands {
|
|
block_on(h.process_from(command, sender, "TestObject")).unwrap();
|
|
}
|
|
}
|
|
|
|
fn tracked(h: &RlvHarness) -> Vec<Guid> {
|
|
h.service
|
|
.restrictions()
|
|
.get_tracked_prim_ids()
|
|
.unwrap()
|
|
.collect()
|
|
}
|
|
|
|
async fn remove(h: &RlvHarness, ids: Vec<Guid>) {
|
|
h.service
|
|
.restrictions()
|
|
.remove_restrictions_for_objects(Box::new(ids.into_iter()), None)
|
|
.await
|
|
.unwrap();
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.GetTrackedPrimIds_NoRestrictions_ReturnsEmptyCollection::test 327086a5aa514ddf8b2cc40891f7ae5e8039788f5cbfeda86f04bd9161f39ded translated
|
|
#[test]
|
|
fn tracked_prim_ids_empty() {
|
|
assert!(tracked(&harness()).is_empty());
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.GetTrackedPrimIds_SingleRestriction_ReturnsSingleId::test 85a822c9e2e8beb2e70748513a397b8ccbb2977c0581b0519bd8ad43e699ad57 translated
|
|
#[test]
|
|
fn tracked_prim_ids_single_restriction() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
assert_eq!(tracked(&h), vec![guid(PRIM_1)]);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.GetTrackedPrimIds_MultipleRestrictionsFromSameObject_ReturnsSingleId::test 933070f933b0a5a39b3d0cd5fd9be9423a538609d0106b352a7d9c339665d6d1 translated
|
|
#[test]
|
|
fn tracked_prim_ids_deduplicates_one_object() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n", "@jump=n", "@sit=n"]);
|
|
assert_eq!(tracked(&h), vec![guid(PRIM_1)]);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.GetTrackedPrimIds_MultipleObjects_ReturnsAllUniqueIds::test 8c2afe66145e4815e73d7849f83cfec50e4a7a49793cc757917cd608c9387419 translated
|
|
#[test]
|
|
fn tracked_prim_ids_multiple_objects() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
process_from(&h, PRIM_2, &["@jump=n"]);
|
|
process_from(&h, PRIM_3, &["@sit=n"]);
|
|
let ids = tracked(&h);
|
|
assert_eq!(ids.len(), 3);
|
|
assert!(ids.contains(&guid(PRIM_1)));
|
|
assert!(ids.contains(&guid(PRIM_2)));
|
|
assert!(ids.contains(&guid(PRIM_3)));
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.GetTrackedPrimIds_MixedRestrictionsAndExceptions_ReturnsAllUniqueIds::test 25ea3c36aba93d5183816962bf49bfdbc3e17e6b06d73a41dee5b51407a84746 translated
|
|
#[test]
|
|
fn tracked_prim_ids_include_restrictions_and_exceptions() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@detachthis=n"]);
|
|
process_from(&h, PRIM_2, &["@detachthis_except:folder=n"]);
|
|
let ids = tracked(&h);
|
|
assert_eq!(ids.len(), 2);
|
|
assert!(ids.contains(&guid(PRIM_1)));
|
|
assert!(ids.contains(&guid(PRIM_2)));
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.GetTrackedPrimIds_AfterRemovingRestriction_DoesNotReturnRemovedObjectId::test af3d5328e5c829bd2de2b72c3f4ede6f083efa789ccef1d73d752612a177360f translated
|
|
#[test]
|
|
fn tracked_prim_ids_after_removing_restriction() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
process_from(&h, PRIM_2, &["@jump=n"]);
|
|
process_from(&h, PRIM_1, &["@fly=y"]);
|
|
let ids = tracked(&h);
|
|
assert_eq!(ids, vec![guid(PRIM_2)]);
|
|
assert!(!ids.contains(&guid(PRIM_1)));
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.GetTrackedPrimIds_AfterClearingAllRestrictions_ReturnsEmptyCollection::test 191a8cc3dba7e68155083a6892f1b4a29ab589023e22cffbc8cd69c005884cca translated
|
|
#[test]
|
|
fn tracked_prim_ids_after_clear() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n", "@jump=n", "@clear"]);
|
|
assert!(tracked(&h).is_empty());
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_EmptyInput_NoEffect::test 8718e08bb2bf951a94803b4947943b5f7f9eb85e906b4ac6c639cb8cd065cf9d translated
|
|
#[test]
|
|
fn remove_restrictions_empty_input() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
block_on(remove(&h, vec![]));
|
|
assert!(!h.service.permissions().can_fly().unwrap());
|
|
assert_eq!(tracked(&h).len(), 1);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_NonExistentId_NoEffect::test 882d2315f40317cce9c9a026eda498325b6227886652795ed45e87cc4e5697ac translated
|
|
#[test]
|
|
fn remove_restrictions_missing_id() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
block_on(remove(&h, vec![guid(MISSING)]));
|
|
assert!(!h.service.permissions().can_fly().unwrap());
|
|
assert_eq!(tracked(&h), vec![guid(PRIM_1)]);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_SingleObject_RemovesAllRestrictionsFromObject::test 73ab6ee30a336372f6aef5bc4a99dbb58215b9445daea5d9708d0ea9cabe8bd1 translated
|
|
#[test]
|
|
fn remove_restrictions_single_object() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n", "@jump=n", "@sit=n"]);
|
|
assert!(!h.service.permissions().can_fly().unwrap());
|
|
assert!(!h.service.permissions().can_jump().unwrap());
|
|
block_on(remove(&h, vec![guid(PRIM_1)]));
|
|
assert!(h.service.permissions().can_fly().unwrap());
|
|
assert!(h.service.permissions().can_jump().unwrap());
|
|
assert!(tracked(&h).is_empty());
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_MultipleObjects_RemovesOnlySpecifiedObjects::test 03b6a6a3e02f6a6a5f296ff1d6cca31c9fc53982cbc9c27e73cfb698ed82acf5 translated
|
|
#[test]
|
|
fn remove_restrictions_multiple_objects() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
process_from(&h, PRIM_2, &["@jump=n"]);
|
|
process_from(&h, PRIM_3, &["@sit=n"]);
|
|
assert!(!h.service.permissions().can_fly().unwrap());
|
|
assert!(!h.service.permissions().can_jump().unwrap());
|
|
block_on(remove(&h, vec![guid(PRIM_1), guid(PRIM_3)]));
|
|
assert!(h.service.permissions().can_fly().unwrap());
|
|
assert!(!h.service.permissions().can_jump().unwrap());
|
|
assert_eq!(tracked(&h), vec![guid(PRIM_2)]);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_PartialMatch_RemovesOnlyMatchingObjects::test 00a26d807882b2bbb375c5ce7cf1074d3227acd891e859602e78abbdc6eefb6a translated
|
|
#[test]
|
|
fn remove_restrictions_partial_match() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
process_from(&h, PRIM_2, &["@jump=n"]);
|
|
block_on(remove(&h, vec![guid(PRIM_1), guid(MISSING)]));
|
|
assert!(h.service.permissions().can_fly().unwrap());
|
|
assert!(!h.service.permissions().can_jump().unwrap());
|
|
assert_eq!(tracked(&h), vec![guid(PRIM_2)]);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithNotificationRestrictions_SendsNotifications::test ba82b183dfdb01b36f9b45520e1808290c360f327d4afa833ba3b8c7a7cecffb translated
|
|
#[test]
|
|
fn remove_restrictions_sends_notification() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_2, &["@notify:123=n"]);
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
block_on(remove(&h, vec![guid(PRIM_1)]));
|
|
assert_eq!(
|
|
h.actions
|
|
.lock()
|
|
.unwrap()
|
|
.replies
|
|
.iter()
|
|
.filter(|reply| **reply == (123, "/fly=y".into()))
|
|
.count(),
|
|
1
|
|
);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_WithComplexRestrictions_RemovesCorrectly::test 631de2d39fa56b29014fae4ce3b57c480f540ad41ce08a0037b7f8bbfcb3c502 translated
|
|
#[test]
|
|
fn remove_restrictions_complex_types() {
|
|
let h = harness();
|
|
process_from(
|
|
&h,
|
|
PRIM_1,
|
|
&[
|
|
"@detachthis=n",
|
|
"@detachthis_except:folder=n",
|
|
"@touchfar:1.5=n",
|
|
],
|
|
);
|
|
process_from(&h, PRIM_2, &["@fly=n"]);
|
|
assert_eq!(
|
|
h.service
|
|
.restrictions()
|
|
.find_restrictions(None, Some(Some(guid(PRIM_1))))
|
|
.unwrap()
|
|
.len(),
|
|
3
|
|
);
|
|
assert_eq!(
|
|
h.service
|
|
.restrictions()
|
|
.find_restrictions(None, Some(Some(guid(PRIM_2))))
|
|
.unwrap()
|
|
.len(),
|
|
1
|
|
);
|
|
block_on(remove(&h, vec![guid(PRIM_1)]));
|
|
assert!(
|
|
h.service
|
|
.restrictions()
|
|
.find_restrictions(None, Some(Some(guid(PRIM_1))))
|
|
.unwrap()
|
|
.is_empty()
|
|
);
|
|
assert_eq!(
|
|
h.service
|
|
.restrictions()
|
|
.find_restrictions(None, Some(Some(guid(PRIM_2))))
|
|
.unwrap()
|
|
.len(),
|
|
1
|
|
);
|
|
}
|
|
|
|
// parity-case: LibreMetaverse.Tests/RLV/RlvRestrictionManagerTests.cs::RlvRestrictionManagerTests.RemoveRestrictionsForObjects_TriggersRestrictionUpdatedEvent::test 318f1f4207b04d01076d3498aceea781c4889b05cdbef199cdbea43dde355f4c translated
|
|
#[test]
|
|
fn remove_restrictions_triggers_update_event() {
|
|
let h = harness();
|
|
process_from(&h, PRIM_1, &["@fly=n"]);
|
|
let removed = Arc::new(Mutex::new(None));
|
|
let captured = Arc::clone(&removed);
|
|
let _subscription = h
|
|
.service
|
|
.restrictions()
|
|
.subscribe_restriction_updated(Some(Arc::new(move |args| {
|
|
if !args.is_new() && args.is_deleted() {
|
|
let restriction = args.restriction();
|
|
*captured.lock().unwrap() = Some((restriction.behavior(), restriction.sender()));
|
|
}
|
|
})));
|
|
block_on(remove(&h, vec![guid(PRIM_1)]));
|
|
assert_eq!(
|
|
*removed.lock().unwrap(),
|
|
Some((RlvRestrictionType::Fly, guid(PRIM_1)))
|
|
);
|
|
}
|